Ian Lance Taylor wrote:
daniel tian <daniel.xnt...@gmail.com> writes:
There is a problem I encountered. I port gcc to 32bit RISC. The
LOAD/STORE only has 8bit displacement. If the immediate displacement
larger than 256, the displacement must be force into register. In
addition, if the immediate is larger than 512, it can only move into
one specified register R0.
Like:
LW R2 (R1) #252 ;; means R2 = Mem(R1 + 255)
LW R2 (R1) #508;; it is wrong. immediate 508 should force into
register first.
LW R2 (R1) #0x500;; it is wrong, immediate 0x500 should force into
register R0 first.
Now, for immediate movement, it is achieved to move large immediate.
But I don't know how to make the address mode legitimate. Now I try to
add the code in LEGITIMIZE_RELOAD_ADDRESS like sh.md, or arm.md. But
cc1 still crashed, when the frame size is larger than 255. Do I miss
something?
I would fix this in LEGITIMIZE_RELOAD_ADDRESS or in
TARGET_SECONDARY_RELOAD. I don't know why cc1 crashed, you will have to
debug that.
LEGITIMIZE_RELOAD_ADDRESS is not the right place to handle this --
LEGITIMIZE_RELOAD_ADDRESS is to be used when target specific approaches
for reloading can generate more efficient code than the generic code in
reload. The generic code should be producing correct, though
potentially inefficient code.
I do agree that the target is going to need secondary reload support.
jeff