@@ -142,13 +142,11 @@ 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>">;
146
145
def sve_cnth_imm : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, 8>">;
147
146
def sve_cntw_imm : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, 4>">;
148
147
def sve_cntd_imm : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, 2>">;
149
148
150
149
// SVE DEC
151
- def sve_cntb_imm_neg : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, -16>">;
152
150
def sve_cnth_imm_neg : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, -8>">;
153
151
def sve_cntw_imm_neg : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, -4>">;
154
152
def sve_cntd_imm_neg : ComplexPattern<i64, 1, "SelectRDVLImm<1, 16, -2>">;
@@ -2680,31 +2678,50 @@ let Predicates = [HasSVE_or_SME] in {
2680
2678
}
2681
2679
2682
2680
let Predicates = [HasSVE_or_SME, UseScalarIncVL], AddedComplexity = 5 in {
2683
- def : Pat<(add GPR64:$op, (vscale (sve_cntb_imm i32:$imm))),
2684
- (INCB_XPiI GPR64:$op, 31, $imm)>;
2681
+ // Some INCB/DECB forms have better latency and throughput than ADDVL on
2682
+ // microarchitectures such as the Neoverse V2 and Neoverse V3, so we prefer
2683
+ // using them here.
2684
+ foreach imm = [ 1, 2, 4 ] in
2685
+ let AddedComplexity = 6 in {
2686
+ def : Pat<(add GPR64:$op, (vscale !mul(imm, 16))),
2687
+ (INCB_XPiI GPR64:$op, 31, imm)>;
2688
+
2689
+ def : Pat<(add GPR32:$op, (i32 (trunc (vscale !mul(imm, 16))))),
2690
+ (EXTRACT_SUBREG (INCB_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2691
+ GPR32:$op, sub_32), 31, imm),
2692
+ sub_32)>;
2693
+
2694
+ def : Pat<(add GPR64:$op, (vscale !mul(imm, -16))),
2695
+ (DECB_XPiI GPR64:$op, 31, imm)>;
2696
+
2697
+ def : Pat<(add GPR32:$op, (i32 (trunc (vscale !mul(imm, -16))))),
2698
+ (EXTRACT_SUBREG (DECB_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2699
+ GPR32:$op, sub_32), 31, imm),
2700
+ sub_32)>;
2701
+ }
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_rdvl_imm i32:$imm))))),
2707
+ (EXTRACT_SUBREG (ADDVL_XXI (INSERT_SUBREG (IMPLICIT_DEF),
2708
+ GPR32:$op, sub_32), $imm),
2709
+ sub_32)>;
2710
+
2685
2711
def : Pat<(add GPR64:$op, (vscale (sve_cnth_imm i32:$imm))),
2686
2712
(INCH_XPiI GPR64:$op, 31, $imm)>;
2687
2713
def : Pat<(add GPR64:$op, (vscale (sve_cntw_imm i32:$imm))),
2688
2714
(INCW_XPiI GPR64:$op, 31, $imm)>;
2689
2715
def : Pat<(add GPR64:$op, (vscale (sve_cntd_imm i32:$imm))),
2690
2716
(INCD_XPiI GPR64:$op, 31, $imm)>;
2691
2717
2692
- def : Pat<(add GPR64:$op, (vscale (sve_cntb_imm_neg i32:$imm))),
2693
- (DECB_XPiI GPR64:$op, 31, $imm)>;
2694
2718
def : Pat<(add GPR64:$op, (vscale (sve_cnth_imm_neg i32:$imm))),
2695
2719
(DECH_XPiI GPR64:$op, 31, $imm)>;
2696
2720
def : Pat<(add GPR64:$op, (vscale (sve_cntw_imm_neg i32:$imm))),
2697
2721
(DECW_XPiI GPR64:$op, 31, $imm)>;
2698
2722
def : Pat<(add GPR64:$op, (vscale (sve_cntd_imm_neg i32:$imm))),
2699
2723
(DECD_XPiI GPR64:$op, 31, $imm)>;
2700
2724
2701
- def : Pat<(add GPR64:$op, (vscale (sve_rdvl_imm i32:$imm))),
2702
- (ADDVL_XXI GPR64:$op, $imm)>;
2703
-
2704
- def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_cntb_imm i32:$imm))))),
2705
- (EXTRACT_SUBREG (INCB_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2706
- GPR32:$op, sub_32), 31, $imm),
2707
- sub_32)>;
2708
2725
def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_cnth_imm i32:$imm))))),
2709
2726
(EXTRACT_SUBREG (INCH_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2710
2727
GPR32:$op, sub_32), 31, $imm),
@@ -2718,10 +2735,6 @@ let Predicates = [HasSVE_or_SME] in {
2718
2735
GPR32:$op, sub_32), 31, $imm),
2719
2736
sub_32)>;
2720
2737
2721
- def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_cntb_imm_neg i32:$imm))))),
2722
- (EXTRACT_SUBREG (DECB_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2723
- GPR32:$op, sub_32), 31, $imm),
2724
- sub_32)>;
2725
2738
def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_cnth_imm_neg i32:$imm))))),
2726
2739
(EXTRACT_SUBREG (DECH_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2727
2740
GPR32:$op, sub_32), 31, $imm),
@@ -2734,11 +2747,6 @@ let Predicates = [HasSVE_or_SME] in {
2734
2747
(EXTRACT_SUBREG (DECD_XPiI (INSERT_SUBREG (IMPLICIT_DEF),
2735
2748
GPR32:$op, sub_32), 31, $imm),
2736
2749
sub_32)>;
2737
-
2738
- def : Pat<(add GPR32:$op, (i32 (trunc (vscale (sve_rdvl_imm i32:$imm))))),
2739
- (EXTRACT_SUBREG (ADDVL_XXI (INSERT_SUBREG (IMPLICIT_DEF),
2740
- GPR32:$op, sub_32), $imm),
2741
- sub_32)>;
2742
2750
}
2743
2751
2744
2752
// For big endian, only BITCASTs involving same sized vector types with same
0 commit comments