Hi Vineet,

On 04/06/2025 20:29, Vineet Gupta wrote:
Hi Paul,

On 5/30/25 03:04, Paul-Antoine Arras wrote:
This pattern enables the combine pass (or late-combine, depending on the case)
to merge a vec_duplicate into a plus-mult or minus-mult RTL instruction.

Before this patch, we have two instructions, e.g.:
   vfmv.v.f        v6,fa0
   vfmadd.vv       v9,v6,v7

After, we get only one:
   vfmadd.vf       v9,fa0,v7

This patch seems to cause a functional regression. I'm seeing SPEC2017 526
blender output mismatch failures on QEMU icounts test harness

     running compare cmd 1
     cpu2017-1.1.7/bin/specperl cpu2017-1.1.7/bin/harness/specdiff -m -l 10
     --reltol 0.05
     
cpu2017-1.1.7/benchspec/CPU/526.blender_r/data/refrate/output/imagevalidate_sh3_no_char_0849.out
     imagevalidate_sh3_no_char_0849.out

     exited with status 1

I have not tried to reproduce it yet but it likely comes from a sign mistake in the handling of vfmsub. Does the attached patch fix it for you?

Thanks,

PA


On SPEC2017's 503.bwaves_r, depending on the workload, the reduction in dynamic
instruction count varies from -4.66% to -4.75%.

        PR target/119100

gcc/ChangeLog:

        * config/riscv/autovec-opt.md (*<optab>_vf_<mode>): Add new pattern to
        combine vec_duplicate + vfm{add,sub}.vv into vfm{add,sub}.vf.
        * config/riscv/riscv-opts.h (FPR2VR_COST_UNPROVIDED): Define.
        * config/riscv/riscv-protos.h (get_fr2vr_cost): Declare function.
        * config/riscv/riscv.cc (riscv_rtx_costs): Add cost model for MULT with
        VEC_DUPLICATE.
        (get_fr2vr_cost): New function.
        * config/riscv/riscv.opt: Add new option --param=fpr2vr-cost.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c: New test.
---
  gcc/config/riscv/autovec-opt.md               |  52 +++
  gcc/config/riscv/riscv-opts.h                 |   1 +
  gcc/config/riscv/riscv-protos.h               |   1 +
  gcc/config/riscv/riscv.cc                     |  39 +-
  gcc/config/riscv/riscv.opt                    |   4 +
  .../riscv/rvv/autovec/vx_vf/vf-1-f16.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-1-f32.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-1-f64.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-2-f16.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-2-f32.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-2-f64.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-3-f16.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-3-f32.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-3-f64.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-4-f16.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-4-f32.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf-4-f64.c        |  10 +
  .../riscv/rvv/autovec/vx_vf/vf_mulop.h        |  61 +++
  .../riscv/rvv/autovec/vx_vf/vf_mulop_data.h   | 413 ++++++++++++++++++
  .../riscv/rvv/autovec/vx_vf/vf_mulop_run.h    |  34 ++
  .../rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c   |  15 +
  .../rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c   |  15 +
  .../rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c   |  15 +
  .../rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c   |  15 +
  .../rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c   |  15 +
  .../rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c   |  15 +
  26 files changed, 811 insertions(+), 4 deletions(-)
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
  create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h
  create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
  create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
  create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
  create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
  create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
  create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
  create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c

diff --git a/gcc/config/riscv/autovec-opt.md b/gcc/config/riscv/autovec-opt.md
index a972eda8de4..19eb16c7540 100644
--- a/gcc/config/riscv/autovec-opt.md
+++ b/gcc/config/riscv/autovec-opt.md
@@ -1713,3 +1713,55 @@ (define_insn_and_split "*<optab>_vx_<mode>"
                                                <MODE>mode);
    }
    [(set_attr "type" "vialu")])
+
+;; 
=============================================================================
+;; Combine vec_duplicate + op.vv to op.vf
+;; Include
+;; - vfmadd.vf
+;; - vfmsub.vf
+;; 
=============================================================================
+
+
+(define_insn_and_split "*<optab>_vf_<mode>"
+  [(set (match_operand:V_VLSF 0 "register_operand"           "=vd")
+    (plus_minus:V_VLSF
+           (mult:V_VLSF
+             (vec_duplicate:V_VLSF
+               (match_operand:<VEL> 1 "register_operand"       "  f"))
+             (match_operand:V_VLSF 2 "register_operand"      "  0"))
+           (match_operand:V_VLSF 3 "register_operand"                " vr")))]
+  "TARGET_VECTOR && can_create_pseudo_p ()"
+  "#"
+  "&& 1"
+  [(const_int 0)]
+  {
+    rtx ops[] = {operands[0], operands[1], operands[2], operands[3],
+                operands[2]};
+    riscv_vector::emit_vlmax_insn (code_for_pred_mul_scalar (<CODE>, 
<MODE>mode),
+                                  riscv_vector::TERNARY_OP_FRM_DYN, ops);
+    DONE;
+  }
+  [(set_attr "type" "vfmuladd")]
+)
+
+(define_insn_and_split "*<optab>_vf_<mode>"
+  [(set (match_operand:V_VLSF 0 "register_operand"           "=vd")
+    (plus_minus:V_VLSF
+           (match_operand:V_VLSF 3 "register_operand"                " vr")
+           (mult:V_VLSF
+             (vec_duplicate:V_VLSF
+               (match_operand:<VEL> 1 "register_operand"       "  f"))
+             (match_operand:V_VLSF 2 "register_operand"      "  0"))))]
+  "TARGET_VECTOR && can_create_pseudo_p ()"
+  "#"
+  "&& 1"
+  [(const_int 0)]
+  {
+    rtx ops[] = {operands[0], operands[1], operands[2], operands[3],
+                operands[2]};
+    riscv_vector::emit_vlmax_insn (code_for_pred_mul_scalar (<CODE>, 
<MODE>mode),
+                                  riscv_vector::TERNARY_OP_FRM_DYN, ops);
+    DONE;
+  }
+  [(set_attr "type" "vfmuladd")]
+)
diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h
index c02c599ed39..e1a820bb50e 100644
--- a/gcc/config/riscv/riscv-opts.h
+++ b/gcc/config/riscv/riscv-opts.h
@@ -164,6 +164,7 @@ enum riscv_tls_type {
    (TARGET_VECTOR && riscv_mautovec_segment)
#define GPR2VR_COST_UNPROVIDED -1
+#define FPR2VR_COST_UNPROVIDED -1
/* 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 d8c8f6b5079..a0331204479 100644
--- a/gcc/config/riscv/riscv-protos.h
+++ b/gcc/config/riscv/riscv-protos.h
@@ -841,6 +841,7 @@ const struct riscv_tune_info *
  riscv_parse_tune (const char *, bool);
  const cpu_vector_cost *get_vector_costs ();
  int get_gr2vr_cost ();
+int get_fr2vr_cost ();
enum
  {
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 2cc69b4458a..d99249f70e8 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -3904,6 +3904,7 @@ riscv_rtx_costs (rtx x, machine_mode mode, int 
outer_code, int opno ATTRIBUTE_UN
    if (riscv_v_ext_mode_p (mode))
      {
        int gr2vr_cost = get_gr2vr_cost ();
+      int fr2vr_cost = get_fr2vr_cost ();
switch (outer_code)
        {
@@ -3922,14 +3923,29 @@ riscv_rtx_costs (rtx x, machine_mode mode, int 
outer_code, int opno ATTRIBUTE_UN
                {
                  rtx op_0 = XEXP (x, 0);
                  rtx op_1 = XEXP (x, 1);
+                 rtx op;
if (GET_CODE (op_0) == VEC_DUPLICATE
                      || GET_CODE (op_1) == VEC_DUPLICATE)
-                   *total = (gr2vr_cost + 1) * COSTS_N_INSNS (1);
-                 else
-                   *total = COSTS_N_INSNS (1);
+                   {
+                     *total = (gr2vr_cost + 1) * COSTS_N_INSNS (1);
+                     break;
+                   }
+                 else if (GET_CODE (op = op_0) == MULT
+                          || GET_CODE (op = op_1) == MULT)
+                   {
+                     rtx mult_op0 = XEXP (op, 0);
+                     if (GET_CODE (mult_op0) == VEC_DUPLICATE)
+                       {
+                         if (FLOAT_MODE_P (mode))
+                           *total = (fr2vr_cost + 1) * COSTS_N_INSNS (1);
+                         else
+                           *total = (gr2vr_cost + 1) * COSTS_N_INSNS (1);
+                         break;
+                       }
+                   }
                }
-               break;
+               /* Fall through.  */
              default:
                *total = COSTS_N_INSNS (1);
                break;
@@ -12646,6 +12662,21 @@ get_gr2vr_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_fr2vr_cost ()
+{
+  int cost = get_vector_costs ()->regmove->FR2VR;
+
+  if (fpr2vr_cost != FPR2VR_COST_UNPROVIDED)
+    cost = fpr2vr_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 b2b9d3311f4..6543fd1c4a7 100644
--- a/gcc/config/riscv/riscv.opt
+++ b/gcc/config/riscv/riscv.opt
@@ -286,6 +286,10 @@ Max number of bytes to compare as part of inlined 
strcmp/strncmp routines (defau
  Target RejectNegative Joined UInteger Var(gpr2vr_cost) 
Init(GPR2VR_COST_UNPROVIDED)
  Set the cost value of the rvv instruction when operate from GPR to VR.
+-param=fpr2vr-cost=
+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=riscv-autovec-mode=
  Target Undocumented RejectNegative Joined Var(riscv_autovec_mode) Save
  Set the only autovec mode to try.
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
new file mode 100644
index 00000000000..821e5c589a4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d --param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_0(_Float16, +, add)
+DEF_VF_MULOP_CASE_0(_Float16, -, sub)
+
+/* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
new file mode 100644
index 00000000000..49b42879a51
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_0(float, +, add)
+DEF_VF_MULOP_CASE_0(float, -, sub)
+
+/* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
new file mode 100644
index 00000000000..2bb5d891237
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_0(double, +, add)
+DEF_VF_MULOP_CASE_0(double, -, sub)
+
+/* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
new file mode 100644
index 00000000000..cbb43cabe98
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d --param=fpr2vr-cost=1" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_0(_Float16, +, add)
+DEF_VF_MULOP_CASE_0(_Float16, -, sub)
+
+/* { dg-final { scan-assembler-not {vfmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
new file mode 100644
index 00000000000..66ff9b8c75e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=1" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_0(float, +, add)
+DEF_VF_MULOP_CASE_0(float, -, sub)
+
+/* { dg-final { scan-assembler-not {vfmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
new file mode 100644
index 00000000000..66ff9b8c75e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=1" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_0(float, +, add)
+DEF_VF_MULOP_CASE_0(float, -, sub)
+
+/* { dg-final { scan-assembler-not {vfmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
new file mode 100644
index 00000000000..45980f49693
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d --param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_1(_Float16, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1(_Float16, -, sub, VF_MULOP_BODY_X16)
+
+/* { dg-final { scan-assembler {vfmadd.vf} } } */
+/* { dg-final { scan-assembler {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
new file mode 100644
index 00000000000..c853620bb13
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_1(float, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1(float, -, sub, VF_MULOP_BODY_X16)
+
+/* { dg-final { scan-assembler {vfmadd.vf} } } */
+/* { dg-final { scan-assembler {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
new file mode 100644
index 00000000000..d38ae8b3220
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_1(double, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1(double, -, sub, VF_MULOP_BODY_X16)
+
+/* { dg-final { scan-assembler {vfmadd.vf} } } */
+/* { dg-final { scan-assembler {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
new file mode 100644
index 00000000000..f1ca34e6d56
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d --param=fpr2vr-cost=4" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_1(_Float16, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1(_Float16, -, sub, VF_MULOP_BODY_X16)
+
+/* { dg-final { scan-assembler-not {vfmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
new file mode 100644
index 00000000000..6730d4b154d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=4" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_1(float, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1(float, -, sub, VF_MULOP_BODY_X16)
+
+/* { dg-final { scan-assembler-not {vfmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
new file mode 100644
index 00000000000..bcb6a6e5696
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=4" } */
+
+#include "vf_mulop.h"
+
+DEF_VF_MULOP_CASE_1(double, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1(double, -, sub, VF_MULOP_BODY_X16)
+
+/* { dg-final { scan-assembler-not {vfmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
new file mode 100644
index 00000000000..52539788906
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
@@ -0,0 +1,61 @@
+#ifndef HAVE_DEFINED_VF_MULOP_H
+#define HAVE_DEFINED_VF_MULOP_H
+
+#include <stdint.h>
+
+#define DEF_VF_MULOP_CASE_0(T, OP, NAME)                                       
\
+  void test_vf_mulop_##NAME##_##T##_case_0(T *restrict out, T *restrict in,    
\
+                                           T x, unsigned n) {                  
\
+    for (unsigned i = 0; i < n; i++)                                           
\
+      out[i] = in[i] OP out[i] * x;                                            
\
+  }
+#define DEF_VF_MULOP_CASE_0_WRAP(T, OP, NAME) DEF_VF_MULOP_CASE_0(T, OP, NAME)
+#define RUN_VF_MULOP_CASE_0(T, NAME, out, in, x, n)                            
\
+  test_vf_mulop_##NAME##_##T##_case_0(out, in, x, n)
+#define RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)                       
\
+  RUN_VF_MULOP_CASE_0(T, NAME, out, in, x, n)
+
+#define VF_MULOP_BODY(op)                                                      
\
+  out[k + 0] = in[k + 0] op tmp * out[k + 0];                                  
\
+  out[k + 1] = in[k + 1] op tmp * out[k + 1];                                  
\
+  k += 2;
+
+#define VF_MULOP_BODY_X4(op)                                                   
\
+  VF_MULOP_BODY(op)                                                            
\
+  VF_MULOP_BODY(op)
+
+#define VF_MULOP_BODY_X8(op)                                                   
\
+  VF_MULOP_BODY_X4(op)                                                         
\
+  VF_MULOP_BODY_X4(op)
+
+#define VF_MULOP_BODY_X16(op)                                                  
\
+  VF_MULOP_BODY_X8(op)                                                         
\
+  VF_MULOP_BODY_X8(op)
+
+#define VF_MULOP_BODY_X32(op)                                                  
\
+  VF_MULOP_BODY_X16(op)                                                        
\
+  VF_MULOP_BODY_X16(op)
+
+#define VF_MULOP_BODY_X64(op)                                                  
\
+  VF_MULOP_BODY_X32(op)                                                        
\
+  VF_MULOP_BODY_X32(op)
+
+#define VF_MULOP_BODY_X128(op)                                                 
\
+  VF_MULOP_BODY_X64(op)                                                        
\
+  VF_MULOP_BODY_X64(op)
+
+#define DEF_VF_MULOP_CASE_1(T, OP, NAME, BODY)                                 
      \
+  void test_vf_mulop_##NAME##_##T##_case_1(T *restrict out, T *restrict in,    
\
+                                           T x, unsigned n) {                  
\
+    unsigned k = 0;                                                            
\
+    T tmp = x + 3;                                                             
\
+                                                                               
\
+    while (k < n) {                                                            
\
+      tmp = tmp * 0x3f;                                                        
\
+      BODY(OP)                                                                 
\
+    }                                                                          
\
+  }
+#define DEF_VF_MULOP_CASE_1_WRAP(T, OP, NAME, BODY)                            
\
+  DEF_VF_MULOP_CASE_1(T, OP, NAME, BODY)
+
+#endif
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h
new file mode 100644
index 00000000000..c16c1a971f7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h
@@ -0,0 +1,413 @@
+#ifndef HAVE_DEFINED_VF_MULOP_DATA_H
+#define HAVE_DEFINED_VF_MULOP_DATA_H
+
+#define N 16
+
+#define TEST_MULOP_DATA(T, NAME)      test_##T##_##NAME##_data
+#define TEST_MULOP_DATA_WRAP(T, NAME) TEST_MULOP_DATA(T, NAME)
+
+
+_Float16 TEST_MULOP_DATA(_Float16, add)[][4][N] =
+{
+  {
+    {     0.30f16 },
+    {
+          1.48f16,       1.48f16,       1.48f16,       1.48f16,
+          0.80f16,       0.80f16,       0.80f16,       0.80f16,
+          0.62f16,       0.62f16,       0.62f16,       0.62f16,
+          1.18f16,       1.18f16,       1.18f16,       1.18f16,
+    },
+    {
+          1.25f16,       1.25f16,       1.25f16,       1.25f16,
+          1.89f16,       1.89f16,       1.89f16,       1.89f16,
+          1.57f16,       1.57f16,       1.57f16,       1.57f16,
+          1.21f16,       1.21f16,       1.21f16,       1.21f16,
+    },
+    {
+          1.85f16,       1.85f16,       1.85f16,       1.85f16,
+          1.37f16,       1.37f16,       1.37f16,       1.37f16,
+          1.09f16,       1.09f16,       1.09f16,       1.09f16,
+          1.54f16,       1.54f16,       1.54f16,       1.54f16,
+    }
+  },
+  {
+    {   -0.505f16 },
+    {
+         -2.38f16,      -2.38f16,      -2.38f16,      -2.38f16,
+         -2.06f16,      -2.06f16,      -2.06f16,      -2.06f16,
+         -1.69f16,      -1.69f16,      -1.69f16,      -1.69f16,
+          -1.1f16,       -1.1f16,       -1.1f16,       -1.1f16,
+    },
+    {
+         -1.77f16,      -1.77f16,      -1.77f16,      -1.77f16,
+          -1.6f16,       -1.6f16,       -1.6f16,       -1.6f16,
+           -1.f16,        -1.f16,        -1.f16,        -1.f16,
+         -1.23f16,      -1.23f16,      -1.23f16,      -1.23f16,
+    },
+    {
+         -1.49f16,      -1.49f16,      -1.49f16,      -1.49f16,
+         -1.25f16,      -1.25f16,      -1.25f16,      -1.25f16,
+         -1.18f16,      -1.18f16,      -1.18f16,      -1.18f16,
+        -0.479f16,     -0.479f16,     -0.479f16,     -0.479f16,
+    }
+  },
+  {
+    {   4.95e-04f16 },
+    {
+    1.4266e-05f16, 1.4266e-05f16, 1.4266e-05f16, 1.4266e-05f16,
+    1.8129e-05f16, 1.8129e-05f16, 1.8129e-05f16, 1.8129e-05f16,
+    -8.4710e-06f16, -8.4710e-06f16, -8.4710e-06f16, -8.4710e-06f16,
+    3.7876e-05f16, 3.7876e-05f16, 3.7876e-05f16, 3.7876e-05f16,
+    },
+    {
+    2.2808e-02f16, 2.2808e-02f16, 2.2808e-02f16, 2.2808e-02f16,
+    3.9633e-02f16, 3.9633e-02f16, 3.9633e-02f16, 3.9633e-02f16,
+    9.9657e-02f16, 9.9657e-02f16, 9.9657e-02f16, 9.9657e-02f16,
+    7.7189e-02f16, 7.7189e-02f16, 7.7189e-02f16, 7.7189e-02f16,
+    },
+    {
+    2.5547e-05f16, 2.5547e-05f16, 2.5547e-05f16, 2.5547e-05f16,
+    3.7732e-05f16, 3.7732e-05f16, 3.7732e-05f16, 3.7732e-05f16,
+    4.0820e-05f16, 4.0820e-05f16, 4.0820e-05f16, 4.0820e-05f16,
+    7.6054e-05f16, 7.6054e-05f16, 7.6054e-05f16, 7.6054e-05f16,
+    }
+  },
+};
+
+float TEST_MULOP_DATA(float, add)[][4][N] =
+{
+  {
+    { 43.71f },
+    {
+      -410.28f,    -410.28f,    -410.28f,    -410.28f,
+      -276.91f,    -276.91f,    -276.91f,    -276.91f,
+      -103.38f,    -103.38f,    -103.38f,    -103.38f,
+      -378.24f,    -378.24f,    -378.24f,    -378.24f,
+   },
+   {
+         9.56f,       9.56f,       9.56f,       9.56f,
+         6.39f,       6.39f,       6.39f,       6.39f,
+         2.40f,       2.40f,       2.40f,       2.40f,
+         8.80f,       8.80f,       8.80f,       8.80f,
+   },
+   {
+         7.59f,       7.59f,       7.59f,       7.59f,
+         2.40f,       2.40f,       2.40f,       2.40f,
+         1.52f,       1.52f,       1.52f,       1.52f,
+         6.41f,       6.41f,       6.41f,       6.41f,
+   }
+  },
+  {
+    { 2.04f },
+    {
+       -110.22f,    -110.22f,    -110.22f,    -110.22f,
+        -25.13f,     -25.13f,     -25.13f,     -25.13f,
+       -108.18f,    -108.18f,    -108.18f,    -108.18f,
+       -107.14f,    -107.14f,    -107.14f,    -107.14f,
+    },
+    {
+         64.82f,      64.82f,      64.82f,      64.82f,
+         31.65f,      31.65f,      31.65f,      31.65f,
+         87.32f,      87.32f,      87.32f,      87.32f,
+         58.70f,      58.70f,      58.70f,      58.70f,
+    },
+    {
+         22.01f,      22.01f,      22.01f,      22.01f,
+         39.44f,      39.44f,      39.44f,      39.44f,
+         69.95f,      69.95f,      69.95f,      69.95f,
+         12.61f,      12.61f,      12.61f,      12.61f,
+    }
+  },
+  {
+    { 20.35f },
+    {
+        881.43f,     881.43f,     881.43f,     881.43f,
+       3300.17f,    3300.17f,    3300.17f,    3300.17f,
+       5217.85f,    5217.85f,    5217.85f,    5217.85f,
+         66.57f,      66.57f,      66.57f,      66.57f,
+    },
+    {
+         64.82f,      64.82f,      64.82f,      64.82f,
+         31.65f,      31.65f,      31.65f,      31.65f,
+         87.32f,      87.32f,      87.32f,      87.32f,
+         58.70f,      58.70f,      58.70f,      58.70f,
+    },
+    {
+       2200.52f,    2200.52f,    2200.52f,    2200.52f,
+       3944.25f,    3944.25f,    3944.25f,    3944.25f,
+       6994.81f,    6994.81f,    6994.81f,    6994.81f,
+       1261.12f,    1261.12f,    1261.12f,    1261.12f,
+    }
+  },
+};
+
+double TEST_MULOP_DATA(double, add)[][4][N] =
+{
+  {
+    {   1.16e+12 },
+    {
+    1.8757e+45, 1.8757e+45, 1.8757e+45, 1.8757e+45,
+    7.5140e+45, 7.5140e+45, 7.5140e+45, 7.5140e+45,
+    8.2069e+45, 8.2069e+45, 8.2069e+45, 8.2069e+45,
+    4.9456e+45, 4.9456e+45, 4.9456e+45, 4.9456e+45,
+    },
+    {
+    9.0242e+32, 9.0242e+32, 9.0242e+32, 9.0242e+32,
+    3.6908e+32, 3.6908e+32, 3.6908e+32, 3.6908e+32,
+    3.9202e+32, 3.9202e+32, 3.9202e+32, 3.9202e+32,
+    5.0276e+32, 5.0276e+32, 5.0276e+32, 5.0276e+32,
+    },
+    {
+    2.9201e+45, 2.9201e+45, 2.9201e+45, 2.9201e+45,
+    7.9411e+45, 7.9411e+45, 7.9411e+45, 7.9411e+45,
+    8.6606e+45, 8.6606e+45, 8.6606e+45, 8.6606e+45,
+    5.5275e+45, 5.5275e+45, 5.5275e+45, 5.5275e+45,
+    }
+  },
+  {
+    {  -7.29e+23 },
+    {
+    -6.4993e+65, -6.4993e+65, -6.4993e+65, -6.4993e+65,
+    -4.6760e+65, -4.6760e+65, -4.6760e+65, -4.6760e+65,
+    -8.1564e+65, -8.1564e+65, -8.1564e+65, -8.1564e+65,
+    -8.2899e+65, -8.2899e+65, -8.2899e+65, -8.2899e+65,
+    },
+    {
+    -7.7764e+41, -7.7764e+41, -7.7764e+41, -7.7764e+41,
+    -1.9756e+41, -1.9756e+41, -1.9756e+41, -1.9756e+41,
+    -4.8980e+41, -4.8980e+41, -4.8980e+41, -4.8980e+41,
+    -8.1062e+41, -8.1062e+41, -8.1062e+41, -8.1062e+41,
+    },
+    {
+    -8.2928e+64, -8.2928e+64, -8.2928e+64, -8.2928e+64,
+    -3.2356e+65, -3.2356e+65, -3.2356e+65, -3.2356e+65,
+    -4.5850e+65, -4.5850e+65, -4.5850e+65, -4.5850e+65,
+    -2.3794e+65, -2.3794e+65, -2.3794e+65, -2.3794e+65,
+    }
+  },
+  {
+    {   2.02e-03 },
+    {
+    -1.2191e-35, -1.2191e-35, -1.2191e-35, -1.2191e-35,
+    -1.0471e-36, -1.0471e-36, -1.0471e-36, -1.0471e-36,
+    -9.7582e-36, -9.7582e-36, -9.7582e-36, -9.7582e-36,
+    -2.2097e-36, -2.2097e-36, -2.2097e-36, -2.2097e-36,
+    },
+    {
+    9.7703e-33, 9.7703e-33, 9.7703e-33, 9.7703e-33,
+    4.1632e-33, 4.1632e-33, 4.1632e-33, 4.1632e-33,
+    8.1964e-33, 8.1964e-33, 8.1964e-33, 8.1964e-33,
+    4.7314e-33, 4.7314e-33, 4.7314e-33, 4.7314e-33,
+    },
+    {
+    7.5586e-36, 7.5586e-36, 7.5586e-36, 7.5586e-36,
+    7.3684e-36, 7.3684e-36, 7.3684e-36, 7.3684e-36,
+    6.8101e-36, 6.8101e-36, 6.8101e-36, 6.8101e-36,
+    7.3543e-36, 7.3543e-36, 7.3543e-36, 7.3543e-36,
+    }
+  },
+};
+
+_Float16 TEST_MULOP_DATA(_Float16, sub)[][4][N] =
+{
+  {
+    {      0.676f16 },
+    {
+          1.39f16,       1.39f16,       1.39f16,       1.39f16,
+          1.68f16,       1.68f16,       1.68f16,       1.68f16,
+          1.63f16,       1.63f16,       1.63f16,       1.63f16,
+          2.12f16,       2.12f16,       2.12f16,       2.12f16,
+    },
+    {
+          1.04f16,       1.04f16,       1.04f16,       1.04f16,
+          1.64f16,       1.64f16,       1.64f16,       1.64f16,
+          1.95f16,       1.95f16,       1.95f16,       1.95f16,
+          1.39f16,       1.39f16,       1.39f16,       1.39f16,
+    },
+    {
+         0.687f16,      0.687f16,      0.687f16,      0.687f16,
+         0.568f16,      0.568f16,      0.568f16,      0.568f16,
+         0.315f16,      0.315f16,      0.315f16,      0.315f16,
+          1.18f16,       1.18f16,       1.18f16,       1.18f16,
+    }
+},
+  {
+    {     -0.324f16 },
+    {
+        -0.679f16,     -0.679f16,     -0.679f16,     -0.679f16,
+        -0.992f16,     -0.992f16,     -0.992f16,     -0.992f16,
+         -1.34f16,      -1.34f16,      -1.34f16,      -1.34f16,
+        -0.297f16,     -0.297f16,     -0.297f16,     -0.297f16,
+    },
+    {
+         -1.96f16,      -1.96f16,      -1.96f16,      -1.96f16,
+         -1.36f16,      -1.36f16,      -1.36f16,      -1.36f16,
+         -1.05f16,      -1.05f16,      -1.05f16,      -1.05f16,
+         -1.61f16,      -1.61f16,      -1.61f16,      -1.61f16,
+    },
+    {
+         -1.31f16,      -1.31f16,      -1.31f16,      -1.31f16,
+         -1.43f16,      -1.43f16,      -1.43f16,      -1.43f16,
+         -1.68f16,      -1.68f16,      -1.68f16,      -1.68f16,
+         -0.82f16,      -0.82f16,      -0.82f16,      -0.82f16,
+    }
+  },
+  {
+    {   7.08e+01f16 },
+    {
+      4.49e+03f16,   4.49e+03f16,   4.49e+03f16,   4.49e+03f16,
+      7.73e+03f16,   7.73e+03f16,   7.73e+03f16,   7.73e+03f16,
+      8.42e+03f16,   8.42e+03f16,   8.42e+03f16,   8.42e+03f16,
+      9.12e+03f16,   9.12e+03f16,   9.12e+03f16,   9.12e+03f16,
+    },
+    {
+      1.40e+01f16,   1.40e+01f16,   1.40e+01f16,   1.40e+01f16,
+      6.80e+01f16,   6.80e+01f16,   6.80e+01f16,   6.80e+01f16,
+      9.54e+01f16,   9.54e+01f16,   9.54e+01f16,   9.54e+01f16,
+      4.49e+01f16,   4.49e+01f16,   4.49e+01f16,   4.49e+01f16,
+    },
+    {
+      3.50e+03f16,   3.50e+03f16,   3.50e+03f16,   3.50e+03f16,
+      2.91e+03f16,   2.91e+03f16,   2.91e+03f16,   2.91e+03f16,
+      1.66e+03f16,   1.66e+03f16,   1.66e+03f16,   1.66e+03f16,
+      5.94e+03f16,   5.94e+03f16,   5.94e+03f16,   5.94e+03f16,
+    }
+  },
+};
+
+float TEST_MULOP_DATA(float, sub)[][4][N] =
+{
+  {
+  {8.51f },
+  {
+       24.21f,      24.21f,      24.21f,      24.21f,
+       40.31f,      40.31f,      40.31f,      40.31f,
+       59.68f,      59.68f,      59.68f,      59.68f,
+       45.42f,      45.42f,      45.42f,      45.42f,
+  },
+  {
+        1.94f,       1.94f,       1.94f,       1.94f,
+        4.24f,       4.24f,       4.24f,       4.24f,
+        6.48f,       6.48f,       6.48f,       6.48f,
+        4.68f,       4.68f,       4.68f,       4.68f,
+  },
+  {
+        7.70f,       7.70f,       7.70f,       7.70f,
+        4.23f,       4.23f,       4.23f,       4.23f,
+        4.54f,       4.54f,       4.54f,       4.54f,
+        5.59f,       5.59f,       5.59f,       5.59f,
+  },
+},
+  {
+    { 85.14f },
+    {
+       1731.29f,    1731.29f,    1731.29f,    1731.29f,
+       3656.53f,    3656.53f,    3656.53f,    3656.53f,
+       5565.07f,    5565.07f,    5565.07f,    5565.07f,
+       4042.14f,    4042.14f,    4042.14f,    4042.14f,
+    },
+    {
+         19.43f,      19.43f,      19.43f,      19.43f,
+         42.45f,      42.45f,      42.45f,      42.45f,
+         64.83f,      64.83f,      64.83f,      64.83f,
+         46.82f,      46.82f,      46.82f,      46.82f,
+    },
+    {
+         77.02f,      77.02f,      77.02f,      77.02f,
+         42.34f,      42.34f,      42.34f,      42.34f,
+         45.44f,      45.44f,      45.44f,      45.44f,
+         55.89f,      55.89f,      55.89f,      55.89f,
+    }
+  },
+  {
+    { 99.01f },
+    {
+       6240.43f,    6240.43f,    6240.43f,    6240.43f,
+       2179.23f,    2179.23f,    2179.23f,    2179.23f,
+       5346.65f,    5346.65f,    5346.65f,    5346.65f,
+       2649.91f,    2649.91f,    2649.91f,    2649.91f,
+    },
+    {
+         59.46f,      59.46f,      59.46f,      59.46f,
+         16.96f,      16.96f,      16.96f,      16.96f,
+         52.55f,      52.55f,      52.55f,      52.55f,
+         24.70f,      24.70f,      24.70f,      24.70f,
+    },
+    {
+        353.30f,     353.30f,     353.30f,     353.30f,
+        500.02f,     500.02f,     500.02f,     500.02f,
+        143.67f,     143.67f,     143.67f,     143.67f,
+        204.36f,     204.36f,     204.36f,     204.36f,
+    }
+  },
+};
+
+double TEST_MULOP_DATA(double, sub)[][4][N] =
+{
+  {
+    { 80.54 },
+    {
+       5731.60,    5731.60,    5731.60,    5731.60,
+       6682.41,    6682.41,    6682.41,    6682.41,
+       7737.53,    7737.53,    7737.53,    7737.53,
+       4922.68,    4922.68,    4922.68,    4922.68,
+    },
+    {
+         67.14,      67.14,      67.14,      67.14,
+         78.23,      78.23,      78.23,      78.23,
+         94.35,      94.35,      94.35,      94.35,
+         49.68,      49.68,      49.68,      49.68,
+    },
+    {
+        324.14,     324.14,     324.14,     324.14,
+        381.77,     381.77,     381.77,     381.77,
+        138.58,     138.58,     138.58,     138.58,
+        921.45,     921.45,     921.45,     921.45,
+    }
+  },
+  {
+    {   8.05e+01 },
+    {
+      8.65e+27,   8.65e+27,   8.65e+27,   8.65e+27,
+      1.01e+28,   1.01e+28,   1.01e+28,   1.01e+28,
+      8.99e+27,   8.99e+27,   8.99e+27,   8.99e+27,
+      1.32e+28,   1.32e+28,   1.32e+28,   1.32e+28,
+    },
+    {
+      6.71e+25,   6.71e+25,   6.71e+25,   6.71e+25,
+      7.82e+25,   7.82e+25,   7.82e+25,   7.82e+25,
+      9.44e+25,   9.44e+25,   9.44e+25,   9.44e+25,
+      4.97e+25,   4.97e+25,   4.97e+25,   4.97e+25,
+    },
+    {
+      3.24e+27,   3.24e+27,   3.24e+27,   3.24e+27,
+      3.82e+27,   3.82e+27,   3.82e+27,   3.82e+27,
+      1.39e+27,   1.39e+27,   1.39e+27,   1.39e+27,
+      9.21e+27,   9.21e+27,   9.21e+27,   9.21e+27,
+    }
+  },
+  {
+    {   2.02e-03 },
+    {
+    2.7308e-35, 2.7308e-35, 2.7308e-35, 2.7308e-35,
+    1.5784e-35, 1.5784e-35, 1.5784e-35, 1.5784e-35,
+    2.3378e-35, 2.3378e-35, 2.3378e-35, 2.3378e-35,
+    1.6918e-35, 1.6918e-35, 1.6918e-35, 1.6918e-35,
+    },
+    {
+    9.7703e-33, 9.7703e-33, 9.7703e-33, 9.7703e-33,
+    4.1632e-33, 4.1632e-33, 4.1632e-33, 4.1632e-33,
+    8.1964e-33, 8.1964e-33, 8.1964e-33, 8.1964e-33,
+    4.7314e-33, 4.7314e-33, 4.7314e-33, 4.7314e-33,
+    },
+    {
+    7.5586e-36, 7.5586e-36, 7.5586e-36, 7.5586e-36,
+    7.3684e-36, 7.3684e-36, 7.3684e-36, 7.3684e-36,
+    6.8101e-36, 6.8101e-36, 6.8101e-36, 6.8101e-36,
+    7.3543e-36, 7.3543e-36, 7.3543e-36, 7.3543e-36,
+    }
+  },
+};
+
+
+#endif
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
new file mode 100644
index 00000000000..bc6f483deed
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
@@ -0,0 +1,34 @@
+#ifndef HAVE_DEFINED_VF_MULOP_RUN_H
+#define HAVE_DEFINED_VF_MULOP_RUN_H
+
+#include <math.h>
+
+#define TYPE_FABS(x, T)                                                        
\
+  (__builtin_types_compatible_p (T, double) ? fabs (x) : fabsf (x))
+
+int
+main ()
+{
+  unsigned i, k;
+
+  for (i = 0; i < sizeof (TEST_DATA) / sizeof (TEST_DATA[0]); i++)
+    {
+      T x = TEST_DATA[i][0][0];
+      T *in = TEST_DATA[i][1];
+      T *out = TEST_DATA[i][2];
+      T *expect = TEST_DATA[i][3];
+
+      TEST_RUN (T, NAME, out, in, x, N);
+
+      for (k = 0; k < N; k++)
+       {
+         T diff = expect[k] - out[k];
+         if (TYPE_FABS (diff, T) > .01 * TYPE_FABS (expect[k], T))
+           __builtin_abort ();
+       }
+    }
+
+  return 0;
+}
+
+#endif
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
new file mode 100644
index 00000000000..1bcf9e075fe
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    _Float16
+#define NAME add
+
+DEF_VF_MULOP_CASE_0_WRAP(T, +, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, 
out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
new file mode 100644
index 00000000000..199b9adc738
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    float
+#define NAME add
+
+DEF_VF_MULOP_CASE_0_WRAP(T, +, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, 
out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
new file mode 100644
index 00000000000..3857f586cc9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    double
+#define NAME add
+
+DEF_VF_MULOP_CASE_0_WRAP(T, +, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, 
out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
new file mode 100644
index 00000000000..671c7d83d9c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    _Float16
+#define NAME sub
+
+DEF_VF_MULOP_CASE_0_WRAP(T, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, 
out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
new file mode 100644
index 00000000000..f89696373c3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    float
+#define NAME sub
+
+DEF_VF_MULOP_CASE_0_WRAP(T, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, 
out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c
new file mode 100644
index 00000000000..b42ab1eff7d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    double
+#define NAME sub
+
+DEF_VF_MULOP_CASE_0_WRAP(T, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, 
out, in, x, n)
+
+#include "vf_mulop_run.h"



--
PA
From 3116dc2c200d8caf200042885b3e166260915e9c Mon Sep 17 00:00:00 2001
From: Paul-Antoine Arras <par...@baylibre.com>
Date: Wed, 4 Jun 2025 14:51:17 +0200
Subject: [PATCH] RISC-V: Add patterns for vector-scalar
 negate-(multiply-add/sub) [PR119100]

This pattern enables the combine pass (or late-combine, depending on the case)
to merge a vec_duplicate into a (possibly negated) minus-mult RTL instruction.

Before this patch, we have two instructions, e.g.:
  vfmv.v.f        v6,fa0
  vfnmadd.vv      v2,v6,v4

After, we get only one:
  vfnmadd.vf      v2,fa0,v4

This also fixes a sign mistake in the handling of vfmsub.

	PR target/119100

gcc/ChangeLog:

	* config/riscv/autovec-opt.md (*<optab>_vf_<mode>): Only handle vfmadd
	and vfmsub.
	(*vfnmsub_<mode>): New pattern.
	(*vfnmadd_<mode>): New pattern.
	* config/riscv/riscv.cc (riscv_rtx_costs): Add cost model for MULT with
	NEG and VEC_DUPLICATE.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c: Add vfnmadd and
	vfnmsub.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h: Add support for neg
	variants. Fix sign for sub.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h: Add data for neg
	variants. Fix data for sub.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h: Rename x to f.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c: Add neg
	argument.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c: New test.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c: New test.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c: New test.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c: New test.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c: New test.
	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c: New test.
---
 gcc/config/riscv/autovec-opt.md               |  35 +-
 gcc/config/riscv/riscv.cc                     |  10 +
 .../riscv/rvv/autovec/vx_vf/vf-1-f16.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-1-f32.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-1-f64.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-2-f16.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-2-f32.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-2-f64.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-3-f16.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-3-f32.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-3-f64.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-4-f16.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-4-f32.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf-4-f64.c        |   8 +-
 .../riscv/rvv/autovec/vx_vf/vf_mulop.h        |  74 ++--
 .../riscv/rvv/autovec/vx_vf/vf_mulop_data.h   | 406 +++++++++++++++++-
 .../riscv/rvv/autovec/vx_vf/vf_mulop_run.h    |   4 +-
 .../rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c   |   2 +-
 .../rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c   |   2 +-
 .../rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c   |   2 +-
 .../rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c   |   2 +-
 .../rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c   |   2 +-
 .../rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c   |   2 +-
 .../rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c  |  15 +
 .../rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c  |  15 +
 .../rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c  |  15 +
 .../rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c  |  15 +
 .../rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c  |  15 +
 .../rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c  |  15 +
 29 files changed, 654 insertions(+), 73 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c

diff --git a/gcc/config/riscv/autovec-opt.md b/gcc/config/riscv/autovec-opt.md
index 19eb16c7540..5a0712a137c 100644
--- a/gcc/config/riscv/autovec-opt.md
+++ b/gcc/config/riscv/autovec-opt.md
@@ -1719,9 +1719,11 @@ (define_insn_and_split "*<optab>_vx_<mode>"
 ;; Include
 ;; - vfmadd.vf
 ;; - vfmsub.vf
+;; - vfnmadd.vf
+;; - vfnmsub.vf
 ;; =============================================================================
 
-
+;; vfmadd.vf, vfmsub.vf
 (define_insn_and_split "*<optab>_vf_<mode>"
   [(set (match_operand:V_VLSF 0 "register_operand"		"=vd")
     (plus_minus:V_VLSF
@@ -1744,9 +1746,10 @@ (define_insn_and_split "*<optab>_vf_<mode>"
   [(set_attr "type" "vfmuladd")]
 )
 
-(define_insn_and_split "*<optab>_vf_<mode>"
+;; vfnmsub.vf
+(define_insn_and_split "*vfnmsub_<mode>"
   [(set (match_operand:V_VLSF 0 "register_operand"		"=vd")
-    (plus_minus:V_VLSF
+    (minus:V_VLSF
 	    (match_operand:V_VLSF 3 "register_operand"		" vr")
 	    (mult:V_VLSF
 	      (vec_duplicate:V_VLSF
@@ -1759,7 +1762,31 @@ (define_insn_and_split "*<optab>_vf_<mode>"
   {
     rtx ops[] = {operands[0], operands[1], operands[2], operands[3],
 		 operands[2]};
-    riscv_vector::emit_vlmax_insn (code_for_pred_mul_scalar (<CODE>, <MODE>mode),
+    riscv_vector::emit_vlmax_insn (code_for_pred_mul_neg_scalar (PLUS, <MODE>mode),
+				   riscv_vector::TERNARY_OP_FRM_DYN, ops);
+    DONE;
+  }
+  [(set_attr "type" "vfmuladd")]
+)
+
+;; vfnmadd.vf
+(define_insn_and_split "*vfnmadd_<mode>"
+  [(set (match_operand:V_VLSF 0 "register_operand"	"=vd")
+    (minus:V_VLSF
+      (mult:V_VLSF
+        (neg:V_VLSF
+          (match_operand:V_VLSF 2 "register_operand"	"  0"))
+        (vec_duplicate:V_VLSF
+          (match_operand:<VEL> 1 "register_operand"	"  f")))
+      (match_operand:V_VLSF 3 "register_operand"	" vr")))]
+  "TARGET_VECTOR && can_create_pseudo_p ()"
+  "#"
+  "&& 1"
+  [(const_int 0)]
+  {
+    rtx ops[] = {operands[0], operands[1], operands[2], operands[3],
+		 operands[2]};
+    riscv_vector::emit_vlmax_insn (code_for_pred_mul_neg_scalar (MINUS, <MODE>mode),
 				   riscv_vector::TERNARY_OP_FRM_DYN, ops);
     DONE;
   }
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 06a8b5175c2..b4c52f84441 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -3936,6 +3936,7 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN
 			   || GET_CODE (op = op_1) == MULT)
 		    {
 		      rtx mult_op0 = XEXP (op, 0);
+		      rtx mult_op1 = XEXP (op, 1);
 		      if (GET_CODE (mult_op0) == VEC_DUPLICATE)
 			{
 			  if (FLOAT_MODE_P (mode))
@@ -3944,6 +3945,15 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN
 			    *total = (gr2vr_cost + 1) * COSTS_N_INSNS (1);
 			  break;
 			}
+		      else if (GET_CODE (mult_op0) == NEG
+			       && GET_CODE (mult_op1) == VEC_DUPLICATE)
+			{
+			  if (FLOAT_MODE_P (mode))
+			    *total = (fr2vr_cost + 1) * COSTS_N_INSNS (1);
+			  else
+			    *total = (gr2vr_cost + 1) * COSTS_N_INSNS (1);
+			  break;
+			}
 		    }
 		}
 		/* Fall through.  */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
index 821e5c589a4..09f4b71f30d 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_0(_Float16, +, add)
-DEF_VF_MULOP_CASE_0(_Float16, -, sub)
+DEF_VF_MULOP_CASE_0 (_Float16, +, +, add)
+DEF_VF_MULOP_CASE_0 (_Float16, -, +, sub)
+DEF_VF_MULOP_CASE_0 (_Float16, +, -, nadd)
+DEF_VF_MULOP_CASE_0 (_Float16, -, -, nsub)
 
 /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmadd.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
index 49b42879a51..b21ae49bd5f 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_0(float, +, add)
-DEF_VF_MULOP_CASE_0(float, -, sub)
+DEF_VF_MULOP_CASE_0 (float, +, +, add)
+DEF_VF_MULOP_CASE_0 (float, -, +, sub)
+DEF_VF_MULOP_CASE_0 (float, +, -, nadd)
+DEF_VF_MULOP_CASE_0 (float, -, -, nsub)
 
 /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmadd.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
index 2bb5d891237..56a44dd065d 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_0(double, +, add)
-DEF_VF_MULOP_CASE_0(double, -, sub)
+DEF_VF_MULOP_CASE_0 (double, +, +, add)
+DEF_VF_MULOP_CASE_0 (double, -, +, sub)
+DEF_VF_MULOP_CASE_0 (double, +, -, nadd)
+DEF_VF_MULOP_CASE_0 (double, -, -, nsub)
 
 /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmadd.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
index cbb43cabe98..22180cb53cd 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_0(_Float16, +, add)
-DEF_VF_MULOP_CASE_0(_Float16, -, sub)
+DEF_VF_MULOP_CASE_0 (_Float16, +, +, add)
+DEF_VF_MULOP_CASE_0 (_Float16, -, +, sub)
+DEF_VF_MULOP_CASE_0 (_Float16, +, -, nadd)
+DEF_VF_MULOP_CASE_0 (_Float16, -, -, nsub)
 
 /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
index 66ff9b8c75e..318c281d0c1 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_0(float, +, add)
-DEF_VF_MULOP_CASE_0(float, -, sub)
+DEF_VF_MULOP_CASE_0 (float, +, +, add)
+DEF_VF_MULOP_CASE_0 (float, -, +, sub)
+DEF_VF_MULOP_CASE_0 (float, +, -, nadd)
+DEF_VF_MULOP_CASE_0 (float, -, -, nsub)
 
 /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
index 66ff9b8c75e..318c281d0c1 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_0(float, +, add)
-DEF_VF_MULOP_CASE_0(float, -, sub)
+DEF_VF_MULOP_CASE_0 (float, +, +, add)
+DEF_VF_MULOP_CASE_0 (float, -, +, sub)
+DEF_VF_MULOP_CASE_0 (float, +, -, nadd)
+DEF_VF_MULOP_CASE_0 (float, -, -, nsub)
 
 /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
index 45980f49693..382f7ef50a9 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_1(_Float16, +, add, VF_MULOP_BODY_X16)
-DEF_VF_MULOP_CASE_1(_Float16, -, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (_Float16, +, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (_Float16, -, +, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (_Float16, +, -, nadd, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (_Float16, -, -, nsub, VF_MULOP_BODY_X16)
 
 /* { dg-final { scan-assembler {vfmadd.vf} } } */
 /* { dg-final { scan-assembler {vfmsub.vf} } } */
+/* { dg-final { scan-assembler {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
index c853620bb13..db2cd2eaabf 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_1(float, +, add, VF_MULOP_BODY_X16)
-DEF_VF_MULOP_CASE_1(float, -, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (float, +, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (float, -, +, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (float, +, -, nadd, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (float, -, -, nsub, VF_MULOP_BODY_X16)
 
 /* { dg-final { scan-assembler {vfmadd.vf} } } */
 /* { dg-final { scan-assembler {vfmsub.vf} } } */
+/* { dg-final { scan-assembler {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
index d38ae8b3220..423b4db3966 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_1(double, +, add, VF_MULOP_BODY_X16)
-DEF_VF_MULOP_CASE_1(double, -, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (double, +, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (double, -, +, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (double, +, -, nadd, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (double, -, -, nsub, VF_MULOP_BODY_X16)
 
 /* { dg-final { scan-assembler {vfmadd.vf} } } */
 /* { dg-final { scan-assembler {vfmsub.vf} } } */
+/* { dg-final { scan-assembler {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
index f1ca34e6d56..1482ff0fdf8 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_1(_Float16, +, add, VF_MULOP_BODY_X16)
-DEF_VF_MULOP_CASE_1(_Float16, -, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (_Float16, +, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (_Float16, -, +, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (_Float16, +, -, nadd, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (_Float16, -, -, nsub, VF_MULOP_BODY_X16)
 
 /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
index 6730d4b154d..d1368e773d8 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_1(float, +, add, VF_MULOP_BODY_X16)
-DEF_VF_MULOP_CASE_1(float, -, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (float, +, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (float, -, +, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (float, +, -, nadd, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (float, -, -, nsub, VF_MULOP_BODY_X16)
 
 /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
index bcb6a6e5696..8e4bdd4b15a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
@@ -3,8 +3,12 @@
 
 #include "vf_mulop.h"
 
-DEF_VF_MULOP_CASE_1(double, +, add, VF_MULOP_BODY_X16)
-DEF_VF_MULOP_CASE_1(double, -, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (double, +, +, add, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (double, -, +, sub, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (double, +, -, nadd, VF_MULOP_BODY_X16)
+DEF_VF_MULOP_CASE_1 (double, -, -, nsub, VF_MULOP_BODY_X16)
 
 /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
index 52539788906..433a16e4eec 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
@@ -3,59 +3,63 @@
 
 #include <stdint.h>
 
-#define DEF_VF_MULOP_CASE_0(T, OP, NAME)                                       \
-  void test_vf_mulop_##NAME##_##T##_case_0(T *restrict out, T *restrict in,    \
-                                           T x, unsigned n) {                  \
+#define DEF_VF_MULOP_CASE_0(T, OP, NEG, NAME)                                  \
+  void test_vf_mulop_##NAME##_##T##_case_0 (T *restrict out, T *restrict in,   \
+					    T f, unsigned n)                   \
+  {                                                                            \
     for (unsigned i = 0; i < n; i++)                                           \
-      out[i] = in[i] OP out[i] * x;                                            \
+      out[i] = NEG (f * out[i] OP in[i]);                                      \
   }
-#define DEF_VF_MULOP_CASE_0_WRAP(T, OP, NAME) DEF_VF_MULOP_CASE_0(T, OP, NAME)
+#define DEF_VF_MULOP_CASE_0_WRAP(T, OP, NEG, NAME)                             \
+  DEF_VF_MULOP_CASE_0 (T, OP, NEG, NAME)
 #define RUN_VF_MULOP_CASE_0(T, NAME, out, in, x, n)                            \
   test_vf_mulop_##NAME##_##T##_case_0(out, in, x, n)
 #define RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)                       \
   RUN_VF_MULOP_CASE_0(T, NAME, out, in, x, n)
 
-#define VF_MULOP_BODY(op)                                                      \
-  out[k + 0] = in[k + 0] op tmp * out[k + 0];                                  \
-  out[k + 1] = in[k + 1] op tmp * out[k + 1];                                  \
+#define VF_MULOP_BODY(op, neg)                                                 \
+  out[k + 0] = neg (tmp * out[k + 0] op in[k + 0]);                            \
+  out[k + 1] = neg (tmp * out[k + 1] op in[k + 1]);                            \
   k += 2;
 
-#define VF_MULOP_BODY_X4(op)                                                   \
-  VF_MULOP_BODY(op)                                                            \
-  VF_MULOP_BODY(op)
+#define VF_MULOP_BODY_X4(op, neg)                                              \
+  VF_MULOP_BODY (op, neg)                                                      \
+  VF_MULOP_BODY (op, neg)
 
-#define VF_MULOP_BODY_X8(op)                                                   \
-  VF_MULOP_BODY_X4(op)                                                         \
-  VF_MULOP_BODY_X4(op)
+#define VF_MULOP_BODY_X8(op, neg)                                              \
+  VF_MULOP_BODY_X4 (op, neg)                                                   \
+  VF_MULOP_BODY_X4 (op, neg)
 
-#define VF_MULOP_BODY_X16(op)                                                  \
-  VF_MULOP_BODY_X8(op)                                                         \
-  VF_MULOP_BODY_X8(op)
+#define VF_MULOP_BODY_X16(op, neg)                                             \
+  VF_MULOP_BODY_X8 (op, neg)                                                   \
+  VF_MULOP_BODY_X8 (op, neg)
 
-#define VF_MULOP_BODY_X32(op)                                                  \
-  VF_MULOP_BODY_X16(op)                                                        \
-  VF_MULOP_BODY_X16(op)
+#define VF_MULOP_BODY_X32(op, neg)                                             \
+  VF_MULOP_BODY_X16 (op, neg)                                                  \
+  VF_MULOP_BODY_X16 (op, neg)
 
-#define VF_MULOP_BODY_X64(op)                                                  \
-  VF_MULOP_BODY_X32(op)                                                        \
-  VF_MULOP_BODY_X32(op)
+#define VF_MULOP_BODY_X64(op, neg)                                             \
+  VF_MULOP_BODY_X32 (op, neg)                                                  \
+  VF_MULOP_BODY_X32 (op, neg)
 
-#define VF_MULOP_BODY_X128(op)                                                 \
-  VF_MULOP_BODY_X64(op)                                                        \
-  VF_MULOP_BODY_X64(op)
+#define VF_MULOP_BODY_X128(op, neg)                                            \
+  VF_MULOP_BODY_X64 (op, neg)                                                  \
+  VF_MULOP_BODY_X64 (op, neg)
 
-#define DEF_VF_MULOP_CASE_1(T, OP, NAME, BODY)                                       \
-  void test_vf_mulop_##NAME##_##T##_case_1(T *restrict out, T *restrict in,    \
-                                           T x, unsigned n) {                  \
+#define DEF_VF_MULOP_CASE_1(T, OP, NEG, NAME, BODY)                            \
+  void test_vf_mulop_##NAME##_##T##_case_1 (T *restrict out, T *restrict in,   \
+					    T x, unsigned n)                   \
+  {                                                                            \
     unsigned k = 0;                                                            \
     T tmp = x + 3;                                                             \
                                                                                \
-    while (k < n) {                                                            \
-      tmp = tmp * 0x3f;                                                        \
-      BODY(OP)                                                                 \
-    }                                                                          \
+    while (k < n)                                                              \
+      {                                                                        \
+	tmp = tmp * 0x3f;                                                      \
+	BODY (OP, NEG)                                                         \
+      }                                                                        \
   }
-#define DEF_VF_MULOP_CASE_1_WRAP(T, OP, NAME, BODY)                            \
-  DEF_VF_MULOP_CASE_1(T, OP, NAME, BODY)
+#define DEF_VF_MULOP_CASE_1_WRAP(T, OP, NEG, NAME, BODY)                       \
+  DEF_VF_MULOP_CASE_1 (T, OP, NEG, NAME, BODY)
 
 #endif
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h
index c16c1a971f7..ffa3d287751 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h
@@ -209,6 +209,408 @@ double TEST_MULOP_DATA(double, add)[][4][N] =
 };
 
 _Float16 TEST_MULOP_DATA(_Float16, sub)[][4][N] =
+{
+  {
+    {       5.94f16 },
+    {
+         -20.1f16,      -20.1f16,      -20.1f16,      -20.1f16,
+         -13.1f16,      -13.1f16,      -13.1f16,      -13.1f16,
+         -8.92f16,      -8.92f16,      -8.92f16,      -8.92f16,
+         -43.1f16,      -43.1f16,      -43.1f16,      -43.1f16,
+    },
+    {
+          7.44f16,       7.44f16,       7.44f16,       7.44f16,
+           5.9f16,        5.9f16,        5.9f16,        5.9f16,
+          6.81f16,       6.81f16,       6.81f16,       6.81f16,
+          9.03f16,       9.03f16,       9.03f16,       9.03f16,
+    },
+    {
+          64.2f16,       64.2f16,       64.2f16,       64.2f16,
+          48.1f16,       48.1f16,       48.1f16,       48.1f16,
+          49.4f16,       49.4f16,       49.4f16,       49.4f16,
+          96.7f16,       96.7f16,       96.7f16,       96.7f16,
+    }
+  },
+  {
+    {     0.0475f16 },
+    {
+       -0.0965f16,    -0.0965f16,    -0.0965f16,    -0.0965f16,
+         -0.23f16,      -0.23f16,      -0.23f16,      -0.23f16,
+        -0.267f16,     -0.267f16,     -0.267f16,     -0.267f16,
+        -0.455f16,     -0.455f16,     -0.455f16,     -0.455f16,
+    },
+    {
+        0.0748f16,     0.0748f16,     0.0748f16,     0.0748f16,
+        0.0372f16,     0.0372f16,     0.0372f16,     0.0372f16,
+        0.0183f16,     0.0183f16,     0.0183f16,     0.0183f16,
+        0.0411f16,     0.0411f16,     0.0411f16,     0.0411f16,
+    },
+    {
+           0.1f16,        0.1f16,        0.1f16,        0.1f16,
+         0.232f16,      0.232f16,      0.232f16,      0.232f16,
+         0.268f16,      0.268f16,      0.268f16,      0.268f16,
+         0.457f16,      0.457f16,      0.457f16,      0.457f16,
+    }
+  },
+  {
+    {   2.46e+01f16 },
+    {
+     -1.46e+02f16,  -1.46e+02f16,  -1.46e+02f16,  -1.46e+02f16,
+      3.66e+02f16,   3.66e+02f16,   3.66e+02f16,   3.66e+02f16,
+      3.47e+02f16,   3.47e+02f16,   3.47e+02f16,   3.47e+02f16,
+      6.24e+02f16,   6.24e+02f16,   6.24e+02f16,   6.24e+02f16,
+    },
+    {
+      6.17e+00f16,   6.17e+00f16,   6.17e+00f16,   6.17e+00f16,
+      2.46e+01f16,   2.46e+01f16,   2.46e+01f16,   2.46e+01f16,
+      1.99e+01f16,   1.99e+01f16,   1.99e+01f16,   1.99e+01f16,
+      3.29e+01f16,   3.29e+01f16,   3.29e+01f16,   3.29e+01f16,
+    },
+    {
+      2.97e+02f16,   2.97e+02f16,   2.97e+02f16,   2.97e+02f16,
+      2.39e+02f16,   2.39e+02f16,   2.39e+02f16,   2.39e+02f16,
+      1.42e+02f16,   1.42e+02f16,   1.42e+02f16,   1.42e+02f16,
+      1.85e+02f16,   1.85e+02f16,   1.85e+02f16,   1.85e+02f16,
+    }
+  },
+};
+
+float TEST_MULOP_DATA(float, sub)[][4][N] =
+{
+  {
+    {       5.96f },
+    {
+          7.74f,       7.74f,       7.74f,       7.74f,
+          -57.f,       -57.f,       -57.f,       -57.f,
+          32.7f,       32.7f,       32.7f,       32.7f,
+          2.44f,       2.44f,       2.44f,       2.44f,
+    },
+    {
+          7.37f,       7.37f,       7.37f,       7.37f,
+           5.6f,        5.6f,        5.6f,        5.6f,
+          9.07f,       9.07f,       9.07f,       9.07f,
+          2.87f,       2.87f,       2.87f,       2.87f,
+    },
+    {
+          36.2f,       36.2f,       36.2f,       36.2f,
+          90.4f,       90.4f,       90.4f,       90.4f,
+          21.3f,       21.3f,       21.3f,       21.3f,
+          14.6f,       14.6f,       14.6f,       14.6f,
+    }
+  },
+  {
+    {   3.00e-02f },
+    {
+     -2.83e-01f,  -2.83e-01f,  -2.83e-01f,  -2.83e-01f,
+     -5.37e-01f,  -5.37e-01f,  -5.37e-01f,  -5.37e-01f,
+     -7.87e-01f,  -7.87e-01f,  -7.87e-01f,  -7.87e-01f,
+     -3.65e-01f,  -3.65e-01f,  -3.65e-01f,  -3.65e-01f,
+    },
+    {
+      8.84e-02f,   8.84e-02f,   8.84e-02f,   8.84e-02f,
+      9.27e-02f,   9.27e-02f,   9.27e-02f,   9.27e-02f,
+      6.51e-02f,   6.51e-02f,   6.51e-02f,   6.51e-02f,
+      5.67e-02f,   5.67e-02f,   5.67e-02f,   5.67e-02f,
+    },
+    {
+      2.86e-01f,   2.86e-01f,   2.86e-01f,   2.86e-01f,
+      5.40e-01f,   5.40e-01f,   5.40e-01f,   5.40e-01f,
+      7.89e-01f,   7.89e-01f,   7.89e-01f,   7.89e-01f,
+      3.67e-01f,   3.67e-01f,   3.67e-01f,   3.67e-01f,
+    }
+  },
+  {
+    {   9.04e+01f },
+    {
+      2.76e+03f,   2.76e+03f,   2.76e+03f,   2.76e+03f,
+      1.05e+03f,   1.05e+03f,   1.05e+03f,   1.05e+03f,
+      5.17e+03f,   5.17e+03f,   5.17e+03f,   5.17e+03f,
+      3.91e+03f,   3.91e+03f,   3.91e+03f,   3.91e+03f,
+    },
+    {
+      3.99e+01f,   3.99e+01f,   3.99e+01f,   3.99e+01f,
+      1.38e+01f,   1.38e+01f,   1.38e+01f,   1.38e+01f,
+      6.36e+01f,   6.36e+01f,   6.36e+01f,   6.36e+01f,
+      4.77e+01f,   4.77e+01f,   4.77e+01f,   4.77e+01f,
+    },
+    {
+      8.39e+02f,   8.39e+02f,   8.39e+02f,   8.39e+02f,
+      1.97e+02f,   1.97e+02f,   1.97e+02f,   1.97e+02f,
+      5.77e+02f,   5.77e+02f,   5.77e+02f,   5.77e+02f,
+      4.02e+02f,   4.02e+02f,   4.02e+02f,   4.02e+02f,
+    }
+  },
+};
+
+double TEST_MULOP_DATA(double, sub)[][4][N] =
+{
+  {
+    {   1.69e+01 },
+    {
+      8.58e+02,   8.58e+02,   8.58e+02,   8.58e+02,
+      2.87e+02,   2.87e+02,   2.87e+02,   2.87e+02,
+      4.35e+02,   4.35e+02,   4.35e+02,   4.35e+02,
+     -6.35e+01,  -6.35e+01,  -6.35e+01,  -6.35e+01,
+    },
+    {
+      8.02e+01,   8.02e+01,   8.02e+01,   8.02e+01,
+      7.51e+01,   7.51e+01,   7.51e+01,   7.51e+01,
+      5.85e+01,   5.85e+01,   5.85e+01,   5.85e+01,
+      1.65e+01,   1.65e+01,   1.65e+01,   1.65e+01,
+    },
+    {
+      4.95e+02,   4.95e+02,   4.95e+02,   4.95e+02,
+      9.80e+02,   9.80e+02,   9.80e+02,   9.80e+02,
+      5.51e+02,   5.51e+02,   5.51e+02,   5.51e+02,
+      3.42e+02,   3.42e+02,   3.42e+02,   3.42e+02,
+    }
+  },
+  {
+    {   8.86e-10 },
+    {
+     -8.82e-09,  -8.82e-09,  -8.82e-09,  -8.82e-09,
+     -3.09e-09,  -3.09e-09,  -3.09e-09,  -3.09e-09,
+     -4.87e-09,  -4.87e-09,  -4.87e-09,  -4.87e-09,
+     -5.70e-09,  -5.70e-09,  -5.70e-09,  -5.70e-09,
+    },
+    {
+      9.72e-10,   9.72e-10,   9.72e-10,   9.72e-10,
+      5.78e-10,   5.78e-10,   5.78e-10,   5.78e-10,
+      1.10e-10,   1.10e-10,   1.10e-10,   1.10e-10,
+      4.62e-10,   4.62e-10,   4.62e-10,   4.62e-10,
+    },
+    {
+      8.82e-09,   8.82e-09,   8.82e-09,   8.82e-09,
+      3.09e-09,   3.09e-09,   3.09e-09,   3.09e-09,
+      4.87e-09,   4.87e-09,   4.87e-09,   4.87e-09,
+      5.70e-09,   5.70e-09,   5.70e-09,   5.70e-09,
+    }
+  },
+  {
+    {   1.09e-20 },
+    {
+     -5.46e-19,  -5.46e-19,  -5.46e-19,  -5.46e-19,
+     -2.28e-19,  -2.28e-19,  -2.28e-19,  -2.28e-19,
+     -4.77e-19,  -4.77e-19,  -4.77e-19,  -4.77e-19,
+     -1.76e-19,  -1.76e-19,  -1.76e-19,  -1.76e-19,
+    },
+    {
+      5.52e-20,   5.52e-20,   5.52e-20,   5.52e-20,
+      2.20e-20,   2.20e-20,   2.20e-20,   2.20e-20,
+      2.97e-20,   2.97e-20,   2.97e-20,   2.97e-20,
+      3.23e-20,   3.23e-20,   3.23e-20,   3.23e-20,
+    },
+    {
+      5.46e-19,   5.46e-19,   5.46e-19,   5.46e-19,
+      2.28e-19,   2.28e-19,   2.28e-19,   2.28e-19,
+      4.77e-19,   4.77e-19,   4.77e-19,   4.77e-19,
+      1.76e-19,   1.76e-19,   1.76e-19,   1.76e-19,
+    }
+  },
+};
+
+_Float16 TEST_MULOP_DATA(_Float16, nadd)[][4][N] =
+{
+  {
+    {       1.09f16 },
+    {
+         -60.7f16,      -60.7f16,      -60.7f16,      -60.7f16,
+         -25.2f16,      -25.2f16,      -25.2f16,      -25.2f16,
+         -50.9f16,      -50.9f16,      -50.9f16,      -50.9f16,
+         -21.1f16,      -21.1f16,      -21.1f16,      -21.1f16,
+    },
+    {
+          5.52f16,       5.52f16,       5.52f16,       5.52f16,
+           2.2f16,        2.2f16,        2.2f16,        2.2f16,
+          2.97f16,       2.97f16,       2.97f16,       2.97f16,
+          3.23f16,       3.23f16,       3.23f16,       3.23f16,
+    },
+    {
+          54.6f16,       54.6f16,       54.6f16,       54.6f16,
+          22.8f16,       22.8f16,       22.8f16,       22.8f16,
+          47.7f16,       47.7f16,       47.7f16,       47.7f16,
+          17.6f16,       17.6f16,       17.6f16,       17.6f16,
+    }
+  },
+  {
+    {      0.794f16 },
+    {
+          -6.8f16,       -6.8f16,       -6.8f16,       -6.8f16,
+          -6.1f16,       -6.1f16,       -6.1f16,       -6.1f16,
+         -3.02f16,      -3.02f16,      -3.02f16,      -3.02f16,
+         -3.15f16,      -3.15f16,      -3.15f16,      -3.15f16,
+    },
+    {
+         0.119f16,      0.119f16,      0.119f16,      0.119f16,
+         0.774f16,      0.774f16,      0.774f16,      0.774f16,
+         0.302f16,      0.302f16,      0.302f16,      0.302f16,
+         0.784f16,      0.784f16,      0.784f16,      0.784f16,
+    },
+    {
+           6.7f16,        6.7f16,        6.7f16,        6.7f16,
+          5.49f16,       5.49f16,       5.49f16,       5.49f16,
+          2.78f16,       2.78f16,       2.78f16,       2.78f16,
+          2.52f16,       2.52f16,       2.52f16,       2.52f16,
+    }
+  },
+  {
+    {      -2.62f16 },
+    {
+          48.6f16,       48.6f16,       48.6f16,       48.6f16,
+          28.1f16,       28.1f16,       28.1f16,       28.1f16,
+         -2.93f16,      -2.93f16,      -2.93f16,      -2.93f16,
+          80.6f16,       80.6f16,       80.6f16,       80.6f16,
+    },
+    {
+         -1.18f16,      -1.18f16,      -1.18f16,      -1.18f16,
+         -7.52f16,      -7.52f16,      -7.52f16,      -7.52f16,
+         -5.37f16,      -5.37f16,      -5.37f16,      -5.37f16,
+         -5.39f16,      -5.39f16,      -5.39f16,      -5.39f16,
+    },
+    {
+         -51.7f16,      -51.7f16,      -51.7f16,      -51.7f16,
+         -47.8f16,      -47.8f16,      -47.8f16,      -47.8f16,
+         -11.2f16,      -11.2f16,      -11.2f16,      -11.2f16,
+         -94.8f16,      -94.8f16,      -94.8f16,      -94.8f16,
+    }
+  },
+};
+
+float TEST_MULOP_DATA(float, nadd)[][4][N] =
+{
+  {
+    {       1.19f },
+    {
+         -21.4f,      -21.4f,      -21.4f,      -21.4f,
+         -9.12f,      -9.12f,      -9.12f,      -9.12f,
+         -51.1f,      -51.1f,      -51.1f,      -51.1f,
+         -48.8f,      -48.8f,      -48.8f,      -48.8f,
+    },
+    {
+          3.83f,       3.83f,       3.83f,       3.83f,
+           2.9f,        2.9f,        2.9f,        2.9f,
+          4.63f,       4.63f,       4.63f,       4.63f,
+          0.65f,       0.65f,       0.65f,       0.65f,
+    },
+    {
+          16.8f,       16.8f,       16.8f,       16.8f,
+          5.66f,       5.66f,       5.66f,       5.66f,
+          45.5f,       45.5f,       45.5f,       45.5f,
+          48.1f,       48.1f,       48.1f,       48.1f,
+    }
+  },
+  {
+    {   1.60e+01f },
+    {
+     -2.69e+02f,  -2.69e+02f,  -2.69e+02f,  -2.69e+02f,
+     -5.05e+02f,  -5.05e+02f,  -5.05e+02f,  -5.05e+02f,
+     -2.92e+02f,  -2.92e+02f,  -2.92e+02f,  -2.92e+02f,
+     -3.91e+02f,  -3.91e+02f,  -3.91e+02f,  -3.91e+02f,
+    },
+    {
+      6.28e+00f,   6.28e+00f,   6.28e+00f,   6.28e+00f,
+      1.94e+01f,   1.94e+01f,   1.94e+01f,   1.94e+01f,
+      1.02e+01f,   1.02e+01f,   1.02e+01f,   1.02e+01f,
+      1.60e+01f,   1.60e+01f,   1.60e+01f,   1.60e+01f,
+    },
+    {
+      1.68e+02f,   1.68e+02f,   1.68e+02f,   1.68e+02f,
+      1.95e+02f,   1.95e+02f,   1.95e+02f,   1.95e+02f,
+      1.30e+02f,   1.30e+02f,   1.30e+02f,   1.30e+02f,
+      1.35e+02f,   1.35e+02f,   1.35e+02f,   1.35e+02f,
+    }
+  },
+  {
+    {  -5.63e+01f },
+    {
+     -3.59e+03f,  -3.59e+03f,  -3.59e+03f,  -3.59e+03f,
+     -2.25e+02f,  -2.25e+02f,  -2.25e+02f,  -2.25e+02f,
+     -4.85e+03f,  -4.85e+03f,  -4.85e+03f,  -4.85e+03f,
+     -1.59e+03f,  -1.59e+03f,  -1.59e+03f,  -1.59e+03f,
+    },
+    {
+     -7.96e+01f,  -7.96e+01f,  -7.96e+01f,  -7.96e+01f,
+     -1.07e+01f,  -1.07e+01f,  -1.07e+01f,  -1.07e+01f,
+     -9.62e+01f,  -9.62e+01f,  -9.62e+01f,  -9.62e+01f,
+     -3.86e+01f,  -3.86e+01f,  -3.86e+01f,  -3.86e+01f,
+    },
+    {
+     -8.83e+02f,  -8.83e+02f,  -8.83e+02f,  -8.83e+02f,
+     -3.79e+02f,  -3.79e+02f,  -3.79e+02f,  -3.79e+02f,
+     -5.62e+02f,  -5.62e+02f,  -5.62e+02f,  -5.62e+02f,
+     -5.85e+02f,  -5.85e+02f,  -5.85e+02f,  -5.85e+02f,
+    }
+  },
+};
+
+double TEST_MULOP_DATA(double, nadd)[][4][N] =
+{
+  {
+    {   8.64e+20 },
+    {
+     -2.89e+41,  -2.89e+41,  -2.89e+41,  -2.89e+41,
+     -6.50e+41,  -6.50e+41,  -6.50e+41,  -6.50e+41,
+     -8.11e+41,  -8.11e+41,  -8.11e+41,  -8.11e+41,
+     -4.44e+41,  -4.44e+41,  -4.44e+41,  -4.44e+41,
+    },
+    {
+      2.61e+20,   2.61e+20,   2.61e+20,   2.61e+20,
+      4.25e+20,   4.25e+20,   4.25e+20,   4.25e+20,
+      5.77e+20,   5.77e+20,   5.77e+20,   5.77e+20,
+      3.74e+20,   3.74e+20,   3.74e+20,   3.74e+20,
+    },
+    {
+      6.38e+40,   6.38e+40,   6.38e+40,   6.38e+40,
+      2.83e+41,   2.83e+41,   2.83e+41,   2.83e+41,
+      3.13e+41,   3.13e+41,   3.13e+41,   3.13e+41,
+      1.21e+41,   1.21e+41,   1.21e+41,   1.21e+41,
+    }
+  },
+  {
+    {  -3.01e+40 },
+    {
+     -7.27e+81,  -7.27e+81,  -7.27e+81,  -7.27e+81,
+     -4.10e+81,  -4.10e+81,  -4.10e+81,  -4.10e+81,
+     -7.82e+81,  -7.82e+81,  -7.82e+81,  -7.82e+81,
+     -1.54e+81,  -1.54e+81,  -1.54e+81,  -1.54e+81,
+    },
+    {
+     -5.71e+40,  -5.71e+40,  -5.71e+40,  -5.71e+40,
+     -1.41e+40,  -1.41e+40,  -1.41e+40,  -1.41e+40,
+     -3.01e+40,  -3.01e+40,  -3.01e+40,  -3.01e+40,
+     -2.47e+40,  -2.47e+40,  -2.47e+40,  -2.47e+40,
+    },
+    {
+      5.55e+81,   5.55e+81,   5.55e+81,   5.55e+81,
+      3.67e+81,   3.67e+81,   3.67e+81,   3.67e+81,
+      6.92e+81,   6.92e+81,   6.92e+81,   6.92e+81,
+      7.96e+80,   7.96e+80,   7.96e+80,   7.96e+80,
+    }
+  },
+  {
+    {   3.65e-20 },
+    {
+     -4.11e-39,  -4.11e-39,  -4.11e-39,  -4.11e-39,
+     -8.48e-39,  -8.48e-39,  -8.48e-39,  -8.48e-39,
+     -8.93e-39,  -8.93e-39,  -8.93e-39,  -8.93e-39,
+     -2.74e-39,  -2.74e-39,  -2.74e-39,  -2.74e-39,
+    },
+    {
+      5.78e-20,   5.78e-20,   5.78e-20,   5.78e-20,
+      1.61e-20,   1.61e-20,   1.61e-20,   1.61e-20,
+      6.91e-20,   6.91e-20,   6.91e-20,   6.91e-20,
+      6.18e-20,   6.18e-20,   6.18e-20,   6.18e-20,
+    },
+    {
+      2.00e-39,   2.00e-39,   2.00e-39,   2.00e-39,
+      7.89e-39,   7.89e-39,   7.89e-39,   7.89e-39,
+      6.41e-39,   6.41e-39,   6.41e-39,   6.41e-39,
+      4.87e-40,   4.87e-40,   4.87e-40,   4.87e-40,
+    }
+  },
+};
+
+_Float16 TEST_MULOP_DATA(_Float16, nsub)[][4][N] =
 {
   {
     {      0.676f16 },
@@ -275,7 +677,7 @@ _Float16 TEST_MULOP_DATA(_Float16, sub)[][4][N] =
   },
 };
 
-float TEST_MULOP_DATA(float, sub)[][4][N] =
+float TEST_MULOP_DATA(float, nsub)[][4][N] =
 {
   {
   {8.51f },
@@ -342,7 +744,7 @@ float TEST_MULOP_DATA(float, sub)[][4][N] =
   },
 };
 
-double TEST_MULOP_DATA(double, sub)[][4][N] =
+double TEST_MULOP_DATA(double, nsub)[][4][N] =
 {
   {
     { 80.54 },
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
index bc6f483deed..579f841e6a7 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
@@ -13,12 +13,12 @@ main ()
 
   for (i = 0; i < sizeof (TEST_DATA) / sizeof (TEST_DATA[0]); i++)
     {
-      T x = TEST_DATA[i][0][0];
+      T f = TEST_DATA[i][0][0];
       T *in = TEST_DATA[i][1];
       T *out = TEST_DATA[i][2];
       T *expect = TEST_DATA[i][3];
 
-      TEST_RUN (T, NAME, out, in, x, N);
+      TEST_RUN (T, NAME, out, in, f, N);
 
       for (k = 0; k < N; k++)
 	{
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
index 1bcf9e075fe..9ec5303df4f 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
@@ -7,7 +7,7 @@
 #define T    _Float16
 #define NAME add
 
-DEF_VF_MULOP_CASE_0_WRAP(T, +, NAME)
+DEF_VF_MULOP_CASE_0_WRAP (T, +, +, NAME)
 
 #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
 #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
index 199b9adc738..222efeceb47 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
@@ -7,7 +7,7 @@
 #define T    float
 #define NAME add
 
-DEF_VF_MULOP_CASE_0_WRAP(T, +, NAME)
+DEF_VF_MULOP_CASE_0_WRAP (T, +, +, NAME)
 
 #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
 #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
index 3857f586cc9..300d5205d79 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
@@ -7,7 +7,7 @@
 #define T    double
 #define NAME add
 
-DEF_VF_MULOP_CASE_0_WRAP(T, +, NAME)
+DEF_VF_MULOP_CASE_0_WRAP (T, +, +, NAME)
 
 #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
 #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
index 671c7d83d9c..d11d446f515 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
@@ -7,7 +7,7 @@
 #define T    _Float16
 #define NAME sub
 
-DEF_VF_MULOP_CASE_0_WRAP(T, -, NAME)
+DEF_VF_MULOP_CASE_0_WRAP (T, -, +, NAME)
 
 #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
 #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
index f89696373c3..500e1b25a73 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
@@ -7,7 +7,7 @@
 #define T    float
 #define NAME sub
 
-DEF_VF_MULOP_CASE_0_WRAP(T, -, NAME)
+DEF_VF_MULOP_CASE_0_WRAP (T, -, +, NAME)
 
 #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
 #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c
index b42ab1eff7d..a2c32943ae7 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c
@@ -7,7 +7,7 @@
 #define T    double
 #define NAME sub
 
-DEF_VF_MULOP_CASE_0_WRAP(T, -, NAME)
+DEF_VF_MULOP_CASE_0_WRAP (T, -, +, NAME)
 
 #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
 #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c
new file mode 100644
index 00000000000..a45e1f854fd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    _Float16
+#define NAME nadd
+
+DEF_VF_MULOP_CASE_0_WRAP(T, +, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c
new file mode 100644
index 00000000000..b8a7bc4fee5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    float
+#define NAME nadd
+
+DEF_VF_MULOP_CASE_0_WRAP (T, +, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c
new file mode 100644
index 00000000000..32664e1fb0e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    double
+#define NAME nadd
+
+DEF_VF_MULOP_CASE_0_WRAP (T, +, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c
new file mode 100644
index 00000000000..a1b0034e620
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    _Float16
+#define NAME nsub
+
+DEF_VF_MULOP_CASE_0_WRAP (T, -, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c
new file mode 100644
index 00000000000..6450573484f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    float
+#define NAME nsub
+
+DEF_VF_MULOP_CASE_0_WRAP (T, -, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+
+#include "vf_mulop_run.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c
new file mode 100644
index 00000000000..eb3ca1c6aca
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c
@@ -0,0 +1,15 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_mulop.h"
+#include "vf_mulop_data.h"
+
+#define T    double
+#define NAME nsub
+
+DEF_VF_MULOP_CASE_0_WRAP (T, -, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+
+#include "vf_mulop_run.h"
-- 
2.49.0

Reply via email to