-
- Downloads
RISC-V: Support FP lrint/lrintf auto vectorization
This patch would like to support the FP lrint/lrintf auto vectorization.
* long lrint (double) for rv64
* long lrintf (float) for rv32
Due to the limitation that only the same size of data type are allowed
in the vectorier, the standard name lrintmn2 only act on DF => DI for
rv64, and SF => SI for rv32.
Given we have code like:
void
test_lrint (long *out, double *in, unsigned count)
{
for (unsigned i = 0; i < count; i++)
out[i] = __builtin_lrint (in[i]);
}
Before this patch:
.L3:
...
fld fa5,0(a1)
fcvt.l.d a5,fa5,dyn
sd a5,-8(a0)
...
bne a1,a4,.L3
After this patch:
.L3:
...
vsetvli a3,zero,e64,m1,ta,ma
vfcvt.x.f.v v1,v1
vsetvli zero,a2,e64,m1,ta,ma
vse32.v v1,0(a0)
...
bne a2,zero,.L3
The rest part like SF => DI/HF => DI/DF => SI/HF => SI will be covered
by TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION.
gcc/ChangeLog:
* config/riscv/autovec.md (lrint<mode><vlconvert>2): New pattern
for lrint/lintf.
* config/riscv/riscv-protos.h (expand_vec_lrint): New func decl
for expanding lint.
* config/riscv/riscv-v.cc (emit_vec_cvt_x_f): New helper func impl
for vfcvt.x.f.v.
(expand_vec_lrint): New function impl for expanding lint.
* config/riscv/vector-iterators.md: New mode attr and iterator.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/unop/test-math.h: New define for
CVT like test case.
* gcc.target/riscv/rvv/autovec/vls/def.h: Ditto.
* gcc.target/riscv/rvv/autovec/unop/math-lrint-0.c: New test.
* gcc.target/riscv/rvv/autovec/unop/math-lrint-1.c: New test.
* gcc.target/riscv/rvv/autovec/unop/math-lrint-run-0.c: New test.
* gcc.target/riscv/rvv/autovec/unop/math-lrint-run-1.c: New test.
* gcc.target/riscv/rvv/autovec/vls/math-lrint-0.c: New test.
* gcc.target/riscv/rvv/autovec/vls/math-lrint-1.c: New test.
Signed-off-by:
Pan Li <pan2.li@intel.com>
Showing
- gcc/config/riscv/autovec.md 11 additions, 0 deletionsgcc/config/riscv/autovec.md
- gcc/config/riscv/riscv-protos.h 1 addition, 0 deletionsgcc/config/riscv/riscv-protos.h
- gcc/config/riscv/riscv-v.cc 20 additions, 0 deletionsgcc/config/riscv/riscv-v.cc
- gcc/config/riscv/vector-iterators.md 69 additions, 0 deletionsgcc/config/riscv/vector-iterators.md
- gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/math-lrint-0.c 14 additions, 0 deletions...estsuite/gcc.target/riscv/rvv/autovec/unop/math-lrint-0.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/math-lrint-1.c 14 additions, 0 deletions...estsuite/gcc.target/riscv/rvv/autovec/unop/math-lrint-1.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/math-lrint-run-0.c 63 additions, 0 deletions...uite/gcc.target/riscv/rvv/autovec/unop/math-lrint-run-0.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/math-lrint-run-1.c 63 additions, 0 deletions...uite/gcc.target/riscv/rvv/autovec/unop/math-lrint-run-1.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/test-math.h 24 additions, 0 deletionsgcc/testsuite/gcc.target/riscv/rvv/autovec/unop/test-math.h
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/def.h 9 additions, 0 deletionsgcc/testsuite/gcc.target/riscv/rvv/autovec/vls/def.h
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/math-lrint-0.c 30 additions, 0 deletions...testsuite/gcc.target/riscv/rvv/autovec/vls/math-lrint-0.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/math-lrint-1.c 30 additions, 0 deletions...testsuite/gcc.target/riscv/rvv/autovec/vls/math-lrint-1.c
Loading
Please register or sign in to comment