RISC-V: Fix V_WHOLE && V_FRACT iterator requirement
This patch fixes the requirement of V_WHOLE and V_FRACT. E.g. VNx8QI in V_WHOLE has no requirement which is incorrect. Actually, VNx8QI should be whole(full) mode when TARGET_MIN_VLEN < 128 since when TARGET_MIN_VLEN == 128, VNx8QI is e8mf2 which is fractional vector. Co-Authored by: Robin Dapp <rdapp@ventanamicro.com> gcc/ChangeLog: * config/riscv/vector-iterators.md: Fix requirement. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vls-vlmax/full-vec-move1.c: New test.
This commit is contained in:
parent
d150afb479
commit
de5f3bbf95
2 changed files with 33 additions and 7 deletions
|
@ -447,21 +447,24 @@
|
|||
])
|
||||
|
||||
(define_mode_iterator V_WHOLE [
|
||||
(VNx4QI "TARGET_MIN_VLEN == 32") VNx8QI VNx16QI VNx32QI (VNx64QI "TARGET_MIN_VLEN > 32") (VNx128QI "TARGET_MIN_VLEN >= 128")
|
||||
(VNx2HI "TARGET_MIN_VLEN == 32") VNx4HI VNx8HI VNx16HI (VNx32HI "TARGET_MIN_VLEN > 32") (VNx64HI "TARGET_MIN_VLEN >= 128")
|
||||
(VNx1SI "TARGET_MIN_VLEN == 32") VNx2SI VNx4SI VNx8SI (VNx16SI "TARGET_MIN_VLEN > 32") (VNx32SI "TARGET_MIN_VLEN >= 128")
|
||||
(VNx4QI "TARGET_MIN_VLEN == 32") (VNx8QI "TARGET_MIN_VLEN < 128") VNx16QI VNx32QI
|
||||
(VNx64QI "TARGET_MIN_VLEN > 32") (VNx128QI "TARGET_MIN_VLEN >= 128")
|
||||
(VNx2HI "TARGET_MIN_VLEN == 32") (VNx4HI "TARGET_MIN_VLEN < 128") VNx8HI VNx16HI
|
||||
(VNx32HI "TARGET_MIN_VLEN > 32") (VNx64HI "TARGET_MIN_VLEN >= 128")
|
||||
(VNx1SI "TARGET_MIN_VLEN == 32") (VNx2SI "TARGET_MIN_VLEN < 128") VNx4SI VNx8SI
|
||||
(VNx16SI "TARGET_MIN_VLEN > 32") (VNx32SI "TARGET_MIN_VLEN >= 128")
|
||||
(VNx1DI "TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN < 128") (VNx2DI "TARGET_VECTOR_ELEN_64")
|
||||
(VNx4DI "TARGET_VECTOR_ELEN_64") (VNx8DI "TARGET_VECTOR_ELEN_64") (VNx16DI "TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 128")
|
||||
|
||||
(VNx2HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN == 32")
|
||||
(VNx4HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN == 64")
|
||||
(VNx4HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN < 128")
|
||||
(VNx8HF "TARGET_VECTOR_ELEN_FP_16")
|
||||
(VNx16HF "TARGET_VECTOR_ELEN_FP_16")
|
||||
(VNx32HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN > 32")
|
||||
(VNx64HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 128")
|
||||
|
||||
(VNx1SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN == 32")
|
||||
(VNx2SF "TARGET_VECTOR_ELEN_FP_32")
|
||||
(VNx2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN < 128")
|
||||
(VNx4SF "TARGET_VECTOR_ELEN_FP_32")
|
||||
(VNx8SF "TARGET_VECTOR_ELEN_FP_32")
|
||||
(VNx16SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN > 32")
|
||||
|
@ -481,8 +484,8 @@
|
|||
(VNx2HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN > 32")
|
||||
(VNx4HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 128")
|
||||
|
||||
(VNx1SI "TARGET_MIN_VLEN > 32 && TARGET_MIN_VLEN < 128") (VNx2SI "TARGET_MIN_VLEN >= 128")
|
||||
(VNx1SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN > 32 && TARGET_MIN_VLEN < 128")
|
||||
(VNx1SI "TARGET_MIN_VLEN == 64") (VNx2SI "TARGET_MIN_VLEN >= 128")
|
||||
(VNx1SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN == 64")
|
||||
(VNx2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 128")
|
||||
])
|
||||
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
/* { dg-do run { target { riscv_vector } } } */
|
||||
/* { dg-additional-options "-std=c99 -O3 -march=rv64gcv_zvl128b -fno-vect-cost-model --param=riscv-autovec-preference=fixed-vlmax" } */
|
||||
|
||||
#include <stdint-gcc.h>
|
||||
#include <assert.h>
|
||||
|
||||
/* This would cause us to emit a vl1r.v for VNx4HImode even when
|
||||
the hardware vector size vl > 64. */
|
||||
|
||||
typedef int16_t V __attribute__((vector_size (128)));
|
||||
|
||||
int main ()
|
||||
{
|
||||
V v;
|
||||
for (int i = 0; i < sizeof (v) / sizeof (v[0]); i++)
|
||||
(v)[i] = i;
|
||||
V res = v;
|
||||
for (int i = 0; i < sizeof (v) / sizeof (v[0]); i++)
|
||||
assert (res[i] == i);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-not {vl[1248]r.v} } } */
|
||||
/* { dg-final { scan-assembler-times {vl[1248]re16.v} 1 } } */
|
Loading…
Add table
Reference in a new issue