-
- Downloads
RISC-V: Refine unsigned avg_floor/avg_ceil
This patch is inspired by LLVM patches: https://github.com/llvm/llvm-project/pull/76550 https://github.com/llvm/llvm-project/pull/77473 Use vaaddu for AVG vectorization. Before this patch: vsetivli zero,8,e8,mf2,ta,ma vle8.v v3,0(a1) vle8.v v2,0(a2) vwaddu.vv v1,v3,v2 vsetvli zero,zero,e16,m1,ta,ma vadd.vi v1,v1,1 vsetvli zero,zero,e8,mf2,ta,ma vnsrl.wi v1,v1,1 vse8.v v1,0(a0) ret After this patch: vsetivli zero,8,e8,mf2,ta,ma csrwi vxrm,0 vle8.v v1,0(a1) vle8.v v2,0(a2) vaaddu.vv v1,v1,v2 vse8.v v1,0(a0) ret Note on signed averaging addition Based on the rvv spec, there is also a variant for signed averaging addition called vaadd. But AFAIU, no matter in which rounding mode, we cannot achieve the semantic of signed averaging addition through vaadd. Thus this patch only introduces vaaddu. More details in: https://github.com/riscv/riscv-v-spec/issues/935 https://github.com/riscv/riscv-v-spec/issues/934 Tested on both RV32 and RV64 no regression. Ok for trunk ? gcc/ChangeLog: * config/riscv/autovec.md (<u>avg<v_double_trunc>3_floor): Remove. (avg<v_double_trunc>3_floor): New pattern. (<u>avg<v_double_trunc>3_ceil): Remove. (avg<v_double_trunc>3_ceil): New pattern. (uavg<mode>3_floor): Ditto. (uavg<mode>3_ceil): Ditto. * config/riscv/riscv-protos.h (enum insn_flags): Add for average addition. (enum insn_type): Ditto. * config/riscv/riscv-v.cc: Ditto. * config/riscv/vector-iterators.md (ashiftrt): Remove. (ASHIFTRT): Ditto. * config/riscv/vector.md: Add VLS modes. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vls/avg-1.c: Adapt test. * gcc.target/riscv/rvv/autovec/vls/avg-2.c: Ditto. * gcc.target/riscv/rvv/autovec/vls/avg-3.c: Ditto. * gcc.target/riscv/rvv/autovec/vls/avg-4.c: Ditto. * gcc.target/riscv/rvv/autovec/vls/avg-5.c: Ditto. * gcc.target/riscv/rvv/autovec/vls/avg-6.c: Ditto. * gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c: Ditto. * gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c: Ditto.
Showing
- gcc/config/riscv/autovec.md 38 additions, 12 deletionsgcc/config/riscv/autovec.md
- gcc/config/riscv/riscv-protos.h 8 additions, 0 deletionsgcc/config/riscv/riscv-protos.h
- gcc/config/riscv/riscv-v.cc 11 additions, 0 deletionsgcc/config/riscv/riscv-v.cc
- gcc/config/riscv/vector-iterators.md 0 additions, 5 deletionsgcc/config/riscv/vector-iterators.md
- gcc/config/riscv/vector.md 6 additions, 6 deletionsgcc/config/riscv/vector.md
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c 2 additions, 2 deletionsgcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c 2 additions, 2 deletionsgcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c 2 additions, 2 deletionsgcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-4.c 3 additions, 3 deletionsgcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-4.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-5.c 3 additions, 3 deletionsgcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-5.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-6.c 3 additions, 3 deletionsgcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-6.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c 4 additions, 3 deletions...uite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c
- gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c 4 additions, 3 deletions...uite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c
Loading
Please register or sign in to comment