diff options
author | Paul-Antoine Arras <parras@baylibre.com> | 2025-09-05 16:37:17 +0200 |
---|---|---|
committer | Paul-Antoine Arras <parras@baylibre.com> | 2025-09-08 12:26:10 +0200 |
commit | c2048dae34104a9e172eec6747ab59f4404fba2f (patch) | |
tree | cb1cf18b0ae66a3c01c1a2764aa9a920c73bc0e5 | |
parent | 1f01c51abff55301149f1057aaf0e7d7784bd6cc (diff) | |
download | gcc-c2048dae34104a9e172eec6747ab59f4404fba2f.zip gcc-c2048dae34104a9e172eec6747ab59f4404fba2f.tar.gz gcc-c2048dae34104a9e172eec6747ab59f4404fba2f.tar.bz2 |
RISC-V: Add pattern for vector-scalar single-width floating-point reverse sub
This pattern enables the combine pass (or late-combine, depending on the case)
to merge a vec_duplicate into a minus RTL instruction. The vec_duplicate is the
minuend operand.
Before this patch, we have two instructions, e.g.:
vfmv.v.f v2,fa0
vfsub.vv v1,v2,v1
After, we get only one:
vfrsub.vf v1,v1,fa0
gcc/ChangeLog:
* config/riscv/autovec-opt.md (*vfrsub_vf_<mode>): New pattern to
combine vec_duplicate + vfsub.vv into vfrsub.vf.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c: Add vfrsub.
* 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_binop_data.h: Add data for
vfrsub.
* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f16.c: New test.
* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f32.c: New test.
* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f64.c: New test.
17 files changed, 234 insertions, 0 deletions
diff --git a/gcc/config/riscv/autovec-opt.md b/gcc/config/riscv/autovec-opt.md index f4d13ca..1c1cf76 100644 --- a/gcc/config/riscv/autovec-opt.md +++ b/gcc/config/riscv/autovec-opt.md @@ -2207,3 +2207,23 @@ } [(set_attr "type" "vfalu")] ) + +;; vfrsub.vf +(define_insn_and_split "*vfrsub_vf_<mode>" + [(set (match_operand:V_VLSF 0 "register_operand") + (minus:V_VLSF + (vec_duplicate:V_VLSF + (match_operand:<VEL> 2 "register_operand")) + (match_operand:V_VLSF 1 "register_operand")))] + "TARGET_VECTOR && can_create_pseudo_p ()" + "#" + "&& 1" + [(const_int 0)] + { + riscv_vector::emit_vlmax_insn (code_for_pred_reverse_scalar (MINUS, + <MODE>mode), + riscv_vector::BINARY_OP_FRM_DYN, operands); + DONE; + } + [(set_attr "type" "vfalu")] +) 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 002d091..5396993 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 @@ -20,6 +20,7 @@ DEF_VF_BINOP_CASE_0 (_Float16, *, mul) DEF_VF_BINOP_CASE_0 (_Float16, +, add) DEF_VF_BINOP_CASE_0 (_Float16, -, sub) DEF_VF_BINOP_REVERSE_CASE_0 (_Float16, /, rdiv) +DEF_VF_BINOP_REVERSE_CASE_0 (_Float16, -, rsub) DEF_VF_BINOP_CASE_2_WRAP (_Float16, MIN_FUNC_0_WRAP (_Float16), min) DEF_VF_BINOP_CASE_2_WRAP (_Float16, MIN_FUNC_1_WRAP (_Float16), min) DEF_VF_BINOP_CASE_2_WRAP (_Float16, MAX_FUNC_0_WRAP (_Float16), max) @@ -42,6 +43,7 @@ DEF_VF_BINOP_WIDEN_CASE_0 (_Float16, float, *, mul) /* { dg-final { scan-assembler-times {vfadd.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfsub.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfrdiv.vf} 1 } } */ +/* { dg-final { scan-assembler-times {vfrsub.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfmin.vf} 2 } } */ /* { dg-final { scan-assembler-times {vfmax.vf} 2 } } */ /* { dg-final { scan-assembler-times {vfwmul.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 c8b323b..9756184 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 @@ -20,6 +20,7 @@ DEF_VF_BINOP_CASE_0 (float, *, mul) DEF_VF_BINOP_CASE_0 (float, +, add) DEF_VF_BINOP_CASE_0 (float, -, sub) DEF_VF_BINOP_REVERSE_CASE_0 (float, /, rdiv) +DEF_VF_BINOP_REVERSE_CASE_0 (float, -, rsub) DEF_VF_BINOP_CASE_2_WRAP (float, MIN_FUNC_0_WRAP (float), min) DEF_VF_BINOP_CASE_2_WRAP (float, MIN_FUNC_1_WRAP (float), min) DEF_VF_BINOP_CASE_2_WRAP (float, MAX_FUNC_0_WRAP (float), max) @@ -42,6 +43,7 @@ DEF_VF_BINOP_WIDEN_CASE_0 (float, double, *, mul) /* { dg-final { scan-assembler-times {vfadd.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfsub.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfrdiv.vf} 1 } } */ +/* { dg-final { scan-assembler-times {vfrsub.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfmin.vf} 2 } } */ /* { dg-final { scan-assembler-times {vfmax.vf} 2 } } */ /* { dg-final { scan-assembler-times {vfwmul.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 0d04b92..12e3216 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 @@ -16,6 +16,7 @@ DEF_VF_BINOP_CASE_0 (double, *, mul) DEF_VF_BINOP_CASE_0 (double, +, add) DEF_VF_BINOP_CASE_0 (double, -, sub) DEF_VF_BINOP_REVERSE_CASE_0 (double, /, rdiv) +DEF_VF_BINOP_REVERSE_CASE_0 (double, -, rsub) DEF_VF_BINOP_CASE_2_WRAP (double, MIN_FUNC_0_WRAP (double), min) DEF_VF_BINOP_CASE_2_WRAP (double, MIN_FUNC_1_WRAP (double), min) DEF_VF_BINOP_CASE_2_WRAP (double, MAX_FUNC_0_WRAP (double), max) @@ -33,5 +34,6 @@ DEF_VF_BINOP_CASE_2_WRAP (double, MAX_FUNC_1_WRAP (double), max) /* { dg-final { scan-assembler-times {vfadd.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfsub.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfrdiv.vf} 1 } } */ +/* { dg-final { scan-assembler-times {vfrsub.vf} 1 } } */ /* { dg-final { scan-assembler-times {vfmin.vf} 2 } } */ /* { dg-final { scan-assembler-times {vfmax.vf} 2 } } */ 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 05361d81..1712076 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 @@ -19,6 +19,7 @@ /* { dg-final { scan-assembler-not {vfadd.vf} } } */ /* { dg-final { scan-assembler-not {vfsub.vf} } } */ /* { dg-final { scan-assembler-not {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler-not {vfrsub.vf} } } */ /* { dg-final { scan-assembler-not {vfmin.vf} } } */ /* { dg-final { scan-assembler-not {vfmax.vf} } } */ /* { dg-final { scan-assembler-not {vfwmul.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 085d872..2938bfb 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 @@ -19,6 +19,7 @@ /* { dg-final { scan-assembler-not {vfadd.vf} } } */ /* { dg-final { scan-assembler-not {vfsub.vf} } } */ /* { dg-final { scan-assembler-not {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler-not {vfrsub.vf} } } */ /* { dg-final { scan-assembler-not {vfmin.vf} } } */ /* { dg-final { scan-assembler-not {vfmax.vf} } } */ /* { dg-final { scan-assembler-not {vfwmul.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 49ad386..b770c45 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 @@ -15,5 +15,6 @@ /* { dg-final { scan-assembler-not {vfadd.vf} } } */ /* { dg-final { scan-assembler-not {vfsub.vf} } } */ /* { dg-final { scan-assembler-not {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler-not {vfrsub.vf} } } */ /* { dg-final { scan-assembler-not {vfmin.vf} } } */ /* { dg-final { scan-assembler-not {vfmax.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 e1d7730..54db980 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 @@ -20,6 +20,7 @@ DEF_VF_BINOP_CASE_1 (_Float16, *, mul, VF_BINOP_BODY_X128) DEF_VF_BINOP_CASE_1 (_Float16, +, add, VF_BINOP_BODY_X128) DEF_VF_BINOP_CASE_1 (_Float16, -, sub, VF_BINOP_BODY_X128) DEF_VF_BINOP_REVERSE_CASE_1 (_Float16, /, rdiv, VF_BINOP_REVERSE_BODY_X128) +DEF_VF_BINOP_REVERSE_CASE_1 (_Float16, -, rsub, VF_BINOP_REVERSE_BODY_X128) DEF_VF_BINOP_CASE_3_WRAP (_Float16, MIN_FUNC_0_WRAP (_Float16), min, VF_BINOP_FUNC_BODY_X128) DEF_VF_BINOP_CASE_3_WRAP (_Float16, MIN_FUNC_1_WRAP (_Float16), min, @@ -46,6 +47,7 @@ DEF_VF_BINOP_WIDEN_CASE_1 (_Float16, float, *, mul) /* { dg-final { scan-assembler {vfadd.vf} } } */ /* { dg-final { scan-assembler {vfsub.vf} } } */ /* { dg-final { scan-assembler {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler {vfrsub.vf} } } */ /* { dg-final { scan-assembler {vfmin.vf} } } */ /* { dg-final { scan-assembler {vfmax.vf} } } */ /* { dg-final { scan-assembler {vfwmul.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 bef9a2d..97791cd 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 @@ -20,6 +20,7 @@ DEF_VF_BINOP_CASE_1 (float, *, mul, VF_BINOP_BODY_X128) DEF_VF_BINOP_CASE_1 (float, +, add, VF_BINOP_BODY_X128) DEF_VF_BINOP_CASE_1 (float, -, sub, VF_BINOP_BODY_X128) DEF_VF_BINOP_REVERSE_CASE_1 (float, /, rdiv, VF_BINOP_REVERSE_BODY_X128) +DEF_VF_BINOP_REVERSE_CASE_1 (float, -, rsub, VF_BINOP_REVERSE_BODY_X128) DEF_VF_BINOP_CASE_3_WRAP (float, MIN_FUNC_0_WRAP (float), min, VF_BINOP_FUNC_BODY_X128) DEF_VF_BINOP_CASE_3_WRAP (float, MIN_FUNC_1_WRAP (float), min, @@ -46,6 +47,7 @@ DEF_VF_BINOP_WIDEN_CASE_1 (float, double, *, mul) /* { dg-final { scan-assembler {vfadd.vf} } } */ /* { dg-final { scan-assembler {vfsub.vf} } } */ /* { dg-final { scan-assembler {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler {vfrsub.vf} } } */ /* { dg-final { scan-assembler {vfmin.vf} } } */ /* { dg-final { scan-assembler {vfmax.vf} } } */ /* { dg-final { scan-assembler {vfwmul.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 861da77..7199444 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 @@ -16,6 +16,7 @@ DEF_VF_BINOP_CASE_1 (double, *, mul, VF_BINOP_BODY_X128) DEF_VF_BINOP_CASE_1 (double, +, add, VF_BINOP_BODY_X128) DEF_VF_BINOP_CASE_1 (double, -, sub, VF_BINOP_BODY_X128) DEF_VF_BINOP_REVERSE_CASE_1 (double, /, rdiv, VF_BINOP_REVERSE_BODY_X128) +DEF_VF_BINOP_REVERSE_CASE_1 (double, -, rsub, VF_BINOP_REVERSE_BODY_X128) DEF_VF_BINOP_CASE_3_WRAP (double, MIN_FUNC_0_WRAP (double), min, VF_BINOP_FUNC_BODY_X128) DEF_VF_BINOP_CASE_3_WRAP (double, MIN_FUNC_1_WRAP (double), min, @@ -37,5 +38,6 @@ DEF_VF_BINOP_CASE_3_WRAP (double, MAX_FUNC_1_WRAP (double), max, /* { dg-final { scan-assembler {vfadd.vf} } } */ /* { dg-final { scan-assembler {vfsub.vf} } } */ /* { dg-final { scan-assembler {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler {vfrsub.vf} } } */ /* { dg-final { scan-assembler {vfmin.vf} } } */ /* { dg-final { scan-assembler {vfmax.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 19456dc..b5c9414 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 @@ -19,6 +19,7 @@ /* { dg-final { scan-assembler-not {vfadd.vf} } } */ /* { dg-final { scan-assembler-not {vfsub.vf} } } */ /* { dg-final { scan-assembler-not {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler-not {vfrsub.vf} } } */ /* { dg-final { scan-assembler-not {vfmin.vf} } } */ /* { dg-final { scan-assembler-not {vfmax.vf} } } */ /* { dg-final { scan-assembler-not {vfwmul.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 9c3a59f..086cf75 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 @@ -19,6 +19,7 @@ /* { dg-final { scan-assembler-not {vfadd.vf} } } */ /* { dg-final { scan-assembler-not {vfsub.vf} } } */ /* { dg-final { scan-assembler-not {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler-not {vfrsub.vf} } } */ /* { dg-final { scan-assembler-not {vfmin.vf} } } */ /* { dg-final { scan-assembler-not {vfmax.vf} } } */ /* { dg-final { scan-assembler-not {vfwmul.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 14cf691..4679799 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 @@ -15,5 +15,6 @@ /* { dg-final { scan-assembler-not {vfadd.vf} } } */ /* { dg-final { scan-assembler-not {vfsub.vf} } } */ /* { dg-final { scan-assembler-not {vfrdiv.vf} } } */ +/* { dg-final { scan-assembler-not {vfrsub.vf} } } */ /* { dg-final { scan-assembler-not {vfmin.vf} } } */ /* { dg-final { scan-assembler-not {vfmax.vf} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_binop_data.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_binop_data.h index d7f8d1d..60dd0ce 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_binop_data.h +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_binop_data.h @@ -594,6 +594,153 @@ double TEST_BINOP_DATA(double, rdiv)[][4][N] = }, }; +_Float16 TEST_BINOP_DATA(_Float16, rsub)[][4][N] = +{ + { + { 0x1.fd40000000000p+6f16 }, + { + 0x1.8fc0000000000p+4f16, 0x1.8fc0000000000p+4f16, 0x1.8fc0000000000p+4f16, 0x1.8fc0000000000p+4f16, + 0x1.b880000000000p+6f16, 0x1.b880000000000p+6f16, 0x1.b880000000000p+6f16, 0x1.b880000000000p+6f16, + 0x1.a4c0000000000p+5f16, 0x1.a4c0000000000p+5f16, 0x1.a4c0000000000p+5f16, 0x1.a4c0000000000p+5f16, + 0x1.6f80000000000p+4f16, 0x1.6f80000000000p+4f16, 0x1.6f80000000000p+4f16, 0x1.6f80000000000p+4f16, + }, + { + 0x1.9940000000000p+6f16, 0x1.9940000000000p+6f16, 0x1.9940000000000p+6f16, 0x1.9940000000000p+6f16, + 0x1.12c0000000000p+4f16, 0x1.12c0000000000p+4f16, 0x1.12c0000000000p+4f16, 0x1.12c0000000000p+4f16, + 0x1.2ac0000000000p+6f16, 0x1.2ac0000000000p+6f16, 0x1.2ac0000000000p+6f16, 0x1.2ac0000000000p+6f16, + 0x1.a140000000000p+6f16, 0x1.a140000000000p+6f16, 0x1.a140000000000p+6f16, 0x1.a140000000000p+6f16, + }, + }, + { + { 0x1.fd40000000000p+6f16 }, + { + -0x1.53c0000000000p+5f16, -0x1.53c0000000000p+5f16, -0x1.53c0000000000p+5f16, -0x1.53c0000000000p+5f16, + 0x1.c300000000000p+6f16, 0x1.c300000000000p+6f16, 0x1.c300000000000p+6f16, 0x1.c300000000000p+6f16, + -0x1.ffc0000000000p+7f16, -0x1.ffc0000000000p+7f16, -0x1.ffc0000000000p+7f16, -0x1.ffc0000000000p+7f16, + -0x1.94c0000000000p+6f16, -0x1.94c0000000000p+6f16, -0x1.94c0000000000p+6f16, -0x1.94c0000000000p+6f16, + }, + { + 0x1.5380000000000p+7f16, 0x1.5380000000000p+7f16, 0x1.5380000000000p+7f16, 0x1.5380000000000p+7f16, + 0x1.d180000000000p+3f16, 0x1.d180000000000p+3f16, 0x1.d180000000000p+3f16, 0x1.d180000000000p+3f16, + 0x1.7f00000000000p+8f16, 0x1.7f00000000000p+8f16, 0x1.7f00000000000p+8f16, 0x1.7f00000000000p+8f16, + 0x1.c900000000000p+7f16, 0x1.c900000000000p+7f16, 0x1.c900000000000p+7f16, 0x1.c900000000000p+7f16, + }, + }, + { + { -0x1.fd40000000000p+6f16 }, + { + -0x1.0600000000000p+5f16, -0x1.0600000000000p+5f16, -0x1.0600000000000p+5f16, -0x1.0600000000000p+5f16, + -0x1.e540000000000p+7f16, -0x1.e540000000000p+7f16, -0x1.e540000000000p+7f16, -0x1.e540000000000p+7f16, + 0x1.96c0000000000p+4f16, 0x1.96c0000000000p+4f16, 0x1.96c0000000000p+4f16, 0x1.96c0000000000p+4f16, + -0x1.08c0000000000p+5f16, -0x1.08c0000000000p+5f16, -0x1.08c0000000000p+5f16, -0x1.08c0000000000p+5f16, + }, + { + -0x1.7a40000000000p+6f16, -0x1.7a40000000000p+6f16, -0x1.7a40000000000p+6f16, -0x1.7a40000000000p+6f16, + 0x1.cd40000000000p+6f16, 0x1.cd40000000000p+6f16, 0x1.cd40000000000p+6f16, 0x1.cd40000000000p+6f16, + -0x1.3180000000000p+7f16, -0x1.3180000000000p+7f16, -0x1.3180000000000p+7f16, -0x1.3180000000000p+7f16, + -0x1.78c0000000000p+6f16, -0x1.78c0000000000p+6f16, -0x1.78c0000000000p+6f16, -0x1.78c0000000000p+6f16, + }, + }, +}; + +float TEST_BINOP_DATA(float, rsub)[][4][N] = +{ + { + { 0x1.05bc2e0000000p+63f }, + { + 0x1.8fe1540000000p+60f, 0x1.8fe1540000000p+60f, 0x1.8fe1540000000p+60f, 0x1.8fe1540000000p+60f, + 0x1.b8b5320000000p+62f, 0x1.b8b5320000000p+62f, 0x1.b8b5320000000p+62f, 0x1.b8b5320000000p+62f, + 0x1.a4eb340000000p+61f, 0x1.a4eb340000000p+61f, 0x1.a4eb340000000p+61f, 0x1.a4eb340000000p+61f, + 0x1.6faeda0000000p+60f, 0x1.6faeda0000000p+60f, 0x1.6faeda0000000p+60f, 0x1.6faeda0000000p+60f, + }, + { + 0x1.a780060000000p+62f, 0x1.a780060000000p+62f, 0x1.a780060000000p+62f, 0x1.a780060000000p+62f, + 0x1.4b0ca80000000p+60f, 0x1.4b0ca80000000p+60f, 0x1.4b0ca80000000p+60f, 0x1.4b0ca80000000p+60f, + 0x1.3902c20000000p+62f, 0x1.3902c20000000p+62f, 0x1.3902c20000000p+62f, 0x1.3902c20000000p+62f, + 0x1.af8ca60000000p+62f, 0x1.af8ca60000000p+62f, 0x1.af8ca60000000p+62f, 0x1.af8ca60000000p+62f, + } + }, + { + { 0x1.3d86160000000p+60f }, + { + -0x1.53e0ba0000000p+61f, -0x1.53e0ba0000000p+61f, -0x1.53e0ba0000000p+61f, -0x1.53e0ba0000000p+61f, + 0x1.c3397c0000000p+62f, 0x1.c3397c0000000p+62f, 0x1.c3397c0000000p+62f, 0x1.c3397c0000000p+62f, + -0x1.ffe2020000000p+63f, -0x1.ffe2020000000p+63f, -0x1.ffe2020000000p+63f, -0x1.ffe2020000000p+63f, + -0x1.94d2a80000000p+62f, -0x1.94d2a80000000p+62f, -0x1.94d2a80000000p+62f, -0x1.94d2a80000000p+62f, + }, + { + 0x1.f2a3c60000000p+61f, 0x1.f2a3c60000000p+61f, 0x1.f2a3c60000000p+61f, 0x1.f2a3c60000000p+61f, + -0x1.73d7f60000000p+62f, -0x1.73d7f60000000p+62f, -0x1.73d7f60000000p+62f, -0x1.73d7f60000000p+62f, + 0x1.13c9620000000p+64f, 0x1.13c9620000000p+64f, 0x1.13c9620000000p+64f, 0x1.13c9620000000p+64f, + 0x1.e4342e0000000p+62f, 0x1.e4342e0000000p+62f, 0x1.e4342e0000000p+62f, 0x1.e4342e0000000p+62f, + }, + }, + { + { -0x1.3d86160000000p+60f }, + { + -0x1.062a340000000p+61f, -0x1.062a340000000p+61f, -0x1.062a340000000p+61f, -0x1.062a340000000p+61f, + -0x1.e573960000000p+63f, -0x1.e573960000000p+63f, -0x1.e573960000000p+63f, -0x1.e573960000000p+63f, + 0x1.96d5c20000000p+60f, 0x1.96d5c20000000p+60f, 0x1.96d5c20000000p+60f, 0x1.96d5c20000000p+60f, + -0x1.08eb620000000p+61f, -0x1.08eb620000000p+61f, -0x1.08eb620000000p+61f, -0x1.08eb620000000p+61f, + }, + { + 0x1.9d9ca40000000p+59f, 0x1.9d9ca40000000p+59f, 0x1.9d9ca40000000p+59f, 0x1.9d9ca40000000p+59f, + 0x1.bdc2d40000000p+63f, 0x1.bdc2d40000000p+63f, 0x1.bdc2d40000000p+63f, 0x1.bdc2d40000000p+63f, + -0x1.6a2dec0000000p+61f, -0x1.6a2dec0000000p+61f, -0x1.6a2dec0000000p+61f, -0x1.6a2dec0000000p+61f, + 0x1.a8a15a0000000p+59f, 0x1.a8a15a0000000p+59f, 0x1.a8a15a0000000p+59f, 0x1.a8a15a0000000p+59f, + }, + }, +}; + +double TEST_BINOP_DATA(double, rsub)[][4][N] = +{ + { + { 0x1.ca3d8e6d80cbbp+510 }, + { + 0x1.8fe1565f12a78p+508, 0x1.8fe1565f12a78p+508, 0x1.8fe1565f12a78p+508, 0x1.8fe1565f12a78p+508, + 0x1.b8b533d821ccap+510, 0x1.b8b533d821ccap+510, 0x1.b8b533d821ccap+510, 0x1.b8b533d821ccap+510, + 0x1.a4eb35b744a54p+509, 0x1.a4eb35b744a54p+509, 0x1.a4eb35b744a54p+509, 0x1.a4eb35b744a54p+509, + 0x1.6faedb6395f48p+508, 0x1.6faedb6395f48p+508, 0x1.6faedb6395f48p+508, 0x1.6faedb6395f48p+508, + }, + { + 0x1.664538d5bc21dp+510, 0x1.664538d5bc21dp+510, 0x1.664538d5bc21dp+510, 0x1.664538d5bc21dp+510, + 0x1.1885a955eff10p+506, 0x1.1885a955eff10p+506, 0x1.1885a955eff10p+506, 0x1.1885a955eff10p+506, + 0x1.ef8fe723bcf22p+509, 0x1.ef8fe723bcf22p+509, 0x1.ef8fe723bcf22p+509, 0x1.ef8fe723bcf22p+509, + 0x1.6e51d7949b4e9p+510, 0x1.6e51d7949b4e9p+510, 0x1.6e51d7949b4e9p+510, 0x1.6e51d7949b4e9p+510, + }, + }, + { + { 0x1.ca3d8e6d80cbbp+510 }, + { + -0x1.53e0bc0170fe8p+509, -0x1.53e0bc0170fe8p+509, -0x1.53e0bc0170fe8p+509, -0x1.53e0bc0170fe8p+509, + 0x1.c3397ceebc142p+510, 0x1.c3397ceebc142p+510, 0x1.c3397ceebc142p+510, 0x1.c3397ceebc142p+510, + -0x1.ffe2046f999e3p+511, -0x1.ffe2046f999e3p+511, -0x1.ffe2046f999e3p+511, -0x1.ffe2046f999e3p+511, + -0x1.94d2a9003ee18p+510, -0x1.94d2a9003ee18p+510, -0x1.94d2a9003ee18p+510, -0x1.94d2a9003ee18p+510, + }, + { + 0x1.3a16f6371ca58p+511, 0x1.3a16f6371ca58p+511, 0x1.3a16f6371ca58p+511, 0x1.3a16f6371ca58p+511, + 0x1.c1045fb12de40p+504, 0x1.c1045fb12de40p+504, 0x1.c1045fb12de40p+504, 0x1.c1045fb12de40p+504, + 0x1.728065d32d020p+512, 0x1.728065d32d020p+512, 0x1.728065d32d020p+512, 0x1.728065d32d020p+512, + 0x1.af881bb6dfd6ap+511, 0x1.af881bb6dfd6ap+511, 0x1.af881bb6dfd6ap+511, 0x1.af881bb6dfd6ap+511, + }, + }, + { + { -0x1.ca3d8e6d80cbbp+510 }, + { + -0x1.062a35a13cec0p+509, -0x1.062a35a13cec0p+509, -0x1.062a35a13cec0p+509, -0x1.062a35a13cec0p+509, + -0x1.e5739808c344dp+511, -0x1.e5739808c344dp+511, -0x1.e5739808c344dp+511, -0x1.e5739808c344dp+511, + 0x1.96d5c3ca79e38p+508, 0x1.96d5c3ca79e38p+508, 0x1.96d5c3ca79e38p+508, 0x1.96d5c3ca79e38p+508, + -0x1.08eb6307cef78p+509, -0x1.08eb6307cef78p+509, -0x1.08eb6307cef78p+509, -0x1.08eb6307cef78p+509, + }, + { + -0x1.4728739ce255bp+510, -0x1.4728739ce255bp+510, -0x1.4728739ce255bp+510, -0x1.4728739ce255bp+510, + 0x1.0054d0d202df0p+511, 0x1.0054d0d202df0p+511, 0x1.0054d0d202df0p+511, 0x1.0054d0d202df0p+511, + -0x1.17f97fb00fa24p+511, -0x1.17f97fb00fa24p+511, -0x1.17f97fb00fa24p+511, -0x1.17f97fb00fa24p+511, + -0x1.45c7dce9994ffp+510, -0x1.45c7dce9994ffp+510, -0x1.45c7dce9994ffp+510, -0x1.45c7dce9994ffp+510, + }, + }, +}; + _Float16 TEST_BINOP_DATA(_Float16, min)[][4][N] = { { diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f16.c new file mode 100644 index 0000000..7b424e4 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f16.c @@ -0,0 +1,19 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-require-effective-target riscv_v_ok } */ +/* { dg-require-effective-target riscv_zvfh_ok } */ +/* { dg-add-options "riscv_v" } */ +/* { dg-add-options "riscv_zvfh" } */ +/* { dg-additional-options "--param=fpr2vr-cost=0" } */ + +#include "vf_binop.h" +#include "vf_binop_data.h" + +#define T _Float16 +#define NAME rsub + +DEF_VF_BINOP_REVERSE_CASE_0_WRAP (T, -, NAME) + +#define TEST_DATA TEST_BINOP_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, f, n) RUN_VF_BINOP_REVERSE_CASE_0_WRAP(T, NAME, out, in, f, n) + +#include "vf_binop_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f32.c new file mode 100644 index 0000000..e5fc9d1 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f32.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "--param=fpr2vr-cost=0" } */ + +#include "vf_binop.h" +#include "vf_binop_data.h" + +#define T float +#define NAME rsub + +DEF_VF_BINOP_REVERSE_CASE_0_WRAP (T, -, NAME) + +#define TEST_DATA TEST_BINOP_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, f, n) RUN_VF_BINOP_REVERSE_CASE_0_WRAP(T, NAME, out, in, f, n) + +#include "vf_binop_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f64.c new file mode 100644 index 0000000..43d4cdd --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrsub-run-1-f64.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "--param=fpr2vr-cost=0" } */ + +#include "vf_binop.h" +#include "vf_binop_data.h" + +#define T double +#define NAME rsub + +DEF_VF_BINOP_REVERSE_CASE_0_WRAP (T, -, NAME) + +#define TEST_DATA TEST_BINOP_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, f, n) RUN_VF_BINOP_REVERSE_CASE_0_WRAP(T, NAME, out, in, f, n) + +#include "vf_binop_run.h" |