@@ -24,6 +24,13 @@ def SImm8UnsignedAsmOperand : SImmAsmOperand<8, "Unsigned"> {
2424 let RenderMethod = "addSImm8UnsignedOperands";
2525}
2626
27+ // (<2 x i16>, <2 x i16>) PPACK_DH (<4 x i8>, <4 x i8>, <4 x i8>, <4 x i8>)
28+ def SDT_RISCVPPackDH
29+ : SDTypeProfile<2, 4, [SDTCisVT<0, v2i16>, SDTCisSameAs<0, 1>,
30+ SDTCisVT<2, v4i8>, SDTCisSameAs<0, 3>,
31+ SDTCisSameAs<0, 4>, SDTCisSameAs<0, 5>]>;
32+ def riscv_ppack_dh : RVSDNode<"PPACK_DH", SDT_RISCVPPackDH>;
33+
2734// A 8-bit signed immediate allowing range [-128, 255]
2835// but represented as [-128, 127].
2936def simm8_unsigned : RISCVOp, ImmLeaf<XLenVT, "return isInt<8>(Imm);"> {
@@ -1530,6 +1537,10 @@ let Predicates = [HasStdExtP, IsRV32] in {
15301537 def : StPat<store, SW, GPR, v2i16>;
15311538 def : LdPat<load, LW, v4i8>;
15321539 def : LdPat<load, LW, v2i16>;
1540+
1541+ // Build vector patterns
1542+ def : Pat<(v2i16 (build_vector (XLenVT GPR:$a), (XLenVT GPR:$b))),
1543+ (PACK GPR:$a, GPR:$b)>;
15331544} // Predicates = [HasStdExtP, IsRV32]
15341545
15351546let Predicates = [HasStdExtP, IsRV64] in {
@@ -1566,4 +1577,29 @@ let Predicates = [HasStdExtP, IsRV64] in {
15661577 def : LdPat<load, LD, v8i8>;
15671578 def : LdPat<load, LD, v4i16>;
15681579 def : LdPat<load, LD, v2i32>;
1580+
1581+ // Build vector patterns
1582+ def : Pat<(v8i8 (build_vector (XLenVT GPR:$a), (XLenVT GPR:$b),
1583+ (XLenVT GPR:$c), (XLenVT GPR:$d),
1584+ (XLenVT undef), (XLenVT undef),
1585+ (XLenVT undef), (XLenVT undef))),
1586+ (PPACK_W (PPACK_H GPR:$a, GPR:$b), (PPACK_H GPR:$c, GPR:$d))>;
1587+
1588+ def : Pat<(v8i8 (build_vector (XLenVT GPR:$a), (XLenVT GPR:$b),
1589+ (XLenVT GPR:$c), (XLenVT GPR:$d),
1590+ (XLenVT GPR:$e), (XLenVT GPR:$f),
1591+ (XLenVT GPR:$g), (XLenVT GPR:$h))),
1592+ (PACK(PPACK_W (PPACK_H GPR:$a, GPR:$b), (PPACK_H GPR:$c, GPR:$d)),
1593+ (PPACK_W (PPACK_H GPR:$e, GPR:$f), (PPACK_H GPR:$g, GPR:$h)))>;
1594+
1595+ def : Pat<(v4i16 (build_vector (XLenVT GPR:$a), (XLenVT GPR:$b),
1596+ (XLenVT undef), (XLenVT undef))),
1597+ (PPACK_W GPR:$a, GPR:$b)>;
1598+
1599+ def : Pat<(v4i16 (build_vector (XLenVT GPR:$a), (XLenVT GPR:$b),
1600+ (XLenVT GPR:$c), (XLenVT GPR:$d))),
1601+ (PACK (PPACK_W GPR:$a, GPR:$b), (PPACK_W GPR:$c, GPR:$d))>;
1602+
1603+ def : Pat<(v2i32 (build_vector (XLenVT GPR:$a), (XLenVT GPR:$b))),
1604+ (PACK GPR:$a, GPR:$b)>;
15691605} // Predicates = [HasStdExtP, IsRV64]
0 commit comments