brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.3 KiB · 522b057 Raw
214 lines · plain
1//===- RISCVInstrInfoZk.td - RISC-V 'Zk' instructions ------*- tablegen -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file describes the RISC-V instructions from the standard 'Zk',10// Scalar Cryptography Instructions extension, version 1.0.11//12//===----------------------------------------------------------------------===//13 14//===----------------------------------------------------------------------===//15// Operand and SDNode transformation definitions.16//===----------------------------------------------------------------------===//17 18// Scalar cryptography19def riscv_sha256sig0 : RVSDNode<"SHA256SIG0", SDTIntUnaryOp>;20def riscv_sha256sig1 : RVSDNode<"SHA256SIG1", SDTIntUnaryOp>;21def riscv_sha256sum0 : RVSDNode<"SHA256SUM0", SDTIntUnaryOp>;22def riscv_sha256sum1 : RVSDNode<"SHA256SUM1", SDTIntUnaryOp>;23 24def SDT_RISCVZkByteSelect : SDTypeProfile<1, 3, [SDTCisVT<0, XLenVT>,25                                                 SDTCisVT<1, XLenVT>,26                                                 SDTCisVT<2, XLenVT>,27                                                 SDTCisVT<3, i32>]>;28// Scalar cryptography29def riscv_sm4ks : RVSDNode<"SM4KS", SDT_RISCVZkByteSelect>;30def riscv_sm4ed : RVSDNode<"SM4ED", SDT_RISCVZkByteSelect>;31 32// Scalar cryptography33def riscv_sm3p0 : RVSDNode<"SM3P0", SDTIntUnaryOp>;34def riscv_sm3p1 : RVSDNode<"SM3P1", SDTIntUnaryOp>;35 36def RnumArg : AsmOperandClass {37  let Name = "RnumArg";38  let RenderMethod = "addImmOperands";39  let DiagnosticType = "InvalidRnumArg";40}41 42def rnum : RISCVOp<i32>, TImmLeaf<i32, [{return (Imm >= 0 && Imm <= 10);}]> {43  let ParserMatchClass = RnumArg;44  let EncoderMethod = "getImmOpValue";45  let DecoderMethod = "decodeUImmOperand<4>";46  let OperandType = "OPERAND_RVKRNUM";47}48 49def byteselect : RISCVOp<i32>, TImmLeaf<i32, [{return isUInt<2>(Imm);}]> {50  let ParserMatchClass = UImmAsmOperand<2>;51  let DecoderMethod = "decodeUImmOperand<2>";52  let OperandType = "OPERAND_UIMM2";53}54 55//===----------------------------------------------------------------------===//56// Instruction class templates57//===----------------------------------------------------------------------===//58 59let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in60class RVKByteSelect<bits<5> funct5, string opcodestr>61    : RVInstR<{0b00, funct5}, 0b000, OPC_OP, (outs GPR:$rd),62              (ins GPR:$rs1, GPR:$rs2, byteselect:$bs),63              opcodestr, "$rd, $rs1, $rs2, $bs">{64  bits<2> bs;65  let Inst{31-30} = bs;66}67 68let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in69class RVKUnary_rnum<bits<7> funct7, bits<3> funct3, string opcodestr>70    : RVInstIBase<funct3, OPC_OP_IMM, (outs GPR:$rd),71                  (ins GPR:$rs1, rnum:$rnum), opcodestr, "$rd, $rs1, $rnum"> {72  bits<4> rnum;73  let Inst{31-25} = funct7;74  let Inst{24} = 0b1;75  let Inst{23-20} = rnum;76}77 78//===----------------------------------------------------------------------===//79// Instructions80//===----------------------------------------------------------------------===//81let Predicates = [HasStdExtZknd, IsRV32] in {82def AES32DSI  : RVKByteSelect<0b10101, "aes32dsi">;83def AES32DSMI : RVKByteSelect<0b10111, "aes32dsmi">;84} // Predicates = [HasStdExtZknd, IsRV32]85 86let Predicates = [HasStdExtZknd, IsRV64] in {87def AES64DS  : ALU_rr<0b0011101, 0b000, "aes64ds">;88def AES64DSM : ALU_rr<0b0011111, 0b000, "aes64dsm">;89 90def AES64IM  : Unary_r<0b001100000000, 0b001, "aes64im">;91} // Predicates = [HasStdExtZknd, IsRV64]92 93let Predicates = [HasStdExtZkndOrZkne, IsRV64] in {94def AES64KS2  : ALU_rr<0b0111111, 0b000, "aes64ks2">;95 96def AES64KS1I : RVKUnary_rnum<0b0011000, 0b001, "aes64ks1i">;97} // Predicates = [HasStdExtZkndOrZkne, IsRV64]98 99let Predicates = [HasStdExtZkne, IsRV32] in {100def AES32ESI  : RVKByteSelect<0b10001, "aes32esi">;101def AES32ESMI : RVKByteSelect<0b10011, "aes32esmi">;102} // Predicates = [HasStdExtZkne, IsRV32]103 104let Predicates = [HasStdExtZkne, IsRV64] in {105def AES64ES   : ALU_rr<0b0011001, 0b000, "aes64es">;106def AES64ESM  : ALU_rr<0b0011011, 0b000, "aes64esm">;107} // Predicates = [HasStdExtZkne, IsRV64]108 109let Predicates = [HasStdExtZknh], IsSignExtendingOpW = 1 in {110def SHA256SIG0 : Unary_r<0b000100000010, 0b001, "sha256sig0">;111def SHA256SIG1 : Unary_r<0b000100000011, 0b001, "sha256sig1">;112def SHA256SUM0 : Unary_r<0b000100000000, 0b001, "sha256sum0">;113def SHA256SUM1 : Unary_r<0b000100000001, 0b001, "sha256sum1">;114} // Predicates = [HasStdExtZknh]115 116let Predicates = [HasStdExtZknh, IsRV32] in {117def SHA512SIG0H : ALU_rr<0b0101110, 0b000, "sha512sig0h">;118def SHA512SIG0L : ALU_rr<0b0101010, 0b000, "sha512sig0l">;119def SHA512SIG1H : ALU_rr<0b0101111, 0b000, "sha512sig1h">;120def SHA512SIG1L : ALU_rr<0b0101011, 0b000, "sha512sig1l">;121def SHA512SUM0R : ALU_rr<0b0101000, 0b000, "sha512sum0r">;122def SHA512SUM1R : ALU_rr<0b0101001, 0b000, "sha512sum1r">;123} // [HasStdExtZknh, IsRV32]124 125let Predicates = [HasStdExtZknh, IsRV64] in {126def SHA512SIG0 : Unary_r<0b000100000110, 0b001, "sha512sig0">;127def SHA512SIG1 : Unary_r<0b000100000111, 0b001, "sha512sig1">;128def SHA512SUM0 : Unary_r<0b000100000100, 0b001, "sha512sum0">;129def SHA512SUM1 : Unary_r<0b000100000101, 0b001, "sha512sum1">;130} // Predicates = [HasStdExtZknh, IsRV64]131 132let Predicates = [HasStdExtZksed], IsSignExtendingOpW = 1 in {133def SM4ED : RVKByteSelect<0b11000, "sm4ed">;134def SM4KS : RVKByteSelect<0b11010, "sm4ks">;135} // Predicates = [HasStdExtZksed]136 137let Predicates = [HasStdExtZksh], IsSignExtendingOpW = 1 in {138def SM3P0 : Unary_r<0b000100001000, 0b001, "sm3p0">;139def SM3P1 : Unary_r<0b000100001001, 0b001, "sm3p1">;140} // Predicates = [HasStdExtZksh]141 142//===----------------------------------------------------------------------===//143// Codegen patterns144//===----------------------------------------------------------------------===//145 146class PatGprGprByteSelect<SDPatternOperator OpNode, RVInst Inst>147    : Pat<(XLenVT (OpNode (XLenVT GPR:$rs1), (XLenVT GPR:$rs2), byteselect:$imm)),148          (Inst GPR:$rs1, GPR:$rs2, byteselect:$imm)>;149 150// Zknd151let Predicates = [HasStdExtZknd, IsRV32] in {152def : PatGprGprByteSelect<int_riscv_aes32dsi, AES32DSI>;153def : PatGprGprByteSelect<int_riscv_aes32dsmi, AES32DSMI>;154} // Predicates = [HasStdExtZknd, IsRV32]155 156let Predicates = [HasStdExtZknd, IsRV64] in {157def : PatGprGpr<int_riscv_aes64ds, AES64DS>;158def : PatGprGpr<int_riscv_aes64dsm, AES64DSM>;159def : PatGpr<int_riscv_aes64im, AES64IM>;160} // Predicates = [HasStdExtZknd, IsRV64]161 162let Predicates = [HasStdExtZkndOrZkne, IsRV64] in {163def : PatGprGpr<int_riscv_aes64ks2, AES64KS2>;164def : Pat<(int_riscv_aes64ks1i GPR:$rs1, rnum:$rnum),165          (AES64KS1I GPR:$rs1, rnum:$rnum)>;166} // Predicates = [HasStdExtZkndOrZkne, IsRV64]167 168// Zkne169let Predicates = [HasStdExtZkne, IsRV32] in {170def : PatGprGprByteSelect<int_riscv_aes32esi, AES32ESI>;171def : PatGprGprByteSelect<int_riscv_aes32esmi, AES32ESMI>;172} // Predicates = [HasStdExtZkne, IsRV32]173 174let Predicates = [HasStdExtZkne, IsRV64] in {175def : PatGprGpr<int_riscv_aes64es, AES64ES>;176def : PatGprGpr<int_riscv_aes64esm, AES64ESM>;177} // Predicates = [HasStdExtZkne, IsRV64]178 179// Zknh180let Predicates = [HasStdExtZknh] in {181def : PatGpr<riscv_sha256sig0, SHA256SIG0>;182def : PatGpr<riscv_sha256sig1, SHA256SIG1>;183def : PatGpr<riscv_sha256sum0, SHA256SUM0>;184def : PatGpr<riscv_sha256sum1, SHA256SUM1>;185} // Predicates = [HasStdExtZknh]186 187let Predicates = [HasStdExtZknh, IsRV32] in {188def : PatGprGpr<int_riscv_sha512sig0l, SHA512SIG0L>;189def : PatGprGpr<int_riscv_sha512sig0h, SHA512SIG0H>;190def : PatGprGpr<int_riscv_sha512sig1l, SHA512SIG1L>;191def : PatGprGpr<int_riscv_sha512sig1h, SHA512SIG1H>;192def : PatGprGpr<int_riscv_sha512sum0r, SHA512SUM0R>;193def : PatGprGpr<int_riscv_sha512sum1r, SHA512SUM1R>;194} // Predicates = [HasStdExtZknh, IsRV32]195 196let Predicates = [HasStdExtZknh, IsRV64] in {197def : PatGpr<int_riscv_sha512sig0, SHA512SIG0>;198def : PatGpr<int_riscv_sha512sig1, SHA512SIG1>;199def : PatGpr<int_riscv_sha512sum0, SHA512SUM0>;200def : PatGpr<int_riscv_sha512sum1, SHA512SUM1>;201} // Predicates = [HasStdExtZknh, IsRV64]202 203// Zksed204let Predicates = [HasStdExtZksed] in {205def : PatGprGprByteSelect<riscv_sm4ks, SM4KS>;206def : PatGprGprByteSelect<riscv_sm4ed, SM4ED>;207} // Predicates = [HasStdExtZksed]208 209// Zksh210let Predicates = [HasStdExtZksh] in {211def : PatGpr<riscv_sm3p0, SM3P0>;212def : PatGpr<riscv_sm3p1, SM3P1>;213} // Predicates = [HasStdExtZksh]214