@@ -1482,6 +1482,28 @@ multiclass VstelmPat<PatFrag StoreOp, ValueType vt, LAInst Inst,
1482
1482
(Inst vt:$vd, BaseAddr:$rj, ImmOpnd:$imm, IdxOpnd:$idx)>;
1483
1483
}
1484
1484
1485
+ multiclass InsertExtractPatV4<ValueType vecty, ValueType elemty> {
1486
+ foreach imm1 = 0...3 in {
1487
+ foreach imm2 = 0...3 in {
1488
+ defvar Imm = !or(!shl(imm2, 4), imm1);
1489
+ def : Pat<(vector_insert vecty:$vd,
1490
+ (elemty (vector_extract vecty:$vj, imm1)), imm2),
1491
+ (VEXTRINS_W $vd, $vj, Imm)>;
1492
+ }
1493
+ }
1494
+ }
1495
+
1496
+ multiclass InsertExtractPatV2<ValueType vecty, ValueType elemty> {
1497
+ foreach imm1 = 0...1 in {
1498
+ foreach imm2 = 0...1 in {
1499
+ defvar Imm = !or(!shl(imm2, 4), imm1);
1500
+ def : Pat<(vector_insert vecty:$vd,
1501
+ (elemty (vector_extract vecty:$vj, imm1)), imm2),
1502
+ (VEXTRINS_D $vd, $vj, Imm)>;
1503
+ }
1504
+ }
1505
+ }
1506
+
1485
1507
let Predicates = [HasExtLSX] in {
1486
1508
1487
1509
// VADD_{B/H/W/D}
@@ -1782,6 +1804,31 @@ defm : PatCCVrVrF<SETUNE, "VFCMP_CUNE">;
1782
1804
defm : PatCCVrVrF<SETO, "VFCMP_COR">;
1783
1805
defm : PatCCVrVrF<SETUO, "VFCMP_CUN">;
1784
1806
1807
+ // Insert element extracted from vector into vector.
1808
+ // VPICKVE2GR_{B/H/W/D} + VINSGR2VR_{B/H/W/D} -> VEXTRINS_{B/H/W/D}
1809
+ foreach imm1 = 0...15 in {
1810
+ foreach imm2 = 0...15 in {
1811
+ defvar Imm = !or(!shl(imm2, 4), imm1);
1812
+ def : Pat<(vector_insert v16i8:$vd,
1813
+ (GRLenVT (vector_extract v16i8:$vj, imm1)), imm2),
1814
+ (VEXTRINS_B $vd, $vj, Imm)>;
1815
+ }
1816
+ }
1817
+
1818
+ foreach imm1 = 0...7 in {
1819
+ foreach imm2 = 0...7 in {
1820
+ defvar Imm = !or(!shl(imm2, 4), imm1);
1821
+ def : Pat<(vector_insert v8i16:$vd,
1822
+ (GRLenVT (vector_extract v8i16:$vj, imm1)), imm2),
1823
+ (VEXTRINS_H $vd, $vj, Imm)>;
1824
+ }
1825
+ }
1826
+
1827
+ defm : InsertExtractPatV4<v4i32, GRLenVT>;
1828
+ defm : InsertExtractPatV4<v4f32, f32>;
1829
+ defm : InsertExtractPatV2<v2i64, GRLenVT>;
1830
+ defm : InsertExtractPatV2<v2f64, f64>;
1831
+
1785
1832
// VINSGR2VR_{B/H/W/D}
1786
1833
def : Pat<(vector_insert v16i8:$vd, GRLenVT:$rj, uimm4:$imm),
1787
1834
(VINSGR2VR_B v16i8:$vd, GRLenVT:$rj, uimm4:$imm)>;
@@ -1791,10 +1838,6 @@ def : Pat<(vector_insert v4i32:$vd, GRLenVT:$rj, uimm2:$imm),
1791
1838
(VINSGR2VR_W v4i32:$vd, GRLenVT:$rj, uimm2:$imm)>;
1792
1839
def : Pat<(vector_insert v2i64:$vd, GRLenVT:$rj, uimm1:$imm),
1793
1840
(VINSGR2VR_D v2i64:$vd, GRLenVT:$rj, uimm1:$imm)>;
1794
- def : Pat<(vector_insert v4f32:$vd, (f32 (vector_extract v4f32:$vj, uimm2:$imm1)), uimm2:$imm2),
1795
- (VINSGR2VR_W $vd, (VPICKVE2GR_W v4f32:$vj, uimm2:$imm1), uimm2:$imm2)>;
1796
- def : Pat<(vector_insert v2f64:$vd, (f64 (vector_extract v2f64:$vj, uimm1:$imm1)), uimm1:$imm2),
1797
- (VINSGR2VR_D $vd, (VPICKVE2GR_D v2f64:$vj, uimm1:$imm1), uimm1:$imm2)>;
1798
1841
def : Pat<(vector_insert v4f32:$vd, FPR32:$fj, uimm2:$imm),
1799
1842
(VINSGR2VR_W $vd, (COPY_TO_REGCLASS FPR32:$fj, GPR), uimm2:$imm)>;
1800
1843
def : Pat<(vector_insert v2f64:$vd, FPR64:$fj, uimm1:$imm),
0 commit comments