mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-04 21:30:49 +00:00
Added getReservedRegs().
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34376 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
efdcb839f2
commit
eceada6728
@ -28,6 +28,7 @@
|
||||
#include "llvm/Target/TargetFrameInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include <algorithm>
|
||||
@ -297,6 +298,20 @@ ARMRegisterInfo::getCalleeSavedRegClasses() const {
|
||||
return CalleeSavedRegClasses;
|
||||
}
|
||||
|
||||
BitVector ARMRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(ARM::SP);
|
||||
if (STI.isTargetDarwin() || hasFP(MF))
|
||||
Reserved.set(FramePtr);
|
||||
// Some targets reserve R9.
|
||||
if (STI.isR9Reserved())
|
||||
Reserved.set(ARM::R9);
|
||||
// At PEI time, if LR is used, it will be spilled upon entry.
|
||||
if (MF.getUsedPhysregs() && !MF.isPhysRegUsed((unsigned)ARM::LR))
|
||||
Reserved.set(ARM::LR);
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated frame
|
||||
/// pointer register. This is true if the function has variable sized allocas
|
||||
/// or if frame pointer elimination is disabled.
|
||||
|
@ -67,6 +67,8 @@ public:
|
||||
|
||||
const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include <cstdlib>
|
||||
using namespace llvm;
|
||||
@ -178,6 +179,14 @@ AlphaRegisterInfo::getCalleeSavedRegClasses() const {
|
||||
return CalleeSavedRegClasses;
|
||||
}
|
||||
|
||||
BitVector AlphaRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(Alpha::R15);
|
||||
Reserved.set(Alpha::R30);
|
||||
Reserved.set(Alpha::R31);
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -49,6 +49,8 @@ struct AlphaRegisterInfo : public AlphaGenRegisterInfo {
|
||||
|
||||
const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
using namespace llvm;
|
||||
|
||||
@ -106,6 +107,19 @@ IA64RegisterInfo::getCalleeSavedRegClasses() const {
|
||||
return CalleeSavedRegClasses;
|
||||
}
|
||||
|
||||
BitVector IA64RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(IA64::r0);
|
||||
Reserved.set(IA64::r1);
|
||||
Reserved.set(IA64::r2);
|
||||
Reserved.set(IA64::r5);
|
||||
Reserved.set(IA64::r12);
|
||||
Reserved.set(IA64::r13);
|
||||
Reserved.set(IA64::r22);
|
||||
Reserved.set(IA64::rp);
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -48,6 +48,8 @@ struct IA64RegisterInfo : public IA64GenRegisterInfo {
|
||||
|
||||
const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
|
@ -41,7 +41,7 @@ BitVector MRegisterInfo::getAllocatableSet(MachineFunction &MF) const {
|
||||
const TargetRegisterClass *RC = *I;
|
||||
for (TargetRegisterClass::iterator I = RC->allocation_order_begin(MF),
|
||||
E = RC->allocation_order_end(MF); I != E; ++I)
|
||||
Allocatable[*I] = true;
|
||||
Allocatable.set(*I);
|
||||
}
|
||||
return Allocatable;
|
||||
}
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include <cstdlib>
|
||||
using namespace llvm;
|
||||
@ -338,6 +339,35 @@ PPCRegisterInfo::getCalleeSavedRegClasses() const {
|
||||
Darwin32_CalleeSavedRegClasses;
|
||||
}
|
||||
|
||||
// needsFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
//
|
||||
static bool needsFP(const MachineFunction &MF) {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return NoFramePointerElim || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
BitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(PPC::R0);
|
||||
Reserved.set(PPC::R1);
|
||||
Reserved.set(PPC::LR);
|
||||
// In Linux, r2 is reserved for the OS.
|
||||
if (!Subtarget.isDarwin())
|
||||
Reserved.set(PPC::R2);
|
||||
// On PPC64, r13 is the thread pointer. Never allocate this register.
|
||||
// Note that this is overconservative, as it also prevents allocation of
|
||||
// R31 when the FP is not needed.
|
||||
if (Subtarget.isPPC64()) {
|
||||
Reserved.set(PPC::R13);
|
||||
Reserved.set(PPC::R31);
|
||||
}
|
||||
if (needsFP(MF))
|
||||
Reserved.set(PPC::R31);
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
/// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
|
||||
/// copy instructions, turning them into load/store instructions.
|
||||
MachineInstr *PPCRegisterInfo::foldMemoryOperand(MachineInstr *MI,
|
||||
@ -398,15 +428,6 @@ MachineInstr *PPCRegisterInfo::foldMemoryOperand(MachineInstr *MI,
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// needsFP - Return true if the specified function should have a dedicated frame
|
||||
// pointer register. This is true if the function has variable sized allocas or
|
||||
// if frame pointer elimination is disabled.
|
||||
//
|
||||
static bool needsFP(const MachineFunction &MF) {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
return NoFramePointerElim || MFI->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
// hasFP - Return true if the specified function actually has a dedicated frame
|
||||
// pointer register. This is true if the function needs a frame pointer and has
|
||||
// a non-zero stack size.
|
||||
|
@ -58,6 +58,8 @@ public:
|
||||
|
||||
const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
/// targetHandlesStackFrameRounding - Returns true if the target is
|
||||
/// responsible for rounding up the stack frame (probably at emitPrologue
|
||||
/// time).
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "llvm/CodeGen/MachineLocation.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Type.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
using namespace llvm;
|
||||
|
||||
@ -116,6 +117,22 @@ const unsigned* SparcRegisterInfo::getCalleeSavedRegs() const {
|
||||
return CalleeSavedRegs;
|
||||
}
|
||||
|
||||
BitVector SparcRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(SP::G2);
|
||||
Reserved.set(SP::G3);
|
||||
Reserved.set(SP::G4);
|
||||
Reserved.set(SP::O6);
|
||||
Reserved.set(SP::I6);
|
||||
Reserved.set(SP::I7);
|
||||
Reserved.set(SP::G0);
|
||||
Reserved.set(SP::G5);
|
||||
Reserved.set(SP::G6);
|
||||
Reserved.set(SP::G7);
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
|
||||
const TargetRegisterClass* const*
|
||||
SparcRegisterInfo::getCalleeSavedRegClasses() const {
|
||||
static const TargetRegisterClass * const CalleeSavedRegClasses[] = { 0 };
|
||||
|
@ -52,6 +52,8 @@ struct SparcRegisterInfo : public SparcGenRegisterInfo {
|
||||
|
||||
const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
using namespace llvm;
|
||||
|
||||
@ -883,6 +884,21 @@ X86RegisterInfo::getCalleeSavedRegClasses() const {
|
||||
return Is64Bit ? CalleeSavedRegClasses64Bit : CalleeSavedRegClasses32Bit;
|
||||
}
|
||||
|
||||
BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved(getNumRegs());
|
||||
Reserved.set(X86::RSP);
|
||||
Reserved.set(X86::ESP);
|
||||
Reserved.set(X86::SP);
|
||||
Reserved.set(X86::SPL);
|
||||
if (hasFP(MF)) {
|
||||
Reserved.set(X86::RBP);
|
||||
Reserved.set(X86::EBP);
|
||||
Reserved.set(X86::BP);
|
||||
Reserved.set(X86::BPL);
|
||||
}
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -78,6 +78,12 @@ public:
|
||||
/// length of this list match the getCalleeSavedRegs() list.
|
||||
const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
|
||||
|
||||
/// getReservedRegs - Returns a bitset indexed by physical register number
|
||||
/// indicating if a register is a special register that has particular uses and
|
||||
/// should be considered unavailable at all times, e.g. SP, RA. This is used by
|
||||
/// register scavenger to determine what registers are free.
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
|
||||
bool hasFP(const MachineFunction &MF) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
|
Loading…
Reference in New Issue
Block a user