1717// Instructions
1818//===----------------------------------------------------------------------===//
1919
20+ class VQDOTVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
21+ : RVInstVV<funct6, opv, (outs VR:$vd_wb),
22+ (ins VR:$vd, VR:$vs2, VR:$vs1, VMaskOp:$vm),
23+ opcodestr, "$vd, $vs2, $vs1$vm"> {
24+ let mayLoad = 0;
25+ let mayStore = 0;
26+ let hasSideEffects = 0;
27+ let Constraints = "$vd = $vd_wb";
28+ }
29+
30+ class VQDOTVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
31+ : RVInstVX<funct6, opv, (outs VR:$vd_wb),
32+ (ins VR:$vd, VR:$vs2, GPR:$rs1, VMaskOp:$vm),
33+ opcodestr, "$vd, $vs2, $rs1$vm"> {
34+ let mayLoad = 0;
35+ let mayStore = 0;
36+ let hasSideEffects = 0;
37+ let Constraints = "$vd = $vd_wb";
38+ }
39+
2040let Predicates = [HasStdExtZvqdotq] in {
21- def VQDOT_VV : VALUVV <0b101100, OPMVV, "vqdot.vv">;
22- def VQDOT_VX : VALUVX <0b101100, OPMVX, "vqdot.vx">;
23- def VQDOTU_VV : VALUVV <0b101000, OPMVV, "vqdotu.vv">;
24- def VQDOTU_VX : VALUVX <0b101000, OPMVX, "vqdotu.vx">;
25- def VQDOTSU_VV : VALUVV <0b101010, OPMVV, "vqdotsu.vv">;
26- def VQDOTSU_VX : VALUVX <0b101010, OPMVX, "vqdotsu.vx">;
27- def VQDOTUS_VX : VALUVX <0b101110, OPMVX, "vqdotus.vx">;
41+ def VQDOT_VV : VQDOTVV <0b101100, OPMVV, "vqdot.vv">;
42+ def VQDOT_VX : VQDOTVX <0b101100, OPMVX, "vqdot.vx">;
43+ def VQDOTU_VV : VQDOTVV <0b101000, OPMVV, "vqdotu.vv">;
44+ def VQDOTU_VX : VQDOTVX <0b101000, OPMVX, "vqdotu.vx">;
45+ def VQDOTSU_VV : VQDOTVV <0b101010, OPMVV, "vqdotsu.vv">;
46+ def VQDOTSU_VX : VQDOTVX <0b101010, OPMVX, "vqdotsu.vx">;
47+ def VQDOTUS_VX : VQDOTVX <0b101110, OPMVX, "vqdotus.vx">;
2848} // Predicates = [HasStdExtZvqdotq]
2949
50+ //===----------------------------------------------------------------------===//
51+ // Helpers to define the VL patterns.
52+ //===----------------------------------------------------------------------===//
3053
3154let HasPassthruOp = true, HasMaskOp = true in {
3255 def riscv_vqdot_vl : RVSDNode<"VQDOT_VL", SDT_RISCVIntBinOp_VL>;
3356 def riscv_vqdotu_vl : RVSDNode<"VQDOTU_VL", SDT_RISCVIntBinOp_VL>;
3457 def riscv_vqdotsu_vl : RVSDNode<"VQDOTSU_VL", SDT_RISCVIntBinOp_VL>;
3558} // let HasPassthruOp = true, HasMaskOp = true
3659
60+ //===----------------------------------------------------------------------===//
61+ // Pseudo Instructions for CodeGen
62+ //===----------------------------------------------------------------------===//
63+
3764multiclass VPseudoVQDOT_VV_VX {
3865 foreach m = MxSet<32>.m in {
3966 defm "" : VPseudoBinaryV_VV<m>,
@@ -54,6 +81,10 @@ let Predicates = [HasStdExtZvqdotq], mayLoad = 0, mayStore = 0,
5481 defm PseudoVQDOTSU : VPseudoVQDOT_VV_VX;
5582}
5683
84+ //===----------------------------------------------------------------------===//
85+ // Patterns.
86+ //===----------------------------------------------------------------------===//
87+
5788defvar AllE32Vectors = [VI32MF2, VI32M1, VI32M2, VI32M4, VI32M8];
5889defm : VPatBinaryVL_VV_VX<riscv_vqdot_vl, "PseudoVQDOT", AllE32Vectors>;
5990defm : VPatBinaryVL_VV_VX<riscv_vqdotu_vl, "PseudoVQDOTU", AllE32Vectors>;
0 commit comments