Specifics of `BASE_REG_CLASS` macro?

Jeff Law law@redhat.com
Fri Mar 31 15:39:00 GMT 2017


On 03/31/2017 09:09 AM, Maxim Blinov wrote:
> Hi,
>
> I am configuring a GCC backend for my CPU architecture. However, I am
> uncertain as to what I should define the `BASE_REG_CLASS` macro to.
>
>> Macro: BASE_REG_CLASS
>>
>> A macro whose definition is the name of the class to which a valid
>> base register must belong. A base register is one used in an address
>> which is the register value plus a displacement.
>
> So, I understand that this macro should return a class of registers
> which may appear in instructions of the following form:
>
> `move *(%reg + $offset), %reg`
>
> My architecture only permits register dereferencing with no offset,
> apart from the stack register. My questions are:
>
> Should I consequently define the BASE_REG_CLASS macro to return the
> stack pointer register class, and second...
I would define BASE_REG_CLASS to be any register that can be used for 
simple indirect addressing (that's the same as base+index with a zero 
index) and the stack pointer.  It may not matter much in the end though.

>
> What is the consequence of having no general registers be capable of
> being dereferenced with an immediate offset, in terms of the
> implementation-specific code that I would need to add, alongside the
> standard assortment of machine description files?
I think we've supported ports with similar restrictions in the past 
(ia64?).  My biggest worry would be in trying to still allow sp+offset.

You might consider not allowing sp+offset initially until you've got 
things mostly working, then look at allow sp+offset in limited cases to 
improve the generated code.

jeff



More information about the Gcc-help mailing list