From: Pan Li <[email protected]>

Similar to vr2gpr-cost=, add the one for fpr as well.

        PR/target 123916

gcc/ChangeLog:

        * config/riscv/riscv-opts.h (VR2FPR_COST_UNPROVIDED): Add new
        sentinel for unprovided cost.
        * config/riscv/riscv-protos.h (get_vr2fr_cost): Add new func
        decl.
        * config/riscv/riscv-vector-costs.cc (costs::adjust_stmt_cost):
        Leverage new func to get cost of vr2fpr.
        * config/riscv/riscv.cc (riscv_register_move_cost): Ditto.
        (get_vr2fr_cost): Add new func to wrap access to the cost
        of the vr2fpr.
        * config/riscv/riscv.opt: Add new param vr2fpr-cost.

Signed-off-by: Pan Li <[email protected]>
---
 gcc/config/riscv/riscv-opts.h          |  1 +
 gcc/config/riscv/riscv-protos.h        |  1 +
 gcc/config/riscv/riscv-vector-costs.cc |  4 ++--
 gcc/config/riscv/riscv.cc              | 17 ++++++++++++++++-
 gcc/config/riscv/riscv.opt             |  4 ++++
 5 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h
index ab67d231d43..1c44bc4e6ec 100644
--- a/gcc/config/riscv/riscv-opts.h
+++ b/gcc/config/riscv/riscv-opts.h
@@ -176,6 +176,7 @@ enum riscv_tls_type {
 #define GPR2VR_COST_UNPROVIDED COST_UNPROVIDED
 #define VR2GPR_COST_UNPROVIDED COST_UNPROVIDED
 #define FPR2VR_COST_UNPROVIDED COST_UNPROVIDED
+#define VR2FPR_COST_UNPROVIDED COST_UNPROVIDED
 
 /* Extra extension flags, used for carry extra info for a RISC-V extension.  */
 enum
diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h
index 2c163ddc324..0734c31ec56 100644
--- a/gcc/config/riscv/riscv-protos.h
+++ b/gcc/config/riscv/riscv-protos.h
@@ -880,6 +880,7 @@ const cpu_vector_cost *get_vector_costs ();
 int get_gr2vr_cost ();
 int get_vr2gr_cost ();
 int get_fr2vr_cost ();
+int get_vr2fr_cost ();
 
 enum
 {
diff --git a/gcc/config/riscv/riscv-vector-costs.cc 
b/gcc/config/riscv/riscv-vector-costs.cc
index b9012a52893..f582551eba7 100644
--- a/gcc/config/riscv/riscv-vector-costs.cc
+++ b/gcc/config/riscv/riscv-vector-costs.cc
@@ -1253,8 +1253,8 @@ costs::adjust_stmt_cost (enum vect_cost_for_stmt kind, 
loop_vec_info loop,
        += (FLOAT_TYPE_P (vectype) ? get_fr2vr_cost () : get_gr2vr_cost ());
       break;
     case vec_to_scalar:
-      stmt_cost += (FLOAT_TYPE_P (vectype) ? costs->regmove->VR2FR
-                   : get_vr2gr_cost ());
+      stmt_cost
+       += (FLOAT_TYPE_P (vectype) ? get_vr2fr_cost () : get_vr2gr_cost ());
       break;
     case vector_load:
     case vector_store:
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 1bb8f98ddb5..8b22556b546 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -10730,7 +10730,7 @@ riscv_register_move_cost (machine_mode mode,
       if (to_is_gpr)
        return get_vr2gr_cost ();
       else if (to_is_fpr)
-       return get_vector_costs ()->regmove->VR2FR;
+       return get_vr2fr_cost ();
     }
 
   if (to == V_REGS)
@@ -14243,6 +14243,21 @@ get_fr2vr_cost ()
   return cost;
 }
 
+/* Return the cost of moving data from floating-point to vector register.
+   It will take the value of --param=fpr2vr-cost if it is provided.
+   Otherwise the default regmove->FR2VR will be returned.  */
+
+int
+get_vr2fr_cost ()
+{
+  int cost = get_vector_costs ()->regmove->VR2FR;
+
+  if (vr2fpr_cost != VR2FPR_COST_UNPROVIDED)
+    cost = vr2fpr_cost;
+
+  return cost;
+}
+
 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
 
 static int
diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt
index 4a2d8ed2408..2c26ee99691 100644
--- a/gcc/config/riscv/riscv.opt
+++ b/gcc/config/riscv/riscv.opt
@@ -294,6 +294,10 @@ Set the cost value of the rvv instruction when operate 
from VR to GPR .
 Target RejectNegative Joined UInteger Var(fpr2vr_cost) 
Init(FPR2VR_COST_UNPROVIDED)
 Set the cost value of the rvv instruction when operate from FPR to VR.
 
+-param=vr2fpr-cost=
+Target RejectNegative Joined UInteger Var(vr2fpr_cost) 
Init(VR2FPR_COST_UNPROVIDED)
+Set the cost value of the rvv instruction when operate from VR to FPR.
+
 -param=riscv-autovec-mode=
 Target Undocumented RejectNegative Joined Var(riscv_autovec_mode) Save
 Set the only autovec mode to try.
-- 
2.43.0

Reply via email to