forked from OSchip/llvm-project
Move CallFrameSetupOpcode and CallFrameDestroyOpcode to TargetInstrInfo.
llvm-svn: 134030
This commit is contained in:
parent
4e77f6f499
commit
194c3dc01f
|
@ -44,7 +44,9 @@ class TargetInstrInfo : public MCInstrInfo {
|
|||
TargetInstrInfo(const TargetInstrInfo &); // DO NOT IMPLEMENT
|
||||
void operator=(const TargetInstrInfo &); // DO NOT IMPLEMENT
|
||||
public:
|
||||
TargetInstrInfo(const MCInstrDesc *desc, unsigned NumOpcodes);
|
||||
TargetInstrInfo(const MCInstrDesc *desc, unsigned NumOpcodes,
|
||||
int CallFrameSetupOpcode = -1,
|
||||
int CallFrameDestroyOpcode = -1);
|
||||
virtual ~TargetInstrInfo();
|
||||
|
||||
/// getRegClass - Givem a machine instruction descriptor, returns the register
|
||||
|
@ -86,6 +88,15 @@ private:
|
|||
AliasAnalysis *AA) const;
|
||||
|
||||
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"
|
||||
/// 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
|
||||
|
@ -656,6 +667,9 @@ public:
|
|||
virtual
|
||||
bool hasLowDefLatency(const InstrItineraryData *ItinData,
|
||||
const MachineInstr *DefMI, unsigned DefIdx) const;
|
||||
|
||||
private:
|
||||
int CallFrameSetupOpcode, CallFrameDestroyOpcode;
|
||||
};
|
||||
|
||||
/// TargetInstrInfoImpl - This is the default implementation of
|
||||
|
@ -664,7 +678,9 @@ public:
|
|||
/// libcodegen, not in libtarget.
|
||||
class TargetInstrInfoImpl : public TargetInstrInfo {
|
||||
protected:
|
||||
TargetInstrInfoImpl(const MCInstrDesc *desc, unsigned NumOpcodes)
|
||||
TargetInstrInfoImpl(const MCInstrDesc *desc, unsigned NumOpcodes,
|
||||
int CallFrameSetupOpcode = -1,
|
||||
int CallFrameDestroyOpcode = -1)
|
||||
: TargetInstrInfo(desc, NumOpcodes) {}
|
||||
public:
|
||||
virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
|
||||
|
|
|
@ -275,15 +275,12 @@ private:
|
|||
const TargetRegisterInfoDesc *InfoDesc; // Extra desc array for codegen
|
||||
const char *const *SubRegIndexNames; // Names of subreg indexes.
|
||||
regclass_iterator RegClassBegin, RegClassEnd; // List of regclasses
|
||||
int CallFrameSetupOpcode, CallFrameDestroyOpcode;
|
||||
|
||||
protected:
|
||||
TargetRegisterInfo(const TargetRegisterInfoDesc *ID,
|
||||
regclass_iterator RegClassBegin,
|
||||
regclass_iterator RegClassEnd,
|
||||
const char *const *subregindexnames,
|
||||
int CallFrameSetupOpcode = -1,
|
||||
int CallFrameDestroyOpcode = -1);
|
||||
const char *const *subregindexnames);
|
||||
virtual ~TargetRegisterInfo();
|
||||
public:
|
||||
|
||||
|
@ -661,15 +658,6 @@ public:
|
|||
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
|
||||
/// code insertion to eliminate call frame setup and destroy pseudo
|
||||
/// instructions (but only if the Target is using them). It is responsible
|
||||
|
@ -681,9 +669,6 @@ public:
|
|||
eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
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!");
|
||||
}
|
||||
|
||||
|
|
|
@ -145,6 +145,7 @@ void PEI::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||
/// pseudo instructions.
|
||||
void PEI::calculateCallsInformation(MachineFunction &Fn) {
|
||||
const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
|
||||
const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
|
||||
const TargetFrameLowering *TFI = Fn.getTarget().getFrameLowering();
|
||||
MachineFrameInfo *MFI = Fn.getFrameInfo();
|
||||
|
||||
|
@ -152,8 +153,8 @@ void PEI::calculateCallsInformation(MachineFunction &Fn) {
|
|||
bool AdjustsStack = MFI->adjustsStack();
|
||||
|
||||
// Get the function call frame set-up and tear-down instruction opcode
|
||||
int FrameSetupOpcode = RegInfo->getCallFrameSetupOpcode();
|
||||
int FrameDestroyOpcode = RegInfo->getCallFrameDestroyOpcode();
|
||||
int FrameSetupOpcode = TII.getCallFrameSetupOpcode();
|
||||
int FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
|
||||
|
||||
// Early exit for targets which have no call frame setup/destroy pseudo
|
||||
// instructions.
|
||||
|
@ -705,12 +706,13 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
|
|||
|
||||
const TargetMachine &TM = Fn.getTarget();
|
||||
assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
|
||||
const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
|
||||
const TargetRegisterInfo &TRI = *TM.getRegisterInfo();
|
||||
const TargetFrameLowering *TFI = TM.getFrameLowering();
|
||||
bool StackGrowsDown =
|
||||
TFI->getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown;
|
||||
int FrameSetupOpcode = TRI.getCallFrameSetupOpcode();
|
||||
int FrameDestroyOpcode = TRI.getCallFrameDestroyOpcode();
|
||||
int FrameSetupOpcode = TII.getCallFrameSetupOpcode();
|
||||
int FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
|
||||
|
||||
for (MachineFunction::iterator BB = Fn.begin(),
|
||||
E = Fn.end(); BB != E; ++BB) {
|
||||
|
|
|
@ -77,7 +77,8 @@ static const ARM_MLxEntry ARM_MLxTable[] = {
|
|||
};
|
||||
|
||||
ARMBaseInstrInfo::ARMBaseInstrInfo(const ARMSubtarget& STI)
|
||||
: TargetInstrInfoImpl(ARMInsts, array_lengthof(ARMInsts)),
|
||||
: TargetInstrInfoImpl(ARMInsts, array_lengthof(ARMInsts),
|
||||
ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
|
||||
Subtarget(STI) {
|
||||
for (unsigned i = 0, e = array_lengthof(ARM_MLxTable); i != e; ++i) {
|
||||
if (!MLxEntryMap.insert(std::make_pair(ARM_MLxTable[i].MLxOpc, i)).second)
|
||||
|
|
|
@ -58,8 +58,7 @@ EnableBasePointer("arm-use-base-pointer", cl::Hidden, cl::init(true),
|
|||
|
||||
ARMBaseRegisterInfo::ARMBaseRegisterInfo(const ARMBaseInstrInfo &tii,
|
||||
const ARMSubtarget &sti)
|
||||
: ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
|
||||
TII(tii), STI(sti),
|
||||
: ARMGenRegisterInfo(), TII(tii), STI(sti),
|
||||
FramePtr((STI.isTargetDarwin() || STI.isThumb()) ? ARM::R7 : ARM::R11),
|
||||
BasePtr(ARM::R6) {
|
||||
}
|
||||
|
|
|
@ -1549,7 +1549,7 @@ bool ARMFastISel::ProcessCallArgs(SmallVectorImpl<Value*> &Args,
|
|||
NumBytes = CCInfo.getNextStackOffset();
|
||||
|
||||
// Issue CALLSEQ_START
|
||||
unsigned AdjStackDown = TM.getRegisterInfo()->getCallFrameSetupOpcode();
|
||||
unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
|
||||
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||
TII.get(AdjStackDown))
|
||||
.addImm(NumBytes));
|
||||
|
@ -1647,7 +1647,7 @@ bool ARMFastISel::FinishCall(MVT RetVT, SmallVectorImpl<unsigned> &UsedRegs,
|
|||
const Instruction *I, CallingConv::ID CC,
|
||||
unsigned &NumBytes) {
|
||||
// Issue CALLSEQ_END
|
||||
unsigned AdjStackUp = TM.getRegisterInfo()->getCallFrameDestroyOpcode();
|
||||
unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
|
||||
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||
TII.get(AdjStackUp))
|
||||
.addImm(NumBytes).addImm(0));
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
using namespace llvm;
|
||||
|
||||
AlphaInstrInfo::AlphaInstrInfo()
|
||||
: TargetInstrInfoImpl(AlphaInsts, array_lengthof(AlphaInsts)),
|
||||
: TargetInstrInfoImpl(AlphaInsts, array_lengthof(AlphaInsts),
|
||||
Alpha::ADJUSTSTACKDOWN, Alpha::ADJUSTSTACKUP),
|
||||
RI(*this) { }
|
||||
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
using namespace llvm;
|
||||
|
||||
AlphaRegisterInfo::AlphaRegisterInfo(const TargetInstrInfo &tii)
|
||||
: AlphaGenRegisterInfo(Alpha::ADJUSTSTACKDOWN, Alpha::ADJUSTSTACKUP),
|
||||
: AlphaGenRegisterInfo(),
|
||||
TII(tii) {
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,8 @@
|
|||
using namespace llvm;
|
||||
|
||||
BlackfinInstrInfo::BlackfinInstrInfo(BlackfinSubtarget &ST)
|
||||
: TargetInstrInfoImpl(BlackfinInsts, array_lengthof(BlackfinInsts)),
|
||||
: TargetInstrInfoImpl(BlackfinInsts, array_lengthof(BlackfinInsts),
|
||||
BF::ADJCALLSTACKDOWN, BF::ADJCALLSTACKUP),
|
||||
RI(ST, *this),
|
||||
Subtarget(ST) {}
|
||||
|
||||
|
|
|
@ -38,9 +38,7 @@ using namespace llvm;
|
|||
|
||||
BlackfinRegisterInfo::BlackfinRegisterInfo(BlackfinSubtarget &st,
|
||||
const TargetInstrInfo &tii)
|
||||
: BlackfinGenRegisterInfo(BF::ADJCALLSTACKDOWN, BF::ADJCALLSTACKUP),
|
||||
Subtarget(st),
|
||||
TII(tii) {}
|
||||
: BlackfinGenRegisterInfo(), Subtarget(st), TII(tii) {}
|
||||
|
||||
const unsigned*
|
||||
BlackfinRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
|
|
|
@ -53,7 +53,8 @@ namespace {
|
|||
}
|
||||
|
||||
SPUInstrInfo::SPUInstrInfo(SPUTargetMachine &tm)
|
||||
: TargetInstrInfoImpl(SPUInsts, sizeof(SPUInsts)/sizeof(SPUInsts[0])),
|
||||
: TargetInstrInfoImpl(SPUInsts, sizeof(SPUInsts)/sizeof(SPUInsts[0]),
|
||||
SPU::ADJCALLSTACKDOWN, SPU::ADJCALLSTACKUP),
|
||||
TM(tm),
|
||||
RI(*TM.getSubtargetImpl(), *this)
|
||||
{ /* NOP */ }
|
||||
|
|
|
@ -189,9 +189,7 @@ unsigned SPURegisterInfo::getRegisterNumbering(unsigned RegEnum) {
|
|||
|
||||
SPURegisterInfo::SPURegisterInfo(const SPUSubtarget &subtarget,
|
||||
const TargetInstrInfo &tii) :
|
||||
SPUGenRegisterInfo(SPU::ADJCALLSTACKDOWN, SPU::ADJCALLSTACKUP),
|
||||
Subtarget(subtarget),
|
||||
TII(tii)
|
||||
SPUGenRegisterInfo(), Subtarget(subtarget), TII(tii)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,8 @@
|
|||
using namespace llvm;
|
||||
|
||||
MBlazeInstrInfo::MBlazeInstrInfo(MBlazeTargetMachine &tm)
|
||||
: TargetInstrInfoImpl(MBlazeInsts, array_lengthof(MBlazeInsts)),
|
||||
: TargetInstrInfoImpl(MBlazeInsts, array_lengthof(MBlazeInsts),
|
||||
MBlaze::ADJCALLSTACKDOWN, MBlaze::ADJCALLSTACKUP),
|
||||
TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
|
||||
|
||||
static bool isZeroImm(const MachineOperand &op) {
|
||||
|
|
|
@ -45,8 +45,7 @@ using namespace llvm;
|
|||
|
||||
MBlazeRegisterInfo::
|
||||
MBlazeRegisterInfo(const MBlazeSubtarget &ST, const TargetInstrInfo &tii)
|
||||
: MBlazeGenRegisterInfo(MBlaze::ADJCALLSTACKDOWN, MBlaze::ADJCALLSTACKUP),
|
||||
Subtarget(ST), TII(tii) {}
|
||||
: MBlazeGenRegisterInfo(), Subtarget(ST), TII(tii) {}
|
||||
|
||||
/// getRegisterNumbering - Given the enum value for some register, e.g.
|
||||
/// MBlaze::R0, return the number that it corresponds to (e.g. 0).
|
||||
|
|
|
@ -28,7 +28,8 @@
|
|||
using namespace llvm;
|
||||
|
||||
MSP430InstrInfo::MSP430InstrInfo(MSP430TargetMachine &tm)
|
||||
: TargetInstrInfoImpl(MSP430Insts, array_lengthof(MSP430Insts)),
|
||||
: TargetInstrInfoImpl(MSP430Insts, array_lengthof(MSP430Insts),
|
||||
MSP430::ADJCALLSTACKDOWN, MSP430::ADJCALLSTACKUP),
|
||||
RI(tm, *this), TM(tm) {}
|
||||
|
||||
void MSP430InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
|
||||
|
|
|
@ -35,8 +35,7 @@ using namespace llvm;
|
|||
// FIXME: Provide proper call frame setup / destroy opcodes.
|
||||
MSP430RegisterInfo::MSP430RegisterInfo(MSP430TargetMachine &tm,
|
||||
const TargetInstrInfo &tii)
|
||||
: MSP430GenRegisterInfo(MSP430::ADJCALLSTACKDOWN, MSP430::ADJCALLSTACKUP),
|
||||
TM(tm), TII(tii) {
|
||||
: MSP430GenRegisterInfo(), TM(tm), TII(tii) {
|
||||
StackAlign = TM.getFrameLowering()->getStackAlignment();
|
||||
}
|
||||
|
||||
|
@ -121,12 +120,12 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
|||
Amount = (Amount+StackAlign-1)/StackAlign*StackAlign;
|
||||
|
||||
MachineInstr *New = 0;
|
||||
if (Old->getOpcode() == getCallFrameSetupOpcode()) {
|
||||
if (Old->getOpcode() == TII.getCallFrameSetupOpcode()) {
|
||||
New = BuildMI(MF, Old->getDebugLoc(),
|
||||
TII.get(MSP430::SUB16ri), MSP430::SPW)
|
||||
.addReg(MSP430::SPW).addImm(Amount);
|
||||
} else {
|
||||
assert(Old->getOpcode() == getCallFrameDestroyOpcode());
|
||||
assert(Old->getOpcode() == TII.getCallFrameDestroyOpcode());
|
||||
// factor out the amount the callee already popped.
|
||||
uint64_t CalleeAmt = Old->getOperand(1).getImm();
|
||||
Amount -= CalleeAmt;
|
||||
|
@ -144,7 +143,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
|||
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
|
||||
// something off the stack pointer, add it back.
|
||||
if (uint64_t CalleeAmt = I->getOperand(1).getImm()) {
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
using namespace llvm;
|
||||
|
||||
MipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm)
|
||||
: TargetInstrInfoImpl(MipsInsts, array_lengthof(MipsInsts)),
|
||||
: TargetInstrInfoImpl(MipsInsts, array_lengthof(MipsInsts),
|
||||
Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
|
||||
TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
|
||||
|
||||
static bool isZeroImm(const MachineOperand &op) {
|
||||
|
|
|
@ -44,8 +44,7 @@ using namespace llvm;
|
|||
|
||||
MipsRegisterInfo::MipsRegisterInfo(const MipsSubtarget &ST,
|
||||
const TargetInstrInfo &tii)
|
||||
: MipsGenRegisterInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
|
||||
Subtarget(ST), TII(tii) {}
|
||||
: MipsGenRegisterInfo(), Subtarget(ST), TII(tii) {}
|
||||
|
||||
/// getRegisterNumbering - Given the enum value for some register, e.g.
|
||||
/// Mips::RA, return the number that it corresponds to (e.g. 31).
|
||||
|
|
|
@ -39,8 +39,9 @@ extern cl::opt<bool> EnablePPC64RS; // FIXME (64-bit): See PPCRegisterInfo.cpp.
|
|||
using namespace llvm;
|
||||
|
||||
PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm)
|
||||
: TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts)), TM(tm),
|
||||
RI(*TM.getSubtargetImpl(), *this) {}
|
||||
: TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts),
|
||||
PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
|
||||
TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
|
||||
|
||||
/// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
|
||||
/// this target when scheduling the DAG.
|
||||
|
|
|
@ -114,8 +114,7 @@ unsigned PPCRegisterInfo::getRegisterNumbering(unsigned RegEnum) {
|
|||
|
||||
PPCRegisterInfo::PPCRegisterInfo(const PPCSubtarget &ST,
|
||||
const TargetInstrInfo &tii)
|
||||
: PPCGenRegisterInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
|
||||
Subtarget(ST), TII(tii) {
|
||||
: PPCGenRegisterInfo(), Subtarget(ST), TII(tii) {
|
||||
ImmToIdxMap[PPC::LD] = PPC::LDX; ImmToIdxMap[PPC::STD] = PPC::STDX;
|
||||
ImmToIdxMap[PPC::LBZ] = PPC::LBZX; ImmToIdxMap[PPC::STB] = PPC::STBX;
|
||||
ImmToIdxMap[PPC::LHZ] = PPC::LHZX; ImmToIdxMap[PPC::LHA] = PPC::LHAX;
|
||||
|
|
|
@ -27,7 +27,8 @@
|
|||
using namespace llvm;
|
||||
|
||||
SparcInstrInfo::SparcInstrInfo(SparcSubtarget &ST)
|
||||
: TargetInstrInfoImpl(SparcInsts, array_lengthof(SparcInsts)),
|
||||
: TargetInstrInfoImpl(SparcInsts, array_lengthof(SparcInsts),
|
||||
SP::ADJCALLSTACKDOWN, SP::ADJCALLSTACKUP),
|
||||
RI(ST, *this), Subtarget(ST) {
|
||||
}
|
||||
|
||||
|
|
|
@ -32,8 +32,7 @@ using namespace llvm;
|
|||
|
||||
SparcRegisterInfo::SparcRegisterInfo(SparcSubtarget &st,
|
||||
const TargetInstrInfo &tii)
|
||||
: SparcGenRegisterInfo(SP::ADJCALLSTACKDOWN, SP::ADJCALLSTACKUP),
|
||||
Subtarget(st), TII(tii) {
|
||||
: SparcGenRegisterInfo(), Subtarget(st), TII(tii) {
|
||||
}
|
||||
|
||||
const unsigned* SparcRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF)
|
||||
|
|
|
@ -29,7 +29,8 @@
|
|||
using namespace llvm;
|
||||
|
||||
SystemZInstrInfo::SystemZInstrInfo(SystemZTargetMachine &tm)
|
||||
: TargetInstrInfoImpl(SystemZInsts, array_lengthof(SystemZInsts)),
|
||||
: TargetInstrInfoImpl(SystemZInsts, array_lengthof(SystemZInsts),
|
||||
SystemZ::ADJCALLSTACKUP, SystemZ::ADJCALLSTACKDOWN),
|
||||
RI(tm, *this), TM(tm) {
|
||||
}
|
||||
|
||||
|
|
|
@ -34,8 +34,7 @@ using namespace llvm;
|
|||
|
||||
SystemZRegisterInfo::SystemZRegisterInfo(SystemZTargetMachine &tm,
|
||||
const SystemZInstrInfo &tii)
|
||||
: SystemZGenRegisterInfo(SystemZ::ADJCALLSTACKUP, SystemZ::ADJCALLSTACKDOWN),
|
||||
TM(tm), TII(tii) {
|
||||
: SystemZGenRegisterInfo(), TM(tm), TII(tii) {
|
||||
}
|
||||
|
||||
const unsigned*
|
||||
|
|
|
@ -24,7 +24,10 @@ using namespace llvm;
|
|||
// 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,12 +22,9 @@ using namespace llvm;
|
|||
|
||||
TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterInfoDesc *ID,
|
||||
regclass_iterator RCB, regclass_iterator RCE,
|
||||
const char *const *subregindexnames,
|
||||
int CFSO, int CFDO)
|
||||
const char *const *subregindexnames)
|
||||
: InfoDesc(ID), SubRegIndexNames(subregindexnames),
|
||||
RegClassBegin(RCB), RegClassEnd(RCE) {
|
||||
CallFrameSetupOpcode = CFSO;
|
||||
CallFrameDestroyOpcode = CFDO;
|
||||
}
|
||||
|
||||
TargetRegisterInfo::~TargetRegisterInfo() {}
|
||||
|
|
|
@ -1630,7 +1630,7 @@ bool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
|
|||
unsigned NumBytes = CCInfo.getNextStackOffset();
|
||||
|
||||
// Issue CALLSEQ_START
|
||||
unsigned AdjStackDown = TM.getRegisterInfo()->getCallFrameSetupOpcode();
|
||||
unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(AdjStackDown))
|
||||
.addImm(NumBytes);
|
||||
|
||||
|
@ -1803,7 +1803,7 @@ bool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
|
|||
MIB.addReg(RegArgs[i]);
|
||||
|
||||
// Issue CALLSEQ_END
|
||||
unsigned AdjStackUp = TM.getRegisterInfo()->getCallFrameDestroyOpcode();
|
||||
unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
|
||||
unsigned NumBytesCallee = 0;
|
||||
if (!Subtarget->is64Bit() && CS.paramHasAttr(1, Attribute::StructRet))
|
||||
NumBytesCallee = 4;
|
||||
|
|
|
@ -54,7 +54,13 @@ ReMatPICStubLoad("remat-pic-stub-load",
|
|||
cl::init(false), cl::Hidden);
|
||||
|
||||
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) {
|
||||
enum {
|
||||
TB_NOT_REVERSABLE = 1U << 31,
|
||||
|
|
|
@ -54,13 +54,7 @@ ForceStackAlign("force-align-stack",
|
|||
|
||||
X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
|
||||
const TargetInstrInfo &tii)
|
||||
: X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ?
|
||||
X86::ADJCALLSTACKDOWN64 :
|
||||
X86::ADJCALLSTACKDOWN32,
|
||||
tm.getSubtarget<X86Subtarget>().is64Bit() ?
|
||||
X86::ADJCALLSTACKUP64 :
|
||||
X86::ADJCALLSTACKUP32),
|
||||
TM(tm), TII(tii) {
|
||||
: X86GenRegisterInfo(), TM(tm), TII(tii) {
|
||||
// Cache some information.
|
||||
const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
|
||||
Is64Bit = Subtarget->is64Bit();
|
||||
|
@ -608,7 +602,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
|||
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
|
||||
bool reseveCallFrame = TFI->hasReservedCallFrame(MF);
|
||||
int Opcode = I->getOpcode();
|
||||
bool isDestroy = Opcode == getCallFrameDestroyOpcode();
|
||||
bool isDestroy = Opcode == TII.getCallFrameDestroyOpcode();
|
||||
DebugLoc DL = I->getDebugLoc();
|
||||
uint64_t Amount = !reseveCallFrame ? I->getOperand(0).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;
|
||||
|
||||
MachineInstr *New = 0;
|
||||
if (Opcode == getCallFrameSetupOpcode()) {
|
||||
if (Opcode == TII.getCallFrameSetupOpcode()) {
|
||||
New = BuildMI(MF, DL, TII.get(getSUBriOpcode(Is64Bit, Amount)),
|
||||
StackPtr)
|
||||
.addReg(StackPtr)
|
||||
.addImm(Amount);
|
||||
} else {
|
||||
assert(Opcode == getCallFrameDestroyOpcode());
|
||||
assert(Opcode == TII.getCallFrameDestroyOpcode());
|
||||
|
||||
// Factor out the amount the callee already popped.
|
||||
Amount -= CalleeAmt;
|
||||
|
@ -658,7 +652,7 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
|||
return;
|
||||
}
|
||||
|
||||
if (Opcode == getCallFrameDestroyOpcode() && CalleeAmt) {
|
||||
if (Opcode == TII.getCallFrameDestroyOpcode() && CalleeAmt) {
|
||||
// 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
|
||||
// more advanced stack pointer tracking ability.
|
||||
|
|
|
@ -40,7 +40,8 @@ namespace XCore {
|
|||
using namespace llvm;
|
||||
|
||||
XCoreInstrInfo::XCoreInstrInfo()
|
||||
: TargetInstrInfoImpl(XCoreInsts, array_lengthof(XCoreInsts)),
|
||||
: TargetInstrInfoImpl(XCoreInsts, array_lengthof(XCoreInsts),
|
||||
XCore::ADJCALLSTACKDOWN, XCore::ADJCALLSTACKUP),
|
||||
RI(*this) {
|
||||
}
|
||||
|
||||
|
|
|
@ -40,8 +40,7 @@
|
|||
using namespace llvm;
|
||||
|
||||
XCoreRegisterInfo::XCoreRegisterInfo(const TargetInstrInfo &tii)
|
||||
: XCoreGenRegisterInfo(XCore::ADJCALLSTACKDOWN, XCore::ADJCALLSTACKUP),
|
||||
TII(tii) {
|
||||
: XCoreGenRegisterInfo(), TII(tii) {
|
||||
}
|
||||
|
||||
// helper functions
|
||||
|
|
|
@ -214,8 +214,7 @@ RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target,
|
|||
OS << "namespace llvm {\n\n";
|
||||
|
||||
OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
|
||||
<< " explicit " << ClassName
|
||||
<< "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
|
||||
<< " explicit " << ClassName << "();\n"
|
||||
<< " virtual int getDwarfRegNumFull(unsigned RegNum, "
|
||||
<< "unsigned Flavour) const;\n"
|
||||
<< " virtual int getLLVMRegNumFull(unsigned DwarfRegNum, "
|
||||
|
@ -660,11 +659,10 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
|||
|
||||
// Emit the constructor of the class...
|
||||
OS << ClassName << "::" << ClassName
|
||||
<< "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n"
|
||||
<< "()\n"
|
||||
<< " : TargetRegisterInfo(" << TargetName << "RegInfoDesc"
|
||||
<< ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n"
|
||||
<< " SubRegIndexTable,\n"
|
||||
<< " CallFrameSetupOpcode, CallFrameDestroyOpcode) {\n"
|
||||
<< " SubRegIndexTable) {\n"
|
||||
<< " InitMCRegisterInfo(" << TargetName << "RegDesc, "
|
||||
<< Regs.size()+1 << ");\n"
|
||||
<< "}\n\n";
|
||||
|
|
Loading…
Reference in New Issue