Michael Hope wrote:
HI there. I'm working on porting gcc to a new architecture which only does indirect addressing - there is no indirect with displacement.
The IA-64 target also has only indirect addressing. Well, it has some auto-increment addressing modes too, but that isn't relevant here. You could try looking at the IA-64 port to see why it works and yours doesn't.
The problem is with spill locations in GCC 4.4.0. The elimination code correctly elimates the frame and args pointer and replaces it with register X. The problem is that it then generates indirect with offset loads to load spilt values.
Since this is happening inside reload, first thing I would check is to make sure you handle REG_OK_STRICT correctly. Before reload, a pseudo-reg is a valid memory address. Inside reload, an unallocated pseudo-reg is actually a memory location, and hence can not be a valid memory address. This is controlled by REG_OK_STRICT.
Jim