[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc
Subject:    Re: Base register restrictions
From:       Jim Wilson <wilson () codesourcery ! com>
Date:       2009-06-30 2:24:38
Message-ID: 4A497766.6040909 () codesourcery ! com
[Download RAW message or body]

Dobes wrote:
> I am working on a port to an architecture with some strict rules.  The
> restriction that I am unable to figure out how to enforce is a base register
> that is allowed in the destination operand, but not in a source operand. 

GCC does not provide any way in the old GO_IF_LEGITIMATE_ADDRESS (or the 
new TARGET_LEGITIMATE_ADDRESS_P) to distinguish between an address used 
in a dest and an address used in a source.  You probably just have to 
limit this to addresses that are valid in both places.  You can then add 
extra constraints to try to recognize other types of memory addresses. 
So you could use "mR" for destination operands and "mS" for source 
operands, where R and S are extra constraints that have been defined 
appropriately.  An example to look at might be the s390 port.  The movti 
pattern for instance uses QRST, where only Q and S can be in the dest, 
but any of Q, R, S, or T can be in the source.  And it doesn't seem to 
use 'm' much.

If you don't have a set of base registers that are valid both in source 
and dest addresses, then this probably gets messy.

Of course, it would be nice if gcc handled this better, but fixing this 
is probably a lot of work.

Jim
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic