Commit 15052bd1 by Bernd Schmidt Committed by Nick Clifton

Treat QImode addresses the same way GO_IF_LEGITIMATE_INDEX does.

From-SVN: r30500
parent e428d738
Fri Nov 12 13:31:54 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* config/arm/arm.h (LEGITIMIZE_RELOAD_ADDRESS): Treat QImode
addresses the same way GO_IF_LEGITIMATE_INDEX does.
Fri Nov 12 12:36:04 1999 Bernd Schmidt <bernds@cygnus.co.uk> Fri Nov 12 12:36:04 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* cse.c (hash_arg_in_struct): Delete. * cse.c (hash_arg_in_struct): Delete.
......
...@@ -1015,52 +1015,52 @@ enum reg_class ...@@ -1015,52 +1015,52 @@ enum reg_class
For the ARM, we wish to handle large displacements off a base For the ARM, we wish to handle large displacements off a base
register by splitting the addend across a MOV and the mem insn. register by splitting the addend across a MOV and the mem insn.
This can cut the number of reloads needed. */ This can cut the number of reloads needed. */
#define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_LEVELS, WIN) \ #define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_LEVELS, WIN) \
do \ do \
{ \ { \
if (GET_CODE (X) == PLUS \ if (GET_CODE (X) == PLUS \
&& GET_CODE (XEXP (X, 0)) == REG \ && GET_CODE (XEXP (X, 0)) == REG \
&& REGNO (XEXP (X, 0)) < FIRST_PSEUDO_REGISTER \ && REGNO (XEXP (X, 0)) < FIRST_PSEUDO_REGISTER \
&& REG_MODE_OK_FOR_BASE_P (XEXP (X, 0), MODE) \ && REG_MODE_OK_FOR_BASE_P (XEXP (X, 0), MODE) \
&& GET_CODE (XEXP (X, 1)) == CONST_INT) \ && GET_CODE (XEXP (X, 1)) == CONST_INT) \
{ \ { \
HOST_WIDE_INT val = INTVAL (XEXP (X, 1)); \ HOST_WIDE_INT val = INTVAL (XEXP (X, 1)); \
HOST_WIDE_INT low, high; \ HOST_WIDE_INT low, high; \
\ \
if (MODE == DImode || (TARGET_SOFT_FLOAT && MODE == DFmode)) \ if (MODE == DImode || (TARGET_SOFT_FLOAT && MODE == DFmode)) \
low = ((val & 0xf) ^ 0x8) - 0x8; \ low = ((val & 0xf) ^ 0x8) - 0x8; \
else if (MODE == SImode || MODE == QImode \ else if (MODE == SImode \
|| (MODE == SFmode && TARGET_SOFT_FLOAT) \ || (MODE == SFmode && TARGET_SOFT_FLOAT) \
|| (MODE == HImode && ! arm_arch4)) \ || ((MODE == HImode || MODE == QImode) && ! arm_arch4)) \
/* Need to be careful, -4096 is not a valid offset */ \ /* Need to be careful, -4096 is not a valid offset */ \
low = val >= 0 ? (val & 0xfff) : -((-val) & 0xfff); \ low = val >= 0 ? (val & 0xfff) : -((-val) & 0xfff); \
else if (MODE == HImode && arm_arch4) \ else if ((MODE == HImode || MODE == QImode) && arm_arch4) \
/* Need to be careful, -256 is not a valid offset */ \ /* Need to be careful, -256 is not a valid offset */ \
low = val >= 0 ? (val & 0xff) : -((-val) & 0xff); \ low = val >= 0 ? (val & 0xff) : -((-val) & 0xff); \
else if (GET_MODE_CLASS (MODE) == MODE_FLOAT \ else if (GET_MODE_CLASS (MODE) == MODE_FLOAT \
&& TARGET_HARD_FLOAT) \ && TARGET_HARD_FLOAT) \
/* Need to be careful, -1024 is not a valid offset */ \ /* Need to be careful, -1024 is not a valid offset */ \
low = val >= 0 ? (val & 0x3ff) : -((-val) & 0x3ff); \ low = val >= 0 ? (val & 0x3ff) : -((-val) & 0x3ff); \
else \ else \
break; \ break; \
\ \
high = ((((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000); \ high = ((((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000); \
/* Check for overflow or zero */ \ /* Check for overflow or zero */ \
if (low == 0 || high == 0 || (high + low != val)) \ if (low == 0 || high == 0 || (high + low != val)) \
break; \ break; \
\ \
/* Reload the high part into a base reg; leave the low part \ /* Reload the high part into a base reg; leave the low part \
in the mem. */ \ in the mem. */ \
X = gen_rtx_PLUS (GET_MODE (X), \ X = gen_rtx_PLUS (GET_MODE (X), \
gen_rtx_PLUS (GET_MODE (X), XEXP (X, 0), \ gen_rtx_PLUS (GET_MODE (X), XEXP (X, 0), \
GEN_INT (high)), \ GEN_INT (high)), \
GEN_INT (low)); \ GEN_INT (low)); \
push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL_PTR, \ push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL_PTR, \
BASE_REG_CLASS, GET_MODE (X), VOIDmode, 0, 0, \ BASE_REG_CLASS, GET_MODE (X), VOIDmode, 0, 0, \
OPNUM, TYPE); \ OPNUM, TYPE); \
goto WIN; \ goto WIN; \
} \ } \
} \ } \
while (0) while (0)
/* Return the maximum number of consecutive registers /* Return the maximum number of consecutive registers
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment