diff options
author | Jeffrey A Law <law@cygnus.com> | 1998-04-07 20:51:37 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1998-04-07 14:51:37 -0600 |
commit | cc46ae8e686c69739474e868114ea5d5337a2271 (patch) | |
tree | 44df79c066e38be4ef97e5c2de952e4d1469a5d0 /gcc | |
parent | 0b3d64d2d1d8f16c16f2ace025d12fa15e0ecdf1 (diff) | |
download | gcc-cc46ae8e686c69739474e868114ea5d5337a2271.zip gcc-cc46ae8e686c69739474e868114ea5d5337a2271.tar.gz gcc-cc46ae8e686c69739474e868114ea5d5337a2271.tar.bz2 |
* pa.h (LEGITIMIZE_RELOAD_ADDRESS): Define.
From-SVN: r19036
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/config/pa/pa.h | 58 |
2 files changed, 62 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7c9e20d..f2d6bf8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +Tue Apr 7 21:48:52 1998 Jeffrey A Law (law@cygnus.com) + + * pa.h (LEGITIMIZE_RELOAD_ADDRESS): Define. + 1998-04-07 Ken Raeburn <raeburn@cygnus.com> * config/mips/mips.c (siginfo): Deleted. diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index db0f99e..b944388 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -1615,6 +1615,64 @@ extern struct rtx_def *hppa_builtin_saveregs (); && GET_CODE (XEXP (X, 1)) == UNSPEC) \ goto ADDR; \ } + +/* Look for machine dependent ways to make the invalid address AD a + valid address. + + For the PA, transform: + + memory(X + <large int>) + + into: + + if (<large int> & mask) >= 16 + Y = (<large int> & ~mask) + mask + 1 Round up. + else + Y = (<large int> & ~mask) Round down. + Z = X + Y + memory (Z + (<large int> - Y)); + + This makes reload inheritance and reload_cse work better since Z + can be reused. + + There may be more opportunities to improve code with this hook. */ +#define LEGITIMIZE_RELOAD_ADDRESS(AD, MODE, OPNUM, TYPE, IND, WIN) \ +do { \ + int offset, newoffset, mask; \ + mask = GET_MODE_CLASS (MODE) == MODE_FLOAT ? 0x1f : 0x3fff; \ + \ + if (GET_CODE (AD) == PLUS \ + && GET_CODE (XEXP (AD, 0)) == REG \ + && GET_CODE (XEXP (AD, 1)) == CONST_INT) \ + { \ + offset = INTVAL (XEXP ((AD), 1)); \ + \ + /* Choose rounding direction. Round up if we are >= halfway. */ \ + if ((offset & mask) >= ((mask + 1) / 2)) \ + newoffset = (offset & ~mask) + mask + 1; \ + else \ + newoffset = offset & ~mask; \ + \ + if (newoffset != 0 \ + && VAL_14_BITS_P (newoffset)) \ + { \ + rtx temp; \ + \ + /* Unshare the sum as well. */ \ + AD = copy_rtx (AD); \ + temp = gen_rtx_PLUS (Pmode, XEXP (AD, 0), \ + GEN_INT (newoffset)); \ + AD = gen_rtx_PLUS (Pmode, temp, GEN_INT (offset - newoffset));\ + push_reload (XEXP (AD, 0), 0, &XEXP (AD, 0), 0, \ + BASE_REG_CLASS, Pmode, VOIDmode, 0, 0, \ + (OPNUM), (TYPE)); \ + goto WIN; \ + } \ + } \ +} while (0) + + + /* Try machine-dependent ways of modifying an illegitimate address to be legitimate. If we find one, return the new, valid address. |