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
  vfnmacc.vv      v2,v6,v4

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

        PR target/119100

gcc/ChangeLog:

        * config/riscv/autovec-opt.md (*vfnmsub_<mode>,*vfnmadd_<mode>): Handle
        both add and acc variants.
        * config/riscv/vector.md (*pred_mul_neg_<optab><mode>_scalar_undef): New
        pattern.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c: Add vfnmacc and
        vfnmsac.
        * 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 (DEF_VF_MULOP_CASE_1):
        Fix return type.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f16.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f32.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f64.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f16.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f32.c: New test.
        * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f64.c: New test.
---
 gcc/config/riscv/autovec-opt.md               | 30 ++++++++-------
 gcc/config/riscv/vector.md                    | 38 ++++++++++++++++++-
 .../riscv/rvv/autovec/vx_vf/vf-1-f16.c        |  4 ++
 .../riscv/rvv/autovec/vx_vf/vf-1-f32.c        |  4 ++
 .../riscv/rvv/autovec/vx_vf/vf-1-f64.c        |  4 ++
 .../riscv/rvv/autovec/vx_vf/vf-2-f16.c        |  2 +
 .../riscv/rvv/autovec/vx_vf/vf-2-f32.c        |  2 +
 .../riscv/rvv/autovec/vx_vf/vf-2-f64.c        |  2 +
 .../riscv/rvv/autovec/vx_vf/vf-3-f16.c        |  4 ++
 .../riscv/rvv/autovec/vx_vf/vf-3-f32.c        |  4 ++
 .../riscv/rvv/autovec/vx_vf/vf-3-f64.c        |  4 ++
 .../riscv/rvv/autovec/vx_vf/vf-4-f16.c        |  2 +
 .../riscv/rvv/autovec/vx_vf/vf-4-f32.c        |  2 +
 .../riscv/rvv/autovec/vx_vf/vf-4-f64.c        |  2 +
 .../riscv/rvv/autovec/vx_vf/vf_mulop.h        |  5 ++-
 .../rvv/autovec/vx_vf/vf_vfnmacc-run-1-f16.c  | 16 ++++++++
 .../rvv/autovec/vx_vf/vf_vfnmacc-run-1-f32.c  | 16 ++++++++
 .../rvv/autovec/vx_vf/vf_vfnmacc-run-1-f64.c  | 16 ++++++++
 .../rvv/autovec/vx_vf/vf_vfnmsac-run-1-f16.c  | 16 ++++++++
 .../rvv/autovec/vx_vf/vf_vfnmsac-run-1-f32.c  | 16 ++++++++
 .../rvv/autovec/vx_vf/vf_vfnmsac-run-1-f64.c  | 16 ++++++++
 21 files changed, 187 insertions(+), 18 deletions(-)
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f16.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f32.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f64.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f16.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f32.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f64.c

diff --git gcc/config/riscv/autovec-opt.md gcc/config/riscv/autovec-opt.md
index bb15d14b4..8df7f6494 100644
--- gcc/config/riscv/autovec-opt.md
+++ gcc/config/riscv/autovec-opt.md
@@ -1723,6 +1723,8 @@ (define_insn_and_split "*<optab>_vx_<mode>"
 ;; - vfnmsub.vf
 ;; - vfmacc.vf
 ;; - vfmsac.vf
+;; - vfnmacc.vf
+;; - vfnmsac.vf
 ;; 
=============================================================================
 
 ;; vfmadd.vf, vfmsub.vf, vfmacc.vf, vfmsac.vf
@@ -1748,22 +1750,22 @@ (define_insn_and_split "*<optab>_vf_<mode>"
   [(set_attr "type" "vfmuladd")]
 )
 
-;; vfnmsub.vf
+;; vfnmsub.vf, vfnmsac.vf
 (define_insn_and_split "*vfnmsub_<mode>"
-  [(set (match_operand:V_VLSF 0 "register_operand"             "=vd")
+  [(set (match_operand:V_VLSF 0 "register_operand")
     (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"))))]
+      (match_operand:V_VLSF 3 "register_operand")
+      (mult:V_VLSF
+       (vec_duplicate:V_VLSF
+         (match_operand:<VEL> 1 "register_operand"))
+       (match_operand:V_VLSF 2 "register_operand"))))]
   "TARGET_VECTOR && can_create_pseudo_p ()"
   "#"
   "&& 1"
   [(const_int 0)]
   {
     rtx ops[] = {operands[0], operands[1], operands[2], operands[3],
-                operands[2]};
+                RVV_VUNDEF(<MODE>mode)};
     riscv_vector::emit_vlmax_insn (code_for_pred_mul_neg_scalar (PLUS, 
<MODE>mode),
                                   riscv_vector::TERNARY_OP_FRM_DYN, ops);
     DONE;
@@ -1771,23 +1773,23 @@ (define_insn_and_split "*vfnmsub_<mode>"
   [(set_attr "type" "vfmuladd")]
 )
 
-;; vfnmadd.vf
+;; vfnmadd.vf, vfnmacc.vf
 (define_insn_and_split "*vfnmadd_<mode>"
-  [(set (match_operand:V_VLSF 0 "register_operand"     "=vd")
+  [(set (match_operand:V_VLSF 0 "register_operand")
     (minus:V_VLSF
       (mult:V_VLSF
        (neg:V_VLSF
-         (match_operand:V_VLSF 2 "register_operand"    "  0"))
+         (match_operand:V_VLSF 2 "register_operand"))
        (vec_duplicate:V_VLSF
-         (match_operand:<VEL> 1 "register_operand"     "  f")))
-      (match_operand:V_VLSF 3 "register_operand"       " vr")))]
+         (match_operand:<VEL> 1 "register_operand")))
+      (match_operand:V_VLSF 3 "register_operand")))]
   "TARGET_VECTOR && can_create_pseudo_p ()"
   "#"
   "&& 1"
   [(const_int 0)]
   {
     rtx ops[] = {operands[0], operands[1], operands[2], operands[3],
-                operands[2]};
+                RVV_VUNDEF(<MODE>mode)};
     riscv_vector::emit_vlmax_insn (code_for_pred_mul_neg_scalar (MINUS, 
<MODE>mode),
                                   riscv_vector::TERNARY_OP_FRM_DYN, ops);
     DONE;
diff --git gcc/config/riscv/vector.md gcc/config/riscv/vector.md
index aaea11533..6753b01db 100644
--- gcc/config/riscv/vector.md
+++ gcc/config/riscv/vector.md
@@ -6848,9 +6848,43 @@ (define_expand "@pred_mul_neg_<optab><mode>_scalar"
                  (match_operand:<VEL> 2 "register_operand"))
                (match_operand:V_VLSF 3 "register_operand")))
            (match_operand:V_VLSF 4 "register_operand"))
-         (match_operand:V_VLSF 5 "register_operand")))]
+         (match_operand:V_VLSF 5 "vector_merge_operand")))]
   "TARGET_VECTOR"
-{})
+{
+  riscv_vector::prepare_ternary_operands (operands);
+})
+
+(define_insn "*pred_mul_neg_<optab><mode>_scalar_undef"
+  [(set (match_operand:V_VLSF 0 "register_operand"           "=vd,vd, vr, vr")
+       (if_then_else:V_VLSF
+         (unspec:<VM>
+           [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,Wc1")
+            (match_operand 6 "vector_length_operand"    "rvl,rvl,rvl,rvl")
+            (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 10 "const_int_operand"       "  i,  i,  i,  i")
+            (reg:SI VL_REGNUM)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
+         (plus_minus:V_VLSF
+           (neg:V_VLSF
+             (mult:V_VLSF
+               (vec_duplicate:V_VLSF
+                 (match_operand:<VEL> 3 "register_operand"  "  f,  f,  f,  f"))
+               (match_operand:V_VLSF 4 "register_operand"   "  0, vr,  0, 
vr")))
+           (match_operand:V_VLSF 5 "register_operand"       " vr,  0, vr,  0"))
+         (match_operand:V_VLSF 2 "vector_undef_operand")))]
+  "TARGET_VECTOR"
+  "@
+   vf<nmsub_nmadd>.vf\t%0,%3,%5%p1
+   vf<nmsac_nmacc>.vf\t%0,%3,%4%p1
+   vf<nmsub_nmadd>.vf\t%0,%3,%5%p1
+   vf<nmsac_nmacc>.vf\t%0,%3,%4%p1"
+  [(set_attr "type" "vfmuladd")
+   (set_attr "mode" "<MODE>")
+   (set (attr "frm_mode")
+       (symbol_ref "riscv_vector::get_frm_mode (operands[10])"))])
 
 (define_insn "*pred_<nmsub_nmadd><mode>_scalar"
   [(set (match_operand:V_VLSF 0 "register_operand"            "=vd, vr")
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
index 10ee2d825..05cf57cc8 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
@@ -9,6 +9,8 @@ DEF_VF_MULOP_CASE_0 (_Float16, +, -, nadd)
 DEF_VF_MULOP_CASE_0 (_Float16, -, -, nsub)
 DEF_VF_MULOP_ACC_CASE_0 (_Float16, +, +, acc)
 DEF_VF_MULOP_ACC_CASE_0 (_Float16, -, +, sac)
+DEF_VF_MULOP_ACC_CASE_0 (_Float16, +, -, nacc)
+DEF_VF_MULOP_ACC_CASE_0 (_Float16, -, -, nsac)
 
 /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
@@ -16,3 +18,5 @@ DEF_VF_MULOP_ACC_CASE_0 (_Float16, -, +, sac)
 /* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmacc.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsac.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmacc.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmsac.vf} 1 } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
index 3492c7f1f..873e31513 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
@@ -9,6 +9,8 @@ DEF_VF_MULOP_CASE_0 (float, +, -, nadd)
 DEF_VF_MULOP_CASE_0 (float, -, -, nsub)
 DEF_VF_MULOP_ACC_CASE_0 (float, +, +, acc)
 DEF_VF_MULOP_ACC_CASE_0 (float, -, +, sac)
+DEF_VF_MULOP_ACC_CASE_0 (float, +, -, nacc)
+DEF_VF_MULOP_ACC_CASE_0 (float, -, -, nsac)
 
 /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
@@ -16,3 +18,5 @@ DEF_VF_MULOP_ACC_CASE_0 (float, -, +, sac)
 /* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmacc.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsac.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmacc.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmsac.vf} 1 } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
index 3ee2fbb9c..4de038c62 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
@@ -9,6 +9,8 @@ DEF_VF_MULOP_CASE_0 (double, +, -, nadd)
 DEF_VF_MULOP_CASE_0 (double, -, -, nsub)
 DEF_VF_MULOP_ACC_CASE_0 (double, +, +, acc)
 DEF_VF_MULOP_ACC_CASE_0 (double, -, +, sac)
+DEF_VF_MULOP_ACC_CASE_0 (double, +, -, nacc)
+DEF_VF_MULOP_ACC_CASE_0 (double, -, -, nsac)
 
 /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
@@ -16,3 +18,5 @@ DEF_VF_MULOP_ACC_CASE_0 (double, -, +, sac)
 /* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmacc.vf} 1 } } */
 /* { dg-final { scan-assembler-times {vfmsac.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmacc.vf} 1 } } */
+/* { dg-final { scan-assembler-times {vfnmsac.vf} 1 } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
index 1e4b80642..78127b6da 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
@@ -9,3 +9,5 @@
 /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
index 48d87c4a6..30d57e0c7 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
@@ -9,3 +9,5 @@
 /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
index ad7beab26..a2ac67e4a 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
@@ -9,3 +9,5 @@
 /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
index 47f7cd179..8295ffb7d 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
@@ -9,6 +9,8 @@ DEF_VF_MULOP_CASE_1 (_Float16, +, -, nadd, VF_MULOP_BODY_X16)
 DEF_VF_MULOP_CASE_1 (_Float16, -, -, nsub, VF_MULOP_BODY_X16)
 DEF_VF_MULOP_ACC_CASE_1 (_Float16, +, +, acc, VF_MULOP_ACC_BODY_X128)
 DEF_VF_MULOP_ACC_CASE_1 (_Float16, -, +, sac, VF_MULOP_ACC_BODY_X128)
+DEF_VF_MULOP_ACC_CASE_1 (_Float16, +, -, nacc, VF_MULOP_ACC_BODY_X128)
+DEF_VF_MULOP_ACC_CASE_1 (_Float16, -, -, nsac, VF_MULOP_ACC_BODY_X128)
 
 /* { dg-final { scan-assembler {vfmadd.vf} } } */
 /* { dg-final { scan-assembler {vfmsub.vf} } } */
@@ -16,3 +18,5 @@ DEF_VF_MULOP_ACC_CASE_1 (_Float16, -, +, sac, 
VF_MULOP_ACC_BODY_X128)
 /* { dg-final { scan-assembler {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler {vfmacc.vf} } } */
 /* { dg-final { scan-assembler {vfmsac.vf} } } */
+/* { dg-final { scan-assembler {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
index 5877dec8b..f237f848d 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
@@ -9,6 +9,8 @@ DEF_VF_MULOP_CASE_1 (float, +, -, nadd, VF_MULOP_BODY_X16)
 DEF_VF_MULOP_CASE_1 (float, -, -, nsub, VF_MULOP_BODY_X16)
 DEF_VF_MULOP_ACC_CASE_1 (float, +, +, acc, VF_MULOP_ACC_BODY_X128)
 DEF_VF_MULOP_ACC_CASE_1 (float, -, +, sac, VF_MULOP_ACC_BODY_X128)
+DEF_VF_MULOP_ACC_CASE_1 (float, +, -, nacc, VF_MULOP_ACC_BODY_X128)
+DEF_VF_MULOP_ACC_CASE_1 (float, -, -, nsac, VF_MULOP_ACC_BODY_X128)
 
 /* { dg-final { scan-assembler {vfmadd.vf} } } */
 /* { dg-final { scan-assembler {vfmsub.vf} } } */
@@ -16,3 +18,5 @@ DEF_VF_MULOP_ACC_CASE_1 (float, -, +, sac, 
VF_MULOP_ACC_BODY_X128)
 /* { dg-final { scan-assembler {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler {vfmacc.vf} } } */
 /* { dg-final { scan-assembler {vfmsac.vf} } } */
+/* { dg-final { scan-assembler {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
index 7073502e0..71bd7e1b9 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
@@ -9,6 +9,8 @@ DEF_VF_MULOP_CASE_1 (double, +, -, nadd, VF_MULOP_BODY_X16)
 DEF_VF_MULOP_CASE_1 (double, -, -, nsub, VF_MULOP_BODY_X16)
 DEF_VF_MULOP_ACC_CASE_1 (double, +, +, acc, VF_MULOP_ACC_BODY_X128)
 DEF_VF_MULOP_ACC_CASE_1 (double, -, +, sac, VF_MULOP_ACC_BODY_X128)
+DEF_VF_MULOP_ACC_CASE_1 (double, +, -, nacc, VF_MULOP_ACC_BODY_X128)
+DEF_VF_MULOP_ACC_CASE_1 (double, -, -, nsac, VF_MULOP_ACC_BODY_X128)
 
 /* { dg-final { scan-assembler {vfmadd.vf} } } */
 /* { dg-final { scan-assembler {vfmsub.vf} } } */
@@ -16,3 +18,5 @@ DEF_VF_MULOP_ACC_CASE_1 (double, -, +, sac, 
VF_MULOP_ACC_BODY_X128)
 /* { dg-final { scan-assembler {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler {vfmacc.vf} } } */
 /* { dg-final { scan-assembler {vfmsac.vf} } } */
+/* { dg-final { scan-assembler {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
index dc7f252ce..7a50f6743 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
@@ -9,3 +9,5 @@
 /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
index c62711fb4..fb0493ea7 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
@@ -9,3 +9,5 @@
 /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
index d0c82cf41..d71bdde26 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
@@ -9,3 +9,5 @@
 /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
 /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
 /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmacc.vf} } } */
+/* { dg-final { scan-assembler-not {vfnmsac.vf} } } */
diff --git gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
index 98fa8fa42..1659f78be 100644
--- gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
@@ -113,8 +113,9 @@
   VF_MULOP_ACC_BODY_X128 (op, neg)
 
 #define DEF_VF_MULOP_ACC_CASE_1(T, OP, NEG, NAME, BODY)                        
\
-  T test_vf_mulop_acc_##NAME##_##T##_case_1 (T *restrict out, T *restrict in,  
\
-                                            T x, unsigned n)                  \
+  void test_vf_mulop_acc_##NAME##_##T##_case_1 (T *restrict out,               
\
+                                               T *restrict in, T x,           \
+                                               unsigned n)                    \
   {                                                                            
\
     unsigned k = 0;                                                            
\
     T tmp = x + 3;                                                             
\
diff --git 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f16.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f16.c
new file mode 100644
index 000000000..b960e7aee
--- /dev/null
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f16.c
@@ -0,0 +1,16 @@
+/* { 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_ACC_CASE_0_WRAP (T, +, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, 
c, x, n)
+#define TEST_OUT b
+
+#include "vf_mulop_run.h"
diff --git 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f32.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f32.c
new file mode 100644
index 000000000..b97cdc226
--- /dev/null
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f32.c
@@ -0,0 +1,16 @@
+/* { 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_ACC_CASE_0_WRAP (T, +, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, 
c, x, n)
+#define TEST_OUT b
+
+#include "vf_mulop_run.h"
diff --git 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f64.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f64.c
new file mode 100644
index 000000000..8da279f18
--- /dev/null
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmacc-run-1-f64.c
@@ -0,0 +1,16 @@
+/* { 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_ACC_CASE_0_WRAP (T, +, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, 
c, x, n)
+#define TEST_OUT b
+
+#include "vf_mulop_run.h"
diff --git 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f16.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f16.c
new file mode 100644
index 000000000..4f10600ec
--- /dev/null
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f16.c
@@ -0,0 +1,16 @@
+/* { 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_ACC_CASE_0_WRAP (T, -, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, 
c, x, n)
+#define TEST_OUT b
+
+#include "vf_mulop_run.h"
diff --git 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f32.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f32.c
new file mode 100644
index 000000000..be1084afa
--- /dev/null
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f32.c
@@ -0,0 +1,16 @@
+/* { 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_ACC_CASE_0_WRAP (T, -, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, 
c, x, n)
+#define TEST_OUT b
+
+#include "vf_mulop_run.h"
diff --git 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f64.c 
gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f64.c
new file mode 100644
index 000000000..73b5a6e87
--- /dev/null
+++ gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsac-run-1-f64.c
@@ -0,0 +1,16 @@
+/* { 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_ACC_CASE_0_WRAP (T, -, -, NAME)
+
+#define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+#define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, 
c, x, n)
+#define TEST_OUT b
+
+#include "vf_mulop_run.h"
-- 
2.39.5

Reply via email to