@@ -288,6 +288,11 @@ class SVE_1_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
288
288
: Pat<(vtd (op vt1:$Op1)),
289
289
(inst $Op1)>;
290
290
291
+ class SVE_2_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
292
+ ValueType vt2, Instruction inst>
293
+ : Pat<(vtd (op vt1:$Op1, vt2:$Op2)),
294
+ (inst $Op1, $Op2)>;
295
+
291
296
class SVE_3_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
292
297
ValueType vt2, ValueType vt3, Instruction inst>
293
298
: Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3)),
@@ -1122,11 +1127,16 @@ class sve_int_bin_cons_arit_0<bits<2> sz8_64, bits<3> opc, string asm,
1122
1127
let Inst{4-0} = Zd;
1123
1128
}
1124
1129
1125
- multiclass sve_int_bin_cons_arit_0<bits<3> opc, string asm> {
1130
+ multiclass sve_int_bin_cons_arit_0<bits<3> opc, string asm, SDPatternOperator op > {
1126
1131
def _B : sve_int_bin_cons_arit_0<0b00, opc, asm, ZPR8>;
1127
1132
def _H : sve_int_bin_cons_arit_0<0b01, opc, asm, ZPR16>;
1128
1133
def _S : sve_int_bin_cons_arit_0<0b10, opc, asm, ZPR32>;
1129
1134
def _D : sve_int_bin_cons_arit_0<0b11, opc, asm, ZPR64>;
1135
+
1136
+ def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1137
+ def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1138
+ def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1139
+ def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1130
1140
}
1131
1141
1132
1142
//===----------------------------------------------------------------------===//
@@ -1801,38 +1811,61 @@ class sve_int_bin_pred_arit_log<bits<2> sz8_64, bits<2> fmt, bits<3> opc,
1801
1811
let ElementSize = zprty.ElementSize;
1802
1812
}
1803
1813
1804
- multiclass sve_int_bin_pred_log<bits<3> opc, string asm> {
1814
+ multiclass sve_int_bin_pred_log<bits<3> opc, string asm, SDPatternOperator op > {
1805
1815
def _B : sve_int_bin_pred_arit_log<0b00, 0b11, opc, asm, ZPR8>;
1806
1816
def _H : sve_int_bin_pred_arit_log<0b01, 0b11, opc, asm, ZPR16>;
1807
1817
def _S : sve_int_bin_pred_arit_log<0b10, 0b11, opc, asm, ZPR32>;
1808
1818
def _D : sve_int_bin_pred_arit_log<0b11, 0b11, opc, asm, ZPR64>;
1819
+
1820
+ def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1821
+ def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1822
+ def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1823
+ def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1809
1824
}
1810
1825
1811
- multiclass sve_int_bin_pred_arit_0<bits<3> opc, string asm> {
1826
+ multiclass sve_int_bin_pred_arit_0<bits<3> opc, string asm, SDPatternOperator op > {
1812
1827
def _B : sve_int_bin_pred_arit_log<0b00, 0b00, opc, asm, ZPR8>;
1813
1828
def _H : sve_int_bin_pred_arit_log<0b01, 0b00, opc, asm, ZPR16>;
1814
1829
def _S : sve_int_bin_pred_arit_log<0b10, 0b00, opc, asm, ZPR32>;
1815
1830
def _D : sve_int_bin_pred_arit_log<0b11, 0b00, opc, asm, ZPR64>;
1831
+
1832
+ def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1833
+ def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1834
+ def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1835
+ def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1816
1836
}
1817
1837
1818
- multiclass sve_int_bin_pred_arit_1<bits<3> opc, string asm> {
1838
+ multiclass sve_int_bin_pred_arit_1<bits<3> opc, string asm, SDPatternOperator op > {
1819
1839
def _B : sve_int_bin_pred_arit_log<0b00, 0b01, opc, asm, ZPR8>;
1820
1840
def _H : sve_int_bin_pred_arit_log<0b01, 0b01, opc, asm, ZPR16>;
1821
1841
def _S : sve_int_bin_pred_arit_log<0b10, 0b01, opc, asm, ZPR32>;
1822
1842
def _D : sve_int_bin_pred_arit_log<0b11, 0b01, opc, asm, ZPR64>;
1843
+
1844
+ def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1845
+ def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1846
+ def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1847
+ def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1823
1848
}
1824
1849
1825
- multiclass sve_int_bin_pred_arit_2<bits<3> opc, string asm> {
1850
+ multiclass sve_int_bin_pred_arit_2<bits<3> opc, string asm, SDPatternOperator op > {
1826
1851
def _B : sve_int_bin_pred_arit_log<0b00, 0b10, opc, asm, ZPR8>;
1827
1852
def _H : sve_int_bin_pred_arit_log<0b01, 0b10, opc, asm, ZPR16>;
1828
1853
def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>;
1829
1854
def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>;
1855
+
1856
+ def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1857
+ def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1858
+ def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1859
+ def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1830
1860
}
1831
1861
1832
1862
// Special case for divides which are not defined for 8b/16b elements.
1833
- multiclass sve_int_bin_pred_arit_2_div<bits<3> opc, string asm> {
1863
+ multiclass sve_int_bin_pred_arit_2_div<bits<3> opc, string asm, SDPatternOperator op > {
1834
1864
def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>;
1835
1865
def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>;
1866
+
1867
+ def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1868
+ def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1836
1869
}
1837
1870
1838
1871
//===----------------------------------------------------------------------===//
@@ -3086,9 +3119,14 @@ class sve_int_bin_cons_log<bits<2> opc, string asm>
3086
3119
let Inst{4-0} = Zd;
3087
3120
}
3088
3121
3089
- multiclass sve_int_bin_cons_log<bits<2> opc, string asm> {
3122
+ multiclass sve_int_bin_cons_log<bits<2> opc, string asm, SDPatternOperator op > {
3090
3123
def NAME : sve_int_bin_cons_log<opc, asm>;
3091
3124
3125
+ def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
3126
+ def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
3127
+ def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
3128
+ def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
3129
+
3092
3130
def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
3093
3131
(!cast<Instruction>(NAME) ZPR8:$Zd, ZPR8:$Zn, ZPR8:$Zm), 1>;
3094
3132
def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
0 commit comments