@@ -35,6 +35,11 @@ def SplatPat : ComplexPattern<vAny, 1, "selectVSplat", [], [], 1>;
3535def SplatPat_simm5 : ComplexPattern<vAny, 1, "selectVSplatSimm5", []>;
3636def SplatPat_uimm5 : ComplexPattern<vAny, 1, "selectVSplatUimm5", []>;
3737
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+
3843multiclass VPatUSLoadStoreSDNode<LLVMType type,
3944 LLVMType mask_type,
4045 int sew,
@@ -181,6 +186,36 @@ defm "" : VPatBinarySDNode_VV_VX<udiv, "PseudoVDIV">;
181186defm "" : VPatBinarySDNode_VV_VX<urem, "PseudoVREMU">;
182187defm "" : VPatBinarySDNode_VV_VX<srem, "PseudoVREM">;
183188
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+
184219} // Predicates = [HasStdExtV]
185220
186221//===----------------------------------------------------------------------===//
@@ -196,6 +231,13 @@ foreach vti = AllIntegerVectors in {
196231 (!cast<Instruction>("PseudoVMV_V_I_" # vti.LMul.MX)
197232 simm5:$rs1, VLMax, vti.SEW)>;
198233}
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+ }
199241} // Predicates = [HasStdExtV]
200242
201243let Predicates = [HasStdExtV, IsRV32] in {
0 commit comments