Represents the cost of a rdffr.

gcc/ChangeLog:

        * config/aarch64/aarch64-protos.h (struct sve_vec_cost): Add
        read_ffr_cost member.
        * config/aarch64/aarch64.cc (aarch64_builtin_vectorization_cost):
        Add handling for hssr_read using read_ffr_cost.
        (aarch64_vector_costs::count_ops):
        Add handling for hssr_read.
        * config/aarch64/tuning_models/a64fx.h: Add entry for
        read_ffr_cost.
        * config/aarch64/tuning_models/cortexa320.h: Likewise.
        * config/aarch64/tuning_models/cortexx925.h: Likewise.
        * config/aarch64/tuning_models/generic.h: Likewise.
        * config/aarch64/tuning_models/generic_armv8_a.h: Likewise.
        * config/aarch64/tuning_models/generic_armv9_a.h: Likewise.
        * config/aarch64/tuning_models/hip12.h: Likewise.
        * config/aarch64/tuning_models/neoverse512tvb.h: Likewise.
        * config/aarch64/tuning_models/neoversen2.h: Likewise.
        * config/aarch64/tuning_models/neoversen3.h: Likewise.
        * config/aarch64/tuning_models/neoversev1.h: Likewise.
        * config/aarch64/tuning_models/neoversev2.h: Likewise.
        * config/aarch64/tuning_models/neoversev3.h: Likewise.
        * config/aarch64/tuning_models/neoversev3ae.h: Likewise.
        * config/aarch64/tuning_models/olympus.h: Likewise.
---
 gcc/config/aarch64/aarch64-protos.h                | 10 ++++++++--
 gcc/config/aarch64/aarch64.cc                      | 12 ++++++++++++
 gcc/config/aarch64/tuning_models/a64fx.h           |  3 ++-
 gcc/config/aarch64/tuning_models/cortexa320.h      |  3 ++-
 gcc/config/aarch64/tuning_models/cortexx925.h      |  3 ++-
 gcc/config/aarch64/tuning_models/generic.h         |  3 ++-
 gcc/config/aarch64/tuning_models/generic_armv8_a.h |  3 ++-
 gcc/config/aarch64/tuning_models/generic_armv9_a.h |  3 ++-
 gcc/config/aarch64/tuning_models/hip12.h           |  3 ++-
 gcc/config/aarch64/tuning_models/neoverse512tvb.h  |  3 ++-
 gcc/config/aarch64/tuning_models/neoversen2.h      |  3 ++-
 gcc/config/aarch64/tuning_models/neoversen3.h      |  3 ++-
 gcc/config/aarch64/tuning_models/neoversev1.h      |  3 ++-
 gcc/config/aarch64/tuning_models/neoversev2.h      |  3 ++-
 gcc/config/aarch64/tuning_models/neoversev3.h      |  3 ++-
 gcc/config/aarch64/tuning_models/neoversev3ae.h    |  3 ++-
 gcc/config/aarch64/tuning_models/olympus.h         |  3 ++-
 17 files changed, 50 insertions(+), 17 deletions(-)

diff --git a/gcc/config/aarch64/aarch64-protos.h 
b/gcc/config/aarch64/aarch64-protos.h
index 22fd1c68b05..c21611f97f7 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -266,7 +266,9 @@ struct sve_vec_cost : simd_vec_cost
                          unsigned int gather_load_x64_cost,
                          unsigned int gather_load_x32_init_cost,
                          unsigned int gather_load_x64_init_cost,
-                         unsigned int scatter_store_elt_cost)
+                         unsigned int scatter_store_elt_cost,
+                         unsigned int read_ffr_cost
+               )
     : simd_vec_cost (base),
       clast_cost (clast_cost),
       fadda_f16_cost (fadda_f16_cost),
@@ -276,7 +278,8 @@ struct sve_vec_cost : simd_vec_cost
       gather_load_x64_cost (gather_load_x64_cost),
       gather_load_x32_init_cost (gather_load_x32_init_cost),
       gather_load_x64_init_cost (gather_load_x64_init_cost),
-      scatter_store_elt_cost (scatter_store_elt_cost)
+      scatter_store_elt_cost (scatter_store_elt_cost),
+      read_ffr_cost (read_ffr_cost)
   {}
 
   /* The cost of a vector-to-scalar CLASTA or CLASTB instruction,
@@ -303,6 +306,9 @@ struct sve_vec_cost : simd_vec_cost
 
   /* The per-element cost of a scatter store.  */
   int scatter_store_elt_cost;
+
+  /* Cost of an rdffrs.  */
+  int read_ffr_cost;
 };
 
 /* Base information about how the CPU issues code, containing
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index d8bd0cc74f1..00df040c8dc 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -18007,6 +18007,17 @@ aarch64_builtin_vectorization_cost (enum 
vect_cost_for_stmt type_of_cost,
        elements = estimated_poly_value (TYPE_VECTOR_SUBPARTS (vectype));
        return elements / 2 + 1;
 
+      case hssr_read:
+       {
+         const sve_vec_cost *sve_costs = aarch64_tune_params.vec_costs->sve;
+         /* We need SVE to have HSSR so we surely will have sve costs defined
+            too.  */
+         gcc_assert (sve_costs);
+
+         /* This will be a rdffr + b.nlast.  */
+         return sve_costs->read_ffr_cost + costs->cond_not_taken_branch_cost;
+       }
+
       default:
        gcc_unreachable ();
     }
@@ -18636,6 +18647,7 @@ aarch64_vector_costs::count_ops (unsigned int count, 
vect_cost_for_stmt kind,
     case scalar_to_vec:
     case vector_stmt:
     case scalar_stmt:
+    case hssr_read:
       ops->general_ops += count;
       break;
 
diff --git a/gcc/config/aarch64/tuning_models/a64fx.h 
b/gcc/config/aarch64/tuning_models/a64fx.h
index c3222960f17..d457e8e29a8 100644
--- a/gcc/config/aarch64/tuning_models/a64fx.h
+++ b/gcc/config/aarch64/tuning_models/a64fx.h
@@ -106,7 +106,8 @@ static const sve_vec_cost a64fx_sve_vector_cost =
   32, /* gather_load_x64_cost  */
   0, /* gather_load_x32_init_cost  */
   0, /* gather_load_x64_init_cost  */
-  1 /* scatter_store_elt_cost  */
+  1, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const struct cpu_vector_cost a64fx_vector_cost =
diff --git a/gcc/config/aarch64/tuning_models/cortexa320.h 
b/gcc/config/aarch64/tuning_models/cortexa320.h
index d5e1f2b2993..749d2afd879 100644
--- a/gcc/config/aarch64/tuning_models/cortexa320.h
+++ b/gcc/config/aarch64/tuning_models/cortexa320.h
@@ -137,7 +137,8 @@ static const sve_vec_cost cortexa320_sve_vector_cost =
   19, /* gather_load_x64_cost  */
   48, /* gather_load_x32_init_cost  */
   38, /* gather_load_x64_init_cost  */
-  0 /* scatter_store_elt_cost  */
+  0, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 /* Cortexa320 costs for vector insn classes.  */
diff --git a/gcc/config/aarch64/tuning_models/cortexx925.h 
b/gcc/config/aarch64/tuning_models/cortexx925.h
index 2a73b369706..46e2f653812 100644
--- a/gcc/config/aarch64/tuning_models/cortexx925.h
+++ b/gcc/config/aarch64/tuning_models/cortexx925.h
@@ -119,7 +119,8 @@ static const sve_vec_cost cortexx925_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  1 /* scatter_store_elt_cost  */
+  1, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info cortexx925_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/generic.h 
b/gcc/config/aarch64/tuning_models/generic.h
index af013e478d4..e163b60f405 100644
--- a/gcc/config/aarch64/tuning_models/generic.h
+++ b/gcc/config/aarch64/tuning_models/generic.h
@@ -107,7 +107,8 @@ static const sve_vec_cost generic_sve_vector_cost =
   2, /* gather_load_x64_cost  */
   0, /* gather_load_x32_init_cost  */
   0, /* gather_load_x64_init_cost  */
-  1 /* scatter_store_elt_cost  */
+  1, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 /* Generic costs for vector insn classes.  */
diff --git a/gcc/config/aarch64/tuning_models/generic_armv8_a.h 
b/gcc/config/aarch64/tuning_models/generic_armv8_a.h
index 29cf3a5a7c7..4de03a3770e 100644
--- a/gcc/config/aarch64/tuning_models/generic_armv8_a.h
+++ b/gcc/config/aarch64/tuning_models/generic_armv8_a.h
@@ -108,7 +108,8 @@ static const sve_vec_cost generic_armv8_a_sve_vector_cost =
   2, /* gather_load_x64_cost  */
   12, /* gather_load_x32_init_cost  */
   4, /* gather_load_x64_init_cost  */
-  1 /* scatter_store_elt_cost  */
+  1, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 /* Generic costs for vector insn classes.  */
diff --git a/gcc/config/aarch64/tuning_models/generic_armv9_a.h 
b/gcc/config/aarch64/tuning_models/generic_armv9_a.h
index 05e777d20ef..d0131c168d9 100644
--- a/gcc/config/aarch64/tuning_models/generic_armv9_a.h
+++ b/gcc/config/aarch64/tuning_models/generic_armv9_a.h
@@ -138,7 +138,8 @@ static const sve_vec_cost generic_armv9_a_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  3 /* scatter_store_elt_cost  */
+  3, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info generic_armv9_a_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/hip12.h 
b/gcc/config/aarch64/tuning_models/hip12.h
index cfb204b2e53..64e08de3da0 100644
--- a/gcc/config/aarch64/tuning_models/hip12.h
+++ b/gcc/config/aarch64/tuning_models/hip12.h
@@ -117,7 +117,8 @@ static const sve_vec_cost hip12_sve_vector_cost =
   16, /* gather_load_x64_cost  */
   96, /* gather_load_x32_init_cost  */
   32, /* gather_load_x64_init_cost  */
-  3 /* scatter_store_elt_cost  */
+  3, /* scatter_store_elt_cost  */
+  5 /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info hip12_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/neoverse512tvb.h 
b/gcc/config/aarch64/tuning_models/neoverse512tvb.h
index d6e2c2e8120..910eb0d52cf 100644
--- a/gcc/config/aarch64/tuning_models/neoverse512tvb.h
+++ b/gcc/config/aarch64/tuning_models/neoverse512tvb.h
@@ -81,7 +81,8 @@ static const sve_vec_cost neoverse512tvb_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  3 /* scatter_store_elt_cost  */
+  3, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_sve_vec_issue_info neoverse512tvb_sve_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/neoversen2.h 
b/gcc/config/aarch64/tuning_models/neoversen2.h
index 21597e6b50f..abbdc98e068 100644
--- a/gcc/config/aarch64/tuning_models/neoversen2.h
+++ b/gcc/config/aarch64/tuning_models/neoversen2.h
@@ -119,7 +119,8 @@ static const sve_vec_cost neoversen2_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  3 /* scatter_store_elt_cost  */
+  3, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info neoversen2_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/neoversen3.h 
b/gcc/config/aarch64/tuning_models/neoversen3.h
index 37f9819148f..e17af8c259e 100644
--- a/gcc/config/aarch64/tuning_models/neoversen3.h
+++ b/gcc/config/aarch64/tuning_models/neoversen3.h
@@ -119,7 +119,8 @@ static const sve_vec_cost neoversen3_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  1 /* scatter_store_elt_cost  */
+  1, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info neoversen3_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/neoversev1.h 
b/gcc/config/aarch64/tuning_models/neoversev1.h
index 004676a8dba..68a82e42dc2 100644
--- a/gcc/config/aarch64/tuning_models/neoversev1.h
+++ b/gcc/config/aarch64/tuning_models/neoversev1.h
@@ -128,7 +128,8 @@ static const sve_vec_cost neoversev1_sve_vector_cost =
   16, /* gather_load_x64_cost  */
   96, /* gather_load_x32_init_cost  */
   32, /* gather_load_x64_init_cost  */
-  3 /* scatter_store_elt_cost  */
+  3, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info neoversev1_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/neoversev2.h 
b/gcc/config/aarch64/tuning_models/neoversev2.h
index 73408977251..da20d3724cf 100644
--- a/gcc/config/aarch64/tuning_models/neoversev2.h
+++ b/gcc/config/aarch64/tuning_models/neoversev2.h
@@ -121,7 +121,8 @@ static const sve_vec_cost neoversev2_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  3 /* scatter_store_elt_cost  */
+  3, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info neoversev2_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/neoversev3.h 
b/gcc/config/aarch64/tuning_models/neoversev3.h
index 7e0144032dc..a6a25a3425a 100644
--- a/gcc/config/aarch64/tuning_models/neoversev3.h
+++ b/gcc/config/aarch64/tuning_models/neoversev3.h
@@ -119,7 +119,8 @@ static const sve_vec_cost neoversev3_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  1 /* scatter_store_elt_cost  */
+  1, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info neoversev3_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/neoversev3ae.h 
b/gcc/config/aarch64/tuning_models/neoversev3ae.h
index bbe4dc54701..86484268985 100644
--- a/gcc/config/aarch64/tuning_models/neoversev3ae.h
+++ b/gcc/config/aarch64/tuning_models/neoversev3ae.h
@@ -119,7 +119,8 @@ static const sve_vec_cost neoversev3ae_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  1 /* scatter_store_elt_cost  */
+  1, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static const aarch64_scalar_vec_issue_info neoversev3ae_scalar_issue_info =
diff --git a/gcc/config/aarch64/tuning_models/olympus.h 
b/gcc/config/aarch64/tuning_models/olympus.h
index 1e701722e22..41bd70f0147 100644
--- a/gcc/config/aarch64/tuning_models/olympus.h
+++ b/gcc/config/aarch64/tuning_models/olympus.h
@@ -90,7 +90,8 @@ static sve_vec_cost olympus_sve_vector_cost =
   12, /* gather_load_x64_cost  */
   42, /* gather_load_x32_init_cost  */
   24, /* gather_load_x64_init_cost  */
-  1 /* scatter_store_elt_cost  */
+  1, /* scatter_store_elt_cost  */
+  5  /* read_ffr_cost */
 };
 
 static aarch64_scalar_vec_issue_info olympus_scalar_issue_info =
-- 
2.43.0

Reply via email to