REG_ALLOC_ORDER and Altivec registers

Dale Johannesen dalej@apple.com
Thu Mar 1 19:47:00 GMT 2007


On Mar 1, 2007, at 12:57 AM, Tehila Meyzels wrote:
> Revital Eres  wrote on 01/03/2007 10:37:36:
>> Hello,
>>
>> I wonder why this order (non-consecutive, decreasing) of Altivec
> registers
>> was chosen when specifying the allocation order in REG_ALLOC_ORDER.
>>
>> (taken from rs6000.h)
>>
>>    /* AltiVec registers.  */                                    \
>>    77, 78,                                                      \
>>    90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80,                  \
>>    79,                                                          \
>>    96, 95, 94, 93, 92, 91,                                      \
>>    108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97,     \
>>    109, 110,                                                    \
>>    111, 112, 113                                                \
>>
>
> I think part of the answer can be found here:
> http://gcc.gnu.org/ml/gcc/2003-06/msg00902.html
> "We have found that re-arranging the REG_ALLOC_ORDER in rs6000.h so  
> that all
> the FP registers come after the integer registers greatly reduces the
> tendency of the compiler to generate code that moves 8-byte quantites
> through the FP registers."

I don't think so, the ordering above is in the original Altivec patch  
here
http://gcc.gnu.org/ml/gcc-patches/2001-11/msg00453.html
which precedes that discussion by over a year.

Obviously you want to use caller-saved registers before callee-saved  
ones.

The consecutive reverse ordering of the callee-saved registers  
matches the
ordering in the save/restore routines in the Altivec PIM (also found in
darwin-vecsave.asm), which is desirable for that mechanism to work well.
(The common ordering doesn't logically have to be reversed; I'd guess  
that
was chosen to be analogous to the integer stmw/lmw instructions.)

The ordering of the caller-saved regs looks odd to me.   V13..V2  
should be used
in that order to minimize conflict with parameters and return  
values.  V0 and V1
are preferred to those, and I'd expect V14..V19 to be preferred also,  
but they
aren't.  Perhaps to minimize the code that sets up VRsave?



More information about the Gcc mailing list