diff options
author | Robin Dapp <rdapp@ventanamicro.com> | 2025-09-05 09:35:46 +0200 |
---|---|---|
committer | Robin Dapp <rdapp@ventanamicro.com> | 2025-09-05 22:25:25 +0200 |
commit | a6bf07653cd272add46a2218ec141c95d7f02427 (patch) | |
tree | 5d253812de6b098a7d07b0786b1f139c43ccd63c | |
parent | 41ea9305466ce54027324258aeae9893101941db (diff) | |
download | gcc-a6bf07653cd272add46a2218ec141c95d7f02427.zip gcc-a6bf07653cd272add46a2218ec141c95d7f02427.tar.gz gcc-a6bf07653cd272add46a2218ec141c95d7f02427.tar.bz2 |
RISC-V: Check if we can vec_extract [PR121510].
For Zvfhmin a vector mode exists but the corresponding vec_extract does
not. This patch checks that a vec_extract is available and otherwise
falls back to standard handling.
PR target/121510
gcc/ChangeLog:
* config/riscv/riscv.cc (riscv_legitimize_move): Check if we can
vec_extract.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/pr121510.c: New test.
-rw-r--r-- | gcc/config/riscv/riscv.cc | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121510.c | 18 |
2 files changed, 20 insertions, 1 deletions
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index d5a656c..07d40f4 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -3686,7 +3686,8 @@ riscv_legitimize_move (machine_mode mode, rtx dest, rtx src) not enabled. In that case we just want to let the standard expansion path run. */ if (riscv_vector::get_vector_mode (smode, nunits).exists (&vmode) - && gen_lowpart_common (vmode, SUBREG_REG (src))) + && gen_lowpart_common (vmode, SUBREG_REG (src)) + && convert_optab_handler (vec_extract_optab, vmode, smode)) { rtx v = gen_lowpart (vmode, SUBREG_REG (src)); rtx int_reg = dest; diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121510.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121510.c new file mode 100644 index 0000000..8e17286 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121510.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv_zvfhmin -mabi=lp64d -O3" } */ + +long *print_bfloat_block; +void ftoastr(float); +void print_bfloat() { + for (;;) { + long j; + union { + _Float16 x; + char b[] + } u; + j = 0; + for (; j < sizeof 0; j++) + u.b[j] = print_bfloat_block[j]; + ftoastr(u.x); + } +} |