On 01/22/10 07:10, Mohamed Shafi wrote:
Hi all,
I am doing a port of a 32bit target in GCC 4.4.0. I have written the
macro legitimize_reload_address which does something similar to what
the target pa does. i.e
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));
The input for the macro is
(plus:SI (reg/f:SI 23 r7)
(const_int 65536 [0x10000]))
and the target support only 15bit signed offset so in
legitimize_reload_address i have
mask = 0x3fff;
offset = INTVAL (XEXP ((addr), 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;
/* Ensure that long displacements are aligned. */
newoffset&= ~(GET_MODE_SIZE (mode) - 1);
if (newoffset)
{
temp = gen_rtx_PLUS (Pmode, XEXP (addr, 0),
GEN_INT (newoffset));
addr = gen_rtx_PLUS (Pmode, temp, GEN_INT (offset - newoffset));
push_reload (XEXP (addr, 0), 0,&XEXP (addr, 0), 0,
BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
opnum, type);
return addr;
}
The macro is defined like this:
#define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_L,WIN) \
do { \
rtx new_x = legitimize_reload_address (X, MODE, OPNUM, TYPE, IND_L); \
if (new_x) \
{ \
X = new_x; \
goto WIN; \
} \
} while (0)
I issue that i am facing is that if i return null_rtx without doing
any processing the complier works propely. But if
legitimize_reload_address gets executed and jumbs to the label WIN
iget ICE.
ice1.c:5: error: unrecognizable insn:
(insn 45 44 20 2 ice1.c:5 (set (mem/c:SI (plus:SI (reg:SI 16 r0)
(const_int 65536 [0x10000])) [4 S4 A32])
(reg:SI 2 d2)) -1 (nil))
Is there something wrong with my legitimize_relaod_address?
Perhaps. However, I would strongly recommend you get your port working
before defining LEGITIMIZE_RELOAD_ADDRESS. It should not be required
for proper operation, particularly for the case you're dealing with.
Once your port is working, particularly any special cases for secondary
reloads, then go back and enable LEGITIMIZE_RELOAD_ADDRESS.
As for debugging LEGITIMIZE_RELOAD_ADDRESS, be aware that properly
defining this macro often requires knowing how reload itself works and
the ability to predict how reload will react to changes you make in
LEGITIMIZE_RELOAD_ADDRESS. With that in mind, I would start by
examining the addresses passed to LEGITIMIZE_RELOAD_ADDRESS, the
resulting insns & reload to verify they all look as you expect.
Jeff