[LLVMdev] Linux/ppc backend
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed Feb 14 07:19:09 PST 2007
Hi Chris,
Chris Lattner wrote:
>> 2) Line 369 of PPCInstrInfo.td, we declare the non-callee saved registers.
>> However, Linux and Darwin do not have the same set
>> of non-callee saved registers. I don't know how to make the if(isDarwin) test
>> in here
>>
>
> Take a look at ARM/ARMRegisterInfo.td for an example of this
I tried to define Defs just like ARMRegisterInfo.td does with different
subtargets, but i get the obvious
message:
Value 'Defs' of type 'list<Register>' is incompatible with initializer '[{
(the code is at the end of this mail)
I'm not sure how to play with Defs and what to write in a .td file. I
tried a top-level if with a Predicate:
def IsMacho : Predicate<"Subtarget->isMachoABI()">;
if (isMacho) let Defs = ....
else Defs = ...
But this fails too.
Any other ideas on how to get this right?
Thx,
Nicolas
let isCall = 1, noResults = 1, PPC970_Unit = 7,
// All calls clobber the non-callee saved registers...
Defs = [{
static const unsigned Defs_ELF[] =
{R0,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,
F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,
V0,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16,V17,V18,V19,
LR,CTR,
CR0,CR1,CR5,CR6,CR7}
static const unsigned Defs_Macho[] =
{R0,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,
F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13,
V0,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16,V17,V18,V19,
LR,CTR,
CR0,CR1,CR5,CR6,CR7}
GPRClass::iterator
GPRClass::allocation_order_begin(const MachineFunction &MF) const {
const TargetMachine &TM = MF.getTarget();
const PPCSubtarget &Subtarget = TM.getSubtarget<PPCSubtarget>();
if (Subtarget.isMachoABI()){
return Defs_Macho;
} else {
return Defs_ELF;
}
}
GPRClass::iterator
GPRClass::allocation_order_end(const MachineFunction &MF) const {
const TargetMachine &TM = MF.getTarget();
const MRegisterInfo *RI = TM.getRegisterInfo();
const PPCSubtarget &Subtarget = TM.getSubtarget<PPCSubtarget>();
GPRClass::iterator I;
if (Subtarget.isMachoABI()) {
I = Defs_Macho + (sizeof(Defs_Macho)/sizeof(unsigned));
} else {
I = Defs_ELF + (sizeof(Defs_ELF)/sizeof(unsigned));
}
return I;
}
}]
in {
// Convenient aliases for call instructions
def BL : IForm<18, 0, 1, (ops calltarget:$func, variable_ops),
"bl $func", BrB, []>; // See Pat patterns
below.
def BLA : IForm<18, 1, 1, (ops aaddr:$func, variable_ops),
"bla $func", BrB, [(PPCcall (i32 imm:$func))]>;
def BCTRL : XLForm_2_ext<19, 528, 20, 0, 1, (ops variable_ops),
"bctrl", BrB,
[(PPCbctrl)]>;
}
More information about the llvm-dev
mailing list