diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-11 13:18:23 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-11 13:18:23 +0000 |
commit | dc6401818b1509cf7617879b9c00bba5daba5c66 (patch) | |
tree | 47461ef6e6ecc6767cb94c718222286724e160c4 | |
parent | 6a70badb2c1f627cd669f2fcfaeca4a05db50b5b (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 21 |
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)], |