xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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