The subreg question

Ling-hua Tseng uranus@it.muds.net
Tue Apr 19 13:06:00 GMT 2005


James E Wilson wrote:
> Ling-hua Tseng wrote:
>> It's obvious that `movil' and `movim' are only access the partial 
>> 16-bit of the 32-bit register. How can I use RTL expression to 
>> represent the operations?
> 
> As you noticed, within a register, subreg can only be used for low
> parts.  You can't ask for the high part of a single register.  If you
> have an item that spans multiple registers, e.g. a 64-bit value that is
> contained in a register pair, then you can ask for the SImode highpart
> of a DImode reg and get valid RTL.  This works because the high part is
> an entire register.  This isn't useful to you.
> 
> Otherwise, you can access subparts via bitfield insert/extract
> operations, or logicals operations (ior/and), though this is likely to
> be tedious, and may confuse optimizers.
> 
> There are high/lo_sum RTL operators that may be useful to you.  You can use
>  (set (reg:SI) (high: ...))
>  (set (reg:SI) (lo_sum (reg:SI) (...)))
> where the first pattern corresponds to movims, and the second one to
> movil.  You could just as well use ior instead of lo_sum for the second
> pattern, this is probably better as movil does not do an add.
> 
> You may want to emit normal rtl for an SImode move, and then split it
> into its two 16-bit parts after reload.  This will avoid confusing RTL
> optimizers before reload.
> 
> We have vector modes which might be useful to you.  If you say a
> register is holding a V4QI mode value, then there are natural ways to
> get at the individual elements of the vector via vector operations.

I read the descriptions of (high:m exp) and (lo_sum:m x y) in the gcc internal manuls (Section 10.7 and 10.9).
The last line of their descriptions confused me because they wrote "m should be Pmode".
Is it really a strict rule?
The RTX "(set (reg:SI xx) (high:m yy))" seems to let m to be an integer mode.
Doesn't it lead to some undefined behaviors in the back-end passes?



More information about the Gcc mailing list