mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-16 14:31:59 +00:00
Restrict Thumb1 register allocation to low registers, even for instructions that
can access the hi regs. Our prologue and epilogue code doesn't know how to properly handle save/restore of the hi regs, so things go badly when we alloc them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84982 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c9dfeb1be8
commit
2f1abe2dae
@ -166,10 +166,20 @@ def GPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
|
||||
ARM::R4, ARM::R5, ARM::R6,
|
||||
ARM::R8, ARM::R9, ARM::R10,ARM::R11,ARM::R7 };
|
||||
|
||||
// For Thumb1 mode, we don't want to allocate hi regs at all, as we
|
||||
// don't know how to spill them. If we make our prologue/epilogue code
|
||||
// smarter at some point, we can go back to using the above allocation
|
||||
// orders for the Thumb1 instructions that know how to use hi regs.
|
||||
static const unsigned THUMB_GPR_AO[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R4, ARM::R5, ARM::R6, ARM::R7 };
|
||||
|
||||
GPRClass::iterator
|
||||
GPRClass::allocation_order_begin(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
|
||||
if (Subtarget.isThumb1Only())
|
||||
return THUMB_GPR_AO;
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.isR9Reserved())
|
||||
return ARM_GPR_AO_4;
|
||||
@ -192,6 +202,12 @@ def GPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
|
||||
const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
|
||||
GPRClass::iterator I;
|
||||
|
||||
if (Subtarget.isThumb1Only()) {
|
||||
I = THUMB_GPR_AO + (sizeof(THUMB_GPR_AO)/sizeof(unsigned));
|
||||
// Mac OS X requires FP not to be clobbered for backtracing purpose.
|
||||
return (Subtarget.isTargetDarwin() || RI->hasFP(MF)) ? I-1 : I;
|
||||
}
|
||||
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.isR9Reserved())
|
||||
I = ARM_GPR_AO_4 + (sizeof(ARM_GPR_AO_4)/sizeof(unsigned));
|
||||
|
Loading…
x
Reference in New Issue
Block a user