Commit 07217645 by Richard Kenner Committed by Richard Kenner

recog.c (offsettable_address_p): Handle LO_SUM case.

	* recog.c (offsettable_address_p): Handle LO_SUM case.
	* config/mips/mips.c (double_memory_operand): Use adjust_address_nv
	instead of plus_constant.

From-SVN: r43912
parent 91667711
Tue Jul 10 07:27:53 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* recog.c (offsettable_address_p): Handle LO_SUM case.
* config/mips/mips.c (double_memory_operand): Use adjust_address_nv
instead of plus_constant.
2001-07-10 Stephane Carrez <Stephane.Carrez@worldnet.fr> 2001-07-10 Stephane Carrez <Stephane.Carrez@worldnet.fr>
* reload1.c (merge_assigned_reloads): After a RELOAD_OTHER merge, * reload1.c (merge_assigned_reloads): After a RELOAD_OTHER merge,
......
...@@ -838,8 +838,6 @@ double_memory_operand (op, mode) ...@@ -838,8 +838,6 @@ double_memory_operand (op, mode)
rtx op; rtx op;
enum machine_mode mode; enum machine_mode mode;
{ {
rtx addr;
if (GET_CODE (op) != MEM if (GET_CODE (op) != MEM
|| ! memory_operand (op, mode)) || ! memory_operand (op, mode))
{ {
...@@ -939,14 +937,12 @@ double_memory_operand (op, mode) ...@@ -939,14 +937,12 @@ double_memory_operand (op, mode)
/* Make sure that 4 added to the address is a valid memory address. /* Make sure that 4 added to the address is a valid memory address.
This essentially just checks for overflow in an added constant. */ This essentially just checks for overflow in an added constant. */
addr = XEXP (op, 0); if (CONSTANT_ADDRESS_P (XEXP (op, 0)))
if (CONSTANT_ADDRESS_P (addr))
return 1; return 1;
return memory_address_p ((GET_MODE_CLASS (mode) == MODE_INT op = adjust_address_nv (op, GET_MODE_CLASS (mode) == MODE_INT
? SImode : SFmode), ? SImode : SFmode, 4);
plus_constant (addr, 4)); return memory_address_p (XEXP (op, 0));
} }
/* Return nonzero if the code of this rtx pattern is EQ or NE. */ /* Return nonzero if the code of this rtx pattern is EQ or NE. */
......
...@@ -1963,8 +1963,12 @@ offsettable_address_p (strictp, mode, y) ...@@ -1963,8 +1963,12 @@ offsettable_address_p (strictp, mode, y)
/* The offset added here is chosen as the maximum offset that /* The offset added here is chosen as the maximum offset that
any instruction could need to add when operating on something any instruction could need to add when operating on something
of the specified mode. We assume that if Y and Y+c are of the specified mode. We assume that if Y and Y+c are
valid addresses then so is Y+d for all 0<d<c. */ valid addresses then so is Y+d for all 0<d<c. adjust_address will
go inside a LO_SUM here, so we do so as well. */
if (GET_CODE (y) == LO_SUM)
z = gen_rtx_LO_SUM (GET_MODE (y), XEXP (y, 0),
plus_constant (XEXP (y, 1), mode_sz - 1));
else
z = plus_constant (y, mode_sz - 1); z = plus_constant (y, mode_sz - 1);
/* Use QImode because an odd displacement may be automatically invalid /* Use QImode because an odd displacement may be automatically invalid
......
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