]> gcc.gnu.org Git - gcc.git/commit
aarch64: Use SVE's RDVL instruction
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 5 Dec 2023 10:11:18 +0000 (10:11 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 5 Dec 2023 10:11:18 +0000 (10:11 +0000)
commit80f47d7bbe38234e1530d27fe5c2f130223ca7a0
tree156bdf4004485e1ae4a121ba8d674545db66a56a
parentc0cf2c893d54420b0c19fee7bd41ae40017d0106
aarch64: Use SVE's RDVL instruction

We didn't previously use SVE's RDVL instruction, since the CNT*
forms are preferred and provide most of the range.  However,
there are some cases that RDVL can handle and CNT* can't,
and using RDVL-like instructions becomes important for SME.

gcc/
* config/aarch64/aarch64-protos.h (aarch64_sve_rdvl_immediate_p)
(aarch64_output_sve_rdvl): Declare.
* config/aarch64/aarch64.cc (aarch64_sve_cnt_factor_p): New
function, split out from...
(aarch64_sve_cnt_immediate_p): ...here.
(aarch64_sve_rdvl_factor_p): New function.
(aarch64_sve_rdvl_immediate_p): Likewise.
(aarch64_output_sve_rdvl): Likewise.
(aarch64_offset_temporaries): Rewrite the SVE handling to use RDVL
for some cases.
(aarch64_expand_mov_immediate): Handle RDVL immediates.
(aarch64_mov_operand_p): Likewise.
* config/aarch64/constraints.md (Usr): New constraint.
* config/aarch64/aarch64.md (*mov<SHORT:mode>_aarch64): Add an RDVL
alternative.
(*movsi_aarch64, *movdi_aarch64): Likewise.

gcc/testsuite/
* gcc.target/aarch64/sve/acle/asm/cntb.c: Tweak expected output.
* gcc.target/aarch64/sve/acle/asm/cnth.c: Likewise.
* gcc.target/aarch64/sve/acle/asm/cntw.c: Likewise.
* gcc.target/aarch64/sve/acle/asm/cntd.c: Likewise.
* gcc.target/aarch64/sve/acle/asm/prfb.c: Likewise.
* gcc.target/aarch64/sve/acle/asm/prfh.c: Likewise.
* gcc.target/aarch64/sve/acle/asm/prfw.c: Likewise.
* gcc.target/aarch64/sve/acle/asm/prfd.c: Likewise.
* gcc.target/aarch64/sve/loop_add_4.c: Expect RDVL to be used
to calculate the -17 and 17 factors.
* gcc.target/aarch64/sve/pcs/stack_clash_1.c: Likewise the 18 factor.
14 files changed:
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.cc
gcc/config/aarch64/aarch64.md
gcc/config/aarch64/constraints.md
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/cntb.c
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/cntd.c
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/cnth.c
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/cntw.c
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/prfb.c
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/prfd.c
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/prfh.c
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/prfw.c
gcc/testsuite/gcc.target/aarch64/sve/loop_add_4.c
gcc/testsuite/gcc.target/aarch64/sve/pcs/stack_clash_1.c
This page took 0.063167 seconds and 5 git commands to generate.