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-exception 6// 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 18def riscv_sha256sig0 : SDNode<"RISCVISD::SHA256SIG0", SDTIntUnaryOp>; 19def riscv_sha256sig1 : SDNode<"RISCVISD::SHA256SIG1", SDTIntUnaryOp>; 20def riscv_sha256sum0 : SDNode<"RISCVISD::SHA256SUM0", SDTIntUnaryOp>; 21def riscv_sha256sum1 : SDNode<"RISCVISD::SHA256SUM1", SDTIntUnaryOp>; 22 23def SDT_RISCVZkByteSelect : SDTypeProfile<1, 3, [SDTCisVT<0, XLenVT>, 24 SDTCisVT<1, XLenVT>, 25 SDTCisVT<2, XLenVT>, 26 SDTCisVT<3, i32>]>; 27def riscv_sm4ks : SDNode<"RISCVISD::SM4KS", SDT_RISCVZkByteSelect>; 28def riscv_sm4ed : SDNode<"RISCVISD::SM4ED", SDT_RISCVZkByteSelect>; 29 30def riscv_sm3p0 : SDNode<"RISCVISD::SM3P0", SDTIntUnaryOp>; 31def riscv_sm3p1 : SDNode<"RISCVISD::SM3P1", SDTIntUnaryOp>; 32 33def RnumArg : AsmOperandClass { 34 let Name = "RnumArg"; 35 let RenderMethod = "addImmOperands"; 36 let DiagnosticType = "InvalidRnumArg"; 37} 38 39def rnum : Operand<i32>, TImmLeaf<i32, [{return (Imm >= 0 && Imm <= 10);}]> { 40 let ParserMatchClass = RnumArg; 41 let EncoderMethod = "getImmOpValue"; 42 let DecoderMethod = "decodeUImmOperand<4>"; 43 let OperandType = "OPERAND_RVKRNUM"; 44 let OperandNamespace = "RISCVOp"; 45} 46 47def byteselect : Operand<i32>, TImmLeaf<i32, [{return isUInt<2>(Imm);}]> { 48 let ParserMatchClass = UImmAsmOperand<2>; 49 let DecoderMethod = "decodeUImmOperand<2>"; 50 let OperandType = "OPERAND_UIMM2"; 51 let OperandNamespace = "RISCVOp"; 52} 53 54//===----------------------------------------------------------------------===// 55// Instruction class templates 56//===----------------------------------------------------------------------===// 57let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in 58class RVKUnary<bits<12> imm12_in, bits<3> funct3, string opcodestr> 59 : RVInstI<funct3, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1), 60 opcodestr, "$rd, $rs1">{ 61 let imm12 = imm12_in; 62} 63 64let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in 65class RVKByteSelect<bits<5> funct5, string opcodestr> 66 : RVInstR<{0b00, funct5}, 0b000, OPC_OP, (outs GPR:$rd), 67 (ins GPR:$rs1, GPR:$rs2, byteselect:$bs), 68 opcodestr, "$rd, $rs1, $rs2, $bs">{ 69 bits<2> bs; 70 let Inst{31-30} = bs; 71} 72 73let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in 74class RVKUnary_rnum<bits<7> funct7, bits<3> funct3, string opcodestr> 75 : RVInstI<funct3, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1, rnum:$rnum), 76 opcodestr, "$rd, $rs1, $rnum">{ 77 bits<4> rnum; 78 let Inst{31-25} = funct7; 79 let Inst{24} = 1; 80 let Inst{23-20} = rnum; 81} 82 83//===----------------------------------------------------------------------===// 84// Instructions 85//===----------------------------------------------------------------------===// 86let Predicates = [HasStdExtZknd, IsRV32] in { 87def AES32DSI : RVKByteSelect<0b10101, "aes32dsi">; 88def AES32DSMI : RVKByteSelect<0b10111, "aes32dsmi">; 89} // Predicates = [HasStdExtZknd, IsRV32] 90 91let Predicates = [HasStdExtZknd, IsRV64] in { 92def AES64DS : ALU_rr<0b0011101, 0b000, "aes64ds">; 93def AES64DSM : ALU_rr<0b0011111, 0b000, "aes64dsm">; 94 95def AES64IM : RVKUnary<0b001100000000, 0b001, "aes64im">; 96} // Predicates = [HasStdExtZknd, IsRV64] 97 98let Predicates = [HasStdExtZkndOrZkne, IsRV64] in { 99def AES64KS2 : ALU_rr<0b0111111, 0b000, "aes64ks2">; 100 101def AES64KS1I : RVKUnary_rnum<0b0011000, 0b001, "aes64ks1i">; 102} // Predicates = [HasStdExtZkndOrZkne, IsRV64] 103 104let Predicates = [HasStdExtZkne, IsRV32] in { 105def AES32ESI : RVKByteSelect<0b10001, "aes32esi">; 106def AES32ESMI : RVKByteSelect<0b10011, "aes32esmi">; 107} // Predicates = [HasStdExtZkne, IsRV32] 108 109let Predicates = [HasStdExtZkne, IsRV64] in { 110def AES64ES : ALU_rr<0b0011001, 0b000, "aes64es">; 111def AES64ESM : ALU_rr<0b0011011, 0b000, "aes64esm">; 112} // Predicates = [HasStdExtZkne, IsRV64] 113 114let Predicates = [HasStdExtZknh], IsSignExtendingOpW = 1 in { 115def SHA256SIG0 : RVKUnary<0b000100000010, 0b001, "sha256sig0">; 116def SHA256SIG1 : RVKUnary<0b000100000011, 0b001, "sha256sig1">; 117def SHA256SUM0 : RVKUnary<0b000100000000, 0b001, "sha256sum0">; 118def SHA256SUM1 : RVKUnary<0b000100000001, 0b001, "sha256sum1">; 119} // Predicates = [HasStdExtZknh] 120 121let Predicates = [HasStdExtZknh, IsRV32] in { 122def SHA512SIG0H : ALU_rr<0b0101110, 0b000, "sha512sig0h">; 123def SHA512SIG0L : ALU_rr<0b0101010, 0b000, "sha512sig0l">; 124def SHA512SIG1H : ALU_rr<0b0101111, 0b000, "sha512sig1h">; 125def SHA512SIG1L : ALU_rr<0b0101011, 0b000, "sha512sig1l">; 126def SHA512SUM0R : ALU_rr<0b0101000, 0b000, "sha512sum0r">; 127def SHA512SUM1R : ALU_rr<0b0101001, 0b000, "sha512sum1r">; 128} // [HasStdExtZknh, IsRV32] 129 130let Predicates = [HasStdExtZknh, IsRV64] in { 131def SHA512SIG0 : RVKUnary<0b000100000110, 0b001, "sha512sig0">; 132def SHA512SIG1 : RVKUnary<0b000100000111, 0b001, "sha512sig1">; 133def SHA512SUM0 : RVKUnary<0b000100000100, 0b001, "sha512sum0">; 134def SHA512SUM1 : RVKUnary<0b000100000101, 0b001, "sha512sum1">; 135} // Predicates = [HasStdExtZknh, IsRV64] 136 137let Predicates = [HasStdExtZksed], IsSignExtendingOpW = 1 in { 138def SM4ED : RVKByteSelect<0b11000, "sm4ed">; 139def SM4KS : RVKByteSelect<0b11010, "sm4ks">; 140} // Predicates = [HasStdExtZksed] 141 142let Predicates = [HasStdExtZksh], IsSignExtendingOpW = 1 in { 143def SM3P0 : RVKUnary<0b000100001000, 0b001, "sm3p0">; 144def SM3P1 : RVKUnary<0b000100001001, 0b001, "sm3p1">; 145} // Predicates = [HasStdExtZksh] 146 147//===----------------------------------------------------------------------===// 148// Codegen patterns 149//===----------------------------------------------------------------------===// 150 151class PatGprGprByteSelect<SDPatternOperator OpNode, RVInst Inst> 152 : Pat<(XLenVT (OpNode (XLenVT GPR:$rs1), (XLenVT GPR:$rs2), byteselect:$imm)), 153 (Inst GPR:$rs1, GPR:$rs2, byteselect:$imm)>; 154 155// Zknd 156let Predicates = [HasStdExtZknd, IsRV32] in { 157def : PatGprGprByteSelect<int_riscv_aes32dsi, AES32DSI>; 158def : PatGprGprByteSelect<int_riscv_aes32dsmi, AES32DSMI>; 159} // Predicates = [HasStdExtZknd, IsRV32] 160 161let Predicates = [HasStdExtZknd, IsRV64] in { 162def : PatGprGpr<int_riscv_aes64ds, AES64DS>; 163def : PatGprGpr<int_riscv_aes64dsm, AES64DSM>; 164def : PatGpr<int_riscv_aes64im, AES64IM>; 165} // Predicates = [HasStdExtZknd, IsRV64] 166 167let Predicates = [HasStdExtZkndOrZkne, IsRV64] in { 168def : PatGprGpr<int_riscv_aes64ks2, AES64KS2>; 169def : Pat<(int_riscv_aes64ks1i GPR:$rs1, rnum:$rnum), 170 (AES64KS1I GPR:$rs1, rnum:$rnum)>; 171} // Predicates = [HasStdExtZkndOrZkne, IsRV64] 172 173// Zkne 174let Predicates = [HasStdExtZkne, IsRV32] in { 175def : PatGprGprByteSelect<int_riscv_aes32esi, AES32ESI>; 176def : PatGprGprByteSelect<int_riscv_aes32esmi, AES32ESMI>; 177} // Predicates = [HasStdExtZkne, IsRV32] 178 179let Predicates = [HasStdExtZkne, IsRV64] in { 180def : PatGprGpr<int_riscv_aes64es, AES64ES>; 181def : PatGprGpr<int_riscv_aes64esm, AES64ESM>; 182} // Predicates = [HasStdExtZkne, IsRV64] 183 184// Zknh 185let Predicates = [HasStdExtZknh] in { 186def : PatGpr<riscv_sha256sig0, SHA256SIG0>; 187def : PatGpr<riscv_sha256sig1, SHA256SIG1>; 188def : PatGpr<riscv_sha256sum0, SHA256SUM0>; 189def : PatGpr<riscv_sha256sum1, SHA256SUM1>; 190} // Predicates = [HasStdExtZknh] 191 192let Predicates = [HasStdExtZknh, IsRV32] in { 193def : PatGprGpr<int_riscv_sha512sig0l, SHA512SIG0L>; 194def : PatGprGpr<int_riscv_sha512sig0h, SHA512SIG0H>; 195def : PatGprGpr<int_riscv_sha512sig1l, SHA512SIG1L>; 196def : PatGprGpr<int_riscv_sha512sig1h, SHA512SIG1H>; 197def : PatGprGpr<int_riscv_sha512sum0r, SHA512SUM0R>; 198def : PatGprGpr<int_riscv_sha512sum1r, SHA512SUM1R>; 199} // Predicates = [HasStdExtZknh, IsRV32] 200 201let Predicates = [HasStdExtZknh, IsRV64] in { 202def : PatGpr<int_riscv_sha512sig0, SHA512SIG0>; 203def : PatGpr<int_riscv_sha512sig1, SHA512SIG1>; 204def : PatGpr<int_riscv_sha512sum0, SHA512SUM0>; 205def : PatGpr<int_riscv_sha512sum1, SHA512SUM1>; 206} // Predicates = [HasStdExtZknh, IsRV64] 207 208// Zksed 209let Predicates = [HasStdExtZksed] in { 210def : PatGprGprByteSelect<riscv_sm4ks, SM4KS>; 211def : PatGprGprByteSelect<riscv_sm4ed, SM4ED>; 212} // Predicates = [HasStdExtZksed] 213 214// Zksh 215let Predicates = [HasStdExtZksh] in { 216def : PatGpr<riscv_sm3p0, SM3P0>; 217def : PatGpr<riscv_sm3p1, SM3P1>; 218} // Predicates = [HasStdExtZksh] 219