It seems because of canonical form of RTL, right? LGTM, but plz add some more comments about the reason into the commit log.
On Wed, Jun 28, 2023 at 11:00 AM Juzhe-Zhong <juzhe.zh...@rivai.ai> wrote: > > gcc/ChangeLog: > > * config/riscv/riscv-vector-builtins-bases.cc: Adapt expand. > * config/riscv/vector.md > (@pred_single_widen_<plus_minus:optab><mode>): Remove. > (@pred_single_widen_add<mode>): New pattern. > (@pred_single_widen_sub<mode>): New pattern. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/rvv/autovec/widen/widen-1.c: Add floating-point. > * gcc.target/riscv/rvv/autovec/widen/widen-2.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen-5.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen-6.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen-complicate-1.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen-complicate-2.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen_run-1.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen_run-2.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen_run-5.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen_run-6.c: Ditto. > * gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-1.c: New test. > * gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-2.c: New test. > * gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-5.c: New test. > * gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-6.c: New test. > > --- > .../riscv/riscv-vector-builtins-bases.cc | 8 +++-- > gcc/config/riscv/vector.md | 31 ++++++++++++++++--- > .../riscv/rvv/autovec/widen/widen-1.c | 7 +++-- > .../riscv/rvv/autovec/widen/widen-2.c | 7 +++-- > .../riscv/rvv/autovec/widen/widen-5.c | 7 +++-- > .../riscv/rvv/autovec/widen/widen-6.c | 7 +++-- > .../rvv/autovec/widen/widen-complicate-1.c | 7 +++-- > .../rvv/autovec/widen/widen-complicate-2.c | 7 +++-- > .../riscv/rvv/autovec/widen/widen_run-1.c | 5 +-- > .../riscv/rvv/autovec/widen/widen_run-2.c | 5 +-- > .../riscv/rvv/autovec/widen/widen_run-5.c | 5 +-- > .../riscv/rvv/autovec/widen/widen_run-6.c | 5 +-- > .../rvv/autovec/widen/widen_run_zvfh-1.c | 28 +++++++++++++++++ > .../rvv/autovec/widen/widen_run_zvfh-2.c | 28 +++++++++++++++++ > .../rvv/autovec/widen/widen_run_zvfh-5.c | 28 +++++++++++++++++ > .../rvv/autovec/widen/widen_run_zvfh-6.c | 28 +++++++++++++++++ > 16 files changed, 187 insertions(+), 26 deletions(-) > create mode 100644 > gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-1.c > create mode 100644 > gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-2.c > create mode 100644 > gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-5.c > create mode 100644 > gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-6.c > > diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc > b/gcc/config/riscv/riscv-vector-builtins-bases.cc > index fb74cb36ebd..f4a061a831b 100644 > --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc > +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc > @@ -390,8 +390,12 @@ public: > return e.use_exact_insn ( > code_for_pred_dual_widen_scalar (CODE, e.vector_mode ())); > case OP_TYPE_wv: > - return e.use_exact_insn ( > - code_for_pred_single_widen (CODE, e.vector_mode ())); > + if (CODE == PLUS) > + return e.use_exact_insn ( > + code_for_pred_single_widen_add (e.vector_mode ())); > + else > + return e.use_exact_insn ( > + code_for_pred_single_widen_sub (e.vector_mode ())); > case OP_TYPE_wf: > return e.use_exact_insn ( > code_for_pred_single_widen_scalar (CODE, e.vector_mode ())); > diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md > index b0b3b0ed977..406f96439ec 100644 > --- a/gcc/config/riscv/vector.md > +++ b/gcc/config/riscv/vector.md > @@ -6574,7 +6574,7 @@ > [(set_attr "type" "vf<widen_binop_insn_type>") > (set_attr "mode" "<V_DOUBLE_TRUNC>")]) > > -(define_insn "@pred_single_widen_<plus_minus:optab><mode>" > +(define_insn "@pred_single_widen_add<mode>" > [(set (match_operand:VWEXTF 0 "register_operand" "=&vr, > &vr") > (if_then_else:VWEXTF > (unspec:<VM> > @@ -6587,14 +6587,37 @@ > (reg:SI VL_REGNUM) > (reg:SI VTYPE_REGNUM) > (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE) > - (plus_minus:VWEXTF > + (plus:VWEXTF > + (float_extend:VWEXTF > + (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" " vr, > vr")) > + (match_operand:VWEXTF 3 "register_operand" " vr, > vr")) > + (match_operand:VWEXTF 2 "vector_merge_operand" " vu, > 0")))] > + "TARGET_VECTOR" > + "vfwadd.wv\t%0,%3,%4%p1" > + [(set_attr "type" "vfwalu") > + (set_attr "mode" "<V_DOUBLE_TRUNC>")]) > + > +(define_insn "@pred_single_widen_sub<mode>" > + [(set (match_operand:VWEXTF 0 "register_operand" "=&vr, > &vr") > + (if_then_else:VWEXTF > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" > "vmWc1,vmWc1") > + (match_operand 5 "vector_length_operand" " rK, > rK") > + (match_operand 6 "const_int_operand" " i, > i") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM) > + (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE) > + (minus:VWEXTF > (match_operand:VWEXTF 3 "register_operand" " vr, > vr") > (float_extend:VWEXTF > (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" " vr, > vr"))) > (match_operand:VWEXTF 2 "vector_merge_operand" " vu, > 0")))] > "TARGET_VECTOR" > - "vfw<insn>.wv\t%0,%3,%4%p1" > - [(set_attr "type" "vf<widen_binop_insn_type>") > + "vfwsub.wv\t%0,%3,%4%p1" > + [(set_attr "type" "vfwalu") > (set_attr "mode" "<V_DOUBLE_TRUNC>")]) > > (define_insn "@pred_single_widen_<plus_minus:optab><mode>_scalar" > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-1.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-1.c > index 00edecab089..e2ec4ee9b99 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-1.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-1.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-additional-options "-march=rv32gcv -mabi=ilp32d > --param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d > --param=riscv-autovec-preference=scalable -ffast-math" } */ > > #include <stdint-gcc.h> > > @@ -19,9 +19,12 @@ > TEST_TYPE (int32_t, int16_t) > \ > TEST_TYPE (uint32_t, uint16_t) > \ > TEST_TYPE (int64_t, int32_t) > \ > - TEST_TYPE (uint64_t, uint32_t) > + TEST_TYPE (uint64_t, uint32_t) > \ > + TEST_TYPE (float, _Float16) > \ > + TEST_TYPE (double, float) > > TEST_ALL () > > /* { dg-final { scan-assembler-times {\tvwadd\.vv} 3 } } */ > /* { dg-final { scan-assembler-times {\tvwaddu\.vv} 3 } } */ > +/* { dg-final { scan-assembler-times {\tvfwadd\.vv} 2 } } */ > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-2.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-2.c > index 4d370f583b7..246acf22dd8 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-2.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-2.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-additional-options "-march=rv32gcv -mabi=ilp32d > --param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d > --param=riscv-autovec-preference=scalable -ffast-math" } */ > > #include <stdint-gcc.h> > > @@ -19,9 +19,12 @@ > TEST_TYPE (int32_t, int16_t) > \ > TEST_TYPE (uint32_t, uint16_t) > \ > TEST_TYPE (int64_t, int32_t) > \ > - TEST_TYPE (uint64_t, uint32_t) > + TEST_TYPE (uint64_t, uint32_t) > \ > + TEST_TYPE (float, _Float16) > \ > + TEST_TYPE (double, float) > > TEST_ALL () > > /* { dg-final { scan-assembler-times {\tvwsub\.vv} 3 } } */ > /* { dg-final { scan-assembler-times {\tvwsubu\.vv} 3 } } */ > +/* { dg-final { scan-assembler-times {\tvfwsub\.vv} 2 } } */ > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-5.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-5.c > index 7f8909272ab..62b121d7bbd 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-5.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-5.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-additional-options "-march=rv32gcv -mabi=ilp32d > --param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d > --param=riscv-autovec-preference=scalable -ffast-math" } */ > > #include <stdint-gcc.h> > > @@ -19,9 +19,12 @@ > TEST_TYPE (int32_t, int16_t) > \ > TEST_TYPE (uint32_t, uint16_t) > \ > TEST_TYPE (int64_t, int32_t) > \ > - TEST_TYPE (uint64_t, uint32_t) > + TEST_TYPE (uint64_t, uint32_t) > \ > + TEST_TYPE (float, _Float16) > \ > + TEST_TYPE (double, float) > > TEST_ALL () > > /* { dg-final { scan-assembler-times {\tvwadd\.wv} 3 } } */ > /* { dg-final { scan-assembler-times {\tvwaddu\.wv} 3 } } */ > +/* { dg-final { scan-assembler-times {\tvfwadd\.wv} 2 } } */ > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-6.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-6.c > index f9542d7601e..cd4853778cf 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-6.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-6.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-additional-options "-march=rv32gcv -mabi=ilp32d > --param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d > --param=riscv-autovec-preference=scalable -ffast-math" } */ > > #include <stdint-gcc.h> > > @@ -19,9 +19,12 @@ > TEST_TYPE (int32_t, int16_t) > \ > TEST_TYPE (uint32_t, uint16_t) > \ > TEST_TYPE (int64_t, int32_t) > \ > - TEST_TYPE (uint64_t, uint32_t) > + TEST_TYPE (uint64_t, uint32_t) > \ > + TEST_TYPE (float, _Float16) > \ > + TEST_TYPE (double, float) > > TEST_ALL () > > /* { dg-final { scan-assembler-times {\tvwsub\.wv} 3 } } */ > /* { dg-final { scan-assembler-times {\tvwsubu\.wv} 3 } } */ > +/* { dg-final { scan-assembler-times {\tvfwsub\.wv} 2 } } */ > diff --git > a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-complicate-1.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-complicate-1.c > index baf91b72d60..83e16c606d1 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-complicate-1.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-complicate-1.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-additional-options "-march=rv32gcv -mabi=ilp32d > --param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d > --param=riscv-autovec-preference=scalable -ffast-math" } */ > > #include <stdint-gcc.h> > > @@ -23,9 +23,12 @@ > TEST_TYPE (int32_t, int16_t) > \ > TEST_TYPE (uint32_t, uint16_t) > \ > TEST_TYPE (int64_t, int32_t) > \ > - TEST_TYPE (uint64_t, uint32_t) > + TEST_TYPE (uint64_t, uint32_t) > \ > + TEST_TYPE (float, _Float16) > \ > + TEST_TYPE (double, float) > > TEST_ALL () > > /* { dg-final { scan-assembler-times {\tvwadd\.vv} 9 } } */ > /* { dg-final { scan-assembler-times {\tvwaddu\.vv} 9 } } */ > +/* { dg-final { scan-assembler-times {\tvfwadd\.vv} 6 } } */ > diff --git > a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-complicate-2.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-complicate-2.c > index 6d1709bf2f6..97036e64d94 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-complicate-2.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-complicate-2.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-additional-options "-march=rv32gcv -mabi=ilp32d > --param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d > --param=riscv-autovec-preference=scalable -ffast-math" } */ > > #include <stdint-gcc.h> > > @@ -23,9 +23,12 @@ > TEST_TYPE (int32_t, int16_t) > \ > TEST_TYPE (uint32_t, uint16_t) > \ > TEST_TYPE (int64_t, int32_t) > \ > - TEST_TYPE (uint64_t, uint32_t) > + TEST_TYPE (uint64_t, uint32_t) > \ > + TEST_TYPE (float, _Float16) > \ > + TEST_TYPE (double, float) > > TEST_ALL () > > /* { dg-final { scan-assembler-times {\tvwsub\.vv} 9 } } */ > /* { dg-final { scan-assembler-times {\tvwsubu\.vv} 9 } } */ > +/* { dg-final { scan-assembler-times {\tvfwsub\.vv} 6 } } */ > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-1.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-1.c > index 6cdeb571711..21d0934ad09 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-1.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-1.c > @@ -1,5 +1,5 @@ > /* { dg-do run { target { riscv_vector } } } */ > -/* { dg-additional-options "--param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "--param=riscv-autovec-preference=scalable > -ffast-math" } */ > > #include <assert.h> > #include "widen-1.c" > @@ -25,7 +25,8 @@ > RUN (int32_t, int16_t, -32768) > \ > RUN (uint32_t, uint16_t, 65535) > \ > RUN (int64_t, int32_t, -2147483648) > \ > - RUN (uint64_t, uint32_t, 4294967295) > + RUN (uint64_t, uint32_t, 4294967295) > \ > + RUN (double, float, -2147483648) > > int > main () > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-2.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-2.c > index 84baa515610..e5805a9a5bb 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-2.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-2.c > @@ -1,5 +1,5 @@ > /* { dg-do run { target { riscv_vector } } } */ > -/* { dg-additional-options "--param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "--param=riscv-autovec-preference=scalable > -ffast-math" } */ > > #include <assert.h> > #include "widen-2.c" > @@ -25,7 +25,8 @@ > RUN (int32_t, int16_t, -32768) > \ > RUN (uint32_t, uint16_t, 65535) > \ > RUN (int64_t, int32_t, -2147483648) > \ > - RUN (uint64_t, uint32_t, 4294967295) > + RUN (uint64_t, uint32_t, 4294967295) > \ > + RUN (double, float, -2147483648) > > int > main () > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-5.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-5.c > index ca16585a945..d94f7044087 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-5.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-5.c > @@ -1,5 +1,5 @@ > /* { dg-do run { target { riscv_vector } } } */ > -/* { dg-additional-options "--param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "--param=riscv-autovec-preference=scalable > -ffast-math" } */ > > #include <assert.h> > #include "widen-5.c" > @@ -25,7 +25,8 @@ > RUN (int32_t, int16_t, -32768) > \ > RUN (uint32_t, uint16_t, 65535) > \ > RUN (int64_t, int32_t, -2147483648) > \ > - RUN (uint64_t, uint32_t, 4294967295) > + RUN (uint64_t, uint32_t, 4294967295) > \ > + RUN (double, float, -2147483648) > > int > main () > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-6.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-6.c > index 5b69c2ab0c6..6c4ccece141 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-6.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run-6.c > @@ -1,5 +1,5 @@ > /* { dg-do run { target { riscv_vector } } } */ > -/* { dg-additional-options "--param=riscv-autovec-preference=scalable" } */ > +/* { dg-additional-options "--param=riscv-autovec-preference=scalable > -ffast-math" } */ > > #include <assert.h> > #include "widen-6.c" > @@ -25,7 +25,8 @@ > RUN (int32_t, int16_t, -32768) > \ > RUN (uint32_t, uint16_t, 65535) > \ > RUN (int64_t, int32_t, -2147483648) > \ > - RUN (uint64_t, uint32_t, 4294967295) > + RUN (uint64_t, uint32_t, 4294967295) > \ > + RUN (double, float, -2147483648) > > int > main () > diff --git > a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-1.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-1.c > new file mode 100644 > index 00000000000..e70f06f5381 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-1.c > @@ -0,0 +1,28 @@ > +/* { dg-do run { target { riscv_vector && riscv_zvfh_hw } } } */ > +/* { dg-additional-options "--param=riscv-autovec-preference=scalable > -ffast-math" } */ > + > +#include <assert.h> > +#include "widen-1.c" > + > +#define SZ 512 > + > +#define RUN(TYPE1, TYPE2, LIMIT) > \ > + TYPE2 a##TYPE2[SZ]; > \ > + TYPE2 b##TYPE2[SZ]; > \ > + TYPE1 dst##TYPE1[SZ]; > \ > + for (int i = 0; i < SZ; i++) > \ > + { > \ > + a##TYPE2[i] = LIMIT + i % 8723; > \ > + b##TYPE2[i] = LIMIT + i & 1964; > \ > + } > \ > + vwadd_##TYPE1_##TYPE2 (dst##TYPE1, a##TYPE2, b##TYPE2, SZ); > \ > + for (int i = 0; i < SZ; i++) > \ > + assert (dst##TYPE1[i] == ((TYPE1) a##TYPE2[i] + (TYPE1) b##TYPE2[i])); > + > +#define RUN_ALL() RUN (float, _Float16, -32768) > + > +int > +main () > +{ > + RUN_ALL () > +} > diff --git > a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-2.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-2.c > new file mode 100644 > index 00000000000..e07a82871a2 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-2.c > @@ -0,0 +1,28 @@ > +/* { dg-do run { target { riscv_vector && riscv_zvfh_hw } } } */ > +/* { dg-additional-options "--param=riscv-autovec-preference=scalable > -ffast-math" } */ > + > +#include <assert.h> > +#include "widen-2.c" > + > +#define SZ 512 > + > +#define RUN(TYPE1, TYPE2, LIMIT) > \ > + TYPE2 a##TYPE2[SZ]; > \ > + TYPE2 b##TYPE2[SZ]; > \ > + TYPE1 dst##TYPE1[SZ]; > \ > + for (int i = 0; i < SZ; i++) > \ > + { > \ > + a##TYPE2[i] = LIMIT + i % 8723; > \ > + b##TYPE2[i] = LIMIT + i & 1964; > \ > + } > \ > + vwsub_##TYPE1_##TYPE2 (dst##TYPE1, a##TYPE2, b##TYPE2, SZ); > \ > + for (int i = 0; i < SZ; i++) > \ > + assert (dst##TYPE1[i] == ((TYPE1) a##TYPE2[i] - (TYPE1) b##TYPE2[i])); > + > +#define RUN_ALL() RUN (float, _Float16, -32768) > + > +int > +main () > +{ > + RUN_ALL () > +} > diff --git > a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-5.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-5.c > new file mode 100644 > index 00000000000..144e3d2b02b > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-5.c > @@ -0,0 +1,28 @@ > +/* { dg-do run { target { riscv_vector && riscv_zvfh_hw } } } */ > +/* { dg-additional-options "--param=riscv-autovec-preference=scalable > -ffast-math" } */ > + > +#include <assert.h> > +#include "widen-5.c" > + > +#define SZ 512 > + > +#define RUN(TYPE1, TYPE2, LIMIT) > \ > + TYPE2 a##TYPE2[SZ]; > \ > + TYPE1 b##TYPE1[SZ]; > \ > + TYPE1 dst##TYPE1[SZ]; > \ > + for (int i = 0; i < SZ; i++) > \ > + { > \ > + a##TYPE2[i] = LIMIT + i % 8723; > \ > + b##TYPE1[i] = LIMIT + i & 1964; > \ > + } > \ > + vwadd_##TYPE1_##TYPE2 (dst##TYPE1, a##TYPE2, b##TYPE1, SZ); > \ > + for (int i = 0; i < SZ; i++) > \ > + assert (dst##TYPE1[i] == ((TYPE1) a##TYPE2[i] + (TYPE1) b##TYPE1[i])); > + > +#define RUN_ALL() RUN (float, _Float16, -32768) > + > +int > +main () > +{ > + RUN_ALL () > +} > diff --git > a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-6.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-6.c > new file mode 100644 > index 00000000000..006dadec067 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen_run_zvfh-6.c > @@ -0,0 +1,28 @@ > +/* { dg-do run { target { riscv_vector && riscv_zvfh_hw } } } */ > +/* { dg-additional-options "--param=riscv-autovec-preference=scalable > -ffast-math" } */ > + > +#include <assert.h> > +#include "widen-6.c" > + > +#define SZ 512 > + > +#define RUN(TYPE1, TYPE2, LIMIT) > \ > + TYPE1 a##TYPE1[SZ]; > \ > + TYPE2 b##TYPE2[SZ]; > \ > + TYPE1 dst##TYPE1[SZ]; > \ > + for (int i = 0; i < SZ; i++) > \ > + { > \ > + a##TYPE1[i] = LIMIT + i % 8723; > \ > + b##TYPE2[i] = LIMIT + i & 1964; > \ > + } > \ > + vwsub_##TYPE1_##TYPE2 (dst##TYPE1, a##TYPE1, b##TYPE2, SZ); > \ > + for (int i = 0; i < SZ; i++) > \ > + assert (dst##TYPE1[i] == ((TYPE1) a##TYPE1[i] - (TYPE1) b##TYPE2[i])); > + > +#define RUN_ALL() RUN (float, _Float16, -32768) > + > +int > +main () > +{ > + RUN_ALL () > +} > -- > 2.36.1 >