aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-11 13:18:23 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-11 13:18:23 +0000
commitdc6401818b1509cf7617879b9c00bba5daba5c66 (patch)
tree47461ef6e6ecc6767cb94c718222286724e160c4
parent6a70badb2c1f627cd669f2fcfaeca4a05db50b5b (diff)
downloadgcc-dc6401818b1509cf7617879b9c00bba5daba5c66.zip
gcc-dc6401818b1509cf7617879b9c00bba5daba5c66.tar.gz
gcc-dc6401818b1509cf7617879b9c00bba5daba5c66.tar.bz2
[AArch64] Add const_offset field to aarch64_address_info
This patch records the integer value of the address offset in aarch64_address_info, so that it doesn't need to be re-extracted from the rtx. The SVE port will make more use of this. The patch also uses poly_int64 routines to manipulate the offset, rather than just handling CONST_INTs. 2018-01-11 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * config/aarch64/aarch64.c (aarch64_address_info): Add a const_offset field. (aarch64_classify_address): Initialize it. Track polynomial offsets. (aarch64_print_address_internal): Use it to check for a zero offset. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r256534
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/aarch64/aarch64.c21
2 files changed, 21 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0ed0a2a..f27395d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -2,6 +2,15 @@
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
+ * config/aarch64/aarch64.c (aarch64_address_info): Add a const_offset
+ field.
+ (aarch64_classify_address): Initialize it. Track polynomial offsets.
+ (aarch64_print_address_internal): Use it to check for a zero offset.
+
+2018-01-11 Richard Sandiford <richard.sandiford@linaro.org>
+ Alan Hayward <alan.hayward@arm.com>
+ David Sherwood <david.sherwood@arm.com>
+
* config/aarch64/aarch64-modes.def (NUM_POLY_INT_COEFFS): Set to 2.
* config/aarch64/aarch64-protos.h (aarch64_initial_elimination_offset):
Return a poly_int64 rather than a HOST_WIDE_INT.
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 7ab1377..ae44c2a 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -113,6 +113,7 @@ struct aarch64_address_info {
enum aarch64_address_type type;
rtx base;
rtx offset;
+ poly_int64 const_offset;
int shift;
enum aarch64_symbol_type symbol_type;
};
@@ -4545,6 +4546,8 @@ aarch64_classify_address (struct aarch64_address_info *info,
{
enum rtx_code code = GET_CODE (x);
rtx op0, op1;
+ poly_int64 offset;
+
HOST_WIDE_INT const_size;
/* On BE, we use load/store pair for all large int mode load/stores.
@@ -4573,6 +4576,7 @@ aarch64_classify_address (struct aarch64_address_info *info,
info->type = ADDRESS_REG_IMM;
info->base = x;
info->offset = const0_rtx;
+ info->const_offset = 0;
return aarch64_base_register_rtx_p (x, strict_p);
case PLUS:
@@ -4582,24 +4586,24 @@ aarch64_classify_address (struct aarch64_address_info *info,
if (! strict_p
&& REG_P (op0)
&& virt_or_elim_regno_p (REGNO (op0))
- && CONST_INT_P (op1))
+ && poly_int_rtx_p (op1, &offset))
{
info->type = ADDRESS_REG_IMM;
info->base = op0;
info->offset = op1;
+ info->const_offset = offset;
return true;
}
if (maybe_ne (GET_MODE_SIZE (mode), 0)
- && CONST_INT_P (op1)
- && aarch64_base_register_rtx_p (op0, strict_p))
+ && aarch64_base_register_rtx_p (op0, strict_p)
+ && poly_int_rtx_p (op1, &offset))
{
- HOST_WIDE_INT offset = INTVAL (op1);
-
info->type = ADDRESS_REG_IMM;
info->base = op0;
info->offset = op1;
+ info->const_offset = offset;
/* TImode and TFmode values are allowed in both pairs of X
registers and individual Q registers. The available
@@ -4679,13 +4683,12 @@ aarch64_classify_address (struct aarch64_address_info *info,
info->type = ADDRESS_REG_WB;
info->base = XEXP (x, 0);
if (GET_CODE (XEXP (x, 1)) == PLUS
- && CONST_INT_P (XEXP (XEXP (x, 1), 1))
+ && poly_int_rtx_p (XEXP (XEXP (x, 1), 1), &offset)
&& rtx_equal_p (XEXP (XEXP (x, 1), 0), info->base)
&& aarch64_base_register_rtx_p (info->base, strict_p))
{
- HOST_WIDE_INT offset;
info->offset = XEXP (XEXP (x, 1), 1);
- offset = INTVAL (info->offset);
+ info->const_offset = offset;
/* TImode and TFmode values are allowed in both pairs of X
registers and individual Q registers. The available
@@ -5735,7 +5738,7 @@ aarch64_print_address_internal (FILE *f, machine_mode mode, rtx x,
switch (addr.type)
{
case ADDRESS_REG_IMM:
- if (addr.offset == const0_rtx)
+ if (known_eq (addr.const_offset, 0))
asm_fprintf (f, "[%s]", reg_names [REGNO (addr.base)]);
else
asm_fprintf (f, "[%s, %wd]", reg_names [REGNO (addr.base)],