@@ -1452,6 +1452,20 @@ multiclass VldreplPat<ValueType vt, LAInst Inst, Operand ImmOpnd> {
14521452 (Inst BaseAddr:$rj, ImmOpnd:$imm)>;
14531453}
14541454
1455+ multiclass VstelmPat<PatFrag StoreOp, ValueType vt, LAInst Inst,
1456+ Operand ImmOpnd, Operand IdxOpnd, ValueType elt = i64> {
1457+ def : Pat<(StoreOp(elt(vector_extract vt:$vd, IdxOpnd:$idx)), BaseAddr:$rj),
1458+ (Inst vt:$vd, BaseAddr:$rj, 0, IdxOpnd:$idx)>;
1459+
1460+ def : Pat<(StoreOp(elt(vector_extract vt:$vd, IdxOpnd:$idx)),
1461+ (AddrConstant GPR:$rj, ImmOpnd:$imm)),
1462+ (Inst vt:$vd, GPR:$rj, ImmOpnd:$imm, IdxOpnd:$idx)>;
1463+
1464+ def : Pat<(StoreOp(elt(vector_extract vt:$vd, IdxOpnd:$idx)),
1465+ (AddLike BaseAddr:$rj, ImmOpnd:$imm)),
1466+ (Inst vt:$vd, BaseAddr:$rj, ImmOpnd:$imm, IdxOpnd:$idx)>;
1467+ }
1468+
14551469let Predicates = [HasExtLSX] in {
14561470
14571471// VADD_{B/H/W/D}
@@ -1945,6 +1959,13 @@ def : Pat<(lsxsplatf32 FPR32:$fj),
19451959def : Pat<(lsxsplatf64 FPR64:$fj),
19461960 (VREPLVEI_D (SUBREG_TO_REG (i64 0), FPR64:$fj, sub_64), 0)>;
19471961
1962+ defm : VstelmPat<truncstorei8, v16i8, VSTELM_B, simm12_addlike, uimm4>;
1963+ defm : VstelmPat<truncstorei16, v8i16, VSTELM_H, simm11_lsl1, uimm3>;
1964+ defm : VstelmPat<truncstorei32, v4i32, VSTELM_W, simm10_lsl2, uimm2>;
1965+ defm : VstelmPat<store, v2i64, VSTELM_D, simm9_lsl3, uimm1>;
1966+ defm : VstelmPat<store, v4f32, VSTELM_W, simm10_lsl2, uimm2, f32>;
1967+ defm : VstelmPat<store, v2f64, VSTELM_D, simm9_lsl3, uimm1, f64>;
1968+
19481969// Loads/Stores
19491970foreach vt = [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64] in {
19501971 defm : LdPat<load, VLD, vt>;
0 commit comments