1*0fca6ea1SDimitry Andric//===-- RISCVInstrInfoZvk.td - RISC-V 'Zvk' instructions ---*- tablegen -*-===// 206c3fb27SDimitry Andric// 306c3fb27SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric// 706c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric// 906c3fb27SDimitry Andric// This file describes the RISC-V instructions from the standard 'Zvk', 10cb14a3feSDimitry Andric// Vector Cryptography Instructions extension, version Release 1.0.0. 1106c3fb27SDimitry Andric// 1206c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 1306c3fb27SDimitry Andric 1406c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 1506c3fb27SDimitry Andric// Operand and SDNode transformation definitions. 1606c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 1706c3fb27SDimitry Andric 18*0fca6ea1SDimitry Andricdef tuimm5 : RISCVOp, TImmLeaf<XLenVT, [{return isUInt<5>(Imm);}]>; 1906c3fb27SDimitry Andric 2006c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 2106c3fb27SDimitry Andric// Instruction class templates 2206c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 2306c3fb27SDimitry Andric 2406c3fb27SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { 2506c3fb27SDimitry Andricmulticlass VCLMUL_MV_V_X<string opcodestr, bits<6> funct6> { 2606c3fb27SDimitry Andric def V : VALUVV<funct6, OPMVV, opcodestr # "." # "vv">, 27*0fca6ea1SDimitry Andric SchedBinaryMC<"WriteVCLMULV", "ReadVCLMULV", "ReadVCLMULV">; 2806c3fb27SDimitry Andric def X : VALUVX<funct6, OPMVX, opcodestr # "." # "vx">, 29*0fca6ea1SDimitry Andric SchedBinaryMC<"WriteVCLMULX", "ReadVCLMULV", "ReadVCLMULX">; 3006c3fb27SDimitry Andric} 3106c3fb27SDimitry Andric 3206c3fb27SDimitry Andricclass RVInstIVI_VROR<bits<6> funct6, dag outs, dag ins, string opcodestr, 3306c3fb27SDimitry Andric string argstr> 3406c3fb27SDimitry Andric : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> { 3506c3fb27SDimitry Andric bits<5> vs2; 3606c3fb27SDimitry Andric bits<6> imm; 3706c3fb27SDimitry Andric bits<5> vd; 3806c3fb27SDimitry Andric bit vm; 3906c3fb27SDimitry Andric 4006c3fb27SDimitry Andric let Inst{31-27} = funct6{5-1}; 4106c3fb27SDimitry Andric let Inst{26} = imm{5}; 4206c3fb27SDimitry Andric let Inst{25} = vm; 4306c3fb27SDimitry Andric let Inst{24-20} = vs2; 4406c3fb27SDimitry Andric let Inst{19-15} = imm{4-0}; 4506c3fb27SDimitry Andric let Inst{14-12} = OPIVI.Value; 4606c3fb27SDimitry Andric let Inst{11-7} = vd; 4706c3fb27SDimitry Andric let Inst{6-0} = OPC_OP_V.Value; 4806c3fb27SDimitry Andric 4906c3fb27SDimitry Andric let Uses = [VTYPE, VL]; 5006c3fb27SDimitry Andric let RVVConstraint = VMConstraint; 5106c3fb27SDimitry Andric} 5206c3fb27SDimitry Andric 5306c3fb27SDimitry Andricmulticlass VROR_IV_V_X_I<string opcodestr, bits<6> funct6> 5406c3fb27SDimitry Andric : VALU_IV_V_X<opcodestr, funct6> { 5506c3fb27SDimitry Andric def I : RVInstIVI_VROR<funct6, (outs VR:$vd), 5606c3fb27SDimitry Andric (ins VR:$vs2, uimm6:$imm, VMaskOp:$vm), 5706c3fb27SDimitry Andric opcodestr # ".vi", "$vd, $vs2, $imm$vm">, 58*0fca6ea1SDimitry Andric SchedUnaryMC<"WriteVRotI", "ReadVRotV">; 5906c3fb27SDimitry Andric} 6006c3fb27SDimitry Andric 6106c3fb27SDimitry Andric// op vd, vs2, vs1 6206c3fb27SDimitry Andricclass PALUVVNoVm<bits<6> funct6, RISCVVFormat opv, string opcodestr> 6306c3fb27SDimitry Andric : VALUVVNoVm<funct6, opv, opcodestr> { 64*0fca6ea1SDimitry Andric let Inst{6-0} = OPC_OP_VE.Value; 6506c3fb27SDimitry Andric} 6606c3fb27SDimitry Andric 67*0fca6ea1SDimitry Andric// op vd, vs2, vs1 68*0fca6ea1SDimitry Andricclass PALUVVNoVmTernary<bits<6> funct6, RISCVVFormat opv, string opcodestr> 69*0fca6ea1SDimitry Andric : RVInstVV<funct6, opv, (outs VR:$vd_wb), 70*0fca6ea1SDimitry Andric (ins VR:$vd, VR:$vs2, VR:$vs1), 71*0fca6ea1SDimitry Andric opcodestr, "$vd, $vs2, $vs1"> { 72*0fca6ea1SDimitry Andric let Constraints = "$vd = $vd_wb"; 73*0fca6ea1SDimitry Andric let vm = 1; 74*0fca6ea1SDimitry Andric let Inst{6-0} = OPC_OP_VE.Value; 75*0fca6ea1SDimitry Andric} 76*0fca6ea1SDimitry Andric 77*0fca6ea1SDimitry Andric// op vd, vs2, imm 78*0fca6ea1SDimitry Andricclass PALUVINoVm<bits<6> funct6, string opcodestr, Operand optype> 7906c3fb27SDimitry Andric : VALUVINoVm<funct6, opcodestr, optype> { 80*0fca6ea1SDimitry Andric let Inst{6-0} = OPC_OP_VE.Value; 8106c3fb27SDimitry Andric let Inst{14-12} = OPMVV.Value; 8206c3fb27SDimitry Andric} 8306c3fb27SDimitry Andric 84*0fca6ea1SDimitry Andric// op vd, vs2, imm where vd is also a source regardless of tail policy 85*0fca6ea1SDimitry Andricclass PALUVINoVmBinary<bits<6> funct6, string opcodestr, Operand optype> 86*0fca6ea1SDimitry Andric : RVInstIVI<funct6, (outs VR:$vd_wb), 87*0fca6ea1SDimitry Andric (ins VR:$vd, VR:$vs2, optype:$imm), 88*0fca6ea1SDimitry Andric opcodestr, "$vd, $vs2, $imm"> { 89*0fca6ea1SDimitry Andric let Constraints = "$vd = $vd_wb"; 90*0fca6ea1SDimitry Andric let vm = 1; 91*0fca6ea1SDimitry Andric let Inst{6-0} = OPC_OP_VE.Value; 92*0fca6ea1SDimitry Andric let Inst{14-12} = OPMVV.Value; 93*0fca6ea1SDimitry Andric} 94*0fca6ea1SDimitry Andric 95*0fca6ea1SDimitry Andric// op vd, vs2 (use vs1 as instruction encoding) where vd is also a source 96*0fca6ea1SDimitry Andric// regardless of tail policy 97*0fca6ea1SDimitry Andricclass PALUVs2NoVmBinary<bits<6> funct6, bits<5> vs1, RISCVVFormat opv, 98*0fca6ea1SDimitry Andric string opcodestr> 99*0fca6ea1SDimitry Andric : RVInstV<funct6, vs1, opv, (outs VR:$vd_wb), (ins VR:$vd, VR:$vs2), 100*0fca6ea1SDimitry Andric opcodestr, "$vd, $vs2"> { 101*0fca6ea1SDimitry Andric let Constraints = "$vd = $vd_wb"; 102*0fca6ea1SDimitry Andric let vm = 1; 103*0fca6ea1SDimitry Andric let Inst{6-0} = OPC_OP_VE.Value; 10406c3fb27SDimitry Andric} 10506c3fb27SDimitry Andric 10606c3fb27SDimitry Andricmulticlass VAES_MV_V_S<bits<6> funct6_vv, bits<6> funct6_vs, bits<5> vs1, 10706c3fb27SDimitry Andric RISCVVFormat opv, string opcodestr> { 108*0fca6ea1SDimitry Andric let RVVConstraint = NoConstraint in 109*0fca6ea1SDimitry Andric def NAME # _VV : PALUVs2NoVmBinary<funct6_vv, vs1, opv, opcodestr # ".vv">, 110*0fca6ea1SDimitry Andric SchedBinaryMC<"WriteVAESMVV", "ReadVAESMVV", "ReadVAESMVV">; 111*0fca6ea1SDimitry Andric let RVVConstraint = VS2Constraint in 112*0fca6ea1SDimitry Andric def NAME # _VS : PALUVs2NoVmBinary<funct6_vs, vs1, opv, opcodestr # ".vs">, 113*0fca6ea1SDimitry Andric SchedBinaryMC<"WriteVAESMVV", "ReadVAESMVV", "ReadVAESMVV">; 11406c3fb27SDimitry Andric} 11506c3fb27SDimitry Andric} // hasSideEffects = 0, mayLoad = 0, mayStore = 0 11606c3fb27SDimitry Andric 11706c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 11806c3fb27SDimitry Andric// Instructions 11906c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 12006c3fb27SDimitry Andric 12106c3fb27SDimitry Andriclet Predicates = [HasStdExtZvbb] in { 12206c3fb27SDimitry Andric def VBREV_V : VALUVs2<0b010010, 0b01010, OPMVV, "vbrev.v">; 12306c3fb27SDimitry Andric def VCLZ_V : VALUVs2<0b010010, 0b01100, OPMVV, "vclz.v">; 12406c3fb27SDimitry Andric def VCPOP_V : VALUVs2<0b010010, 0b01110, OPMVV, "vcpop.v">; 12506c3fb27SDimitry Andric def VCTZ_V : VALUVs2<0b010010, 0b01101, OPMVV, "vctz.v">; 12606c3fb27SDimitry Andric let Constraints = "@earlyclobber $vd", RVVConstraint = WidenV in 12706c3fb27SDimitry Andric defm VWSLL_V : VSHT_IV_V_X_I<"vwsll", 0b110101>; 12806c3fb27SDimitry Andric} // Predicates = [HasStdExtZvbb] 12906c3fb27SDimitry Andric 13006c3fb27SDimitry Andriclet Predicates = [HasStdExtZvbc] in { 13106c3fb27SDimitry Andric defm VCLMUL_V : VCLMUL_MV_V_X<"vclmul", 0b001100>; 13206c3fb27SDimitry Andric defm VCLMULH_V : VCLMUL_MV_V_X<"vclmulh", 0b001101>; 13306c3fb27SDimitry Andric} // Predicates = [HasStdExtZvbc] 13406c3fb27SDimitry Andric 1355f757f3fSDimitry Andriclet Predicates = [HasStdExtZvkb] in { 1365f757f3fSDimitry Andric defm VANDN_V : VALU_IV_V_X<"vandn", 0b000001>; 1375f757f3fSDimitry Andric def VBREV8_V : VALUVs2<0b010010, 0b01000, OPMVV, "vbrev8.v">; 1385f757f3fSDimitry Andric def VREV8_V : VALUVs2<0b010010, 0b01001, OPMVV, "vrev8.v">; 1395f757f3fSDimitry Andric defm VROL_V : VALU_IV_V_X<"vrol", 0b010101>; 1405f757f3fSDimitry Andric defm VROR_V : VROR_IV_V_X_I<"vror", 0b010100>; 1415f757f3fSDimitry Andric} // Predicates = [HasStdExtZvkb] 1425f757f3fSDimitry Andric 14306c3fb27SDimitry Andriclet Predicates = [HasStdExtZvkg], RVVConstraint = NoConstraint in { 144*0fca6ea1SDimitry Andric def VGHSH_VV : PALUVVNoVmTernary<0b101100, OPMVV, "vghsh.vv">, 145*0fca6ea1SDimitry Andric SchedTernaryMC<"WriteVGHSHV", "ReadVGHSHV", "ReadVGHSHV", 146*0fca6ea1SDimitry Andric "ReadVGHSHV">; 147*0fca6ea1SDimitry Andric def VGMUL_VV : PALUVs2NoVmBinary<0b101000, 0b10001, OPMVV, "vgmul.vv">, 148*0fca6ea1SDimitry Andric SchedBinaryMC<"WriteVGMULV", "ReadVGMULV", "ReadVGMULV">; 14906c3fb27SDimitry Andric} // Predicates = [HasStdExtZvkg] 15006c3fb27SDimitry Andric 151*0fca6ea1SDimitry Andriclet Predicates = [HasStdExtZvknhaOrZvknhb], RVVConstraint = Sha2Constraint in { 152*0fca6ea1SDimitry Andric def VSHA2CH_VV : PALUVVNoVmTernary<0b101110, OPMVV, "vsha2ch.vv">, 153*0fca6ea1SDimitry Andric SchedTernaryMC<"WriteVSHA2CHV", "ReadVSHA2CHV", "ReadVSHA2CHV", 154*0fca6ea1SDimitry Andric "ReadVSHA2CHV">; 155*0fca6ea1SDimitry Andric def VSHA2CL_VV : PALUVVNoVmTernary<0b101111, OPMVV, "vsha2cl.vv">, 156*0fca6ea1SDimitry Andric SchedTernaryMC<"WriteVSHA2CLV", "ReadVSHA2CLV", "ReadVSHA2CLV", 157*0fca6ea1SDimitry Andric "ReadVSHA2CLV">; 158*0fca6ea1SDimitry Andric def VSHA2MS_VV : PALUVVNoVmTernary<0b101101, OPMVV, "vsha2ms.vv">, 159*0fca6ea1SDimitry Andric SchedTernaryMC<"WriteVSHA2MSV", "ReadVSHA2MSV", "ReadVSHA2MSV", 160*0fca6ea1SDimitry Andric "ReadVSHA2MSV">; 1615f757f3fSDimitry Andric} // Predicates = [HasStdExtZvknhaOrZvknhb] 16206c3fb27SDimitry Andric 163*0fca6ea1SDimitry Andriclet Predicates = [HasStdExtZvkned] in { 16406c3fb27SDimitry Andric defm VAESDF : VAES_MV_V_S<0b101000, 0b101001, 0b00001, OPMVV, "vaesdf">; 16506c3fb27SDimitry Andric defm VAESDM : VAES_MV_V_S<0b101000, 0b101001, 0b00000, OPMVV, "vaesdm">; 16606c3fb27SDimitry Andric defm VAESEF : VAES_MV_V_S<0b101000, 0b101001, 0b00011, OPMVV, "vaesef">; 16706c3fb27SDimitry Andric defm VAESEM : VAES_MV_V_S<0b101000, 0b101001, 0b00010, OPMVV, "vaesem">; 168*0fca6ea1SDimitry Andric def VAESKF1_VI : PALUVINoVm<0b100010, "vaeskf1.vi", uimm5>, 169*0fca6ea1SDimitry Andric SchedUnaryMC<"WriteVAESKF1V", "ReadVAESKF1V">; 170*0fca6ea1SDimitry Andric def VAESKF2_VI : PALUVINoVmBinary<0b101010, "vaeskf2.vi", uimm5>, 171*0fca6ea1SDimitry Andric SchedBinaryMC<"WriteVAESKF2V", "ReadVAESKF2V", "ReadVAESKF2V">; 172*0fca6ea1SDimitry Andric let RVVConstraint = VS2Constraint in 173*0fca6ea1SDimitry Andric def VAESZ_VS : PALUVs2NoVmBinary<0b101001, 0b00111, OPMVV, "vaesz.vs">, 174*0fca6ea1SDimitry Andric SchedBinaryMC<"WriteVAESZV", "ReadVAESZV", "ReadVAESZV">; 17506c3fb27SDimitry Andric} // Predicates = [HasStdExtZvkned] 17606c3fb27SDimitry Andric 177*0fca6ea1SDimitry Andriclet Predicates = [HasStdExtZvksed] in { 178*0fca6ea1SDimitry Andric let RVVConstraint = NoConstraint in 179*0fca6ea1SDimitry Andric def VSM4K_VI : PALUVINoVm<0b100001, "vsm4k.vi", uimm5>, 180*0fca6ea1SDimitry Andric SchedUnaryMC<"WriteVSM4KV", "ReadVSM4KV">; 18106c3fb27SDimitry Andric defm VSM4R : VAES_MV_V_S<0b101000, 0b101001, 0b10000, OPMVV, "vsm4r">; 18206c3fb27SDimitry Andric} // Predicates = [HasStdExtZvksed] 18306c3fb27SDimitry Andric 184*0fca6ea1SDimitry Andriclet Predicates = [HasStdExtZvksh], RVVConstraint = VS2Constraint in { 185*0fca6ea1SDimitry Andric def VSM3C_VI : PALUVINoVmBinary<0b101011, "vsm3c.vi", uimm5>, 186*0fca6ea1SDimitry Andric SchedBinaryMC<"WriteVSM3CV", "ReadVSM3CV", "ReadVSM3CV">; 187*0fca6ea1SDimitry Andric def VSM3ME_VV : PALUVVNoVm<0b100000, OPMVV, "vsm3me.vv">, 188*0fca6ea1SDimitry Andric SchedUnaryMC<"WriteVSM3MEV", "ReadVSM3MEV">; 18906c3fb27SDimitry Andric} // Predicates = [HasStdExtZvksh] 19006c3fb27SDimitry Andric 19106c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 19206c3fb27SDimitry Andric// Pseudo instructions 19306c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 19406c3fb27SDimitry Andric 1955f757f3fSDimitry Andricdefvar I32IntegerVectors = !filter(vti, AllIntegerVectors, !eq(vti.SEW, 32)); 1965f757f3fSDimitry Andricdefvar I32I64IntegerVectors = !filter(vti, AllIntegerVectors, 1975f757f3fSDimitry Andric !or(!eq(vti.SEW, 32), !eq(vti.SEW, 64))); 19806c3fb27SDimitry Andric 1995f757f3fSDimitry Andricclass ZvkI32IntegerVectors<string vd_lmul> { 2005f757f3fSDimitry Andric list<VTypeInfo> vs2_types = !cond(!eq(vd_lmul, "M8") : !filter(vti, I32IntegerVectors, !le(vti.LMul.octuple, 32)), 2015f757f3fSDimitry Andric !eq(vd_lmul, "M4") : !filter(vti, I32IntegerVectors, !le(vti.LMul.octuple, 32)), 2025f757f3fSDimitry Andric !eq(vd_lmul, "M2") : !filter(vti, I32IntegerVectors, !le(vti.LMul.octuple, 16)), 2035f757f3fSDimitry Andric !eq(vd_lmul, "M1") : !filter(vti, I32IntegerVectors, !le(vti.LMul.octuple, 8)), 2045f757f3fSDimitry Andric !eq(vd_lmul, "MF2") : !filter(vti, I32IntegerVectors, !le(vti.LMul.octuple, 4)), 2055f757f3fSDimitry Andric !eq(vd_lmul, "MF4") : !filter(vti, I32IntegerVectors, !le(vti.LMul.octuple, 2)), 2065f757f3fSDimitry Andric !eq(vd_lmul, "MF8") : !filter(vti, I32IntegerVectors, !le(vti.LMul.octuple, 1))); 2075f757f3fSDimitry Andric} 2085f757f3fSDimitry Andric 2095f757f3fSDimitry Andricclass ZvkMxSet<string vd_lmul> { 2105f757f3fSDimitry Andric list<LMULInfo> vs2_lmuls = !cond(!eq(vd_lmul, "M8") : [V_MF8, V_MF4, V_MF2, V_M1, V_M2, V_M4], 2115f757f3fSDimitry Andric !eq(vd_lmul, "M4") : [V_MF8, V_MF4, V_MF2, V_M1, V_M2, V_M4], 2125f757f3fSDimitry Andric !eq(vd_lmul, "M2") : [V_MF8, V_MF4, V_MF2, V_M1, V_M2], 2135f757f3fSDimitry Andric !eq(vd_lmul, "M1") : [V_MF8, V_MF4, V_MF2, V_M1], 2145f757f3fSDimitry Andric !eq(vd_lmul, "MF2") : [V_MF8, V_MF4, V_MF2], 2155f757f3fSDimitry Andric !eq(vd_lmul, "MF4") : [V_MF8, V_MF4], 2165f757f3fSDimitry Andric !eq(vd_lmul, "MF8") : [V_MF8]); 2175f757f3fSDimitry Andric} 2185f757f3fSDimitry Andric 219*0fca6ea1SDimitry Andricclass VPseudoBinaryNoMask_Zvk<DAGOperand RetClass, VReg OpClass> : 220*0fca6ea1SDimitry Andric Pseudo<(outs RetClass:$rd_wb), 221*0fca6ea1SDimitry Andric (ins RetClass:$rd, OpClass:$rs2, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), []>, 2225f757f3fSDimitry Andric RISCVVPseudo { 2235f757f3fSDimitry Andric let mayLoad = 0; 2245f757f3fSDimitry Andric let mayStore = 0; 2255f757f3fSDimitry Andric let hasSideEffects = 0; 226*0fca6ea1SDimitry Andric let Constraints = "$rd_wb = $rd"; 2275f757f3fSDimitry Andric let HasVLOp = 1; 2285f757f3fSDimitry Andric let HasSEWOp = 1; 2295f757f3fSDimitry Andric let HasVecPolicyOp = 1; 2305f757f3fSDimitry Andric let BaseInstr = !cast<Instruction>(PseudoToVInst<NAME>.VInst); 2315f757f3fSDimitry Andric} 2325f757f3fSDimitry Andric 233*0fca6ea1SDimitry Andricclass VPseudoTernaryNoMask_Zvk<VReg RetClass, 2345f757f3fSDimitry Andric VReg Op1Class, 235*0fca6ea1SDimitry Andric DAGOperand Op2Class> : 236*0fca6ea1SDimitry Andric Pseudo<(outs RetClass:$rd_wb), 237*0fca6ea1SDimitry Andric (ins RetClass:$rd, Op1Class:$rs2, Op2Class:$rs1, 2385f757f3fSDimitry Andric AVL:$vl, ixlenimm:$sew, ixlenimm:$policy), []>, 2395f757f3fSDimitry Andric RISCVVPseudo { 2405f757f3fSDimitry Andric let mayLoad = 0; 2415f757f3fSDimitry Andric let mayStore = 0; 2425f757f3fSDimitry Andric let hasSideEffects = 0; 243*0fca6ea1SDimitry Andric let Constraints = "$rd_wb = $rd"; 2445f757f3fSDimitry Andric let HasVLOp = 1; 2455f757f3fSDimitry Andric let HasSEWOp = 1; 2465f757f3fSDimitry Andric let HasVecPolicyOp = 1; 2475f757f3fSDimitry Andric let BaseInstr = !cast<Instruction>(PseudoToVInst<NAME>.VInst); 2485f757f3fSDimitry Andric} 2495f757f3fSDimitry Andric 250*0fca6ea1SDimitry Andricmulticlass VPseudoBinaryNoMaskPolicy_Zvk<VReg RetClass, 2515f757f3fSDimitry Andric VReg Op1Class, 2525f757f3fSDimitry Andric DAGOperand Op2Class, 2535f757f3fSDimitry Andric LMULInfo MInfo, 2545f757f3fSDimitry Andric string Constraint = ""> { 255*0fca6ea1SDimitry Andric let VLMul = MInfo.value in { 256*0fca6ea1SDimitry Andric def "_" # MInfo.MX : VPseudoBinaryNoMaskPolicy<RetClass, Op1Class, Op2Class, 2575f757f3fSDimitry Andric Constraint>; 2585f757f3fSDimitry Andric } 259*0fca6ea1SDimitry Andric} 2605f757f3fSDimitry Andric 261*0fca6ea1SDimitry Andricmulticlass VPseudoTernaryNoMask_Zvk<VReg RetClass, 262*0fca6ea1SDimitry Andric VReg Op1Class, 263*0fca6ea1SDimitry Andric DAGOperand Op2Class, 264*0fca6ea1SDimitry Andric LMULInfo MInfo> { 265*0fca6ea1SDimitry Andric let VLMul = MInfo.value in 266*0fca6ea1SDimitry Andric def "_" # MInfo.MX : VPseudoTernaryNoMask_Zvk<RetClass, Op1Class, Op2Class>; 267*0fca6ea1SDimitry Andric} 268*0fca6ea1SDimitry Andric 269*0fca6ea1SDimitry Andricmulticlass VPseudoBinaryV_V_NoMask_Zvk<LMULInfo m> { 27006c3fb27SDimitry Andric let VLMul = m.value in { 271*0fca6ea1SDimitry Andric def "_VV_" # m.MX : VPseudoBinaryNoMask_Zvk<m.vrclass, m.vrclass>; 2725f757f3fSDimitry Andric } 2735f757f3fSDimitry Andric} 2745f757f3fSDimitry Andric 275*0fca6ea1SDimitry Andricmulticlass VPseudoBinaryV_S_NoMask_Zvk<LMULInfo m> { 2765f757f3fSDimitry Andric let VLMul = m.value in 2775f757f3fSDimitry Andric foreach vs2_lmul = ZvkMxSet<m.MX>.vs2_lmuls in 278*0fca6ea1SDimitry Andric def "_VS_" # m.MX # "_" # vs2_lmul.MX : VPseudoBinaryNoMask_Zvk<m.vrclass, vs2_lmul.vrclass>; 2795f757f3fSDimitry Andric} 2805f757f3fSDimitry Andric 281*0fca6ea1SDimitry Andricmulticlass VPseudoVGMUL { 2825f757f3fSDimitry Andric foreach m = MxListVF4 in { 2835f757f3fSDimitry Andric defvar mx = m.MX; 284*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_V_NoMask_Zvk<m>, 285*0fca6ea1SDimitry Andric SchedBinary<"WriteVGMULV", "ReadVGMULV", "ReadVGMULV", mx>; 2865f757f3fSDimitry Andric } 2875f757f3fSDimitry Andric} 2885f757f3fSDimitry Andric 289*0fca6ea1SDimitry Andricmulticlass VPseudoVAESMV { 2905f757f3fSDimitry Andric foreach m = MxListVF4 in { 2915f757f3fSDimitry Andric defvar mx = m.MX; 292*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_V_NoMask_Zvk<m>, 293*0fca6ea1SDimitry Andric SchedBinary<"WriteVAESMVV", "ReadVAESMVV", "ReadVAESMVV", mx>; 294*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_S_NoMask_Zvk<m>, 295*0fca6ea1SDimitry Andric SchedBinary<"WriteVAESMVV", "ReadVAESMVV", "ReadVAESMVV", mx>; 2965f757f3fSDimitry Andric 2975f757f3fSDimitry Andric } 2985f757f3fSDimitry Andric} 2995f757f3fSDimitry Andric 300*0fca6ea1SDimitry Andricmulticlass VPseudoVSM4R { 3015f757f3fSDimitry Andric foreach m = MxListVF4 in { 3025f757f3fSDimitry Andric defvar mx = m.MX; 303*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_V_NoMask_Zvk<m>, 304*0fca6ea1SDimitry Andric SchedBinary<"WriteVSM4RV", "ReadVSM4RV", "ReadVSM4RV", mx>; 305*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_S_NoMask_Zvk<m>, 306*0fca6ea1SDimitry Andric SchedBinary<"WriteVSM4RV", "ReadVSM4RV", "ReadVSM4RV", mx>; 3075f757f3fSDimitry Andric 3085f757f3fSDimitry Andric } 3095f757f3fSDimitry Andric} 3105f757f3fSDimitry Andric 311*0fca6ea1SDimitry Andricmulticlass VPseudoVGHSH { 3125f757f3fSDimitry Andric foreach m = MxListVF4 in { 3135f757f3fSDimitry Andric defvar mx = m.MX; 314*0fca6ea1SDimitry Andric defm _VV : VPseudoTernaryNoMask_Zvk<m.vrclass, m.vrclass, m.vrclass, m>, 315*0fca6ea1SDimitry Andric SchedTernary<"WriteVGHSHV", "ReadVGHSHV", "ReadVGHSHV", 316*0fca6ea1SDimitry Andric "ReadVGHSHV", mx>; 3175f757f3fSDimitry Andric } 3185f757f3fSDimitry Andric} 3195f757f3fSDimitry Andric 320*0fca6ea1SDimitry Andricmulticlass VPseudoVSHA2CH { 3215f757f3fSDimitry Andric foreach m = MxListVF4 in { 3225f757f3fSDimitry Andric defvar mx = m.MX; 323*0fca6ea1SDimitry Andric defm _VV : VPseudoTernaryNoMask_Zvk<m.vrclass, m.vrclass, m.vrclass, m>, 324*0fca6ea1SDimitry Andric SchedTernary<"WriteVSHA2CHV", "ReadVSHA2CHV", "ReadVSHA2CHV", 325*0fca6ea1SDimitry Andric "ReadVSHA2CHV", mx>; 3265f757f3fSDimitry Andric } 3275f757f3fSDimitry Andric} 3285f757f3fSDimitry Andric 329*0fca6ea1SDimitry Andricmulticlass VPseudoVSHA2CL { 3305f757f3fSDimitry Andric foreach m = MxListVF4 in { 3315f757f3fSDimitry Andric defvar mx = m.MX; 332*0fca6ea1SDimitry Andric defm _VV : VPseudoTernaryNoMask_Zvk<m.vrclass, m.vrclass, m.vrclass, m>, 333*0fca6ea1SDimitry Andric SchedTernary<"WriteVSHA2CLV", "ReadVSHA2CLV", "ReadVSHA2CLV", 334*0fca6ea1SDimitry Andric "ReadVSHA2CLV", mx>; 335*0fca6ea1SDimitry Andric } 336*0fca6ea1SDimitry Andric} 3375f757f3fSDimitry Andric 338*0fca6ea1SDimitry Andricmulticlass VPseudoVSHA2MS { 339*0fca6ea1SDimitry Andric foreach m = MxListVF4 in { 340*0fca6ea1SDimitry Andric defvar mx = m.MX; 341*0fca6ea1SDimitry Andric defm _VV : VPseudoTernaryNoMask_Zvk<m.vrclass, m.vrclass, m.vrclass, m>, 342*0fca6ea1SDimitry Andric SchedTernary<"WriteVSHA2MSV", "ReadVSHA2MSV", "ReadVSHA2MSV", 343*0fca6ea1SDimitry Andric "ReadVSHA2MSV", mx>; 344*0fca6ea1SDimitry Andric } 345*0fca6ea1SDimitry Andric} 346*0fca6ea1SDimitry Andric 347*0fca6ea1SDimitry Andricmulticlass VPseudoVAESKF1 { 348*0fca6ea1SDimitry Andric foreach m = MxListVF4 in { 349*0fca6ea1SDimitry Andric defvar mx = m.MX; 350*0fca6ea1SDimitry Andric defm _VI : VPseudoBinaryNoMaskPolicy_Zvk<m.vrclass, m.vrclass, uimm5, m>, 351*0fca6ea1SDimitry Andric SchedBinary<"WriteVAESKF1V", "ReadVAESKF1V", "ReadVAESKF1V", mx, 352*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 353*0fca6ea1SDimitry Andric } 354*0fca6ea1SDimitry Andric} 355*0fca6ea1SDimitry Andric 356*0fca6ea1SDimitry Andricmulticlass VPseudoVAESKF2 { 357*0fca6ea1SDimitry Andric foreach m = MxListVF4 in { 358*0fca6ea1SDimitry Andric defvar mx = m.MX; 359*0fca6ea1SDimitry Andric defm _VI : VPseudoTernaryNoMask_Zvk<m.vrclass, m.vrclass, uimm5, m>, 360*0fca6ea1SDimitry Andric SchedTernary<"WriteVAESKF2V", "ReadVAESKF2V", "ReadVAESKF2V", 361*0fca6ea1SDimitry Andric "ReadVAESKF2V", mx>; 362*0fca6ea1SDimitry Andric } 363*0fca6ea1SDimitry Andric} 364*0fca6ea1SDimitry Andric 365*0fca6ea1SDimitry Andricmulticlass VPseudoVAESZ { 366*0fca6ea1SDimitry Andric foreach m = MxListVF4 in { 367*0fca6ea1SDimitry Andric defvar mx = m.MX; 368*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_S_NoMask_Zvk<m>, 369*0fca6ea1SDimitry Andric SchedBinary<"WriteVAESZV", "ReadVAESZV", "ReadVAESZV", mx>; 370*0fca6ea1SDimitry Andric } 371*0fca6ea1SDimitry Andric} 372*0fca6ea1SDimitry Andric 373*0fca6ea1SDimitry Andricmulticlass VPseudoVSM3C { 374*0fca6ea1SDimitry Andric foreach m = MxListVF4 in { 375*0fca6ea1SDimitry Andric defvar mx = m.MX; 376*0fca6ea1SDimitry Andric defm _VI : VPseudoTernaryNoMask_Zvk<m.vrclass, m.vrclass, uimm5, m>, 377*0fca6ea1SDimitry Andric SchedTernary<"WriteVSM3CV", "ReadVSM3CV", "ReadVSM3CV", 378*0fca6ea1SDimitry Andric "ReadVSM3CV", mx>; 379*0fca6ea1SDimitry Andric } 380*0fca6ea1SDimitry Andric} 381*0fca6ea1SDimitry Andric 382*0fca6ea1SDimitry Andricmulticlass VPseudoVSM4K { 383*0fca6ea1SDimitry Andric foreach m = MxListVF4 in { 384*0fca6ea1SDimitry Andric defvar mx = m.MX; 385*0fca6ea1SDimitry Andric defm _VI : VPseudoBinaryNoMaskPolicy_Zvk<m.vrclass, m.vrclass, uimm5, m>, 386*0fca6ea1SDimitry Andric SchedBinary<"WriteVSM4KV", "ReadVSM4KV", "ReadVSM4KV", mx, 387*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 388*0fca6ea1SDimitry Andric } 389*0fca6ea1SDimitry Andric} 390*0fca6ea1SDimitry Andric 391*0fca6ea1SDimitry Andricmulticlass VPseudoVSM3ME { 392*0fca6ea1SDimitry Andric foreach m = MxListVF4 in { 393*0fca6ea1SDimitry Andric defvar mx = m.MX; 394*0fca6ea1SDimitry Andric defm _VV : VPseudoBinaryNoMaskPolicy_Zvk<m.vrclass, m.vrclass, m.vrclass, m>, 395*0fca6ea1SDimitry Andric SchedBinary<"WriteVSM3MEV", "ReadVSM3MEV", "ReadVSM3MEV", mx, 396*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 3975f757f3fSDimitry Andric } 3985f757f3fSDimitry Andric} 3995f757f3fSDimitry Andric 4005f757f3fSDimitry Andricmulticlass VPseudoVCLMUL_VV_VX { 4015f757f3fSDimitry Andric foreach m = MxList in { 4025f757f3fSDimitry Andric defvar mx = m.MX; 4035f757f3fSDimitry Andric defm "" : VPseudoBinaryV_VV<m>, 404*0fca6ea1SDimitry Andric SchedBinary<"WriteVCLMULV", "ReadVCLMULV", "ReadVCLMULV", mx, 405*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 4065f757f3fSDimitry Andric defm "" : VPseudoBinaryV_VX<m>, 407*0fca6ea1SDimitry Andric SchedBinary<"WriteVCLMULX", "ReadVCLMULV", "ReadVCLMULX", mx, 408*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 4095f757f3fSDimitry Andric } 4105f757f3fSDimitry Andric} 4115f757f3fSDimitry Andric 4125f757f3fSDimitry Andricmulticlass VPseudoUnaryV_V<LMULInfo m> { 4135f757f3fSDimitry Andric let VLMul = m.value in { 4145f757f3fSDimitry Andric defvar suffix = "_V_" # m.MX; 4155f757f3fSDimitry Andric def suffix : VPseudoUnaryNoMask<m.vrclass, m.vrclass>; 4165f757f3fSDimitry Andric def suffix # "_MASK" : VPseudoUnaryMask<m.vrclass, m.vrclass>, 41706c3fb27SDimitry Andric RISCVMaskedPseudo<MaskIdx=2>; 41806c3fb27SDimitry Andric } 41906c3fb27SDimitry Andric} 4205f757f3fSDimitry Andric 421*0fca6ea1SDimitry Andricmulticlass VPseudoVBREV { 4225f757f3fSDimitry Andric foreach m = MxList in { 4235f757f3fSDimitry Andric defvar mx = m.MX; 4245f757f3fSDimitry Andric defm "" : VPseudoUnaryV_V<m>, 425*0fca6ea1SDimitry Andric SchedUnary<"WriteVBREVV", "ReadVBREVV", mx, forceMergeOpRead=true>; 426*0fca6ea1SDimitry Andric } 427*0fca6ea1SDimitry Andric} 428*0fca6ea1SDimitry Andric 429*0fca6ea1SDimitry Andricmulticlass VPseudoVCLZ { 430*0fca6ea1SDimitry Andric foreach m = MxList in { 431*0fca6ea1SDimitry Andric defvar mx = m.MX; 432*0fca6ea1SDimitry Andric defm "" : VPseudoUnaryV_V<m>, 433*0fca6ea1SDimitry Andric SchedUnary<"WriteVCLZV", "ReadVCLZV", mx, forceMergeOpRead=true>; 434*0fca6ea1SDimitry Andric } 435*0fca6ea1SDimitry Andric} 436*0fca6ea1SDimitry Andric 437*0fca6ea1SDimitry Andricmulticlass VPseudoVCTZ { 438*0fca6ea1SDimitry Andric foreach m = MxList in { 439*0fca6ea1SDimitry Andric defvar mx = m.MX; 440*0fca6ea1SDimitry Andric defm "" : VPseudoUnaryV_V<m>, 441*0fca6ea1SDimitry Andric SchedUnary<"WriteVCTZV", "ReadVCTZV", mx, forceMergeOpRead=true>; 442*0fca6ea1SDimitry Andric } 443*0fca6ea1SDimitry Andric} 444*0fca6ea1SDimitry Andric 445*0fca6ea1SDimitry Andricmulticlass VPseudoVCPOP { 446*0fca6ea1SDimitry Andric foreach m = MxList in { 447*0fca6ea1SDimitry Andric defvar mx = m.MX; 448*0fca6ea1SDimitry Andric defm "" : VPseudoUnaryV_V<m>, 449*0fca6ea1SDimitry Andric SchedUnary<"WriteVCPOPV", "ReadVCPOPV", mx, forceMergeOpRead=true>; 450*0fca6ea1SDimitry Andric } 451*0fca6ea1SDimitry Andric} 452*0fca6ea1SDimitry Andric 453*0fca6ea1SDimitry Andricmulticlass VPseudoVWSLL { 454*0fca6ea1SDimitry Andric foreach m = MxListW in { 455*0fca6ea1SDimitry Andric defvar mx = m.MX; 456*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryW_VV<m>, 457*0fca6ea1SDimitry Andric SchedBinary<"WriteVWSLLV", "ReadVWSLLV", "ReadVWSLLV", mx, 458*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 459*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryW_VX<m>, 460*0fca6ea1SDimitry Andric SchedBinary<"WriteVWSLLX", "ReadVWSLLV", "ReadVWSLLX", mx, 461*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 462*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryW_VI<uimm5, m>, 463*0fca6ea1SDimitry Andric SchedUnary<"WriteVWSLLI", "ReadVWSLLV", mx, 464*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 465*0fca6ea1SDimitry Andric } 466*0fca6ea1SDimitry Andric} 467*0fca6ea1SDimitry Andric 468*0fca6ea1SDimitry Andricmulticlass VPseudoVANDN { 469*0fca6ea1SDimitry Andric foreach m = MxList in { 470*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_VV<m>, 471*0fca6ea1SDimitry Andric SchedBinary<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV", m.MX, 472*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 473*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_VX<m>, 474*0fca6ea1SDimitry Andric SchedBinary<"WriteVIALUX", "ReadVIALUV", "ReadVIALUX", m.MX, 475*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 476*0fca6ea1SDimitry Andric } 477*0fca6ea1SDimitry Andric} 478*0fca6ea1SDimitry Andric 479*0fca6ea1SDimitry Andricmulticlass VPseudoVBREV8 { 480*0fca6ea1SDimitry Andric foreach m = MxList in { 481*0fca6ea1SDimitry Andric defvar mx = m.MX; 482*0fca6ea1SDimitry Andric defm "" : VPseudoUnaryV_V<m>, 483*0fca6ea1SDimitry Andric SchedUnary<"WriteVBREV8V", "ReadVBREV8V", mx, forceMergeOpRead=true>; 484*0fca6ea1SDimitry Andric } 485*0fca6ea1SDimitry Andric} 486*0fca6ea1SDimitry Andric 487*0fca6ea1SDimitry Andricmulticlass VPseudoVREV8 { 488*0fca6ea1SDimitry Andric foreach m = MxList in { 489*0fca6ea1SDimitry Andric defvar mx = m.MX; 490*0fca6ea1SDimitry Andric defm "" : VPseudoUnaryV_V<m>, 491*0fca6ea1SDimitry Andric SchedUnary<"WriteVREV8V", "ReadVREV8V", mx, forceMergeOpRead=true>; 492*0fca6ea1SDimitry Andric } 493*0fca6ea1SDimitry Andric} 494*0fca6ea1SDimitry Andric 495*0fca6ea1SDimitry Andricmulticlass VPseudoVROT_VV_VX { 496*0fca6ea1SDimitry Andric foreach m = MxList in { 497*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_VV<m>, 498*0fca6ea1SDimitry Andric SchedBinary<"WriteVRotV", "ReadVRotV", "ReadVRotV", m.MX, 499*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 500*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_VX<m>, 501*0fca6ea1SDimitry Andric SchedBinary<"WriteVRotX", "ReadVRotV", "ReadVRotX", m.MX, 502*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 503*0fca6ea1SDimitry Andric } 504*0fca6ea1SDimitry Andric} 505*0fca6ea1SDimitry Andric 506*0fca6ea1SDimitry Andricmulticlass VPseudoVROT_VV_VX_VI 507*0fca6ea1SDimitry Andric : VPseudoVROT_VV_VX { 508*0fca6ea1SDimitry Andric foreach m = MxList in { 509*0fca6ea1SDimitry Andric defm "" : VPseudoBinaryV_VI<uimm6, m>, 510*0fca6ea1SDimitry Andric SchedUnary<"WriteVRotI", "ReadVRotV", m.MX, 511*0fca6ea1SDimitry Andric forceMergeOpRead=true>; 5125f757f3fSDimitry Andric } 51306c3fb27SDimitry Andric} 51406c3fb27SDimitry Andric 5155f757f3fSDimitry Andriclet Predicates = [HasStdExtZvbb] in { 516*0fca6ea1SDimitry Andric defm PseudoVBREV : VPseudoVBREV; 517*0fca6ea1SDimitry Andric defm PseudoVCLZ : VPseudoVCLZ; 518*0fca6ea1SDimitry Andric defm PseudoVCTZ : VPseudoVCTZ; 519*0fca6ea1SDimitry Andric defm PseudoVCPOP : VPseudoVCPOP; 520*0fca6ea1SDimitry Andric defm PseudoVWSLL : VPseudoVWSLL; 5215f757f3fSDimitry Andric} // Predicates = [HasStdExtZvbb] 52206c3fb27SDimitry Andric 5235f757f3fSDimitry Andriclet Predicates = [HasStdExtZvbc] in { 5245f757f3fSDimitry Andric defm PseudoVCLMUL : VPseudoVCLMUL_VV_VX; 5255f757f3fSDimitry Andric defm PseudoVCLMULH : VPseudoVCLMUL_VV_VX; 5265f757f3fSDimitry Andric} // Predicates = [HasStdExtZvbc] 5275f757f3fSDimitry Andric 5285f757f3fSDimitry Andriclet Predicates = [HasStdExtZvkb] in { 529*0fca6ea1SDimitry Andric defm PseudoVANDN : VPseudoVANDN; 530*0fca6ea1SDimitry Andric defm PseudoVBREV8 : VPseudoVBREV8; 531*0fca6ea1SDimitry Andric defm PseudoVREV8 : VPseudoVREV8; 532*0fca6ea1SDimitry Andric defm PseudoVROL : VPseudoVROT_VV_VX; 533*0fca6ea1SDimitry Andric defm PseudoVROR : VPseudoVROT_VV_VX_VI; 5345f757f3fSDimitry Andric} // Predicates = [HasStdExtZvkb] 5355f757f3fSDimitry Andric 5365f757f3fSDimitry Andriclet Predicates = [HasStdExtZvkg] in { 537*0fca6ea1SDimitry Andric defm PseudoVGHSH : VPseudoVGHSH; 538*0fca6ea1SDimitry Andric defm PseudoVGMUL : VPseudoVGMUL; 5395f757f3fSDimitry Andric} // Predicates = [HasStdExtZvkg] 5405f757f3fSDimitry Andric 5415f757f3fSDimitry Andriclet Predicates = [HasStdExtZvkned] in { 542*0fca6ea1SDimitry Andric defm PseudoVAESDF : VPseudoVAESMV; 543*0fca6ea1SDimitry Andric defm PseudoVAESDM : VPseudoVAESMV; 544*0fca6ea1SDimitry Andric defm PseudoVAESEF : VPseudoVAESMV; 545*0fca6ea1SDimitry Andric defm PseudoVAESEM : VPseudoVAESMV; 546*0fca6ea1SDimitry Andric defm PseudoVAESKF1 : VPseudoVAESKF1; 547*0fca6ea1SDimitry Andric defm PseudoVAESKF2 : VPseudoVAESKF2; 548*0fca6ea1SDimitry Andric defm PseudoVAESZ : VPseudoVAESZ; 5495f757f3fSDimitry Andric} // Predicates = [HasStdExtZvkned] 5505f757f3fSDimitry Andric 5515f757f3fSDimitry Andriclet Predicates = [HasStdExtZvknhaOrZvknhb] in { 552*0fca6ea1SDimitry Andric defm PseudoVSHA2CH : VPseudoVSHA2CH; 553*0fca6ea1SDimitry Andric defm PseudoVSHA2CL : VPseudoVSHA2CL; 554*0fca6ea1SDimitry Andric defm PseudoVSHA2MS : VPseudoVSHA2MS; 5555f757f3fSDimitry Andric} // Predicates = [HasStdExtZvknhaOrZvknhb] 5565f757f3fSDimitry Andric 5575f757f3fSDimitry Andriclet Predicates = [HasStdExtZvksed] in { 558*0fca6ea1SDimitry Andric defm PseudoVSM4K : VPseudoVSM4K; 559*0fca6ea1SDimitry Andric defm PseudoVSM4R : VPseudoVSM4R; 5605f757f3fSDimitry Andric} // Predicates = [HasStdExtZvksed] 5615f757f3fSDimitry Andric 5625f757f3fSDimitry Andriclet Predicates = [HasStdExtZvksh] in { 563*0fca6ea1SDimitry Andric defm PseudoVSM3C : VPseudoVSM3C; 564*0fca6ea1SDimitry Andric defm PseudoVSM3ME : VPseudoVSM3ME; 5655f757f3fSDimitry Andric} // Predicates = [HasStdExtZvksh] 56606c3fb27SDimitry Andric 56706c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 56806c3fb27SDimitry Andric// SDNode patterns 56906c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 57006c3fb27SDimitry Andric 5715f757f3fSDimitry Andricmulticlass VPatUnarySDNode_V<SDPatternOperator op, string instruction_name, 5725f757f3fSDimitry Andric Predicate predicate = HasStdExtZvbb> { 57306c3fb27SDimitry Andric foreach vti = AllIntegerVectors in { 5745f757f3fSDimitry Andric let Predicates = !listconcat([predicate], 57506c3fb27SDimitry Andric GetVTypePredicates<vti>.Predicates) in { 57606c3fb27SDimitry Andric def : Pat<(vti.Vector (op (vti.Vector vti.RegClass:$rs1))), 57706c3fb27SDimitry Andric (!cast<Instruction>(instruction_name#"_V_"#vti.LMul.MX) 57806c3fb27SDimitry Andric (vti.Vector (IMPLICIT_DEF)), 57906c3fb27SDimitry Andric vti.RegClass:$rs1, 58006c3fb27SDimitry Andric vti.AVL, vti.Log2SEW, TA_MA)>; 58106c3fb27SDimitry Andric } 58206c3fb27SDimitry Andric } 58306c3fb27SDimitry Andric} 58406c3fb27SDimitry Andric 58506c3fb27SDimitry Andric// Helpers for detecting splats since we preprocess splat_vector to vmv.v.x 58606c3fb27SDimitry Andric// This should match the logic in RISCVDAGToDAGISel::selectVSplat 58706c3fb27SDimitry Andricdef riscv_splat_vector : PatFrag<(ops node:$rs1), 58806c3fb27SDimitry Andric (riscv_vmv_v_x_vl undef, node:$rs1, srcvalue)>; 58906c3fb27SDimitry Andricdef riscv_vnot : PatFrag<(ops node:$rs1), (xor node:$rs1, 59006c3fb27SDimitry Andric (riscv_splat_vector -1))>; 59106c3fb27SDimitry Andric 59206c3fb27SDimitry Andricforeach vti = AllIntegerVectors in { 5935f757f3fSDimitry Andric let Predicates = !listconcat([HasStdExtZvkb], 59406c3fb27SDimitry Andric GetVTypePredicates<vti>.Predicates) in { 59506c3fb27SDimitry Andric def : Pat<(vti.Vector (and (riscv_vnot vti.RegClass:$rs1), 59606c3fb27SDimitry Andric vti.RegClass:$rs2)), 59706c3fb27SDimitry Andric (!cast<Instruction>("PseudoVANDN_VV_"#vti.LMul.MX) 59806c3fb27SDimitry Andric (vti.Vector (IMPLICIT_DEF)), 59906c3fb27SDimitry Andric vti.RegClass:$rs2, 60006c3fb27SDimitry Andric vti.RegClass:$rs1, 60106c3fb27SDimitry Andric vti.AVL, vti.Log2SEW, TA_MA)>; 60206c3fb27SDimitry Andric def : Pat<(vti.Vector (and (riscv_splat_vector 60306c3fb27SDimitry Andric (not vti.ScalarRegClass:$rs1)), 60406c3fb27SDimitry Andric vti.RegClass:$rs2)), 60506c3fb27SDimitry Andric (!cast<Instruction>("PseudoVANDN_VX_"#vti.LMul.MX) 60606c3fb27SDimitry Andric (vti.Vector (IMPLICIT_DEF)), 60706c3fb27SDimitry Andric vti.RegClass:$rs2, 60806c3fb27SDimitry Andric vti.ScalarRegClass:$rs1, 60906c3fb27SDimitry Andric vti.AVL, vti.Log2SEW, TA_MA)>; 61006c3fb27SDimitry Andric } 61106c3fb27SDimitry Andric} 61206c3fb27SDimitry Andric 61306c3fb27SDimitry Andricdefm : VPatUnarySDNode_V<bitreverse, "PseudoVBREV">; 6145f757f3fSDimitry Andricdefm : VPatUnarySDNode_V<bswap, "PseudoVREV8", HasStdExtZvkb>; 61506c3fb27SDimitry Andricdefm : VPatUnarySDNode_V<ctlz, "PseudoVCLZ">; 61606c3fb27SDimitry Andricdefm : VPatUnarySDNode_V<cttz, "PseudoVCTZ">; 61706c3fb27SDimitry Andricdefm : VPatUnarySDNode_V<ctpop, "PseudoVCPOP">; 61806c3fb27SDimitry Andric 61906c3fb27SDimitry Andricdefm : VPatBinarySDNode_VV_VX<rotl, "PseudoVROL">; 62006c3fb27SDimitry Andric 6215f757f3fSDimitry Andric// Invert the immediate and mask it to SEW for readability. 6225f757f3fSDimitry Andricdef InvRot8Imm : SDNodeXForm<imm, [{ 6235f757f3fSDimitry Andric return CurDAG->getTargetConstant(0x7 & (64 - N->getZExtValue()), SDLoc(N), 6245f757f3fSDimitry Andric N->getValueType(0)); 6255f757f3fSDimitry Andric}]>; 6265f757f3fSDimitry Andricdef InvRot16Imm : SDNodeXForm<imm, [{ 6275f757f3fSDimitry Andric return CurDAG->getTargetConstant(0xf & (64 - N->getZExtValue()), SDLoc(N), 6285f757f3fSDimitry Andric N->getValueType(0)); 6295f757f3fSDimitry Andric}]>; 6305f757f3fSDimitry Andricdef InvRot32Imm : SDNodeXForm<imm, [{ 6315f757f3fSDimitry Andric return CurDAG->getTargetConstant(0x1f & (64 - N->getZExtValue()), SDLoc(N), 6325f757f3fSDimitry Andric N->getValueType(0)); 6335f757f3fSDimitry Andric}]>; 6345f757f3fSDimitry Andricdef InvRot64Imm : SDNodeXForm<imm, [{ 63506c3fb27SDimitry Andric return CurDAG->getTargetConstant(0x3f & (64 - N->getZExtValue()), SDLoc(N), 63606c3fb27SDimitry Andric N->getValueType(0)); 63706c3fb27SDimitry Andric}]>; 63806c3fb27SDimitry Andric 63906c3fb27SDimitry Andric// Although there is no vrol.vi, an immediate rotate left can be achieved by 64006c3fb27SDimitry Andric// negating the immediate in vror.vi 64106c3fb27SDimitry Andricforeach vti = AllIntegerVectors in { 6425f757f3fSDimitry Andric let Predicates = !listconcat([HasStdExtZvkb], 64306c3fb27SDimitry Andric GetVTypePredicates<vti>.Predicates) in { 64406c3fb27SDimitry Andric def : Pat<(vti.Vector (rotl vti.RegClass:$rs2, 64506c3fb27SDimitry Andric (vti.Vector (SplatPat_uimm6 uimm6:$rs1)))), 64606c3fb27SDimitry Andric (!cast<Instruction>("PseudoVROR_VI_"#vti.LMul.MX) 64706c3fb27SDimitry Andric (vti.Vector (IMPLICIT_DEF)), 64806c3fb27SDimitry Andric vti.RegClass:$rs2, 6495f757f3fSDimitry Andric (!cast<SDNodeXForm>("InvRot" # vti.SEW # "Imm") uimm6:$rs1), 65006c3fb27SDimitry Andric vti.AVL, vti.Log2SEW, TA_MA)>; 65106c3fb27SDimitry Andric } 65206c3fb27SDimitry Andric} 65306c3fb27SDimitry Andricdefm : VPatBinarySDNode_VV_VX_VI<rotr, "PseudoVROR", uimm6>; 65406c3fb27SDimitry Andric 6555f757f3fSDimitry Andricforeach vtiToWti = AllWidenableIntVectors in { 6565f757f3fSDimitry Andric defvar vti = vtiToWti.Vti; 6575f757f3fSDimitry Andric defvar wti = vtiToWti.Wti; 6585f757f3fSDimitry Andric let Predicates = !listconcat([HasStdExtZvbb], 6595f757f3fSDimitry Andric GetVTypePredicates<vti>.Predicates, 6605f757f3fSDimitry Andric GetVTypePredicates<wti>.Predicates) in { 6615f757f3fSDimitry Andric def : Pat<(shl (wti.Vector (zext_oneuse (vti.Vector vti.RegClass:$rs2))), 6625f757f3fSDimitry Andric (wti.Vector (ext_oneuse (vti.Vector vti.RegClass:$rs1)))), 6635f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VV_"#vti.LMul.MX) 6645f757f3fSDimitry Andric (wti.Vector (IMPLICIT_DEF)), 6655f757f3fSDimitry Andric vti.RegClass:$rs2, vti.RegClass:$rs1, 6665f757f3fSDimitry Andric vti.AVL, vti.Log2SEW, TA_MA)>; 6675f757f3fSDimitry Andric 6685f757f3fSDimitry Andric def : Pat<(shl (wti.Vector (zext_oneuse (vti.Vector vti.RegClass:$rs2))), 6695f757f3fSDimitry Andric (wti.Vector (Low8BitsSplatPat (XLenVT GPR:$rs1)))), 6705f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VX_"#vti.LMul.MX) 6715f757f3fSDimitry Andric (wti.Vector (IMPLICIT_DEF)), 6725f757f3fSDimitry Andric vti.RegClass:$rs2, GPR:$rs1, 6735f757f3fSDimitry Andric vti.AVL, vti.Log2SEW, TA_MA)>; 6745f757f3fSDimitry Andric 6755f757f3fSDimitry Andric def : Pat<(shl (wti.Vector (zext_oneuse (vti.Vector vti.RegClass:$rs2))), 6765f757f3fSDimitry Andric (wti.Vector (SplatPat_uimm5 uimm5:$rs1))), 6775f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VI_"#vti.LMul.MX) 6785f757f3fSDimitry Andric (wti.Vector (IMPLICIT_DEF)), 6795f757f3fSDimitry Andric vti.RegClass:$rs2, uimm5:$rs1, 6805f757f3fSDimitry Andric vti.AVL, vti.Log2SEW, TA_MA)>; 6815f757f3fSDimitry Andric } 6825f757f3fSDimitry Andric} 6835f757f3fSDimitry Andric 68406c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 68506c3fb27SDimitry Andric// VL patterns 68606c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 68706c3fb27SDimitry Andric 6885f757f3fSDimitry Andricmulticlass VPatUnaryVL_V<SDPatternOperator op, string instruction_name, 6895f757f3fSDimitry Andric Predicate predicate = HasStdExtZvbb> { 69006c3fb27SDimitry Andric foreach vti = AllIntegerVectors in { 6915f757f3fSDimitry Andric let Predicates = !listconcat([predicate], 69206c3fb27SDimitry Andric GetVTypePredicates<vti>.Predicates) in { 69306c3fb27SDimitry Andric def : Pat<(vti.Vector (op (vti.Vector vti.RegClass:$rs1), 69406c3fb27SDimitry Andric (vti.Vector vti.RegClass:$merge), 69506c3fb27SDimitry Andric (vti.Mask V0), 69606c3fb27SDimitry Andric VLOpFrag)), 69706c3fb27SDimitry Andric (!cast<Instruction>(instruction_name#"_V_"#vti.LMul.MX#"_MASK") 69806c3fb27SDimitry Andric vti.RegClass:$merge, 69906c3fb27SDimitry Andric vti.RegClass:$rs1, 70006c3fb27SDimitry Andric (vti.Mask V0), 70106c3fb27SDimitry Andric GPR:$vl, 70206c3fb27SDimitry Andric vti.Log2SEW, 70306c3fb27SDimitry Andric TAIL_AGNOSTIC)>; 70406c3fb27SDimitry Andric } 70506c3fb27SDimitry Andric } 70606c3fb27SDimitry Andric} 70706c3fb27SDimitry Andric 70806c3fb27SDimitry Andricforeach vti = AllIntegerVectors in { 7095f757f3fSDimitry Andric let Predicates = !listconcat([HasStdExtZvkb], 71006c3fb27SDimitry Andric GetVTypePredicates<vti>.Predicates) in { 71106c3fb27SDimitry Andric def : Pat<(vti.Vector (riscv_and_vl (riscv_xor_vl 71206c3fb27SDimitry Andric (vti.Vector vti.RegClass:$rs1), 71306c3fb27SDimitry Andric (riscv_splat_vector -1), 71406c3fb27SDimitry Andric (vti.Vector vti.RegClass:$merge), 71506c3fb27SDimitry Andric (vti.Mask V0), 71606c3fb27SDimitry Andric VLOpFrag), 71706c3fb27SDimitry Andric (vti.Vector vti.RegClass:$rs2), 71806c3fb27SDimitry Andric (vti.Vector vti.RegClass:$merge), 71906c3fb27SDimitry Andric (vti.Mask V0), 72006c3fb27SDimitry Andric VLOpFrag)), 72106c3fb27SDimitry Andric (!cast<Instruction>("PseudoVANDN_VV_"#vti.LMul.MX#"_MASK") 72206c3fb27SDimitry Andric vti.RegClass:$merge, 72306c3fb27SDimitry Andric vti.RegClass:$rs2, 72406c3fb27SDimitry Andric vti.RegClass:$rs1, 72506c3fb27SDimitry Andric (vti.Mask V0), 72606c3fb27SDimitry Andric GPR:$vl, 72706c3fb27SDimitry Andric vti.Log2SEW, 72806c3fb27SDimitry Andric TAIL_AGNOSTIC)>; 72906c3fb27SDimitry Andric 73006c3fb27SDimitry Andric def : Pat<(vti.Vector (riscv_and_vl (riscv_splat_vector 73106c3fb27SDimitry Andric (not vti.ScalarRegClass:$rs1)), 73206c3fb27SDimitry Andric (vti.Vector vti.RegClass:$rs2), 73306c3fb27SDimitry Andric (vti.Vector vti.RegClass:$merge), 73406c3fb27SDimitry Andric (vti.Mask V0), 73506c3fb27SDimitry Andric VLOpFrag)), 73606c3fb27SDimitry Andric (!cast<Instruction>("PseudoVANDN_VX_"#vti.LMul.MX#"_MASK") 73706c3fb27SDimitry Andric vti.RegClass:$merge, 73806c3fb27SDimitry Andric vti.RegClass:$rs2, 73906c3fb27SDimitry Andric vti.ScalarRegClass:$rs1, 74006c3fb27SDimitry Andric (vti.Mask V0), 74106c3fb27SDimitry Andric GPR:$vl, 74206c3fb27SDimitry Andric vti.Log2SEW, 74306c3fb27SDimitry Andric TAIL_AGNOSTIC)>; 74406c3fb27SDimitry Andric } 74506c3fb27SDimitry Andric} 74606c3fb27SDimitry Andric 74706c3fb27SDimitry Andricdefm : VPatUnaryVL_V<riscv_bitreverse_vl, "PseudoVBREV">; 7485f757f3fSDimitry Andricdefm : VPatUnaryVL_V<riscv_bswap_vl, "PseudoVREV8", HasStdExtZvkb>; 74906c3fb27SDimitry Andricdefm : VPatUnaryVL_V<riscv_ctlz_vl, "PseudoVCLZ">; 75006c3fb27SDimitry Andricdefm : VPatUnaryVL_V<riscv_cttz_vl, "PseudoVCTZ">; 75106c3fb27SDimitry Andricdefm : VPatUnaryVL_V<riscv_ctpop_vl, "PseudoVCPOP">; 7525f757f3fSDimitry Andric 7535f757f3fSDimitry Andricdefm : VPatBinaryVL_VV_VX<riscv_rotl_vl, "PseudoVROL">; 7545f757f3fSDimitry Andric// Although there is no vrol.vi, an immediate rotate left can be achieved by 7555f757f3fSDimitry Andric// negating the immediate in vror.vi 7565f757f3fSDimitry Andricforeach vti = AllIntegerVectors in { 7575f757f3fSDimitry Andric let Predicates = !listconcat([HasStdExtZvkb], 7585f757f3fSDimitry Andric GetVTypePredicates<vti>.Predicates) in { 7595f757f3fSDimitry Andric def : Pat<(riscv_rotl_vl vti.RegClass:$rs2, 7605f757f3fSDimitry Andric (vti.Vector (SplatPat_uimm6 uimm6:$rs1)), 7615f757f3fSDimitry Andric (vti.Vector vti.RegClass:$merge), 7625f757f3fSDimitry Andric (vti.Mask V0), VLOpFrag), 7635f757f3fSDimitry Andric (!cast<Instruction>("PseudoVROR_VI_"#vti.LMul.MX#"_MASK") 7645f757f3fSDimitry Andric vti.RegClass:$merge, 7655f757f3fSDimitry Andric vti.RegClass:$rs2, 7665f757f3fSDimitry Andric (!cast<SDNodeXForm>("InvRot" # vti.SEW # "Imm") uimm6:$rs1), 7675f757f3fSDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 7685f757f3fSDimitry Andric } 7695f757f3fSDimitry Andric} 7705f757f3fSDimitry Andricdefm : VPatBinaryVL_VV_VX_VI<riscv_rotr_vl, "PseudoVROR", uimm6>; 7715f757f3fSDimitry Andric 7725f757f3fSDimitry Andricforeach vtiToWti = AllWidenableIntVectors in { 7735f757f3fSDimitry Andric defvar vti = vtiToWti.Vti; 7745f757f3fSDimitry Andric defvar wti = vtiToWti.Wti; 7755f757f3fSDimitry Andric let Predicates = !listconcat([HasStdExtZvbb], 7765f757f3fSDimitry Andric GetVTypePredicates<vti>.Predicates, 7775f757f3fSDimitry Andric GetVTypePredicates<wti>.Predicates) in { 7785f757f3fSDimitry Andric def : Pat<(riscv_shl_vl 7795f757f3fSDimitry Andric (wti.Vector (zext_oneuse (vti.Vector vti.RegClass:$rs2))), 7805f757f3fSDimitry Andric (wti.Vector (ext_oneuse (vti.Vector vti.RegClass:$rs1))), 7815f757f3fSDimitry Andric (wti.Vector wti.RegClass:$merge), 7825f757f3fSDimitry Andric (vti.Mask V0), VLOpFrag), 7835f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VV_"#vti.LMul.MX#"_MASK") 7845f757f3fSDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, vti.RegClass:$rs1, 7855f757f3fSDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 7865f757f3fSDimitry Andric 7875f757f3fSDimitry Andric def : Pat<(riscv_shl_vl 788*0fca6ea1SDimitry Andric (wti.Vector (riscv_zext_vl_oneuse 789*0fca6ea1SDimitry Andric (vti.Vector vti.RegClass:$rs2), 790*0fca6ea1SDimitry Andric (vti.Mask V0), VLOpFrag)), 791*0fca6ea1SDimitry Andric (wti.Vector (riscv_ext_vl_oneuse 792*0fca6ea1SDimitry Andric (vti.Vector vti.RegClass:$rs1), 793*0fca6ea1SDimitry Andric (vti.Mask V0), VLOpFrag)), 794*0fca6ea1SDimitry Andric (wti.Vector wti.RegClass:$merge), 795*0fca6ea1SDimitry Andric (vti.Mask V0), VLOpFrag), 796*0fca6ea1SDimitry Andric (!cast<Instruction>("PseudoVWSLL_VV_"#vti.LMul.MX#"_MASK") 797*0fca6ea1SDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, vti.RegClass:$rs1, 798*0fca6ea1SDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 799*0fca6ea1SDimitry Andric 800*0fca6ea1SDimitry Andric def : Pat<(riscv_shl_vl 8015f757f3fSDimitry Andric (wti.Vector (zext_oneuse (vti.Vector vti.RegClass:$rs2))), 8025f757f3fSDimitry Andric (wti.Vector (Low8BitsSplatPat (XLenVT GPR:$rs1))), 8035f757f3fSDimitry Andric (wti.Vector wti.RegClass:$merge), 8045f757f3fSDimitry Andric (vti.Mask V0), VLOpFrag), 8055f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VX_"#vti.LMul.MX#"_MASK") 8065f757f3fSDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, GPR:$rs1, 8075f757f3fSDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 8085f757f3fSDimitry Andric 8095f757f3fSDimitry Andric def : Pat<(riscv_shl_vl 810*0fca6ea1SDimitry Andric (wti.Vector (riscv_zext_vl_oneuse 811*0fca6ea1SDimitry Andric (vti.Vector vti.RegClass:$rs2), 812*0fca6ea1SDimitry Andric (vti.Mask V0), VLOpFrag)), 813*0fca6ea1SDimitry Andric (wti.Vector (Low8BitsSplatPat (XLenVT GPR:$rs1))), 814*0fca6ea1SDimitry Andric (wti.Vector wti.RegClass:$merge), 815*0fca6ea1SDimitry Andric (vti.Mask V0), VLOpFrag), 816*0fca6ea1SDimitry Andric (!cast<Instruction>("PseudoVWSLL_VX_"#vti.LMul.MX#"_MASK") 817*0fca6ea1SDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, GPR:$rs1, 818*0fca6ea1SDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 819*0fca6ea1SDimitry Andric 820*0fca6ea1SDimitry Andric def : Pat<(riscv_shl_vl 8215f757f3fSDimitry Andric (wti.Vector (zext_oneuse (vti.Vector vti.RegClass:$rs2))), 8225f757f3fSDimitry Andric (wti.Vector (SplatPat_uimm5 uimm5:$rs1)), 8235f757f3fSDimitry Andric (wti.Vector wti.RegClass:$merge), 8245f757f3fSDimitry Andric (vti.Mask V0), VLOpFrag), 8255f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VI_"#vti.LMul.MX#"_MASK") 8265f757f3fSDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, uimm5:$rs1, 8275f757f3fSDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 8285f757f3fSDimitry Andric 829*0fca6ea1SDimitry Andric def : Pat<(riscv_shl_vl 830*0fca6ea1SDimitry Andric (wti.Vector (riscv_zext_vl_oneuse 831*0fca6ea1SDimitry Andric (vti.Vector vti.RegClass:$rs2), 832*0fca6ea1SDimitry Andric (vti.Mask V0), VLOpFrag)), 833*0fca6ea1SDimitry Andric (wti.Vector (SplatPat_uimm5 uimm5:$rs1)), 834*0fca6ea1SDimitry Andric (wti.Vector wti.RegClass:$merge), 835*0fca6ea1SDimitry Andric (vti.Mask V0), VLOpFrag), 836*0fca6ea1SDimitry Andric (!cast<Instruction>("PseudoVWSLL_VI_"#vti.LMul.MX#"_MASK") 837*0fca6ea1SDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, uimm5:$rs1, 838*0fca6ea1SDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 839*0fca6ea1SDimitry Andric 8405f757f3fSDimitry Andric def : Pat<(riscv_vwsll_vl 8415f757f3fSDimitry Andric (vti.Vector vti.RegClass:$rs2), 8425f757f3fSDimitry Andric (vti.Vector vti.RegClass:$rs1), 8435f757f3fSDimitry Andric (wti.Vector wti.RegClass:$merge), 8445f757f3fSDimitry Andric (vti.Mask V0), VLOpFrag), 8455f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VV_"#vti.LMul.MX#"_MASK") 8465f757f3fSDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, vti.RegClass:$rs1, 8475f757f3fSDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 8485f757f3fSDimitry Andric 8495f757f3fSDimitry Andric def : Pat<(riscv_vwsll_vl 8505f757f3fSDimitry Andric (vti.Vector vti.RegClass:$rs2), 8515f757f3fSDimitry Andric (vti.Vector (Low8BitsSplatPat (XLenVT GPR:$rs1))), 8525f757f3fSDimitry Andric (wti.Vector wti.RegClass:$merge), 8535f757f3fSDimitry Andric (vti.Mask V0), VLOpFrag), 8545f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VX_"#vti.LMul.MX#"_MASK") 8555f757f3fSDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, GPR:$rs1, 8565f757f3fSDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 8575f757f3fSDimitry Andric 8585f757f3fSDimitry Andric def : Pat<(riscv_vwsll_vl 8595f757f3fSDimitry Andric (vti.Vector vti.RegClass:$rs2), 8605f757f3fSDimitry Andric (vti.Vector (SplatPat_uimm5 uimm5:$rs1)), 8615f757f3fSDimitry Andric (wti.Vector wti.RegClass:$merge), 8625f757f3fSDimitry Andric (vti.Mask V0), VLOpFrag), 8635f757f3fSDimitry Andric (!cast<Instruction>("PseudoVWSLL_VI_"#vti.LMul.MX#"_MASK") 8645f757f3fSDimitry Andric wti.RegClass:$merge, vti.RegClass:$rs2, uimm5:$rs1, 8655f757f3fSDimitry Andric (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; 8665f757f3fSDimitry Andric } 8675f757f3fSDimitry Andric} 8685f757f3fSDimitry Andric 8695f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 8705f757f3fSDimitry Andric// Codegen patterns 8715f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 8725f757f3fSDimitry Andric 8735f757f3fSDimitry Andricclass VPatUnaryNoMask_Zvk<string intrinsic_name, 8745f757f3fSDimitry Andric string inst, 8755f757f3fSDimitry Andric string kind, 8765f757f3fSDimitry Andric ValueType result_type, 8775f757f3fSDimitry Andric ValueType op2_type, 8785f757f3fSDimitry Andric int sew, 8795f757f3fSDimitry Andric LMULInfo vlmul, 8805f757f3fSDimitry Andric VReg result_reg_class, 8815f757f3fSDimitry Andric VReg op2_reg_class> : 8825f757f3fSDimitry Andric Pat<(result_type (!cast<Intrinsic>(intrinsic_name) 883*0fca6ea1SDimitry Andric (result_type result_reg_class:$rd), 8845f757f3fSDimitry Andric (op2_type op2_reg_class:$rs2), 8855f757f3fSDimitry Andric VLOpFrag, (XLenVT timm:$policy))), 8865f757f3fSDimitry Andric (!cast<Instruction>(inst#"_"#kind#"_"#vlmul.MX) 887*0fca6ea1SDimitry Andric (result_type result_reg_class:$rd), 8885f757f3fSDimitry Andric (op2_type op2_reg_class:$rs2), 8895f757f3fSDimitry Andric GPR:$vl, sew, (XLenVT timm:$policy))>; 8905f757f3fSDimitry Andric 8915f757f3fSDimitry Andricclass VPatUnaryNoMask_VS_Zvk<string intrinsic_name, 8925f757f3fSDimitry Andric string inst, 8935f757f3fSDimitry Andric string kind, 8945f757f3fSDimitry Andric ValueType result_type, 8955f757f3fSDimitry Andric ValueType op2_type, 8965f757f3fSDimitry Andric int sew, 8975f757f3fSDimitry Andric LMULInfo vlmul, 8985f757f3fSDimitry Andric LMULInfo vs2_lmul, 8995f757f3fSDimitry Andric VReg result_reg_class, 9005f757f3fSDimitry Andric VReg op2_reg_class> : 9015f757f3fSDimitry Andric Pat<(result_type (!cast<Intrinsic>(intrinsic_name) 902*0fca6ea1SDimitry Andric (result_type result_reg_class:$rd), 9035f757f3fSDimitry Andric (op2_type op2_reg_class:$rs2), 9045f757f3fSDimitry Andric VLOpFrag, (XLenVT timm:$policy))), 9055f757f3fSDimitry Andric (!cast<Instruction>(inst#"_"#kind#"_"#vlmul.MX#"_"#vs2_lmul.MX) 906*0fca6ea1SDimitry Andric (result_type result_reg_class:$rd), 9075f757f3fSDimitry Andric (op2_type op2_reg_class:$rs2), 9085f757f3fSDimitry Andric GPR:$vl, sew, (XLenVT timm:$policy))>; 9095f757f3fSDimitry Andric 9105f757f3fSDimitry Andricmulticlass VPatUnaryV_V_NoMask_Zvk<string intrinsic, string instruction, 9115f757f3fSDimitry Andric list<VTypeInfo> vtilist> { 9125f757f3fSDimitry Andric foreach vti = vtilist in 9135f757f3fSDimitry Andric def : VPatUnaryNoMask_Zvk<intrinsic # "_vv", instruction, "VV", 9145f757f3fSDimitry Andric vti.Vector, vti.Vector, vti.Log2SEW, 9155f757f3fSDimitry Andric vti.LMul, vti.RegClass, vti.RegClass>; 9165f757f3fSDimitry Andric} 9175f757f3fSDimitry Andric 9185f757f3fSDimitry Andricmulticlass VPatUnaryV_S_NoMaskVectorCrypto<string intrinsic, string instruction, 9195f757f3fSDimitry Andric list<VTypeInfo> vtilist> { 9205f757f3fSDimitry Andric foreach vti = vtilist in 9215f757f3fSDimitry Andric foreach vti_vs2 = ZvkI32IntegerVectors<vti.LMul.MX>.vs2_types in 9225f757f3fSDimitry Andric def : VPatUnaryNoMask_VS_Zvk<intrinsic # "_vs", instruction, "VS", 9235f757f3fSDimitry Andric vti.Vector, vti_vs2.Vector, vti.Log2SEW, 9245f757f3fSDimitry Andric vti.LMul, vti_vs2.LMul, vti.RegClass, vti_vs2.RegClass>; 9255f757f3fSDimitry Andric} 9265f757f3fSDimitry Andric 9275f757f3fSDimitry Andricmulticlass VPatUnaryV_V_S_NoMask_Zvk<string intrinsic, string instruction, 9285f757f3fSDimitry Andric list<VTypeInfo> vtilist> { 9295f757f3fSDimitry Andric defm : VPatUnaryV_V_NoMask_Zvk<intrinsic, instruction, vtilist>; 9305f757f3fSDimitry Andric defm : VPatUnaryV_S_NoMaskVectorCrypto<intrinsic, instruction, vtilist>; 9315f757f3fSDimitry Andric} 9325f757f3fSDimitry Andric 9335f757f3fSDimitry Andricmulticlass VPatBinaryV_VV_NoMask<string intrinsic, string instruction, 9345f757f3fSDimitry Andric list<VTypeInfo> vtilist> { 9355f757f3fSDimitry Andric foreach vti = vtilist in 9365f757f3fSDimitry Andric def : VPatTernaryNoMaskWithPolicy<intrinsic, instruction, "VV", 9375f757f3fSDimitry Andric vti.Vector, vti.Vector, vti.Vector, 9385f757f3fSDimitry Andric vti.Log2SEW, vti.LMul, vti.RegClass, 9395f757f3fSDimitry Andric vti.RegClass, vti.RegClass>; 9405f757f3fSDimitry Andric} 9415f757f3fSDimitry Andric 9425f757f3fSDimitry Andricmulticlass VPatBinaryV_VI_NoMask<string intrinsic, string instruction, 943*0fca6ea1SDimitry Andric list<VTypeInfo> vtilist, 944*0fca6ea1SDimitry Andric Operand imm_type = tuimm5> { 9455f757f3fSDimitry Andric foreach vti = vtilist in 9465f757f3fSDimitry Andric def : VPatTernaryNoMaskWithPolicy<intrinsic, instruction, "VI", 9475f757f3fSDimitry Andric vti.Vector, vti.Vector, XLenVT, 9485f757f3fSDimitry Andric vti.Log2SEW, vti.LMul, vti.RegClass, 9495f757f3fSDimitry Andric vti.RegClass, imm_type>; 9505f757f3fSDimitry Andric} 9515f757f3fSDimitry Andric 9525f757f3fSDimitry Andricmulticlass VPatBinaryV_VI_NoMaskTU<string intrinsic, string instruction, 953*0fca6ea1SDimitry Andric list<VTypeInfo> vtilist, 954*0fca6ea1SDimitry Andric Operand imm_type = tuimm5> { 9555f757f3fSDimitry Andric foreach vti = vtilist in 9565f757f3fSDimitry Andric def : VPatBinaryNoMaskTU<intrinsic, instruction # "_VI_" # vti.LMul.MX, 9575f757f3fSDimitry Andric vti.Vector, vti.Vector, XLenVT, vti.Log2SEW, 9585f757f3fSDimitry Andric vti.RegClass, vti.RegClass, imm_type>; 9595f757f3fSDimitry Andric} 9605f757f3fSDimitry Andric 9615f757f3fSDimitry Andricmulticlass VPatBinaryV_VV_NoMaskTU<string intrinsic, string instruction, 9625f757f3fSDimitry Andric list<VTypeInfo> vtilist> { 9635f757f3fSDimitry Andric foreach vti = vtilist in 9645f757f3fSDimitry Andric def : VPatBinaryNoMaskTU<intrinsic, instruction # "_VV_" # vti.LMul.MX, 9655f757f3fSDimitry Andric vti.Vector, vti.Vector, vti.Vector, vti.Log2SEW, 9665f757f3fSDimitry Andric vti.RegClass, vti.RegClass, vti.RegClass>; 9675f757f3fSDimitry Andric} 9685f757f3fSDimitry Andric 9695f757f3fSDimitry Andricmulticlass VPatBinaryV_VX_VROTATE<string intrinsic, string instruction, 9705f757f3fSDimitry Andric list<VTypeInfo> vtilist, bit isSEWAware = 0> { 9715f757f3fSDimitry Andric foreach vti = vtilist in { 9725f757f3fSDimitry Andric defvar kind = "V"#vti.ScalarSuffix; 9735f757f3fSDimitry Andric let Predicates = GetVTypePredicates<vti>.Predicates in 9745f757f3fSDimitry Andric defm : VPatBinary<intrinsic, 9755f757f3fSDimitry Andric !if(isSEWAware, 9765f757f3fSDimitry Andric instruction#"_"#kind#"_"#vti.LMul.MX#"_E"#vti.SEW, 9775f757f3fSDimitry Andric instruction#"_"#kind#"_"#vti.LMul.MX), 9785f757f3fSDimitry Andric vti.Vector, vti.Vector, XLenVT, vti.Mask, 9795f757f3fSDimitry Andric vti.Log2SEW, vti.RegClass, 9805f757f3fSDimitry Andric vti.RegClass, vti.ScalarRegClass>; 9815f757f3fSDimitry Andric } 9825f757f3fSDimitry Andric} 9835f757f3fSDimitry Andric 9845f757f3fSDimitry Andricmulticlass VPatBinaryV_VI_VROL<string intrinsic, string instruction, 9855f757f3fSDimitry Andric list<VTypeInfo> vtilist, bit isSEWAware = 0> { 9865f757f3fSDimitry Andric foreach vti = vtilist in { 9875f757f3fSDimitry Andric defvar Intr = !cast<Intrinsic>(intrinsic); 9885f757f3fSDimitry Andric defvar Pseudo = !cast<Instruction>( 9895f757f3fSDimitry Andric !if(isSEWAware, instruction#"_VI_"#vti.LMul.MX#"_E"#vti.SEW, 9905f757f3fSDimitry Andric instruction#"_VI_"#vti.LMul.MX)); 9915f757f3fSDimitry Andric let Predicates = GetVTypePredicates<vti>.Predicates in 9925f757f3fSDimitry Andric def : Pat<(vti.Vector (Intr (vti.Vector vti.RegClass:$merge), 9935f757f3fSDimitry Andric (vti.Vector vti.RegClass:$rs2), 9945f757f3fSDimitry Andric (XLenVT uimm6:$rs1), 9955f757f3fSDimitry Andric VLOpFrag)), 9965f757f3fSDimitry Andric (Pseudo (vti.Vector vti.RegClass:$merge), 9975f757f3fSDimitry Andric (vti.Vector vti.RegClass:$rs2), 9985f757f3fSDimitry Andric (InvRot64Imm uimm6:$rs1), 9995f757f3fSDimitry Andric GPR:$vl, vti.Log2SEW, TU_MU)>; 10005f757f3fSDimitry Andric 10015f757f3fSDimitry Andric defvar IntrMask = !cast<Intrinsic>(intrinsic#"_mask"); 10025f757f3fSDimitry Andric defvar PseudoMask = !cast<Instruction>( 10035f757f3fSDimitry Andric !if(isSEWAware, instruction#"_VI_"#vti.LMul.MX#"_E"#vti.SEW#"_MASK", 10045f757f3fSDimitry Andric instruction#"_VI_"#vti.LMul.MX#"_MASK")); 10055f757f3fSDimitry Andric let Predicates = GetVTypePredicates<vti>.Predicates in 10065f757f3fSDimitry Andric def : Pat<(vti.Vector (IntrMask (vti.Vector vti.RegClass:$merge), 10075f757f3fSDimitry Andric (vti.Vector vti.RegClass:$rs2), 10085f757f3fSDimitry Andric (XLenVT uimm6:$rs1), 10095f757f3fSDimitry Andric (vti.Mask V0), 10105f757f3fSDimitry Andric VLOpFrag, (XLenVT timm:$policy))), 10115f757f3fSDimitry Andric (PseudoMask (vti.Vector vti.RegClass:$merge), 10125f757f3fSDimitry Andric (vti.Vector vti.RegClass:$rs2), 10135f757f3fSDimitry Andric (InvRot64Imm uimm6:$rs1), 10145f757f3fSDimitry Andric (vti.Mask V0), 10155f757f3fSDimitry Andric GPR:$vl, vti.Log2SEW, (XLenVT timm:$policy))>; 10165f757f3fSDimitry Andric } 10175f757f3fSDimitry Andric} 10185f757f3fSDimitry Andric 10195f757f3fSDimitry Andricmulticlass VPatBinaryV_VV_VX_VROL<string intrinsic, string instruction, 10205f757f3fSDimitry Andric string instruction2, list<VTypeInfo> vtilist> 10215f757f3fSDimitry Andric : VPatBinaryV_VV<intrinsic, instruction, vtilist>, 10225f757f3fSDimitry Andric VPatBinaryV_VX_VROTATE<intrinsic, instruction, vtilist>, 10235f757f3fSDimitry Andric VPatBinaryV_VI_VROL<intrinsic, instruction2, vtilist>; 10245f757f3fSDimitry Andric 10255f757f3fSDimitry Andricmulticlass VPatBinaryV_VV_VX_VI_VROR<string intrinsic, string instruction, 1026*0fca6ea1SDimitry Andric list<VTypeInfo> vtilist> 10275f757f3fSDimitry Andric : VPatBinaryV_VV<intrinsic, instruction, vtilist>, 10285f757f3fSDimitry Andric VPatBinaryV_VX_VROTATE<intrinsic, instruction, vtilist>, 1029*0fca6ea1SDimitry Andric VPatBinaryV_VI<intrinsic, instruction, vtilist, uimm6>; 10305f757f3fSDimitry Andric 1031*0fca6ea1SDimitry Andricmulticlass VPatBinaryW_VV_VX_VI_VWSLL<string intrinsic, string instruction, 1032*0fca6ea1SDimitry Andric list<VTypeInfoToWide> vtilist> 1033*0fca6ea1SDimitry Andric : VPatBinaryW_VV<intrinsic, instruction, vtilist> { 10345f757f3fSDimitry Andric foreach VtiToWti = vtilist in { 10355f757f3fSDimitry Andric defvar Vti = VtiToWti.Vti; 10365f757f3fSDimitry Andric defvar Wti = VtiToWti.Wti; 1037*0fca6ea1SDimitry Andric defvar kind = "V"#Vti.ScalarSuffix; 1038*0fca6ea1SDimitry Andric let Predicates = !listconcat(GetVTypePredicates<Vti>.Predicates, 1039*0fca6ea1SDimitry Andric GetVTypePredicates<Wti>.Predicates) in { 1040*0fca6ea1SDimitry Andric defm : VPatBinary<intrinsic, instruction#"_"#kind#"_"#Vti.LMul.MX, 1041*0fca6ea1SDimitry Andric Wti.Vector, Vti.Vector, XLenVT, Vti.Mask, 1042*0fca6ea1SDimitry Andric Vti.Log2SEW, Wti.RegClass, 1043*0fca6ea1SDimitry Andric Vti.RegClass, Vti.ScalarRegClass>; 10445f757f3fSDimitry Andric defm : VPatBinary<intrinsic, instruction # "_VI_" # Vti.LMul.MX, 10455f757f3fSDimitry Andric Wti.Vector, Vti.Vector, XLenVT, Vti.Mask, 10465f757f3fSDimitry Andric Vti.Log2SEW, Wti.RegClass, 10475f757f3fSDimitry Andric Vti.RegClass, uimm5>; 10485f757f3fSDimitry Andric } 10495f757f3fSDimitry Andric } 10505f757f3fSDimitry Andric} 10515f757f3fSDimitry Andric 10525f757f3fSDimitry Andriclet Predicates = [HasStdExtZvbb] in { 10535f757f3fSDimitry Andric defm : VPatUnaryV_V<"int_riscv_vbrev", "PseudoVBREV", AllIntegerVectors>; 10545f757f3fSDimitry Andric defm : VPatUnaryV_V<"int_riscv_vclz", "PseudoVCLZ", AllIntegerVectors>; 10555f757f3fSDimitry Andric defm : VPatUnaryV_V<"int_riscv_vctz", "PseudoVCTZ", AllIntegerVectors>; 10565f757f3fSDimitry Andric defm : VPatUnaryV_V<"int_riscv_vcpopv", "PseudoVCPOP", AllIntegerVectors>; 10575f757f3fSDimitry Andric defm : VPatBinaryW_VV_VX_VI_VWSLL<"int_riscv_vwsll", "PseudoVWSLL", AllWidenableIntVectors>; 10585f757f3fSDimitry Andric} // Predicates = [HasStdExtZvbb] 10595f757f3fSDimitry Andric 10605f757f3fSDimitry Andriclet Predicates = [HasStdExtZvbc] in { 10615f757f3fSDimitry Andric defm : VPatBinaryV_VV_VX<"int_riscv_vclmul", "PseudoVCLMUL", I64IntegerVectors>; 10625f757f3fSDimitry Andric defm : VPatBinaryV_VV_VX<"int_riscv_vclmulh", "PseudoVCLMULH", I64IntegerVectors>; 10635f757f3fSDimitry Andric} // Predicates = [HasStdExtZvbc] 10645f757f3fSDimitry Andric 10655f757f3fSDimitry Andriclet Predicates = [HasStdExtZvkb] in { 10665f757f3fSDimitry Andric defm : VPatBinaryV_VV_VX<"int_riscv_vandn", "PseudoVANDN", AllIntegerVectors>; 10675f757f3fSDimitry Andric defm : VPatUnaryV_V<"int_riscv_vbrev8", "PseudoVBREV8", AllIntegerVectors>; 10685f757f3fSDimitry Andric defm : VPatUnaryV_V<"int_riscv_vrev8", "PseudoVREV8", AllIntegerVectors>; 10695f757f3fSDimitry Andric defm : VPatBinaryV_VV_VX_VROL<"int_riscv_vrol", "PseudoVROL", "PseudoVROR", AllIntegerVectors>; 10705f757f3fSDimitry Andric defm : VPatBinaryV_VV_VX_VI_VROR<"int_riscv_vror", "PseudoVROR", AllIntegerVectors>; 10715f757f3fSDimitry Andric} // Predicates = [HasStdExtZvkb] 10725f757f3fSDimitry Andric 10735f757f3fSDimitry Andriclet Predicates = [HasStdExtZvkg] in { 10745f757f3fSDimitry Andric defm : VPatBinaryV_VV_NoMask<"int_riscv_vghsh", "PseudoVGHSH", I32IntegerVectors>; 10755f757f3fSDimitry Andric defm : VPatUnaryV_V_NoMask_Zvk<"int_riscv_vgmul", "PseudoVGMUL", I32IntegerVectors>; 10765f757f3fSDimitry Andric} // Predicates = [HasStdExtZvkg] 10775f757f3fSDimitry Andric 10785f757f3fSDimitry Andriclet Predicates = [HasStdExtZvkned] in { 10795f757f3fSDimitry Andric defm : VPatUnaryV_V_S_NoMask_Zvk<"int_riscv_vaesdf", "PseudoVAESDF", I32IntegerVectors>; 10805f757f3fSDimitry Andric defm : VPatUnaryV_V_S_NoMask_Zvk<"int_riscv_vaesdm", "PseudoVAESDM", I32IntegerVectors>; 10815f757f3fSDimitry Andric defm : VPatUnaryV_V_S_NoMask_Zvk<"int_riscv_vaesef", "PseudoVAESEF", I32IntegerVectors>; 10825f757f3fSDimitry Andric defm : VPatUnaryV_V_S_NoMask_Zvk<"int_riscv_vaesem", "PseudoVAESEM", I32IntegerVectors>; 10835f757f3fSDimitry Andric defm : VPatBinaryV_VI_NoMaskTU<"int_riscv_vaeskf1", "PseudoVAESKF1", I32IntegerVectors>; 10845f757f3fSDimitry Andric defm : VPatBinaryV_VI_NoMask<"int_riscv_vaeskf2", "PseudoVAESKF2", I32IntegerVectors>; 10855f757f3fSDimitry Andric defm : VPatUnaryV_S_NoMaskVectorCrypto<"int_riscv_vaesz", "PseudoVAESZ", I32IntegerVectors>; 10865f757f3fSDimitry Andric} // Predicates = [HasStdExtZvkned] 10875f757f3fSDimitry Andric 10885f757f3fSDimitry Andriclet Predicates = [HasStdExtZvknha] in { 10895f757f3fSDimitry Andric defm : VPatBinaryV_VV_NoMask<"int_riscv_vsha2ch", "PseudoVSHA2CH", I32IntegerVectors>; 10905f757f3fSDimitry Andric defm : VPatBinaryV_VV_NoMask<"int_riscv_vsha2cl", "PseudoVSHA2CH", I32IntegerVectors>; 10915f757f3fSDimitry Andric defm : VPatBinaryV_VV_NoMask<"int_riscv_vsha2ms", "PseudoVSHA2MS", I32IntegerVectors>; 10925f757f3fSDimitry Andric} // Predicates = [HasStdExtZvknha] 10935f757f3fSDimitry Andric 10945f757f3fSDimitry Andriclet Predicates = [HasStdExtZvknhb] in { 10955f757f3fSDimitry Andric defm : VPatBinaryV_VV_NoMask<"int_riscv_vsha2ch", "PseudoVSHA2CH", I32I64IntegerVectors>; 10965f757f3fSDimitry Andric defm : VPatBinaryV_VV_NoMask<"int_riscv_vsha2cl", "PseudoVSHA2CH", I32I64IntegerVectors>; 10975f757f3fSDimitry Andric defm : VPatBinaryV_VV_NoMask<"int_riscv_vsha2ms", "PseudoVSHA2MS", I32I64IntegerVectors>; 10985f757f3fSDimitry Andric} // Predicates = [HasStdExtZvknhb] 10995f757f3fSDimitry Andric 11005f757f3fSDimitry Andriclet Predicates = [HasStdExtZvksed] in { 11015f757f3fSDimitry Andric defm : VPatBinaryV_VI_NoMaskTU<"int_riscv_vsm4k", "PseudoVSM4K", I32IntegerVectors>; 11025f757f3fSDimitry Andric defm : VPatUnaryV_V_S_NoMask_Zvk<"int_riscv_vsm4r", "PseudoVSM4R", I32IntegerVectors>; 11035f757f3fSDimitry Andric} // Predicates = [HasStdExtZvksed] 11045f757f3fSDimitry Andric 11055f757f3fSDimitry Andriclet Predicates = [HasStdExtZvksh] in { 11065f757f3fSDimitry Andric defm : VPatBinaryV_VI_NoMask<"int_riscv_vsm3c", "PseudoVSM3C", I32IntegerVectors>; 11075f757f3fSDimitry Andric defm : VPatBinaryV_VV_NoMaskTU<"int_riscv_vsm3me", "PseudoVSM3ME", I32IntegerVectors>; 11085f757f3fSDimitry Andric} // Predicates = [HasStdExtZvksh] 1109