@@ -43,6 +43,17 @@ class THVdotALUrVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
43
43
opcodestr, "$vd, $rs1, $vs2$vm">;
44
44
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
45
45
46
+ let Predicates = [HasVendorXTHeadBa], DecoderNamespace = "THeadBa",
47
+ hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
48
+ class THShiftALU_rri<bits<3> funct3, string opcodestr>
49
+ : RVInstR<0, funct3, OPC_CUSTOM_0, (outs GPR:$rd),
50
+ (ins GPR:$rs1, GPR:$rs2, uimm2:$uimm2),
51
+ opcodestr, "$rd, $rs1, $rs2, $uimm2"> {
52
+ bits<2> uimm2;
53
+ let Inst{31-27} = 0;
54
+ let Inst{26-25} = uimm2;
55
+ }
56
+
46
57
//===----------------------------------------------------------------------===//
47
58
// Combination of instruction classes.
48
59
// Use these multiclasses to define instructions more easily.
@@ -59,6 +70,11 @@ multiclass THVdotVMAQA<string opcodestr, bits<6> funct6> {
59
70
//===----------------------------------------------------------------------===//
60
71
// Instructions
61
72
//===----------------------------------------------------------------------===//
73
+ let Predicates = [HasVendorXTHeadBa] in {
74
+ def TH_ADDSL : THShiftALU_rri<0b001, "th.addsl">,
75
+ Sched<[WriteSHXADD, ReadSHXADD, ReadSHXADD]>;
76
+ } // Predicates = [HasVendorXTHeadBa]
77
+
62
78
let Predicates = [HasVendorXTHeadVdot],
63
79
Constraints = "@earlyclobber $vd",
64
80
RVVConstraint = WidenV in {
@@ -134,6 +150,80 @@ multiclass VPatTernaryVMAQA_VV_VX<string intrinsic, string instruction,
134
150
//===----------------------------------------------------------------------===//
135
151
// Pseudo-instructions and codegen patterns
136
152
//===----------------------------------------------------------------------===//
153
+ let Predicates = [HasVendorXTHeadBa] in {
154
+ def : Pat<(add GPR:$rs1, (shl GPR:$rs2, uimm2:$uimm2)),
155
+ (TH_ADDSL GPR:$rs1, GPR:$rs2, uimm2:$uimm2)>;
156
+
157
+ // Reuse complex patterns from StdExtZba
158
+ def : Pat<(add sh1add_op:$rs1, non_imm12:$rs2),
159
+ (TH_ADDSL GPR:$rs2, sh1add_op:$rs1, 1)>;
160
+ def : Pat<(add sh2add_op:$rs1, non_imm12:$rs2),
161
+ (TH_ADDSL GPR:$rs2, sh2add_op:$rs1, 2)>;
162
+ def : Pat<(add sh3add_op:$rs1, non_imm12:$rs2),
163
+ (TH_ADDSL GPR:$rs2, sh3add_op:$rs1, 3)>;
164
+
165
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 6)), GPR:$rs2),
166
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 1), 1)>;
167
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 10)), GPR:$rs2),
168
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 2), 1)>;
169
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 18)), GPR:$rs2),
170
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 3), 1)>;
171
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 12)), GPR:$rs2),
172
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 1), 2)>;
173
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 20)), GPR:$rs2),
174
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 2), 2)>;
175
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 36)), GPR:$rs2),
176
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 3), 2)>;
177
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 24)), GPR:$rs2),
178
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 1), 3)>;
179
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 40)), GPR:$rs2),
180
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 2), 3)>;
181
+ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 72)), GPR:$rs2),
182
+ (TH_ADDSL GPR:$rs2, (TH_ADDSL GPR:$rs1, GPR:$rs1, 3), 3)>;
183
+
184
+ def : Pat<(add GPR:$r, CSImm12MulBy4:$i),
185
+ (TH_ADDSL GPR:$r, (ADDI X0, (SimmShiftRightBy2XForm CSImm12MulBy4:$i)), 2)>;
186
+ def : Pat<(add GPR:$r, CSImm12MulBy8:$i),
187
+ (TH_ADDSL GPR:$r, (ADDI X0, (SimmShiftRightBy3XForm CSImm12MulBy8:$i)), 3)>;
188
+
189
+ def : Pat<(mul GPR:$r, C3LeftShift:$i),
190
+ (SLLI (TH_ADDSL GPR:$r, GPR:$r, 1),
191
+ (TrailingZeros C3LeftShift:$i))>;
192
+ def : Pat<(mul GPR:$r, C5LeftShift:$i),
193
+ (SLLI (TH_ADDSL GPR:$r, GPR:$r, 2),
194
+ (TrailingZeros C5LeftShift:$i))>;
195
+ def : Pat<(mul GPR:$r, C9LeftShift:$i),
196
+ (SLLI (TH_ADDSL GPR:$r, GPR:$r, 3),
197
+ (TrailingZeros C9LeftShift:$i))>;
198
+
199
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 11)),
200
+ (TH_ADDSL GPR:$r, (TH_ADDSL GPR:$r, GPR:$r, 2), 1)>;
201
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 19)),
202
+ (TH_ADDSL GPR:$r, (TH_ADDSL GPR:$r, GPR:$r, 3), 1)>;
203
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 13)),
204
+ (TH_ADDSL GPR:$r, (TH_ADDSL GPR:$r, GPR:$r, 1), 2)>;
205
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 21)),
206
+ (TH_ADDSL GPR:$r, (TH_ADDSL GPR:$r, GPR:$r, 2), 2)>;
207
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 37)),
208
+ (TH_ADDSL GPR:$r, (TH_ADDSL GPR:$r, GPR:$r, 3), 2)>;
209
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 25)),
210
+ (TH_ADDSL (TH_ADDSL GPR:$r, GPR:$r, 2), (TH_ADDSL GPR:$r, GPR:$r, 2), 2)>;
211
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 41)),
212
+ (TH_ADDSL GPR:$r, (TH_ADDSL GPR:$r, GPR:$r, 2), 3)>;
213
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 73)),
214
+ (TH_ADDSL GPR:$r, (TH_ADDSL GPR:$r, GPR:$r, 3), 3)>;
215
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 27)),
216
+ (TH_ADDSL (TH_ADDSL GPR:$r, GPR:$r, 3), (TH_ADDSL GPR:$r, GPR:$r, 3), 1)>;
217
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 45)),
218
+ (TH_ADDSL (TH_ADDSL GPR:$r, GPR:$r, 3), (TH_ADDSL GPR:$r, GPR:$r, 3), 2)>;
219
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 81)),
220
+ (TH_ADDSL (TH_ADDSL GPR:$r, GPR:$r, 3), (TH_ADDSL GPR:$r, GPR:$r, 3), 3)>;
221
+
222
+ def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 200)),
223
+ (SLLI (TH_ADDSL (TH_ADDSL GPR:$r, GPR:$r, 2),
224
+ (TH_ADDSL GPR:$r, GPR:$r, 2), 2), 3)>;
225
+ } // Predicates = [HasVendorXTHeadBa]
226
+
137
227
defm PseudoTHVdotVMAQA : VPseudoVMAQA_VV_VX;
138
228
defm PseudoTHVdotVMAQAU : VPseudoVMAQA_VV_VX;
139
229
defm PseudoTHVdotVMAQASU : VPseudoVMAQA_VV_VX;
0 commit comments