Move CallFrameSetupOpcode and CallFrameDestroyOpcode to TargetInstrInfo.

llvm-svn: 134030
This commit is contained in:
Evan Cheng 2011-06-28 21:14:33 +00:00
parent 4e77f6f499
commit 194c3dc01f
32 changed files with 86 additions and 86 deletions

View File

@ -44,7 +44,9 @@ class TargetInstrInfo : public MCInstrInfo {
TargetInstrInfo(const TargetInstrInfo &); // DO NOT IMPLEMENT TargetInstrInfo(const TargetInstrInfo &); // DO NOT IMPLEMENT
void operator=(const TargetInstrInfo &); // DO NOT IMPLEMENT void operator=(const TargetInstrInfo &); // DO NOT IMPLEMENT
public: public:
TargetInstrInfo(const MCInstrDesc *desc, unsigned NumOpcodes); TargetInstrInfo(const MCInstrDesc *desc, unsigned NumOpcodes,
int CallFrameSetupOpcode = -1,
int CallFrameDestroyOpcode = -1);
virtual ~TargetInstrInfo(); virtual ~TargetInstrInfo();
/// getRegClass - Givem a machine instruction descriptor, returns the register /// getRegClass - Givem a machine instruction descriptor, returns the register
@ -86,6 +88,15 @@ private:
AliasAnalysis *AA) const; AliasAnalysis *AA) const;
public: public:
/// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
/// frame setup/destroy instructions if they exist (-1 otherwise). Some
/// targets use pseudo instructions in order to abstract away the difference
/// between operating with a frame pointer and operating without, through the
/// use of these two instructions.
///
int getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; }
int getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; }
/// isCoalescableExtInstr - Return true if the instruction is a "coalescable" /// isCoalescableExtInstr - Return true if the instruction is a "coalescable"
/// extension instruction. That is, it's like a copy where it's legal for the /// extension instruction. That is, it's like a copy where it's legal for the
/// source to overlap the destination. e.g. X86::MOVSX64rr32. If this returns /// source to overlap the destination. e.g. X86::MOVSX64rr32. If this returns
@ -656,6 +667,9 @@ public:
virtual virtual
bool hasLowDefLatency(const InstrItineraryData *ItinData, bool hasLowDefLatency(const InstrItineraryData *ItinData,
const MachineInstr *DefMI, unsigned DefIdx) const; const MachineInstr *DefMI, unsigned DefIdx) const;
private:
int CallFrameSetupOpcode, CallFrameDestroyOpcode;
}; };
/// TargetInstrInfoImpl - This is the default implementation of /// TargetInstrInfoImpl - This is the default implementation of
@ -664,7 +678,9 @@ public:
/// libcodegen, not in libtarget. /// libcodegen, not in libtarget.
class TargetInstrInfoImpl : public TargetInstrInfo { class TargetInstrInfoImpl : public TargetInstrInfo {
protected: protected:
TargetInstrInfoImpl(const MCInstrDesc *desc, unsigned NumOpcodes) TargetInstrInfoImpl(const MCInstrDesc *desc, unsigned NumOpcodes,
int CallFrameSetupOpcode = -1,
int CallFrameDestroyOpcode = -1)
: TargetInstrInfo(desc, NumOpcodes) {} : TargetInstrInfo(desc, NumOpcodes) {}
public: public:
virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst, virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,

View File

@ -275,15 +275,12 @@ private:
const TargetRegisterInfoDesc *InfoDesc; // Extra desc array for codegen const TargetRegisterInfoDesc *InfoDesc; // Extra desc array for codegen
const char *const *SubRegIndexNames; // Names of subreg indexes. const char *const *SubRegIndexNames; // Names of subreg indexes.
regclass_iterator RegClassBegin, RegClassEnd; // List of regclasses regclass_iterator RegClassBegin, RegClassEnd; // List of regclasses
int CallFrameSetupOpcode, CallFrameDestroyOpcode;
protected: protected:
TargetRegisterInfo(const TargetRegisterInfoDesc *ID, TargetRegisterInfo(const TargetRegisterInfoDesc *ID,
regclass_iterator RegClassBegin, regclass_iterator RegClassBegin,
regclass_iterator RegClassEnd, regclass_iterator RegClassEnd,
const char *const *subregindexnames, const char *const *subregindexnames);
int CallFrameSetupOpcode = -1,
int CallFrameDestroyOpcode = -1);
virtual ~TargetRegisterInfo(); virtual ~TargetRegisterInfo();
public: public:
@ -661,15 +658,6 @@ public:
return false; // Must return a value in order to compile with VS 2005 return false; // Must return a value in order to compile with VS 2005
} }
/// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
/// frame setup/destroy instructions if they exist (-1 otherwise). Some
/// targets use pseudo instructions in order to abstract away the difference
/// between operating with a frame pointer and operating without, through the
/// use of these two instructions.
///
int getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; }
int getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; }
/// eliminateCallFramePseudoInstr - This method is called during prolog/epilog /// eliminateCallFramePseudoInstr - This method is called during prolog/epilog
/// code insertion to eliminate call frame setup and destroy pseudo /// code insertion to eliminate call frame setup and destroy pseudo
/// instructions (but only if the Target is using them). It is responsible /// instructions (but only if the Target is using them). It is responsible
@ -681,9 +669,6 @@ public:
eliminateCallFramePseudoInstr(MachineFunction &MF, eliminateCallFramePseudoInstr(MachineFunction &MF,
MachineBasicBlock &MBB, MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const { MachineBasicBlock::iterator MI) const {
assert(getCallFrameSetupOpcode()== -1 && getCallFrameDestroyOpcode()== -1 &&
"eliminateCallFramePseudoInstr must be implemented if using"
" call frame setup/destroy pseudo instructions!");
assert(0 && "Call Frame Pseudo Instructions do not exist on this target!"); assert(0 && "Call Frame Pseudo Instructions do not exist on this target!");
} }

View File

@ -145,6 +145,7 @@ void PEI::getAnalysisUsage(AnalysisUsage &AU) const {
/// pseudo instructions. /// pseudo instructions.
void PEI::calculateCallsInformation(MachineFunction &Fn) { void PEI::calculateCallsInformation(MachineFunction &Fn) {
const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo(); const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
const TargetFrameLowering *TFI = Fn.getTarget().getFrameLowering(); const TargetFrameLowering *TFI = Fn.getTarget().getFrameLowering();
MachineFrameInfo *MFI = Fn.getFrameInfo(); MachineFrameInfo *MFI = Fn.getFrameInfo();
@ -152,8 +153,8 @@ void PEI::calculateCallsInformation(MachineFunction &Fn) {
bool AdjustsStack = MFI->adjustsStack(); bool AdjustsStack = MFI->adjustsStack();
// Get the function call frame set-up and tear-down instruction opcode // Get the function call frame set-up and tear-down instruction opcode
int FrameSetupOpcode = RegInfo->getCallFrameSetupOpcode(); int FrameSetupOpcode = TII.getCallFrameSetupOpcode();
int FrameDestroyOpcode = RegInfo->getCallFrameDestroyOpcode(); int FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
// Early exit for targets which have no call frame setup/destroy pseudo // Early exit for targets which have no call frame setup/destroy pseudo
// instructions. // instructions.
@ -705,12 +706,13 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
const TargetMachine &TM = Fn.getTarget(); const TargetMachine &TM = Fn.getTarget();
assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!"); assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
const TargetRegisterInfo &TRI = *TM.getRegisterInfo(); const TargetRegisterInfo &TRI = *TM.getRegisterInfo();
const TargetFrameLowering *TFI = TM.getFrameLowering(); const TargetFrameLowering *TFI = TM.getFrameLowering();
bool StackGrowsDown = bool StackGrowsDown =
TFI->getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown; TFI->getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown;
int FrameSetupOpcode = TRI.getCallFrameSetupOpcode(); int FrameSetupOpcode = TII.getCallFrameSetupOpcode();
int FrameDestroyOpcode = TRI.getCallFrameDestroyOpcode(); int FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
for (MachineFunction::iterator BB = Fn.begin(), for (MachineFunction::iterator BB = Fn.begin(),
E = Fn.end(); BB != E; ++BB) { E = Fn.end(); BB != E; ++BB) {

View File

@ -77,7 +77,8 @@ static const ARM_MLxEntry ARM_MLxTable[] = {
}; };
ARMBaseInstrInfo::ARMBaseInstrInfo(const ARMSubtarget& STI) ARMBaseInstrInfo::ARMBaseInstrInfo(const ARMSubtarget& STI)
: TargetInstrInfoImpl(ARMInsts, array_lengthof(ARMInsts)), : TargetInstrInfoImpl(ARMInsts, array_lengthof(ARMInsts),
ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
Subtarget(STI) { Subtarget(STI) {
for (unsigned i = 0, e = array_lengthof(ARM_MLxTable); i != e; ++i) { for (unsigned i = 0, e = array_lengthof(ARM_MLxTable); i != e; ++i) {
if (!MLxEntryMap.insert(std::make_pair(ARM_MLxTable[i].MLxOpc, i)).second) if (!MLxEntryMap.insert(std::make_pair(ARM_MLxTable[i].MLxOpc, i)).second)

View File

@ -58,8 +58,7 @@ EnableBasePointer("arm-use-base-pointer", cl::Hidden, cl::init(true),
ARMBaseRegisterInfo::ARMBaseRegisterInfo(const ARMBaseInstrInfo &tii, ARMBaseRegisterInfo::ARMBaseRegisterInfo(const ARMBaseInstrInfo &tii,
const ARMSubtarget &sti) const ARMSubtarget &sti)
: ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP), : ARMGenRegisterInfo(), TII(tii), STI(sti),
TII(tii), STI(sti),
FramePtr((STI.isTargetDarwin() || STI.isThumb()) ? ARM::R7 : ARM::R11), FramePtr((STI.isTargetDarwin() || STI.isThumb()) ? ARM::R7 : ARM::R11),
BasePtr(ARM::R6) { BasePtr(ARM::R6) {
} }

View File

@ -1549,7 +1549,7 @@ bool ARMFastISel::ProcessCallArgs(SmallVectorImpl<Value*> &Args,
NumBytes = CCInfo.getNextStackOffset(); NumBytes = CCInfo.getNextStackOffset();
// Issue CALLSEQ_START // Issue CALLSEQ_START
unsigned AdjStackDown = TM.getRegisterInfo()->getCallFrameSetupOpcode(); unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
TII.get(AdjStackDown)) TII.get(AdjStackDown))
.addImm(NumBytes)); .addImm(NumBytes));
@ -1647,7 +1647,7 @@ bool ARMFastISel::FinishCall(MVT RetVT, SmallVectorImpl<unsigned> &UsedRegs,
const Instruction *I, CallingConv::ID CC, const Instruction *I, CallingConv::ID CC,
unsigned &NumBytes) { unsigned &NumBytes) {
// Issue CALLSEQ_END // Issue CALLSEQ_END
unsigned AdjStackUp = TM.getRegisterInfo()->getCallFrameDestroyOpcode(); unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
TII.get(AdjStackUp)) TII.get(AdjStackUp))
.addImm(NumBytes).addImm(0)); .addImm(NumBytes).addImm(0));

View File

@ -25,7 +25,8 @@
using namespace llvm; using namespace llvm;
AlphaInstrInfo::AlphaInstrInfo() AlphaInstrInfo::AlphaInstrInfo()
: TargetInstrInfoImpl(AlphaInsts, array_lengthof(AlphaInsts)), : TargetInstrInfoImpl(AlphaInsts, array_lengthof(AlphaInsts),
Alpha::ADJUSTSTACKDOWN, Alpha::ADJUSTSTACKUP),
RI(*this) { } RI(*this) { }

View File

@ -41,7 +41,7 @@
using namespace llvm; using namespace llvm;
AlphaRegisterInfo::AlphaRegisterInfo(const TargetInstrInfo &tii) AlphaRegisterInfo::AlphaRegisterInfo(const TargetInstrInfo &tii)
: AlphaGenRegisterInfo(Alpha::ADJUSTSTACKDOWN, Alpha::ADJUSTSTACKUP), : AlphaGenRegisterInfo(),
TII(tii) { TII(tii) {
} }

View File

@ -26,7 +26,8 @@
using namespace llvm; using namespace llvm;
BlackfinInstrInfo::BlackfinInstrInfo(BlackfinSubtarget &ST) BlackfinInstrInfo::BlackfinInstrInfo(BlackfinSubtarget &ST)
: TargetInstrInfoImpl(BlackfinInsts, array_lengthof(BlackfinInsts)), : TargetInstrInfoImpl(BlackfinInsts, array_lengthof(BlackfinInsts),
BF::ADJCALLSTACKDOWN, BF::ADJCALLSTACKUP),
RI(ST, *this), RI(ST, *this),
Subtarget(ST) {} Subtarget(ST) {}

View File

@ -38,9 +38,7 @@ using namespace llvm;
BlackfinRegisterInfo::BlackfinRegisterInfo(BlackfinSubtarget &st, BlackfinRegisterInfo::BlackfinRegisterInfo(BlackfinSubtarget &st,
const TargetInstrInfo &tii) const TargetInstrInfo &tii)
: BlackfinGenRegisterInfo(BF::ADJCALLSTACKDOWN, BF::ADJCALLSTACKUP), : BlackfinGenRegisterInfo(), Subtarget(st), TII(tii) {}
Subtarget(st),
TII(tii) {}
const unsigned* const unsigned*
BlackfinRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { BlackfinRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {

View File

@ -53,7 +53,8 @@ namespace {
} }
SPUInstrInfo::SPUInstrInfo(SPUTargetMachine &tm) SPUInstrInfo::SPUInstrInfo(SPUTargetMachine &tm)
: TargetInstrInfoImpl(SPUInsts, sizeof(SPUInsts)/sizeof(SPUInsts[0])), : TargetInstrInfoImpl(SPUInsts, sizeof(SPUInsts)/sizeof(SPUInsts[0]),
SPU::ADJCALLSTACKDOWN, SPU::ADJCALLSTACKUP),
TM(tm), TM(tm),
RI(*TM.getSubtargetImpl(), *this) RI(*TM.getSubtargetImpl(), *this)
{ /* NOP */ } { /* NOP */ }

View File

@ -189,9 +189,7 @@ unsigned SPURegisterInfo::getRegisterNumbering(unsigned RegEnum) {
SPURegisterInfo::SPURegisterInfo(const SPUSubtarget &subtarget, SPURegisterInfo::SPURegisterInfo(const SPUSubtarget &subtarget,
const TargetInstrInfo &tii) : const TargetInstrInfo &tii) :
SPUGenRegisterInfo(SPU::ADJCALLSTACKDOWN, SPU::ADJCALLSTACKUP), SPUGenRegisterInfo(), Subtarget(subtarget), TII(tii)
Subtarget(subtarget),
TII(tii)
{ {
} }

View File

@ -27,7 +27,8 @@
using namespace llvm; using namespace llvm;
MBlazeInstrInfo::MBlazeInstrInfo(MBlazeTargetMachine &tm) MBlazeInstrInfo::MBlazeInstrInfo(MBlazeTargetMachine &tm)
: TargetInstrInfoImpl(MBlazeInsts, array_lengthof(MBlazeInsts)), : TargetInstrInfoImpl(MBlazeInsts, array_lengthof(MBlazeInsts),
MBlaze::ADJCALLSTACKDOWN, MBlaze::ADJCALLSTACKUP),
TM(tm), RI(*TM.getSubtargetImpl(), *this) {} TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
static bool isZeroImm(const MachineOperand &op) { static bool isZeroImm(const MachineOperand &op) {

View File

@ -45,8 +45,7 @@ using namespace llvm;
MBlazeRegisterInfo:: MBlazeRegisterInfo::
MBlazeRegisterInfo(const MBlazeSubtarget &ST, const TargetInstrInfo &tii) MBlazeRegisterInfo(const MBlazeSubtarget &ST, const TargetInstrInfo &tii)
: MBlazeGenRegisterInfo(MBlaze::ADJCALLSTACKDOWN, MBlaze::ADJCALLSTACKUP), : MBlazeGenRegisterInfo(), Subtarget(ST), TII(tii) {}
Subtarget(ST), TII(tii) {}
/// getRegisterNumbering - Given the enum value for some register, e.g. /// getRegisterNumbering - Given the enum value for some register, e.g.
/// MBlaze::R0, return the number that it corresponds to (e.g. 0). /// MBlaze::R0, return the number that it corresponds to (e.g. 0).

View File

@ -28,7 +28,8 @@
using namespace llvm; using namespace llvm;
MSP430InstrInfo::MSP430InstrInfo(MSP430TargetMachine &tm) MSP430InstrInfo::MSP430InstrInfo(MSP430TargetMachine &tm)
: TargetInstrInfoImpl(MSP430Insts, array_lengthof(MSP430Insts)), : TargetInstrInfoImpl(MSP430Insts, array_lengthof(MSP430Insts),
MSP430::ADJCALLSTACKDOWN, MSP430::ADJCALLSTACKUP),
RI(tm, *this), TM(tm) {} RI(tm, *this), TM(tm) {}
void MSP430InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB, void MSP430InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,

View File

@ -35,8 +35,7 @@ using namespace llvm;
// FIXME: Provide proper call frame setup / destroy opcodes. // FIXME: Provide proper call frame setup / destroy opcodes.
MSP430RegisterInfo::MSP430RegisterInfo(MSP430TargetMachine &tm, MSP430RegisterInfo::MSP430RegisterInfo(MSP430TargetMachine &tm,
const TargetInstrInfo &tii) const TargetInstrInfo &tii)
: MSP430GenRegisterInfo(MSP430::ADJCALLSTACKDOWN, MSP430::ADJCALLSTACKUP), : MSP430GenRegisterInfo(), TM(tm), TII(tii) {
TM(tm), TII(tii) {
StackAlign = TM.getFrameLowering()->getStackAlignment(); StackAlign = TM.getFrameLowering()->getStackAlignment();
} }
@ -121,12 +120,12 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
Amount = (Amount+StackAlign-1)/StackAlign*StackAlign; Amount = (Amount+StackAlign-1)/StackAlign*StackAlign;
MachineInstr *New = 0; MachineInstr *New = 0;
if (Old->getOpcode() == getCallFrameSetupOpcode()) { if (Old->getOpcode() == TII.getCallFrameSetupOpcode()) {
New = BuildMI(MF, Old->getDebugLoc(), New = BuildMI(MF, Old->getDebugLoc(),
TII.get(MSP430::SUB16ri), MSP430::SPW) TII.get(MSP430::SUB16ri), MSP430::SPW)
.addReg(MSP430::SPW).addImm(Amount); .addReg(MSP430::SPW).addImm(Amount);
} else { } else {
assert(Old->getOpcode() == getCallFrameDestroyOpcode()); assert(Old->getOpcode() == TII.getCallFrameDestroyOpcode());
// factor out the amount the callee already popped. // factor out the amount the callee already popped.
uint64_t CalleeAmt = Old->getOperand(1).getImm(); uint64_t CalleeAmt = Old->getOperand(1).getImm();
Amount -= CalleeAmt; Amount -= CalleeAmt;
@ -144,7 +143,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
MBB.insert(I, New); MBB.insert(I, New);
} }
} }
} else if (I->getOpcode() == getCallFrameDestroyOpcode()) { } else if (I->getOpcode() == TII.getCallFrameDestroyOpcode()) {
// If we are performing frame pointer elimination and if the callee pops // If we are performing frame pointer elimination and if the callee pops
// something off the stack pointer, add it back. // something off the stack pointer, add it back.
if (uint64_t CalleeAmt = I->getOperand(1).getImm()) { if (uint64_t CalleeAmt = I->getOperand(1).getImm()) {

View File

@ -25,7 +25,8 @@
using namespace llvm; using namespace llvm;
MipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm) MipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm)
: TargetInstrInfoImpl(MipsInsts, array_lengthof(MipsInsts)), : TargetInstrInfoImpl(MipsInsts, array_lengthof(MipsInsts),
Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
TM(tm), RI(*TM.getSubtargetImpl(), *this) {} TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
static bool isZeroImm(const MachineOperand &op) { static bool isZeroImm(const MachineOperand &op) {

View File

@ -44,8 +44,7 @@ using namespace llvm;
MipsRegisterInfo::MipsRegisterInfo(const MipsSubtarget &ST, MipsRegisterInfo::MipsRegisterInfo(const MipsSubtarget &ST,
const TargetInstrInfo &tii) const TargetInstrInfo &tii)
: MipsGenRegisterInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP), : MipsGenRegisterInfo(), Subtarget(ST), TII(tii) {}
Subtarget(ST), TII(tii) {}
/// getRegisterNumbering - Given the enum value for some register, e.g. /// getRegisterNumbering - Given the enum value for some register, e.g.
/// Mips::RA, return the number that it corresponds to (e.g. 31). /// Mips::RA, return the number that it corresponds to (e.g. 31).

View File

@ -39,8 +39,9 @@ extern cl::opt<bool> EnablePPC64RS; // FIXME (64-bit): See PPCRegisterInfo.cpp.
using namespace llvm; using namespace llvm;
PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm) PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm)
: TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts)), TM(tm), : TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts),
RI(*TM.getSubtargetImpl(), *this) {} PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
/// CreateTargetHazardRecognizer - Return the hazard recognizer to use for /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
/// this target when scheduling the DAG. /// this target when scheduling the DAG.

View File

@ -114,8 +114,7 @@ unsigned PPCRegisterInfo::getRegisterNumbering(unsigned RegEnum) {
PPCRegisterInfo::PPCRegisterInfo(const PPCSubtarget &ST, PPCRegisterInfo::PPCRegisterInfo(const PPCSubtarget &ST,
const TargetInstrInfo &tii) const TargetInstrInfo &tii)
: PPCGenRegisterInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP), : PPCGenRegisterInfo(), Subtarget(ST), TII(tii) {
Subtarget(ST), TII(tii) {
ImmToIdxMap[PPC::LD] = PPC::LDX; ImmToIdxMap[PPC::STD] = PPC::STDX; ImmToIdxMap[PPC::LD] = PPC::LDX; ImmToIdxMap[PPC::STD] = PPC::STDX;
ImmToIdxMap[PPC::LBZ] = PPC::LBZX; ImmToIdxMap[PPC::STB] = PPC::STBX; ImmToIdxMap[PPC::LBZ] = PPC::LBZX; ImmToIdxMap[PPC::STB] = PPC::STBX;
ImmToIdxMap[PPC::LHZ] = PPC::LHZX; ImmToIdxMap[PPC::LHA] = PPC::LHAX; ImmToIdxMap[PPC::LHZ] = PPC::LHZX; ImmToIdxMap[PPC::LHA] = PPC::LHAX;

View File

@ -27,7 +27,8 @@
using namespace llvm; using namespace llvm;
SparcInstrInfo::SparcInstrInfo(SparcSubtarget &ST) SparcInstrInfo::SparcInstrInfo(SparcSubtarget &ST)
: TargetInstrInfoImpl(SparcInsts, array_lengthof(SparcInsts)), : TargetInstrInfoImpl(SparcInsts, array_lengthof(SparcInsts),
SP::ADJCALLSTACKDOWN, SP::ADJCALLSTACKUP),
RI(ST, *this), Subtarget(ST) { RI(ST, *this), Subtarget(ST) {
} }

View File

@ -32,8 +32,7 @@ using namespace llvm;
SparcRegisterInfo::SparcRegisterInfo(SparcSubtarget &st, SparcRegisterInfo::SparcRegisterInfo(SparcSubtarget &st,
const TargetInstrInfo &tii) const TargetInstrInfo &tii)
: SparcGenRegisterInfo(SP::ADJCALLSTACKDOWN, SP::ADJCALLSTACKUP), : SparcGenRegisterInfo(), Subtarget(st), TII(tii) {
Subtarget(st), TII(tii) {
} }
const unsigned* SparcRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const unsigned* SparcRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF)

View File

@ -29,7 +29,8 @@
using namespace llvm; using namespace llvm;
SystemZInstrInfo::SystemZInstrInfo(SystemZTargetMachine &tm) SystemZInstrInfo::SystemZInstrInfo(SystemZTargetMachine &tm)
: TargetInstrInfoImpl(SystemZInsts, array_lengthof(SystemZInsts)), : TargetInstrInfoImpl(SystemZInsts, array_lengthof(SystemZInsts),
SystemZ::ADJCALLSTACKUP, SystemZ::ADJCALLSTACKDOWN),
RI(tm, *this), TM(tm) { RI(tm, *this), TM(tm) {
} }

View File

@ -34,8 +34,7 @@ using namespace llvm;
SystemZRegisterInfo::SystemZRegisterInfo(SystemZTargetMachine &tm, SystemZRegisterInfo::SystemZRegisterInfo(SystemZTargetMachine &tm,
const SystemZInstrInfo &tii) const SystemZInstrInfo &tii)
: SystemZGenRegisterInfo(SystemZ::ADJCALLSTACKUP, SystemZ::ADJCALLSTACKDOWN), : SystemZGenRegisterInfo(), TM(tm), TII(tii) {
TM(tm), TII(tii) {
} }
const unsigned* const unsigned*

View File

@ -24,7 +24,10 @@ using namespace llvm;
// TargetInstrInfo // TargetInstrInfo
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
TargetInstrInfo::TargetInstrInfo(const MCInstrDesc* Desc, unsigned numOpcodes) { TargetInstrInfo::TargetInstrInfo(const MCInstrDesc* Desc, unsigned numOpcodes,
int CFSetupOpcode, int CFDestroyOpcode)
: CallFrameSetupOpcode(CFSetupOpcode),
CallFrameDestroyOpcode(CFDestroyOpcode) {
InitMCInstrInfo(Desc, numOpcodes); InitMCInstrInfo(Desc, numOpcodes);
} }

View File

@ -22,12 +22,9 @@ using namespace llvm;
TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterInfoDesc *ID, TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterInfoDesc *ID,
regclass_iterator RCB, regclass_iterator RCE, regclass_iterator RCB, regclass_iterator RCE,
const char *const *subregindexnames, const char *const *subregindexnames)
int CFSO, int CFDO)
: InfoDesc(ID), SubRegIndexNames(subregindexnames), : InfoDesc(ID), SubRegIndexNames(subregindexnames),
RegClassBegin(RCB), RegClassEnd(RCE) { RegClassBegin(RCB), RegClassEnd(RCE) {
CallFrameSetupOpcode = CFSO;
CallFrameDestroyOpcode = CFDO;
} }
TargetRegisterInfo::~TargetRegisterInfo() {} TargetRegisterInfo::~TargetRegisterInfo() {}

View File

@ -1630,7 +1630,7 @@ bool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
unsigned NumBytes = CCInfo.getNextStackOffset(); unsigned NumBytes = CCInfo.getNextStackOffset();
// Issue CALLSEQ_START // Issue CALLSEQ_START
unsigned AdjStackDown = TM.getRegisterInfo()->getCallFrameSetupOpcode(); unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(AdjStackDown)) BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(AdjStackDown))
.addImm(NumBytes); .addImm(NumBytes);
@ -1803,7 +1803,7 @@ bool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
MIB.addReg(RegArgs[i]); MIB.addReg(RegArgs[i]);
// Issue CALLSEQ_END // Issue CALLSEQ_END
unsigned AdjStackUp = TM.getRegisterInfo()->getCallFrameDestroyOpcode(); unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
unsigned NumBytesCallee = 0; unsigned NumBytesCallee = 0;
if (!Subtarget->is64Bit() && CS.paramHasAttr(1, Attribute::StructRet)) if (!Subtarget->is64Bit() && CS.paramHasAttr(1, Attribute::StructRet))
NumBytesCallee = 4; NumBytesCallee = 4;

View File

@ -54,7 +54,13 @@ ReMatPICStubLoad("remat-pic-stub-load",
cl::init(false), cl::Hidden); cl::init(false), cl::Hidden);
X86InstrInfo::X86InstrInfo(X86TargetMachine &tm) X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
: TargetInstrInfoImpl(X86Insts, array_lengthof(X86Insts)), : TargetInstrInfoImpl(X86Insts, array_lengthof(X86Insts),
(tm.getSubtarget<X86Subtarget>().is64Bit()
? X86::ADJCALLSTACKDOWN64
: X86::ADJCALLSTACKDOWN32),
(tm.getSubtarget<X86Subtarget>().is64Bit()
? X86::ADJCALLSTACKUP64
: X86::ADJCALLSTACKUP32)),
TM(tm), RI(tm, *this) { TM(tm), RI(tm, *this) {
enum { enum {
TB_NOT_REVERSABLE = 1U << 31, TB_NOT_REVERSABLE = 1U << 31,

View File

@ -54,13 +54,7 @@ ForceStackAlign("force-align-stack",
X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm, X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
const TargetInstrInfo &tii) const TargetInstrInfo &tii)
: X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ? : X86GenRegisterInfo(), TM(tm), TII(tii) {
X86::ADJCALLSTACKDOWN64 :
X86::ADJCALLSTACKDOWN32,
tm.getSubtarget<X86Subtarget>().is64Bit() ?
X86::ADJCALLSTACKUP64 :
X86::ADJCALLSTACKUP32),
TM(tm), TII(tii) {
// Cache some information. // Cache some information.
const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>(); const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
Is64Bit = Subtarget->is64Bit(); Is64Bit = Subtarget->is64Bit();
@ -608,7 +602,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
bool reseveCallFrame = TFI->hasReservedCallFrame(MF); bool reseveCallFrame = TFI->hasReservedCallFrame(MF);
int Opcode = I->getOpcode(); int Opcode = I->getOpcode();
bool isDestroy = Opcode == getCallFrameDestroyOpcode(); bool isDestroy = Opcode == TII.getCallFrameDestroyOpcode();
DebugLoc DL = I->getDebugLoc(); DebugLoc DL = I->getDebugLoc();
uint64_t Amount = !reseveCallFrame ? I->getOperand(0).getImm() : 0; uint64_t Amount = !reseveCallFrame ? I->getOperand(0).getImm() : 0;
uint64_t CalleeAmt = isDestroy ? I->getOperand(1).getImm() : 0; uint64_t CalleeAmt = isDestroy ? I->getOperand(1).getImm() : 0;
@ -629,13 +623,13 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
Amount = (Amount + StackAlign - 1) / StackAlign * StackAlign; Amount = (Amount + StackAlign - 1) / StackAlign * StackAlign;
MachineInstr *New = 0; MachineInstr *New = 0;
if (Opcode == getCallFrameSetupOpcode()) { if (Opcode == TII.getCallFrameSetupOpcode()) {
New = BuildMI(MF, DL, TII.get(getSUBriOpcode(Is64Bit, Amount)), New = BuildMI(MF, DL, TII.get(getSUBriOpcode(Is64Bit, Amount)),
StackPtr) StackPtr)
.addReg(StackPtr) .addReg(StackPtr)
.addImm(Amount); .addImm(Amount);
} else { } else {
assert(Opcode == getCallFrameDestroyOpcode()); assert(Opcode == TII.getCallFrameDestroyOpcode());
// Factor out the amount the callee already popped. // Factor out the amount the callee already popped.
Amount -= CalleeAmt; Amount -= CalleeAmt;
@ -658,7 +652,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
return; return;
} }
if (Opcode == getCallFrameDestroyOpcode() && CalleeAmt) { if (Opcode == TII.getCallFrameDestroyOpcode() && CalleeAmt) {
// If we are performing frame pointer elimination and if the callee pops // If we are performing frame pointer elimination and if the callee pops
// something off the stack pointer, add it back. We do this until we have // something off the stack pointer, add it back. We do this until we have
// more advanced stack pointer tracking ability. // more advanced stack pointer tracking ability.

View File

@ -40,7 +40,8 @@ namespace XCore {
using namespace llvm; using namespace llvm;
XCoreInstrInfo::XCoreInstrInfo() XCoreInstrInfo::XCoreInstrInfo()
: TargetInstrInfoImpl(XCoreInsts, array_lengthof(XCoreInsts)), : TargetInstrInfoImpl(XCoreInsts, array_lengthof(XCoreInsts),
XCore::ADJCALLSTACKDOWN, XCore::ADJCALLSTACKUP),
RI(*this) { RI(*this) {
} }

View File

@ -40,8 +40,7 @@
using namespace llvm; using namespace llvm;
XCoreRegisterInfo::XCoreRegisterInfo(const TargetInstrInfo &tii) XCoreRegisterInfo::XCoreRegisterInfo(const TargetInstrInfo &tii)
: XCoreGenRegisterInfo(XCore::ADJCALLSTACKDOWN, XCore::ADJCALLSTACKUP), : XCoreGenRegisterInfo(), TII(tii) {
TII(tii) {
} }
// helper functions // helper functions

View File

@ -214,8 +214,7 @@ RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target,
OS << "namespace llvm {\n\n"; OS << "namespace llvm {\n\n";
OS << "struct " << ClassName << " : public TargetRegisterInfo {\n" OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
<< " explicit " << ClassName << " explicit " << ClassName << "();\n"
<< "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
<< " virtual int getDwarfRegNumFull(unsigned RegNum, " << " virtual int getDwarfRegNumFull(unsigned RegNum, "
<< "unsigned Flavour) const;\n" << "unsigned Flavour) const;\n"
<< " virtual int getLLVMRegNumFull(unsigned DwarfRegNum, " << " virtual int getLLVMRegNumFull(unsigned DwarfRegNum, "
@ -660,11 +659,10 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
// Emit the constructor of the class... // Emit the constructor of the class...
OS << ClassName << "::" << ClassName OS << ClassName << "::" << ClassName
<< "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n" << "()\n"
<< " : TargetRegisterInfo(" << TargetName << "RegInfoDesc" << " : TargetRegisterInfo(" << TargetName << "RegInfoDesc"
<< ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n" << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n"
<< " SubRegIndexTable,\n" << " SubRegIndexTable) {\n"
<< " CallFrameSetupOpcode, CallFrameDestroyOpcode) {\n"
<< " InitMCRegisterInfo(" << TargetName << "RegDesc, " << " InitMCRegisterInfo(" << TargetName << "RegDesc, "
<< Regs.size()+1 << ");\n" << Regs.size()+1 << ");\n"
<< "}\n\n"; << "}\n\n";