Skip to content

Commit 128c1f4

Browse files
committed
add patterns for vector_extract & store merged into vstelm instructions
1 parent cfb057a commit 128c1f4

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,6 +1760,14 @@ def : Pat<(lasxsplatf32 FPR32:$fj),
17601760
def : Pat<(lasxsplatf64 FPR64:$fj),
17611761
(XVREPLVE0_D (SUBREG_TO_REG (i64 0), FPR64:$fj, sub_64))>;
17621762

1763+
// VSTELM
1764+
defm : VstelmPat<truncstorei8, v32i8, XVSTELM_B, simm12_addlike, uimm5>;
1765+
defm : VstelmPat<truncstorei16, v16i16, XVSTELM_H, simm11_lsl1, uimm4>;
1766+
defm : VstelmPat<truncstorei32, v8i32, XVSTELM_W, simm10_lsl2, uimm3>;
1767+
defm : VstelmPat<store, v4i64, XVSTELM_D, simm9_lsl3, uimm2>;
1768+
defm : VstelmPat<store, v8f32, XVSTELM_W, simm10_lsl2, uimm3, f32>;
1769+
defm : VstelmPat<store, v4f64, XVSTELM_D, simm9_lsl3, uimm2, f64>;
1770+
17631771
// Loads/Stores
17641772
foreach vt = [v32i8, v16i16, v8i32, v4i64, v8f32, v4f64] in {
17651773
defm : LdPat<load, XVLD, vt>;

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
14551469
let Predicates = [HasExtLSX] in {
14561470

14571471
// VADD_{B/H/W/D}
@@ -1945,6 +1959,13 @@ def : Pat<(lsxsplatf32 FPR32:$fj),
19451959
def : 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
19491970
foreach vt = [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64] in {
19501971
defm : LdPat<load, VLD, vt>;

0 commit comments

Comments
 (0)