pa.h (CONSTANT_ADDRESS_P): Do not accept symbolic addresses.
* pa.h (CONSTANT_ADDRESS_P): Do not accept symbolic addresses. (LEGITIMIZE_ADDRESS): Just a stub now. Call hppa_legitimize_address to do the real work. From-SVN: r3570
This commit is contained in:
parent
e26d4611b5
commit
901a8cea7b
@ -1015,10 +1015,12 @@ extern union tree_node *current_function_decl;
|
|||||||
|
|
||||||
#define MAX_REGS_PER_ADDRESS 2
|
#define MAX_REGS_PER_ADDRESS 2
|
||||||
|
|
||||||
/* Recognize any constant value that is a valid address. */
|
/* Recognize any constant value that is a valid address except
|
||||||
|
for symbolic addresses. We get better CSE by rejecting them
|
||||||
#define CONSTANT_ADDRESS_P(X) CONSTANT_P (X)
|
here and allowing hppa_legitimize_address to break them up. */
|
||||||
|
|
||||||
|
#define CONSTANT_ADDRESS_P(X) \
|
||||||
|
(CONSTANT_P (X) && ! symbolic_expression_p (X))
|
||||||
|
|
||||||
/* Include all constant integers and constant doubles, but not
|
/* Include all constant integers and constant doubles, but not
|
||||||
floating-point, except for floating-point zero. */
|
floating-point, except for floating-point zero. */
|
||||||
@ -1191,73 +1193,14 @@ extern union tree_node *current_function_decl;
|
|||||||
GO_IF_LEGITIMATE_ADDRESS.
|
GO_IF_LEGITIMATE_ADDRESS.
|
||||||
|
|
||||||
It is always safe for this macro to do nothing. It exists to recognize
|
It is always safe for this macro to do nothing. It exists to recognize
|
||||||
opportunities to optimize the output.
|
opportunities to optimize the output. */
|
||||||
|
|
||||||
For the PA, transform:
|
extern struct rtx_def *hppa_legitimize_address ();
|
||||||
|
#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
|
||||||
memory(X + <large int>)
|
{ rtx orig_x = (X); \
|
||||||
|
(X) = hppa_legitimize_address (X, OLDX, MODE); \
|
||||||
into:
|
if ((X) != orig_x && memory_address_p (MODE, X)) \
|
||||||
|
goto WIN; }
|
||||||
Y = <large int> & ~mask;
|
|
||||||
Z = X + Y
|
|
||||||
memory (Z + (<large int> & mask));
|
|
||||||
|
|
||||||
This is for CSE to find several similar references, and only use one Z.
|
|
||||||
|
|
||||||
MODE_FLOAT references allow displacements which fit in 5 bits, so use
|
|
||||||
0xf as the mask.
|
|
||||||
|
|
||||||
MODE_INT references allow displacements which fit in 11 bits, so use
|
|
||||||
0x1fff as the mask.
|
|
||||||
|
|
||||||
This relies on the fact that most mode MODE_FLOAT references will use FP
|
|
||||||
registers and most mode MODE_INT references will use integer registers.
|
|
||||||
(In the rare case of an FP register used in an integer MODE, we depend
|
|
||||||
on secondary reloads and the final output pass to clean things up.)
|
|
||||||
|
|
||||||
|
|
||||||
It is also beneficial to handle (plus (mult (X) (Y)) (Z)) in a special
|
|
||||||
manner if Y is 2, 4, or 8. (allows more shadd insns and shifted indexed
|
|
||||||
adressing modes to be used).
|
|
||||||
|
|
||||||
Put X and Z into registers. Then put the entire expression into
|
|
||||||
a register. */
|
|
||||||
|
|
||||||
#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
|
|
||||||
{ if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == REG \
|
|
||||||
&& GET_CODE (XEXP (X, 1)) == CONST_INT) \
|
|
||||||
{ \
|
|
||||||
rtx int_reg, ptr_reg; \
|
|
||||||
int offset = INTVAL (XEXP (X, 1)); \
|
|
||||||
int mask = GET_MODE_CLASS (mode) == MODE_FLOAT ? 0xf \
|
|
||||||
: 0x1fff; \
|
|
||||||
int_reg = force_reg (SImode, GEN_INT (offset & ~ mask)); \
|
|
||||||
ptr_reg = force_reg (SImode, \
|
|
||||||
gen_rtx (PLUS, SImode, \
|
|
||||||
XEXP (X, 0), int_reg)); \
|
|
||||||
X = plus_constant (ptr_reg, offset & mask); \
|
|
||||||
goto WIN; \
|
|
||||||
} \
|
|
||||||
if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == MULT \
|
|
||||||
&& GET_CODE (XEXP (XEXP (X, 0), 1)) == CONST_INT \
|
|
||||||
&& shadd_constant_p (INTVAL (XEXP (XEXP (X, 0), 1)))) \
|
|
||||||
{ \
|
|
||||||
int val = INTVAL (XEXP (XEXP (X, 0), 1)); \
|
|
||||||
rtx reg1, reg2; \
|
|
||||||
reg1 = force_reg (SImode, force_operand (XEXP (X, 1), 0));\
|
|
||||||
reg2 = force_reg (SImode, \
|
|
||||||
force_operand (XEXP (XEXP (X, 0), 0), 0));\
|
|
||||||
(X) = force_reg (SImode, \
|
|
||||||
gen_rtx (PLUS, SImode, \
|
|
||||||
gen_rtx (MULT, SImode, reg2, \
|
|
||||||
GEN_INT (val)), \
|
|
||||||
reg1)); \
|
|
||||||
goto WIN; \
|
|
||||||
} \
|
|
||||||
if (flag_pic) (X) = legitimize_pic_address (X, MODE, gen_reg_rtx (Pmode));\
|
|
||||||
if (memory_address_p (MODE, X)) \
|
|
||||||
goto WIN;}
|
|
||||||
|
|
||||||
/* Go to LABEL if ADDR (a legitimate address expression)
|
/* Go to LABEL if ADDR (a legitimate address expression)
|
||||||
has an effect that depends on the machine mode it is used for. */
|
has an effect that depends on the machine mode it is used for. */
|
||||||
|
Loading…
Reference in New Issue
Block a user