[AArch64] Improve LDP/STP generation that requires a base register
authorJackson Woodruff <jackson.woodruff@arm.com>
Wed, 30 May 2018 10:59:25 +0000 (10:59 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Wed, 30 May 2018 10:59:25 +0000 (10:59 +0000)
commitd0b51297b0b12584251e4eebcd7d8e6fd48edc20
tree21ad00bd75ac07a9a1b087a73e2a2587e24d064f
parent2eb2847ec54a3262f303f47697c5e5cbe3cc089d
[AArch64] Improve LDP/STP generation that requires a base register

This patch generalizes the formation of LDP/STP that require a base register.

In AArch64, LDP/STP instructions have different sized immediate offsets than
normal LDR/STR instructions. This part of the backend attempts to spot groups
of four LDR/STR instructions that can be turned into LDP/STP instructions by
using a base register.

Previously, we would only accept address pairs that were ordered in ascending
or descending order, and only strictly sequential loads/stores. In fact, the
instructions that we generate from this should be able to consider any order
of loads or stores (provided that they can be re-ordered). They should also be
able to accept non-sequential loads and stores provided that the two pairs of
addresses are amenable to pairing. The current code is also overly restrictive
on the range of addresses that are accepted, as LDP/STP instructions may take
negative offsets as well as positive ones.

This patch improves that by allowing us to accept all orders of loads/stores
that are valid, and extending the range that the LDP/STP addresses can reach.

2017-05-30  Jackson Woodruff  <jackson.woodruff@arm.com>

* config/aarch64/aarch64.c (aarch64_host_wide_int_compare): New.
(aarch64_ldrstr_offset_compare): New.
(aarch64_operands_adjust_ok_for_ldpstp): Update to consider all
load/store orderings.
(aarch64_gen_adjusted_ldpstp): Likewise.

* gcc.target/aarch64/simd/ldp_stp_9: New.
* gcc.target/aarch64/simd/ldp_stp_10: New.
* gcc.target/aarch64/simd/ldp_stp_11: New.
* gcc.target/aarch64/simd/ldp_stp_12: New.

From-SVN: r260952
gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/ldp_stp_10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/ldp_stp_11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/ldp_stp_12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/ldp_stp_9.c [new file with mode: 0644]