From: Jeffrey A Law Date: Tue, 7 Apr 1998 20:51:37 +0000 (+0000) Subject: * pa.h (LEGITIMIZE_RELOAD_ADDRESS): Define. X-Git-Tag: prereleases/egcs-1.1-prerelease~1784 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cc46ae8e686c69739474e868114ea5d5337a2271;p=thirdparty%2Fgcc.git * pa.h (LEGITIMIZE_RELOAD_ADDRESS): Define. From-SVN: r19036 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7c9e20dfe10f..f2d6bf8e6853 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 * config/mips/mips.c (siginfo): Deleted. diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index db0f99e5f44c..b944388d93a8 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 + ) + + into: + + if ( & mask) >= 16 + Y = ( & ~mask) + mask + 1 Round up. + else + Y = ( & ~mask) Round down. + Z = X + Y + memory (Z + ( - 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.