mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-26 05:25:47 +00:00
Move some more functionality from MRegisterInfo to TargetInstrInfo.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45603 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -46,6 +46,7 @@ namespace {
|
|||||||
(void) llvm::createAliasDebugger();
|
(void) llvm::createAliasDebugger();
|
||||||
(void) llvm::createAndersensPass();
|
(void) llvm::createAndersensPass();
|
||||||
(void) llvm::createArgumentPromotionPass();
|
(void) llvm::createArgumentPromotionPass();
|
||||||
|
(void) llvm::createAutoVectorizePass();
|
||||||
(void) llvm::createBasicAliasAnalysisPass();
|
(void) llvm::createBasicAliasAnalysisPass();
|
||||||
(void) llvm::createBasicVNPass();
|
(void) llvm::createBasicVNPass();
|
||||||
(void) llvm::createBlockPlacementPass();
|
(void) llvm::createBlockPlacementPass();
|
||||||
|
@@ -25,7 +25,6 @@
|
|||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
class BitVector;
|
class BitVector;
|
||||||
class CalleeSavedInfo;
|
|
||||||
class MachineFunction;
|
class MachineFunction;
|
||||||
class MachineInstr;
|
class MachineInstr;
|
||||||
class MachineLocation;
|
class MachineLocation;
|
||||||
@@ -470,26 +469,6 @@ public:
|
|||||||
// immediates and memory. FIXME: Move these to TargetInstrInfo.h.
|
// immediates and memory. FIXME: Move these to TargetInstrInfo.h.
|
||||||
//
|
//
|
||||||
|
|
||||||
/// spillCalleeSavedRegisters - Issues instruction(s) to spill all callee
|
|
||||||
/// saved registers and returns true if it isn't possible / profitable to do
|
|
||||||
/// so by issuing a series of store instructions via
|
|
||||||
/// storeRegToStackSlot(). Returns false otherwise.
|
|
||||||
virtual bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// restoreCalleeSavedRegisters - Issues instruction(s) to restore all callee
|
|
||||||
/// saved registers and returns true if it isn't possible / profitable to do
|
|
||||||
/// so by issuing a series of load instructions via loadRegToStackSlot().
|
|
||||||
/// Returns false otherwise.
|
|
||||||
virtual bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// getCrossCopyRegClass - Returns a legal register class to copy a register
|
/// getCrossCopyRegClass - Returns a legal register class to copy a register
|
||||||
/// in the specified class to or from. Returns NULL if it is possible to copy
|
/// in the specified class to or from. Returns NULL if it is possible to copy
|
||||||
/// between a two registers of the specified class.
|
/// between a two registers of the specified class.
|
||||||
|
@@ -26,6 +26,7 @@ class MachineInstr;
|
|||||||
class TargetMachine;
|
class TargetMachine;
|
||||||
class TargetRegisterClass;
|
class TargetRegisterClass;
|
||||||
class LiveVariables;
|
class LiveVariables;
|
||||||
|
class CalleeSavedInfo;
|
||||||
|
|
||||||
template<class T> class SmallVectorImpl;
|
template<class T> class SmallVectorImpl;
|
||||||
|
|
||||||
@@ -497,6 +498,26 @@ public:
|
|||||||
assert(0 && "Target didn't implement TargetInstrInfo::loadRegFromAddr!");
|
assert(0 && "Target didn't implement TargetInstrInfo::loadRegFromAddr!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// spillCalleeSavedRegisters - Issues instruction(s) to spill all callee
|
||||||
|
/// saved registers and returns true if it isn't possible / profitable to do
|
||||||
|
/// so by issuing a series of store instructions via
|
||||||
|
/// storeRegToStackSlot(). Returns false otherwise.
|
||||||
|
virtual bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// restoreCalleeSavedRegisters - Issues instruction(s) to restore all callee
|
||||||
|
/// saved registers and returns true if it isn't possible / profitable to do
|
||||||
|
/// so by issuing a series of load instructions via loadRegToStackSlot().
|
||||||
|
/// Returns false otherwise.
|
||||||
|
virtual bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// BlockHasNoFallThrough - Return true if the specified block does not
|
/// BlockHasNoFallThrough - Return true if the specified block does not
|
||||||
/// fall-through into its successor block. This is primarily used when a
|
/// fall-through into its successor block. This is primarily used when a
|
||||||
/// branch is unanalyzable. It is useful for things like unconditional
|
/// branch is unanalyzable. It is useful for things like unconditional
|
||||||
|
@@ -330,6 +330,12 @@ FunctionPass *createPredicateSimplifierPass();
|
|||||||
//
|
//
|
||||||
FunctionPass *createGVNPREPass();
|
FunctionPass *createGVNPREPass();
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// AutoVectorize - This pass performs vectorization of straight-line code
|
||||||
|
//
|
||||||
|
FunctionPass *createAutoVectorizePass();
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// GVN - This pass performs global value numbering and redundant load
|
// GVN - This pass performs global value numbering and redundant load
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
#include "ARMMachineFunctionInfo.h"
|
#include "ARMMachineFunctionInfo.h"
|
||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
#include "llvm/CodeGen/LiveVariables.h"
|
#include "llvm/CodeGen/LiveVariables.h"
|
||||||
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||||
#include "llvm/Target/TargetAsmInfo.h"
|
#include "llvm/Target/TargetAsmInfo.h"
|
||||||
@@ -598,6 +599,50 @@ void ARMInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ARMInstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const {
|
||||||
|
MachineFunction &MF = *MBB.getParent();
|
||||||
|
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||||
|
if (!AFI->isThumbFunction() || CSI.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
MachineInstrBuilder MIB = BuildMI(MBB, MI, get(ARM::tPUSH));
|
||||||
|
for (unsigned i = CSI.size(); i != 0; --i) {
|
||||||
|
unsigned Reg = CSI[i-1].getReg();
|
||||||
|
// Add the callee-saved register as live-in. It's killed at the spill.
|
||||||
|
MBB.addLiveIn(Reg);
|
||||||
|
MIB.addReg(Reg, false/*isDef*/,false/*isImp*/,true/*isKill*/);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ARMInstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const {
|
||||||
|
MachineFunction &MF = *MBB.getParent();
|
||||||
|
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||||
|
if (!AFI->isThumbFunction() || CSI.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool isVarArg = AFI->getVarArgsRegSaveSize() > 0;
|
||||||
|
MachineInstr *PopMI = new MachineInstr(get(ARM::tPOP));
|
||||||
|
MBB.insert(MI, PopMI);
|
||||||
|
for (unsigned i = CSI.size(); i != 0; --i) {
|
||||||
|
unsigned Reg = CSI[i-1].getReg();
|
||||||
|
if (Reg == ARM::LR) {
|
||||||
|
// Special epilogue for vararg functions. See emitEpilogue
|
||||||
|
if (isVarArg)
|
||||||
|
continue;
|
||||||
|
Reg = ARM::PC;
|
||||||
|
PopMI->setInstrDescriptor(get(ARM::tPOP_RET));
|
||||||
|
MBB.erase(MI);
|
||||||
|
}
|
||||||
|
PopMI->addOperand(MachineOperand::CreateReg(Reg, true));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool ARMInstrInfo::BlockHasNoFallThrough(MachineBasicBlock &MBB) const {
|
bool ARMInstrInfo::BlockHasNoFallThrough(MachineBasicBlock &MBB) const {
|
||||||
if (MBB.empty()) return false;
|
if (MBB.empty()) return false;
|
||||||
|
|
||||||
|
@@ -184,6 +184,12 @@ public:
|
|||||||
SmallVectorImpl<MachineOperand> &Addr,
|
SmallVectorImpl<MachineOperand> &Addr,
|
||||||
const TargetRegisterClass *RC,
|
const TargetRegisterClass *RC,
|
||||||
SmallVectorImpl<MachineInstr*> &NewMIs) const;
|
SmallVectorImpl<MachineInstr*> &NewMIs) const;
|
||||||
|
virtual bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const;
|
||||||
|
virtual bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const;
|
||||||
virtual bool BlockHasNoFallThrough(MachineBasicBlock &MBB) const;
|
virtual bool BlockHasNoFallThrough(MachineBasicBlock &MBB) const;
|
||||||
virtual bool ReverseBranchCondition(std::vector<MachineOperand> &Cond) const;
|
virtual bool ReverseBranchCondition(std::vector<MachineOperand> &Cond) const;
|
||||||
|
|
||||||
|
@@ -88,50 +88,6 @@ ARMRegisterInfo::ARMRegisterInfo(const TargetInstrInfo &tii,
|
|||||||
FramePtr((STI.useThumbBacktraces() || STI.isThumb()) ? ARM::R7 : ARM::R11) {
|
FramePtr((STI.useThumbBacktraces() || STI.isThumb()) ? ARM::R7 : ARM::R11) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ARMRegisterInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const {
|
|
||||||
MachineFunction &MF = *MBB.getParent();
|
|
||||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
|
||||||
if (!AFI->isThumbFunction() || CSI.empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
MachineInstrBuilder MIB = BuildMI(MBB, MI, TII.get(ARM::tPUSH));
|
|
||||||
for (unsigned i = CSI.size(); i != 0; --i) {
|
|
||||||
unsigned Reg = CSI[i-1].getReg();
|
|
||||||
// Add the callee-saved register as live-in. It's killed at the spill.
|
|
||||||
MBB.addLiveIn(Reg);
|
|
||||||
MIB.addReg(Reg, false/*isDef*/,false/*isImp*/,true/*isKill*/);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ARMRegisterInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const {
|
|
||||||
MachineFunction &MF = *MBB.getParent();
|
|
||||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
|
||||||
if (!AFI->isThumbFunction() || CSI.empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
bool isVarArg = AFI->getVarArgsRegSaveSize() > 0;
|
|
||||||
MachineInstr *PopMI = new MachineInstr(TII.get(ARM::tPOP));
|
|
||||||
MBB.insert(MI, PopMI);
|
|
||||||
for (unsigned i = CSI.size(); i != 0; --i) {
|
|
||||||
unsigned Reg = CSI[i-1].getReg();
|
|
||||||
if (Reg == ARM::LR) {
|
|
||||||
// Special epilogue for vararg functions. See emitEpilogue
|
|
||||||
if (isVarArg)
|
|
||||||
continue;
|
|
||||||
Reg = ARM::PC;
|
|
||||||
PopMI->setInstrDescriptor(TII.get(ARM::tPOP_RET));
|
|
||||||
MBB.erase(MI);
|
|
||||||
}
|
|
||||||
PopMI->addOperand(MachineOperand::CreateReg(Reg, true));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
const MachineInstrBuilder &AddDefaultPred(const MachineInstrBuilder &MIB) {
|
const MachineInstrBuilder &AddDefaultPred(const MachineInstrBuilder &MIB) {
|
||||||
return MIB.addImm((int64_t)ARMCC::AL).addReg(0);
|
return MIB.addImm((int64_t)ARMCC::AL).addReg(0);
|
||||||
|
@@ -37,14 +37,6 @@ public:
|
|||||||
static unsigned getRegisterNumbering(unsigned RegEnum);
|
static unsigned getRegisterNumbering(unsigned RegEnum);
|
||||||
|
|
||||||
/// Code Generation virtual methods...
|
/// Code Generation virtual methods...
|
||||||
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const;
|
|
||||||
|
|
||||||
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const;
|
|
||||||
|
|
||||||
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
||||||
unsigned DestReg, const MachineInstr *Orig) const;
|
unsigned DestReg, const MachineInstr *Orig) const;
|
||||||
|
|
||||||
|
@@ -29,12 +29,6 @@ struct IA64RegisterInfo : public IA64GenRegisterInfo {
|
|||||||
IA64RegisterInfo(const TargetInstrInfo &tii);
|
IA64RegisterInfo(const TargetInstrInfo &tii);
|
||||||
|
|
||||||
/// Code Generation virtual methods...
|
/// Code Generation virtual methods...
|
||||||
void copyRegToReg(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
unsigned DestReg, unsigned SrcReg,
|
|
||||||
const TargetRegisterClass *DestRC,
|
|
||||||
const TargetRegisterClass *SrcRC) const;
|
|
||||||
|
|
||||||
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
||||||
unsigned DestReg, const MachineInstr *Orig) const;
|
unsigned DestReg, const MachineInstr *Orig) const;
|
||||||
|
|
||||||
|
@@ -15,9 +15,11 @@
|
|||||||
#include "X86.h"
|
#include "X86.h"
|
||||||
#include "X86GenInstrInfo.inc"
|
#include "X86GenInstrInfo.inc"
|
||||||
#include "X86InstrBuilder.h"
|
#include "X86InstrBuilder.h"
|
||||||
|
#include "X86MachineFunctionInfo.h"
|
||||||
#include "X86Subtarget.h"
|
#include "X86Subtarget.h"
|
||||||
#include "X86TargetMachine.h"
|
#include "X86TargetMachine.h"
|
||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||||
#include "llvm/CodeGen/LiveVariables.h"
|
#include "llvm/CodeGen/LiveVariables.h"
|
||||||
@@ -962,6 +964,45 @@ void X86InstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
|
|||||||
NewMIs.push_back(MIB);
|
NewMIs.push_back(MIB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool X86InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const {
|
||||||
|
if (CSI.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
|
||||||
|
unsigned SlotSize = is64Bit ? 8 : 4;
|
||||||
|
|
||||||
|
MachineFunction &MF = *MBB.getParent();
|
||||||
|
X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
|
||||||
|
X86FI->setCalleeSavedFrameSize(CSI.size() * SlotSize);
|
||||||
|
|
||||||
|
unsigned Opc = is64Bit ? X86::PUSH64r : X86::PUSH32r;
|
||||||
|
for (unsigned i = CSI.size(); i != 0; --i) {
|
||||||
|
unsigned Reg = CSI[i-1].getReg();
|
||||||
|
// Add the callee-saved register as live-in. It's killed at the spill.
|
||||||
|
MBB.addLiveIn(Reg);
|
||||||
|
BuildMI(MBB, MI, get(Opc)).addReg(Reg);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool X86InstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const {
|
||||||
|
if (CSI.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
|
||||||
|
|
||||||
|
unsigned Opc = is64Bit ? X86::POP64r : X86::POP32r;
|
||||||
|
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
||||||
|
unsigned Reg = CSI[i].getReg();
|
||||||
|
BuildMI(MBB, MI, get(Opc), Reg);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool X86InstrInfo::BlockHasNoFallThrough(MachineBasicBlock &MBB) const {
|
bool X86InstrInfo::BlockHasNoFallThrough(MachineBasicBlock &MBB) const {
|
||||||
if (MBB.empty()) return false;
|
if (MBB.empty()) return false;
|
||||||
|
|
||||||
|
@@ -296,6 +296,15 @@ public:
|
|||||||
SmallVectorImpl<MachineOperand> &Addr,
|
SmallVectorImpl<MachineOperand> &Addr,
|
||||||
const TargetRegisterClass *RC,
|
const TargetRegisterClass *RC,
|
||||||
SmallVectorImpl<MachineInstr*> &NewMIs) const;
|
SmallVectorImpl<MachineInstr*> &NewMIs) const;
|
||||||
|
|
||||||
|
virtual bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const;
|
||||||
|
|
||||||
|
virtual bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator MI,
|
||||||
|
const std::vector<CalleeSavedInfo> &CSI) const;
|
||||||
|
|
||||||
virtual bool BlockHasNoFallThrough(MachineBasicBlock &MBB) const;
|
virtual bool BlockHasNoFallThrough(MachineBasicBlock &MBB) const;
|
||||||
virtual bool ReverseBranchCondition(std::vector<MachineOperand> &Cond) const;
|
virtual bool ReverseBranchCondition(std::vector<MachineOperand> &Cond) const;
|
||||||
|
|
||||||
|
@@ -741,39 +741,6 @@ unsigned X86RegisterInfo::getX86RegNum(unsigned RegNo) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool X86RegisterInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const {
|
|
||||||
if (CSI.empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
MachineFunction &MF = *MBB.getParent();
|
|
||||||
X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
|
|
||||||
X86FI->setCalleeSavedFrameSize(CSI.size() * SlotSize);
|
|
||||||
unsigned Opc = Is64Bit ? X86::PUSH64r : X86::PUSH32r;
|
|
||||||
for (unsigned i = CSI.size(); i != 0; --i) {
|
|
||||||
unsigned Reg = CSI[i-1].getReg();
|
|
||||||
// Add the callee-saved register as live-in. It's killed at the spill.
|
|
||||||
MBB.addLiveIn(Reg);
|
|
||||||
BuildMI(MBB, MI, TII.get(Opc)).addReg(Reg);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool X86RegisterInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const {
|
|
||||||
if (CSI.empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
unsigned Opc = Is64Bit ? X86::POP64r : X86::POP32r;
|
|
||||||
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
|
||||||
unsigned Reg = CSI[i].getReg();
|
|
||||||
BuildMI(MBB, MI, TII.get(Opc), Reg);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const MachineInstrBuilder &X86InstrAddOperand(MachineInstrBuilder &MIB,
|
static const MachineInstrBuilder &X86InstrAddOperand(MachineInstrBuilder &MIB,
|
||||||
MachineOperand &MO) {
|
MachineOperand &MO) {
|
||||||
if (MO.isRegister())
|
if (MO.isRegister())
|
||||||
|
@@ -92,15 +92,7 @@ public:
|
|||||||
int getDwarfRegNum(unsigned RegNum, bool isEH) const;
|
int getDwarfRegNum(unsigned RegNum, bool isEH) const;
|
||||||
|
|
||||||
/// Code Generation virtual methods...
|
/// Code Generation virtual methods...
|
||||||
///
|
///
|
||||||
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const;
|
|
||||||
|
|
||||||
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator MI,
|
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const;
|
|
||||||
|
|
||||||
const TargetRegisterClass *
|
const TargetRegisterClass *
|
||||||
getCrossCopyRegClass(const TargetRegisterClass *RC) const;
|
getCrossCopyRegClass(const TargetRegisterClass *RC) const;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user