@@ -1518,6 +1518,18 @@ multiclass InsertExtractPatV2<ValueType vecty, ValueType elemty> {
15181518 }
15191519}
15201520
1521+ multiclass VAvgPat<SDPatternOperator OpNode, string Inst, ValueType vt> {
1522+ def : Pat<(OpNode (vt (add vt:$vj, vt:$vk)), (vt (vsplat_imm_eq_1))),
1523+ (!cast<LAInst>(Inst) vt:$vj, vt:$vk)>;
1524+ }
1525+
1526+ multiclass VAvgrPat<SDPatternOperator OpNode, string Inst, ValueType vt> {
1527+ def : Pat<(OpNode (vt (add (vt (add vt:$vj, vt:$vk)),
1528+ (vt (vsplat_imm_eq_1)))),
1529+ (vt (vsplat_imm_eq_1))),
1530+ (!cast<LAInst>(Inst) vt:$vj, vt:$vk)>;
1531+ }
1532+
15211533let Predicates = [HasExtLSX] in {
15221534
15231535// VADD_{B/H/W/D}
@@ -2155,54 +2167,22 @@ def : Pat<(f64 f64imm_vldi:$in),
21552167 (f64 (EXTRACT_SUBREG (VLDI (to_f64imm_vldi f64imm_vldi:$in)), sub_64))>;
21562168
21572169// VAVG_{B/H/W/D/BU/HU/WU/DU}, VAVGR_{B/H/W/D/BU/HU/WU/DU}
2158- def : Pat<(sra (v16i8 (add v16i8:$vj, v16i8:$vk)), (v16i8 (vsplat_imm_eq_1))),
2159- (VAVG_B v16i8:$vj, v16i8:$vk)>;
2160- def : Pat<(sra (v8i16 (add v8i16:$vj, v8i16:$vk)), (v8i16 (vsplat_imm_eq_1))),
2161- (VAVG_H v8i16:$vj, v8i16:$vk)>;
2162- def : Pat<(sra (v4i32 (add v4i32:$vj, v4i32:$vk)), (v4i32 (vsplat_imm_eq_1))),
2163- (VAVG_W v4i32:$vj, v4i32:$vk)>;
2164- def : Pat<(sra (v2i64 (add v2i64:$vj, v2i64:$vk)), (v2i64 (vsplat_imm_eq_1))),
2165- (VAVG_D v2i64:$vj, v2i64:$vk)>;
2166- def : Pat<(srl (v16i8 (add v16i8:$vj, v16i8:$vk)), (v16i8 (vsplat_imm_eq_1))),
2167- (VAVG_BU v16i8:$vj, v16i8:$vk)>;
2168- def : Pat<(srl (v8i16 (add v8i16:$vj, v8i16:$vk)), (v8i16 (vsplat_imm_eq_1))),
2169- (VAVG_HU v8i16:$vj, v8i16:$vk)>;
2170- def : Pat<(srl (v4i32 (add v4i32:$vj, v4i32:$vk)), (v4i32 (vsplat_imm_eq_1))),
2171- (VAVG_WU v4i32:$vj, v4i32:$vk)>;
2172- def : Pat<(srl (v2i64 (add v2i64:$vj, v2i64:$vk)), (v2i64 (vsplat_imm_eq_1))),
2173- (VAVG_DU v2i64:$vj, v2i64:$vk)>;
2174- def : Pat<(sra (v16i8 (add (v16i8 (add v16i8:$vj, v16i8:$vk)),
2175- (v16i8 (vsplat_imm_eq_1)))),
2176- (v16i8 (vsplat_imm_eq_1))),
2177- (VAVGR_B v16i8:$vj, v16i8:$vk)>;
2178- def : Pat<(sra (v8i16 (add (v8i16 (add v8i16:$vj, v8i16:$vk)),
2179- (v8i16 (vsplat_imm_eq_1)))),
2180- (v8i16 (vsplat_imm_eq_1))),
2181- (VAVGR_H v8i16:$vj, v8i16:$vk)>;
2182- def : Pat<(sra (v4i32 (add (v4i32 (add v4i32:$vj, v4i32:$vk)),
2183- (v4i32 (vsplat_imm_eq_1)))),
2184- (v4i32 (vsplat_imm_eq_1))),
2185- (VAVGR_W v4i32:$vj, v4i32:$vk)>;
2186- def : Pat<(sra (v2i64 (add (v2i64 (add v2i64:$vj, v2i64:$vk)),
2187- (v2i64 (vsplat_imm_eq_1)))),
2188- (v2i64 (vsplat_imm_eq_1))),
2189- (VAVGR_D v2i64:$vj, v2i64:$vk)>;
2190- def : Pat<(srl (v16i8 (add (v16i8 (add v16i8:$vj, v16i8:$vk)),
2191- (v16i8 (vsplat_imm_eq_1)))),
2192- (v16i8 (vsplat_imm_eq_1))),
2193- (VAVGR_BU v16i8:$vj, v16i8:$vk)>;
2194- def : Pat<(srl (v8i16 (add (v8i16 (add v8i16:$vj, v8i16:$vk)),
2195- (v8i16 (vsplat_imm_eq_1)))),
2196- (v8i16 (vsplat_imm_eq_1))),
2197- (VAVGR_HU v8i16:$vj, v8i16:$vk)>;
2198- def : Pat<(srl (v4i32 (add (v4i32 (add v4i32:$vj, v4i32:$vk)),
2199- (v4i32 (vsplat_imm_eq_1)))),
2200- (v4i32 (vsplat_imm_eq_1))),
2201- (VAVGR_WU v4i32:$vj, v4i32:$vk)>;
2202- def : Pat<(srl (v2i64 (add (v2i64 (add v2i64:$vj, v2i64:$vk)),
2203- (v2i64 (vsplat_imm_eq_1)))),
2204- (v2i64 (vsplat_imm_eq_1))),
2205- (VAVGR_DU v2i64:$vj, v2i64:$vk)>;
2170+ defm : VAvgPat<sra, "VAVG_B", v16i8>;
2171+ defm : VAvgPat<sra, "VAVG_H", v8i16>;
2172+ defm : VAvgPat<sra, "VAVG_W", v4i32>;
2173+ defm : VAvgPat<sra, "VAVG_D", v2i64>;
2174+ defm : VAvgPat<srl, "VAVG_BU", v16i8>;
2175+ defm : VAvgPat<srl, "VAVG_HU", v8i16>;
2176+ defm : VAvgPat<srl, "VAVG_WU", v4i32>;
2177+ defm : VAvgPat<srl, "VAVG_DU", v2i64>;
2178+ defm : VAvgrPat<sra, "VAVGR_B", v16i8>;
2179+ defm : VAvgrPat<sra, "VAVGR_H", v8i16>;
2180+ defm : VAvgrPat<sra, "VAVGR_W", v4i32>;
2181+ defm : VAvgrPat<sra, "VAVGR_D", v2i64>;
2182+ defm : VAvgrPat<srl, "VAVGR_BU", v16i8>;
2183+ defm : VAvgrPat<srl, "VAVGR_HU", v8i16>;
2184+ defm : VAvgrPat<srl, "VAVGR_WU", v4i32>;
2185+ defm : VAvgrPat<srl, "VAVGR_DU", v2i64>;
22062186
22072187// abs
22082188def : Pat<(abs v16i8:$vj), (VSIGNCOV_B v16i8:$vj, v16i8:$vj)>;
0 commit comments