@@ -142,11 +142,13 @@ def AArch64st1q_scatter : SDNode<"AArch64ISD::SST1Q_PRED", SDT_AArch64_SCATTER_V
142
142
143
143
// SVE CNT/INC/RDVL
144
144
def sve_rdvl_imm : ComplexPattern<i64, 1, "SelectRDVLImm<-32, 31, 16>">;
145
+ def sve_cntb_imm : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, 16>">;
145
146
def sve_cnth_imm : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, 8>">;
146
147
def sve_cntw_imm : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, 4>">;
147
148
def sve_cntd_imm : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, 2>">;
148
149
149
150
// SVE DEC
151
+ def sve_cntb_imm_neg : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, -16>">;
150
152
def sve_cnth_imm_neg : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, -8>">;
151
153
def sve_cntw_imm_neg : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, -4>">;
152
154
def sve_cntd_imm_neg : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, -2>">;
@@ -2680,28 +2682,31 @@ let Predicates = [HasSVEorSME] in {
2680
2682
}
2681
2683
2682
2684
let Predicates = [HasSVEorSME, UseScalarIncVL], AddedComplexity = 5 in {
2683
- def : Pat<(add GPR64:$op, (vscale (sve_rdvl_imm i32:$imm))),
2684
- (ADDVL_XXI GPR64:$op, $imm)>;
2685
-
2686
- def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_rdvl_imm i32:$imm))))),
2687
- (EXTRACT_SUBREG (ADDVL_XXI (INSERT_SUBREG (IMPLICIT_DEF),
2688
- GPR32:$op, sub_32), $imm),
2689
- sub_32)>;
2690
-
2685
+ def : Pat<(add GPR64:$op, (vscale (sve_cntb_imm i32:$imm))),
2686
+ (INCB_XPiI GPR64:$op, 31, $imm)>;
2691
2687
def : Pat<(add GPR64:$op, (vscale (sve_cnth_imm i32:$imm))),
2692
2688
(INCH_XPiI GPR64:$op, 31, $imm)>;
2693
2689
def : Pat<(add GPR64:$op, (vscale (sve_cntw_imm i32:$imm))),
2694
2690
(INCW_XPiI GPR64:$op, 31, $imm)>;
2695
2691
def : Pat<(add GPR64:$op, (vscale (sve_cntd_imm i32:$imm))),
2696
2692
(INCD_XPiI GPR64:$op, 31, $imm)>;
2697
2693
2694
+ def : Pat<(add GPR64:$op, (vscale (sve_cntb_imm_neg i32:$imm))),
2695
+ (DECB_XPiI GPR64:$op, 31, $imm)>;
2698
2696
def : Pat<(add GPR64:$op, (vscale (sve_cnth_imm_neg i32:$imm))),
2699
2697
(DECH_XPiI GPR64:$op, 31, $imm)>;
2700
2698
def : Pat<(add GPR64:$op, (vscale (sve_cntw_imm_neg i32:$imm))),
2701
2699
(DECW_XPiI GPR64:$op, 31, $imm)>;
2702
2700
def : Pat<(add GPR64:$op, (vscale (sve_cntd_imm_neg i32:$imm))),
2703
2701
(DECD_XPiI GPR64:$op, 31, $imm)>;
2704
2702
2703
+ def : Pat<(add GPR64:$op, (vscale (sve_rdvl_imm i32:$imm))),
2704
+ (ADDVL_XXI GPR64:$op, $imm)>;
2705
+
2706
+ def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_cntb_imm i32:$imm))))),
2707
+ (EXTRACT_SUBREG (INCB_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2708
+ GPR32:$op, sub_32), 31, $imm),
2709
+ sub_32)>;
2705
2710
def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_cnth_imm i32:$imm))))),
2706
2711
(EXTRACT_SUBREG (INCH_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2707
2712
GPR32:$op, sub_32), 31, $imm),
@@ -2715,6 +2720,10 @@ let Predicates = [HasSVEorSME] in {
2715
2720
GPR32:$op, sub_32), 31, $imm),
2716
2721
sub_32)>;
2717
2722
2723
+ def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_cntb_imm_neg i32:$imm))))),
2724
+ (EXTRACT_SUBREG (DECB_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2725
+ GPR32:$op, sub_32), 31, $imm),
2726
+ sub_32)>;
2718
2727
def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_cnth_imm_neg i32:$imm))))),
2719
2728
(EXTRACT_SUBREG (DECH_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2720
2729
GPR32:$op, sub_32), 31, $imm),
@@ -2727,6 +2736,11 @@ let Predicates = [HasSVEorSME] in {
2727
2736
(EXTRACT_SUBREG (DECD_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2728
2737
GPR32:$op, sub_32), 31, $imm),
2729
2738
sub_32)>;
2739
+
2740
+ def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_rdvl_imm i32:$imm))))),
2741
+ (EXTRACT_SUBREG (ADDVL_XXI (INSERT_SUBREG (IMPLICIT_DEF),
2742
+ GPR32:$op, sub_32), $imm),
2743
+ sub_32)>;
2730
2744
}
2731
2745
2732
2746
// For big endian, only BITCASTs involving same sized vector types with same
0 commit comments