35 #define GET_REGINFO_TARGET_DESC
36 #include "XCoreGenRegisterInfo.inc"
45 static inline bool isImmUs(
unsigned val) {
49 static inline bool isImmU6(
unsigned val) {
50 return val < (1 << 6);
54 return val < (1 << 16);
64 static const uint16_t CalleeSavedRegs[] = {
66 XCore::R8, XCore::R9, XCore::R10, XCore::LR,
69 return CalleeSavedRegs;
76 Reserved.
set(XCore::CP);
77 Reserved.
set(XCore::DP);
78 Reserved.
set(XCore::SP);
79 Reserved.
set(XCore::LR);
81 Reserved.
set(XCore::R10);
91 return TFI->
hasFP(MF);
106 int SPAdj,
unsigned FIOperandNum,
108 assert(SPAdj == 0 &&
"Unexpected");
125 DEBUG(
errs() <<
"FrameIndex : " << FrameIndex <<
"\n");
126 DEBUG(
errs() <<
"FrameOffset : " << Offset <<
"\n");
127 DEBUG(
errs() <<
"StackSize : " << StackSize <<
"\n");
145 assert(Offset%4 == 0 &&
"Misaligned stack offset");
147 DEBUG(
errs() <<
"Offset : " << Offset <<
"\n" <<
"<--------->\n");
151 bool FP = TFI->
hasFP(MF);
156 assert(XCore::GRRegsRegClass.contains(Reg) &&
"Unexpected register operand");
169 loadConstant(MBB, II, ScratchReg, Offset, dl);
198 BuildMI(MBB, II, dl, TII.
get(XCore::STW_2rus))
221 NewOpcode = (isU6) ? XCore::LDWSP_ru6 : XCore::LDWSP_lru6;
226 NewOpcode = (isU6) ? XCore::STWSP_ru6 : XCore::STWSP_lru6;
232 NewOpcode = (isU6) ? XCore::LDAWSP_ru6 : XCore::LDAWSP_lru6;
244 void XCoreRegisterInfo::
252 int Opcode =
isImmU6(Value) ? XCore::LDC_ru6 : XCore::LDC_lru6;
254 BuildMI(MBB, I, dl, TII.
get(Opcode), DstReg).addImm(Value);
260 return TFI->
hasFP(MF) ? XCore::R10 : XCore::SP;
const MachineFunction * getParent() const
instr_iterator erase(instr_iterator I)
bool useFPForScavengingIndex(const MachineFunction &MF) const
void ChangeToRegister(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
const Function * getFunction() const
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
uint64_t getStackSize() const
const HexagonInstrInfo * TII
virtual bool hasFP(const MachineFunction &MF) const =0
#define llvm_unreachable(msg)
bool hasDebugInfo() const
const MachineInstrBuilder & addImm(int64_t Val) const
static bool needsFrameMoves(const MachineFunction &MF)
Return whether to emit frame moves.
unsigned getKillRegState(bool B)
void ChangeToImmediate(int64_t ImmVal)
const MachineBasicBlock * getParent() const
bool isDebugValue() const
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
virtual const TargetFrameLowering * getFrameLowering() const
const MCInstrDesc & get(unsigned Opcode) const
int64_t getObjectOffset(int ObjectIdx) const
bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const
virtual const TargetInstrInfo * getInstrInfo() const
void eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=NULL) const
unsigned getFrameRegister(const MachineFunction &MF) const
static bool isImmUs(unsigned val)
BitVector getReservedRegs(const MachineFunction &MF) const
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
MachineFrameInfo * getFrameInfo()
static bool isImmU6(unsigned val)
void print(raw_ostream &OS, const TargetMachine *TM=0, bool SkipOpers=false) const
static bool isImmU16(unsigned val)
bool requiresRegisterScavenging(const MachineFunction &MF) const
const uint16_t * getCalleeSavedRegs(const MachineFunction *MF=0) const
Code Generation virtual methods...
const TargetMachine & getTarget() const
unsigned getReg() const
getReg - Returns the register number.
LLVM Value Representation.
MachineModuleInfo & getMMI() const
StringRef getName() const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
DebugLoc getDebugLoc() const
unsigned scavengeRegister(const TargetRegisterClass *RegClass, MachineBasicBlock::iterator I, int SPAdj)