Skip to content

Commit 4859ee9

Browse files
authored
[RISCV] Add tied source operand to Zvqdotq MC instructions. (llvm#155286)
This is consistent with what we do for integer and FP multiply accumulate instructions. We need new classes because normal multiply accumulate have the operands in a different order.
1 parent ac771f4 commit 4859ee9

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoZvqdotq.td

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,50 @@
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+
2040
let 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

3154
let 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+
3764
multiclass 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+
5788
defvar AllE32Vectors = [VI32MF2, VI32M1, VI32M2, VI32M4, VI32M8];
5889
defm : VPatBinaryVL_VV_VX<riscv_vqdot_vl, "PseudoVQDOT", AllE32Vectors>;
5990
defm : VPatBinaryVL_VV_VX<riscv_vqdotu_vl, "PseudoVQDOTU", AllE32Vectors>;

0 commit comments

Comments
 (0)