diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 439cc12f93d5dee816fc663098cf9253f1d67bec..819e1538741734f0c0e234f6b9abfaee5b7b019c 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -10900,7 +10900,9 @@ riscv_conditional_register_usage (void) call_used_regs[regno] = 1; } - if (!TARGET_VECTOR) + if (TARGET_VECTOR) + global_regs[VXRM_REGNUM] = 1; + else { for (int regno = V_REG_FIRST; regno <= V_REG_LAST; regno++) fixed_regs[regno] = call_used_regs[regno] = 1; diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-2.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-2.c new file mode 100644 index 0000000000000000000000000000000000000000..d6e3aa090777b39ee5974fad193820977f9f9124 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-2.c @@ -0,0 +1,40 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d" } */ + +#include "riscv_vector.h" + +#define N 4 +uint16_t a[N]; +uint16_t b[N]; +uint16_t c[N]; + +void initialize () +{ + uint16_t tmp_0[N] = { 0xfff, 3213, 238, 275, }; + + for (int i = 0; i < N; ++i) + a[i] = b[i] = tmp_0[i]; + + for (int i = 0; i < N; ++i) + c[i] = 0; +} + +void compute () +{ + size_t vl = __riscv_vsetvl_e16m1 (N); + vuint16m1_t va = __riscv_vle16_v_u16m1 (a, vl); + vuint16m1_t vb = __riscv_vle16_v_u16m1 (b, vl); + vuint16m1_t vc = __riscv_vaaddu_vv_u16m1 (va, vb, __RISCV_VXRM_RDN, vl); + + __riscv_vse16_v_u16m1 (c, vc, vl); +} + +int main () +{ + initialize (); + compute(); + + return 0; +} + +/* { dg-final { scan-assembler-times {csrwi\s+vxrm,\s*[01234]} 2 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-run-2.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-run-2.c new file mode 100644 index 0000000000000000000000000000000000000000..89150d4f6b592727b09ebaea673d233eaead6add --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118103-run-2.c @@ -0,0 +1,44 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-options "-O3" } */ + +#include "riscv_vector.h" + +#define N 4 +uint16_t a[N]; +uint16_t b[N]; +uint16_t c[N]; + +void initialize () { + uint16_t tmp_0[N] = { 0xfff, 3213, 238, 275, }; + uint16_t tmp_1[N] = { 0x2, 823, 39, 9, }; + + for (int i = 0; i < N; ++i) + { + a[i] = tmp_0[i]; + b[i] = tmp_1[i]; + } + + for (int i = 0; i < N; ++i) + c[i] = 0; +} + +void compute () +{ + size_t vl = __riscv_vsetvl_e16m1 (N); + vuint16m1_t va = __riscv_vle16_v_u16m1 (a, vl); + vuint16m1_t vb = __riscv_vle16_v_u16m1 (b, vl); + vuint16m1_t vc = __riscv_vaaddu_vv_u16m1 (va, vb, __RISCV_VXRM_RDN, vl); + + __riscv_vse16_v_u16m1 (c, vc, vl); +} + +int main () +{ + initialize (); + compute (); + + if (c[0] != 2048) + __builtin_abort (); + + return 0; +}