On Wed, Jul 19, 2006 at 02:12:09PM +0100, Saajan Singh Chana wrote:
> I have defined GO_IF_LEGITIMATE_ADDRESS() to only accept indexed 
> addresses where the index is HImode,

I was trying to get you to copy and paste your definition og
GO_IF_LEGITIMATE_ADDRESS() into your message. :-)

> and then LEGITIMIZE_ADDRESS to replace SImode index registers
> with a subreg.

I don't think you can do that. (plus:SI (reg:SI <index>) (reg:SI <base)) is a
different address than (plus:SI (zero_extend:SI (subreg:HI (reg:SI <index>)
0)) (reg:SI <base>)) unless you can somehow prove that the index fits inside
16 bits. Here's an example where you can't:

int foo (int *base, unsigned long int index)
{
        return (base[index]);
}

> This sometimes causes 
> ICEs in emit_move_insn or copy_to_mode_reg because the mode of the index 
> register is different to the mode of the PLUS or the MULT. 

> I'll try using a zero_extend as you suggested.

Btw, I suppose you might see things like

(mem:XX (plus:SI (zero_extend:SI (subreg:HI (reg:SI <index>)) 0)
                 (reg:SI <base>)))

as well as

(mem:XX (plus:SI (zero_extend:SI (reg:HI <index>))
                 (reg:SI <base>)))

and I think GO_IF_LEGITIMATE_ADDRESS() should accept either form. You'd see
the former before the reload pass and the latter both after and before
reload.

(Does GCC ever use (truncate:HI (reg:SI ...)) instead of
(subreg:HI (reg:SI ...) 0 )? Just wondering.)

> What is the advantage of using PSImode?  As far as I can see there is 
> nothing which specifies how many bits are actually used, so it would 
> seem to be treated the same as SImode.  The target machine doesn't have 
> special instructions for manipulating 24-bit pointers, all pointer moves 
> and arithmetic are done with 32-bit instructions.

OK, use SImode.

-- 
Rask Ingemann Lambertsen

Reply via email to