This patch adds dispatch constraints for Neoverse V2 and illustrates the steps
necessary to enable dispatch scheduling for an AArch64 core.

The dispatch constraints are based on section 4.1 of the Neoverse V2 SWOG.
Please note that the values used here deviate slightly from the current SWOG
version but are based on correct numbers. Arm will do an official Neoverse V2
SWOG release with the updated values in due time.

Here are the steps how we implemented the dispatch constraints for
Neoverse V2:
1. We used instruction attributes to group instructions into dispatch groups,
   corresponding to operations that utilize a certain pipeline type. For that,
   we added a new attribute (neoversev2_dispatch) with values for the
   different dispatch groups. The values of neoversev2_dispatch are determined
   using expressions of other instruction attributes.
   For example, the SWOG describes a constraint of "Up to 4 uOPs utilizing the
   M pipelines". Thus, one of the values of neoversev2_dispatch is "m" and it
   groups instructions that use the M pipelines such as integer multiplication.
   Note that we made some minor simplifications compared to the information
   in the SWOG, because the instruction annotation does not allow for a fully
   accurate mapping of instructions to utilized pipelines. To give one example,
   the instructions IRG and LDG are both tagged with "memtag", but IRG uses
   the M pipelines, while LDG uses the L pipelines.
2. In the Neoverse V2 tuning model, we added an array of dispatch_constraint
   objects and referenced it in the tune_params. The new attribute
   neoversev2_dispatch provided a compact way to define the dispatch
   constraints.
3. We enabled dispatch scheduling for Neoverse V2 by adding the
   AARCH64_EXTRA_TUNE_DISPATCH_SCHED tune flag.

Performance evaluation on Grace machine using SPEC2017 and GROMACS2024:
We ran each benchmark 5 times compiled with trunk (commit a1fb757) and with
the patch series and computed the speed-up for the median values per
test (i.e. values >1 mean that the patch series improves performance):

SPEC2017 FP (-O3 -Wl,-z,muldefs -lm -fallow-argument-mismatch -fpermissive
             -fstack-arrays -flto=auto -Wl,--sort-section=name -march=native
             -mcpu=neoverse-v2 -std=gnu17):
Geom. mean of speed-ups         1.0006
blender                         1.0008
bwaves                          0.9996
cactuBSSN                       1.0007
fotonik3d                       1.0002
imagick                         0.9999
lbm                             1.0016
nab                             1.0012
namd                            1.0002
parest                          1.0004
povray                          1.0029
roms                            1.0000
wrf                             1.0003

SPEC2017 INT (same as SPEC2017 FP):
Geom. mean of speed-ups         0.9994
deepsjeng                       0.9991
gcc                             1.0024
leela                           0.9985
mcf                             0.9985
exchange2                       1.0000
omnetpp                         1.0005
perlbench                       0.9975
x264                            1.0032
xalancbmk                       0.9916
xz                              1.0032

GROMACS 2024 (-O3 -Wl,-z,muldefs -lm -flto=auto -Wl,--sort-section=name
              -march=native -mcpu=neoverse-v2)
Geom. mean of speed-ups:                     1.0024
22vs23_cut_arm_neon_asimd_cpu_perf           1.0005
22vs23_cut_arm_sve_cpu_perf                  1.0153
22vs23_fsw_arm_neon_asimd_cpu_perf           1.0107
22vs23_fsw_arm_sve_cpu_perf                  1.0156
22vs23_ljpme-geom_arm_neon_asimd_cpu_perf    1.0081
22vs23_ljpme-geom_arm_sve_cpu_perf           1.0024
22vs23_ljpme-lb_arm_neon_asimd_cpu_perf      1.0068
22vs23_ljpme-lb_arm_sve_cpu_perf             0.9957
22vs23_psh_arm_neon_asimd_cpu_perf           0.9957
22vs23_psh_arm_sve_cpu_perf                  0.9885
22vs23_psw_arm_neon_asimd_cpu_perf           0.9983
22vs23_psw_arm_sve_cpu_perf                  1.0024
22vs23_rf_arm_neon_asimd_cpu_perf            0.9976
22vs23_rf_arm_sve_cpu_perf                   0.9916

The effect of the patch series on compile times was evaluated by
comparing the compile times of insn-emit-1.cc. Speed-up for the median
values of 5 repetitions: 1.0001

Any help with further performance evaluation would be greatly appreciated.

The patch was bootstrapped and tested on aarch64-linux-gnu, no regression.

Signed-off-by: Jennifer Schmitz <jschm...@nvidia.com>

gcc/ChangeLog:

        * config/aarch64/aarch64.md: Include neoversev2.md.
        * config/aarch64/tuning_models/neoversev2.h: Enable dispatch
        scheduling and add dispatch constraints.
        * config/aarch64/neoversev2.md: New file and new instruction attribute
        neoversev2_dispatch.
---
 gcc/config/aarch64/aarch64.md                 |   3 +
 gcc/config/aarch64/neoversev2.md              | 192 ++++++++++++++++++
 gcc/config/aarch64/tuning_models/neoversev2.h | 102 +++++++++-
 3 files changed, 294 insertions(+), 3 deletions(-)
 create mode 100644 gcc/config/aarch64/neoversev2.md

diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index fc9c819b864..bceaf40ae97 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -672,6 +672,9 @@
 (include "tsv110.md")
 (include "thunderx3t110.md")
 
+;; Dispatch scheduling
+(include "neoversev2.md")
+
 ;; -------------------------------------------------------------------
 ;; Jumps and other miscellaneous insns
 ;; -------------------------------------------------------------------
diff --git a/gcc/config/aarch64/neoversev2.md b/gcc/config/aarch64/neoversev2.md
new file mode 100644
index 00000000000..8dc9b098d09
--- /dev/null
+++ b/gcc/config/aarch64/neoversev2.md
@@ -0,0 +1,192 @@
+;; Instruction attribute for dispatch scheduling for Neoverse V2.
+;; Copyright The GNU Toolchain Authors.
+;;
+;; This file is part of GCC.
+;;
+;; GCC is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GCC is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GCC; see the file COPYING3.  If not see
+;; <http://www.gnu.org/licenses/>.
+
+;; Attribute that groups other instruction attributes into dispatch groups
+;; for Neoverse V2 cores.  Dispatch groups are groups of pipelines for which
+;; the SWOG specifies a dispatch constraint.  For example: Because the SWOG
+;; contains a dispatch constraint for the V02 pipelines, there is an attribute
+;; value "v02" that groups instructions that are processed by the V0 and V2
+;; pipelines.
+;; Values that contain a "_" represent combinations of dispatch groups.
+;; For example, there are dispatch constraints for the M0 and V pipelines.
+;; The value "m0_v" groups instructions that utilize the M0 as well as the
+;; V pipelines, such that both dispatch constraints apply.
+
+(define_attr "neoversev2_dispatch"
+  "none,bs01,bsm,m,m0,v02,v13,v,l01,l,bsm_l,m_l,m0_v,v_v13,v_l,\
+   l01_d,l01_v"
+  (cond [(eq_attr "type" "branch,call")
+        (const_string "bs01")
+        (ior
+          (eq_attr "type" "adc_reg,alu_ext,alu_imm,alu_sreg,alus_ext,\
+           alus_imm,alus_sreg,clz,csel,logic_imm,logic_reg,logics_imm,\
+           logics_reg,mov_imm,rbit,rev,shift_reg")
+          (eq_attr "sve_type" "sve_pred_cnt_scalar"))
+        (const_string "bsm")
+        (ior
+          (eq_attr "type" "alu_ext,alus_ext,bfm,bfx,mul,rotate_imm,\
+           smull,umull")
+          (eq_attr "autodetect_type" "alu_shift_asr_op2,alu_shift_lsl_op2,\
+           alu_shift_lsr_op2")
+          (eq_attr "sve_type" "sve_pred_cnt_ctrl,sve_pred_misc"))
+        (const_string "m")
+        (ior
+          (eq_attr "type" "crc,f_cvti2f,mla,neon_from_gp,neon_from_gp_q,\
+           sdiv,smlal,udiv,umlal")
+          (eq_attr "sve_type" "sve_ffr,sve_pred_logical"))
+        (const_string "m0")
+        (ior
+          (eq_attr "type"
+           "crypto_sha256_slow,crypto_sha3,crypto_sha512,crypto_sm3,\
+            crypto_sm4,f_rintd,f_rints,fccmpd,fccmps,fcmpd,fcmps,fdivd,\
+            fdivs,fsqrtd,fsqrts,neon_fp_cvt_narrow_d_q,\
+            neon_fp_cvt_narrow_s_q,neon_fp_cvt_widen_h,neon_fp_cvt_widen_s,\
+            neon_fp_div_d,neon_fp_div_d_q,neon_fp_div_s,neon_fp_div_s_q,\
+            neon_fp_recpe_d,neon_fp_recpe_d_q,neon_fp_recpe_s,\
+            neon_fp_recpe_s_q,neon_fp_recps_d,neon_fp_recps_d_q,\
+            neon_fp_recps_s,neon_fp_recps_s_q,neon_fp_recpx_d,\
+            neon_fp_recpx_d_q,neon_fp_recpx_s,neon_fp_recpx_s_q,\
+            neon_fp_round_d,neon_fp_round_d_q,neon_fp_round_s,\
+            neon_fp_round_s_q,neon_fp_rsqrte_d,neon_fp_rsqrte_d_q,\
+            neon_fp_rsqrte_s,neon_fp_rsqrte_s_q,neon_fp_rsqrts_d,\
+            neon_fp_rsqrts_d_q,neon_fp_rsqrts_s,neon_fp_rsqrts_s_q,\
+            neon_fp_sqrt_d,neon_fp_sqrt_d_q,neon_fp_sqrt_s,\
+            neon_fp_sqrt_s_q,neon_fp_to_int_d,neon_fp_to_int_d_q,\
+            neon_fp_to_int_s,neon_fp_to_int_s_q,neon_int_to_fp_d,\
+            neon_int_to_fp_d_q,neon_int_to_fp_s,neon_int_to_fp_s_q,\
+            neon_mla_b,neon_mla_b_q,neon_mla_h,neon_mla_h_q,\
+            neon_mla_s,neon_mla_s_q,neon_mla_b_long,neon_mla_h_long,\
+            neon_mla_h_scalar,neon_mla_h_scalar_q,neon_mla_s_long,\
+            neon_mla_s_scalar,neon_mla_s_scalar_q,neon_mla_h_scalar_long,\
+            neon_mla_s_scalar_long,neon_mul_b,neon_mul_b_q,\
+            neon_mul_d_long,neon_mul_h,neon_mul_h_q,neon_mul_h_long,\
+            neon_mul_h_scalar,neon_mul_h_scalar_q,neon_mul_h_scalar_long,\
+            neon_mul_s,neon_mul_s_q,neon_mul_s_long,neon_mul_s_scalar,\
+            neon_mul_s_scalar_q,neon_mul_s_scalar_long,neon_sat_mla_b_long,\
+            neon_sat_mla_h_long,neon_sat_mla_h_scalar_long,\
+            neon_sat_mla_s_long,neon_sat_mla_s_scalar_long,\
+            neon_sat_mul_b,neon_sat_mul_b_q,neon_sat_mul_b_long,\
+            neon_sat_mul_h,neon_sat_mul_h_q,neon_sat_mul_h_long,\
+            neon_sat_mul_h_scalar,neon_sat_mul_h_scalar_q,\
+            neon_sat_mul_h_scalar_long,neon_sat_mul_s,neon_sat_mul_s_q,\
+            neon_sat_mul_s_long,neon_sat_mul_s_scalar,\
+            neon_sat_mul_s_scalar_q,neon_sat_mul_s_scalar_long")
+          (eq_attr "sve_type"
+           "sve_crypto_sha3,sve_fp_cmp,sve_fp_cvt,sve_fp_div,sve_fp_log,\
+            sve_fp_sqrt,sve_int_cvt,sve_int_div,sve_int_dot,sve_int_index,\
+            sve_int_mul,sve_int_recip_est"))
+        (const_string "v02")
+        (ior
+          (eq_attr "type"
+           "neon_arith_acc,neon_arith_acc_q,neon_reduc_add,\
+            neon_reduc_add_long,neon_reduc_add_q,neon_reduc_minmax,\
+            neon_reduc_minmax_q,neon_sat_shift_imm,\
+            neon_sat_shift_imm_narrow_q,neon_sat_shift_imm_q,\
+            neon_sat_shift_reg,neon_sat_shift_reg_q,neon_shift_acc,\
+            neon_shift_acc_q,neon_shift_imm,neon_shift_imm_long,\
+            neon_shift_imm_narrow_q,neon_shift_imm_q,neon_shift_reg,\
+            neon_shift_reg_q")
+          (eq_attr "sve_type"
+           "sve_fp_assoc_add,sve_fp_exp,sve_int_accum,sve_int_bit_perm,\
+            sve_int_extend,sve_int_extract,sve_int_shift"))
+        (const_string "v13")
+        (ior
+          (eq_attr "type" "crypto_pmull,f_cvt,f_cvtf2i,f_minmaxd,f_minmaxs,\
+           faddd,fadds,fconstd,fconsts,fcsel,ffarithd,ffariths,fmacd,fmacs,\
+           fmov,fmuld,fmuls,f_mcr,f_mrc,neon_abd,\
+           neon_abd_long,neon_abd_q,neon_abs,neon_abs_q,neon_add,\
+           neon_add_halve,neon_add_halve_narrow_q,neon_add_halve_q,\
+           neon_add_long,neon_add_q,neon_add_widen,neon_bsl,neon_bsl_q,\
+           neon_cls,neon_cls_q,neon_cnt,neon_cnt_q,neon_compare,\
+           neon_compare_q,neon_compare_zero,neon_compare_zero_q,\
+           neon_dup,neon_dup_q,neon_ext,neon_ext_q,neon_fcadd,neon_fcmla,\
+           neon_fp_abd_d,neon_fp_abd_d_q,neon_fp_abd_s,neon_fp_abd_s_q,\
+           neon_fp_abs_d,neon_fp_abs_d_q,neon_fp_abs_s,neon_fp_abs_s_q,\
+           neon_fp_addsub_d,neon_fp_addsub_d_q,neon_fp_addsub_s,\
+           neon_fp_addsub_s_q,neon_fp_compare_d,neon_fp_compare_d_q,\
+           neon_fp_compare_s,neon_fp_compare_s_q,neon_fp_minmax_d,\
+           neon_fp_minmax_d_q,neon_fp_minmax_s,neon_fp_minmax_s_q,\
+           neon_fp_mla_d,neon_fp_mla_d_q,neon_fp_mla_d_scalar_q,\
+           neon_fp_mla_s,neon_fp_mla_s_q,neon_fp_mla_s_scalar,\
+           neon_fp_mla_s_scalar_q,neon_fp_mul_d,neon_fp_mul_d_q,\
+           neon_fp_mul_d_scalar_q,neon_fp_mul_s,neon_fp_mul_s_q,\
+           neon_fp_mul_s_scalar,neon_fp_mul_s_scalar_q,neon_fp_neg_d,\
+           neon_fp_neg_d_q,neon_fp_neg_s,neon_fp_neg_s_q,neon_fp_reduc_add_d,\
+           neon_fp_reduc_add_d_q,neon_fp_reduc_add_s,neon_fp_reduc_add_s_q,\
+           neon_fp_reduc_minmax_d,neon_fp_reduc_minmax_d_q,\
+           neon_fp_reduc_minmax_s,neon_fp_reduc_minmax_s_q,neon_logic,\
+           neon_logic_q,neon_minmax,neon_minmax_q,neon_move,\
+           neon_move_narrow_q,neon_move_q,neon_neg,neon_neg_q,neon_permute,\
+           neon_permute_q,neon_qabs,neon_qabs_q,neon_qadd,neon_qadd_q,\
+           neon_qneg,neon_qneg_q,neon_qsub,neon_qsub_q,neon_rbit,\
+           neon_rbit_q,neon_rev,neon_rev_q,neon_sub,neon_sub_halve,\
+           neon_sub_halve_narrow_q,neon_sub_halve_q,neon_sub_long,\
+           neon_sub_q,neon_sub_widen,neon_tbl1,neon_tbl1_q,neon_tbl2,\
+           neon_tbl2_q,neon_tbl3,neon_tbl3_q,neon_tbl4,neon_tbl4_q,\
+           neon_to_gp,neon_to_gp_q,neon_tst,neon_tst_q,neon_zip,\
+           neon_zip_q")
+          (eq_attr "sve_type" "sve_fp_arith,sve_fp_misc,sve_fp_mul,\
+           sve_fp_reduc,sve_int_general,sve_int_pmul"))
+        (const_string "v")
+        (eq_attr "sve_type" "sve_store_pred")
+        (const_string "l01")
+        (ior
+          (eq_attr "type" "neon_ldp,neon_ldp_q,neon_load1_1reg,\
+           neon_load1_1reg_q,neon_load1_2reg,neon_load1_2reg_q,\
+           neon_load1_3reg,neon_load1_3reg_q,neon_load1_4reg,\
+           neon_load1_4reg_q")
+          (eq_attr "sve_type" "sve_load_1reg"))
+        (const_string "l")
+        (eq_attr "type" "f_loadd,f_loads")
+        (const_string "bsm_l")
+        (eq_attr "sve_type" "sve_load_pred")
+        (const_string "m_l")
+        (ior
+          (eq_attr "type" "neon_ins,neon_ins_q")
+          (eq_attr "sve_type" "sve_int_cmp_set,sve_int_match,sve_pred_vec"))
+        (const_string "m0_v")
+        (eq_attr "sve_type" "sve_int_reduc")
+        (const_string "v_v13")
+        (ior
+          (eq_attr "type" "neon_load1_all_lanes,neon_load1_one_lane,\
+           neon_load1_one_lane_q,neon_load2_2reg,neon_load2_2reg_q,\
+           neon_load2_all_lanes,neon_load2_all_lanes_q,neon_load2_one_lane,\
+           neon_load3_3reg,neon_load3_3reg_q,neon_load3_all_lanes,\
+           neon_load3_all_lanes_q,neon_load3_one_lane,neon_load4_4reg,\
+           neon_load4_4reg_q,neon_load4_all_lanes,neon_load4_all_lanes_q,\
+           neon_load4_one_lane")
+          (eq_attr "sve_type" "sve_gatherload_32,sve_gatherload_64,\
+           sve_load_2reg,sve_load_3reg,sve_load_4reg"))
+        (const_string "v_l")
+        (eq_attr "type" "load_16,load_4,load_8,store_16,store_4,store_8")
+        (const_string "l01_d")
+        (ior
+          (eq_attr "type" "f_stored,f_stores,neon_stp,neon_stp_q,\
+           neon_store1_1reg,neon_store1_1reg_q,neon_store1_2reg,\
+           neon_store1_2reg_q,neon_store1_3reg,neon_store1_3reg_q,\
+           neon_store1_4reg,neon_store1_4reg_q,neon_store1_one_lane,\
+           neon_store1_one_lane_q,neon_store2_2reg,neon_store2_2reg_q,\
+           neon_store2_one_lane,neon_store2_one_lane_q,neon_store3_3reg,\
+           neon_store3_3reg_q,neon_store3_one_lane,neon_store3_one_lane_q,\
+           neon_store4_4reg,neon_store4_4reg_q,neon_store4_one_lane,\
+           neon_store4_one_lane_q")
+          (eq_attr "sve_type" "sve_scatterstore_32,sve_scatterstore_64,\
+           sve_store_1reg,sve_store_2reg,sve_store_3reg,sve_store_4reg"))
+        (const_string "l01_v")]
+       (const_string "none")))
\ No newline at end of file
diff --git a/gcc/config/aarch64/tuning_models/neoversev2.h 
b/gcc/config/aarch64/tuning_models/neoversev2.h
index faf06d8e7ed..c3749d0c194 100644
--- a/gcc/config/aarch64/tuning_models/neoversev2.h
+++ b/gcc/config/aarch64/tuning_models/neoversev2.h
@@ -21,6 +21,7 @@
 #define GCC_AARCH64_H_NEOVERSEV2
 
 #include "generic.h"
+#include "../aarch64-sched-dispatch.h"
 
 static const struct cpu_regmove_cost neoversev2_regmove_cost =
 {
@@ -188,6 +189,100 @@ static const struct cpu_vector_cost 
neoversev2_vector_cost =
   &neoversev2_vec_issue_info /* issue_info  */
 };
 
+/* Neoverse V2 dispatch constraints for instruction scheduling.  */
+static const dispatch_constraint neoversev2_dispatch_constraints[] = {
+  dispatch_constraint ("total", 16, [](rtx_insn *)
+    {
+      return 1;
+    }),
+  dispatch_constraint ("b_s01", 4, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      return (int)(dispatch_group == NEOVERSEV2_DISPATCH_BS01);
+    }),
+  dispatch_constraint ("m0", 2, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      return (int)(dispatch_group == NEOVERSEV2_DISPATCH_M0
+                  || dispatch_group == NEOVERSEV2_DISPATCH_M0_V);
+    }),
+  dispatch_constraint ("m", 4, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      return (int)(dispatch_group == NEOVERSEV2_DISPATCH_M
+                  || dispatch_group == NEOVERSEV2_DISPATCH_M0
+                  || dispatch_group == NEOVERSEV2_DISPATCH_M_L
+                  || dispatch_group == NEOVERSEV2_DISPATCH_M0_V);
+    }),
+  dispatch_constraint ("b_s_m", 8, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      return (int)(dispatch_group == NEOVERSEV2_DISPATCH_BS01
+                  || dispatch_group == NEOVERSEV2_DISPATCH_BSM
+                  || dispatch_group == NEOVERSEV2_DISPATCH_M
+                  || dispatch_group == NEOVERSEV2_DISPATCH_M0
+                  || dispatch_group == NEOVERSEV2_DISPATCH_BSM_L
+                  || dispatch_group == NEOVERSEV2_DISPATCH_M_L
+                  || dispatch_group == NEOVERSEV2_DISPATCH_M0_V);
+    }),
+  dispatch_constraint ("v02", 2, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      return (int)(dispatch_group == NEOVERSEV2_DISPATCH_V02);
+    }),
+  dispatch_constraint ("v13", 2, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      return (int)(dispatch_group == NEOVERSEV2_DISPATCH_V13);
+    }),
+  dispatch_constraint ("v", 4, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      switch (dispatch_group) {
+       case NEOVERSEV2_DISPATCH_V02:
+       case NEOVERSEV2_DISPATCH_V13:
+       case NEOVERSEV2_DISPATCH_V:
+       case NEOVERSEV2_DISPATCH_M0_V:
+       case NEOVERSEV2_DISPATCH_V_L:
+       case NEOVERSEV2_DISPATCH_L01_V:
+         return 1;
+       case NEOVERSEV2_DISPATCH_V_V13:
+         return 2;
+       default:
+         return 0;
+      }
+    }),
+  dispatch_constraint ("l01_d", 4, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      switch (dispatch_group) {
+       case NEOVERSEV2_DISPATCH_L01_V:
+       case NEOVERSEV2_DISPATCH_L01:
+         return 1;
+       case NEOVERSEV2_DISPATCH_L01_D:
+         return 2;
+       default:
+         return 0;
+      }
+    }),
+  dispatch_constraint ("l", 6, [](rtx_insn *insn)
+    {
+      auto dispatch_group = get_attr_neoversev2_dispatch (insn);
+      switch (dispatch_group) {
+       case NEOVERSEV2_DISPATCH_L:
+       case NEOVERSEV2_DISPATCH_BSM_L:
+       case NEOVERSEV2_DISPATCH_M_L:
+       case NEOVERSEV2_DISPATCH_V_L:
+       case NEOVERSEV2_DISPATCH_L01_V:
+         return 1;
+       case NEOVERSEV2_DISPATCH_L01_D:
+         return 2;
+       default:
+         return 0;
+      }
+    })
+};
+
 static const struct tune_params neoversev2_tunings =
 {
   &cortexa76_extra_costs,
@@ -221,12 +316,13 @@ static const struct tune_params neoversev2_tunings =
    | AARCH64_EXTRA_TUNE_CSE_SVE_VL_CONSTANTS
    | AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT
    | AARCH64_EXTRA_TUNE_AVOID_PRED_RMW
-   | AARCH64_EXTRA_TUNE_AVOID_LDAPUR), /* tune_flags.  */
+   | AARCH64_EXTRA_TUNE_AVOID_LDAPUR
+   | AARCH64_EXTRA_TUNE_DISPATCH_SCHED),       /* tune_flags.  */
   &generic_armv9a_prefetch_tune,
   AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
   AARCH64_LDP_STP_POLICY_ALWAYS,   /* stp_policy_model.  */
-  nullptr,     /* dispatch_constraints.  */
-  0            /* num_dispatch_constraints.  */
+  neoversev2_dispatch_constraints,  /* dispatch_constraints.  */
+  ARRAY_SIZE (neoversev2_dispatch_constraints)  /* num_dispatch_constraints.  
*/
 };
 
 #endif /* GCC_AARCH64_H_NEOVERSEV2.  */
-- 
2.34.1

Reply via email to