@@ -35,6 +35,11 @@ def SplatPat : ComplexPattern<vAny, 1, "selectVSplat", [], [], 1>;
35
35
def SplatPat_simm5 : ComplexPattern<vAny, 1, "selectVSplatSimm5", []>;
36
36
def SplatPat_uimm5 : ComplexPattern<vAny, 1, "selectVSplatUimm5", []>;
37
37
38
+ // A mask-vector version of the standard 'vnot' fragment but using splat_vector
39
+ // rather than (the implicit) build_vector
40
+ def riscv_m_vnot : PatFrag<(ops node:$in),
41
+ (xor node:$in, (splat_vector (XLenVT 1)))>;
42
+
38
43
multiclass VPatUSLoadStoreSDNode<LLVMType type,
39
44
LLVMType mask_type,
40
45
int sew,
@@ -181,6 +186,36 @@ defm "" : VPatBinarySDNode_VV_VX<udiv, "PseudoVDIV">;
181
186
defm "" : VPatBinarySDNode_VV_VX<urem, "PseudoVREMU">;
182
187
defm "" : VPatBinarySDNode_VV_VX<srem, "PseudoVREM">;
183
188
189
+ // 16.1. Vector Mask-Register Logical Instructions
190
+ foreach mti = AllMasks in {
191
+ def : Pat<(mti.Mask (and VR:$rs1, VR:$rs2)),
192
+ (!cast<Instruction>("PseudoVMAND_MM_"#mti.LMul.MX)
193
+ VR:$rs1, VR:$rs2, VLMax, mti.SEW)>;
194
+ def : Pat<(mti.Mask (or VR:$rs1, VR:$rs2)),
195
+ (!cast<Instruction>("PseudoVMOR_MM_"#mti.LMul.MX)
196
+ VR:$rs1, VR:$rs2, VLMax, mti.SEW)>;
197
+ def : Pat<(mti.Mask (xor VR:$rs1, VR:$rs2)),
198
+ (!cast<Instruction>("PseudoVMXOR_MM_"#mti.LMul.MX)
199
+ VR:$rs1, VR:$rs2, VLMax, mti.SEW)>;
200
+
201
+ def : Pat<(mti.Mask (riscv_m_vnot (and VR:$rs1, VR:$rs2))),
202
+ (!cast<Instruction>("PseudoVMNAND_MM_"#mti.LMul.MX)
203
+ VR:$rs1, VR:$rs2, VLMax, mti.SEW)>;
204
+ def : Pat<(mti.Mask (riscv_m_vnot (or VR:$rs1, VR:$rs2))),
205
+ (!cast<Instruction>("PseudoVMNOR_MM_"#mti.LMul.MX)
206
+ VR:$rs1, VR:$rs2, VLMax, mti.SEW)>;
207
+ def : Pat<(mti.Mask (riscv_m_vnot (xor VR:$rs1, VR:$rs2))),
208
+ (!cast<Instruction>("PseudoVMXNOR_MM_"#mti.LMul.MX)
209
+ VR:$rs1, VR:$rs2, VLMax, mti.SEW)>;
210
+
211
+ def : Pat<(mti.Mask (and VR:$rs1, (riscv_m_vnot VR:$rs2))),
212
+ (!cast<Instruction>("PseudoVMANDNOT_MM_"#mti.LMul.MX)
213
+ VR:$rs1, VR:$rs2, VLMax, mti.SEW)>;
214
+ def : Pat<(mti.Mask (or VR:$rs1, (riscv_m_vnot VR:$rs2))),
215
+ (!cast<Instruction>("PseudoVMORNOT_MM_"#mti.LMul.MX)
216
+ VR:$rs1, VR:$rs2, VLMax, mti.SEW)>;
217
+ }
218
+
184
219
} // Predicates = [HasStdExtV]
185
220
186
221
//===----------------------------------------------------------------------===//
@@ -196,6 +231,13 @@ foreach vti = AllIntegerVectors in {
196
231
(!cast<Instruction>("PseudoVMV_V_I_" # vti.LMul.MX)
197
232
simm5:$rs1, VLMax, vti.SEW)>;
198
233
}
234
+
235
+ foreach mti = AllMasks in {
236
+ def : Pat<(mti.Mask (splat_vector (XLenVT 1))),
237
+ (!cast<Instruction>("PseudoVMSET_M_"#mti.BX) VLMax, mti.SEW)>;
238
+ def : Pat<(mti.Mask (splat_vector (XLenVT 0))),
239
+ (!cast<Instruction>("PseudoVMCLR_M_"#mti.BX) VLMax, mti.SEW)>;
240
+ }
199
241
} // Predicates = [HasStdExtV]
200
242
201
243
let Predicates = [HasStdExtV, IsRV32] in {
0 commit comments