summaryrefslogtreecommitdiff
path: root/gcc/config/aarch64/aarch64.c
diff options
context:
space:
mode:
authorwilco <wilco@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-08 19:18:33 +0000
committerwilco <wilco@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-08 19:18:33 +0000
commit8da6e78e68cb290a046135f0d8c5b40e28805f5d (patch)
treee2fecc79734bfc862c1cce548342eddf0fd76f1f /gcc/config/aarch64/aarch64.c
parent64215350809ec3d3ed76ab210223819845b4e0cc (diff)
downloadgcc-8da6e78e68cb290a046135f0d8c5b40e28805f5d.tar.gz
This patch fixes an issue in aarch64_classify_address. TImode and TFmode
can either use a 64-bit LDP/STP or 128-bit LDR/STR. The addressing mode must be carefully modelled as the intersection of both. This is done for the immediate offsets, however load_store_pair_p must be set as well to avoid LDP with a PC-relative address if aarch64_pcrelative_literal_loads is true. gcc/ PR target/78733 * config/aarch64/aarch64.c (aarch64_classify_address): Set load_store_pair_p for TImode and TFmode. testsuite/ * gcc.target/aarch64/pr78733.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@243456 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/aarch64/aarch64.c')
-rw-r--r--gcc/config/aarch64/aarch64.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 1a06432655e..e87831f56e9 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -4273,8 +4273,11 @@ aarch64_classify_address (struct aarch64_address_info *info,
enum rtx_code code = GET_CODE (x);
rtx op0, op1;
- /* On BE, we use load/store pair for all large int mode load/stores. */
+ /* On BE, we use load/store pair for all large int mode load/stores.
+ TI/TFmode may also use a load/store pair. */
bool load_store_pair_p = (outer_code == PARALLEL
+ || mode == TImode
+ || mode == TFmode
|| (BYTES_BIG_ENDIAN
&& aarch64_vect_struct_mode_p (mode)));