39 #define DEBUG_TYPE "xcore-reg-info" 41 #define GET_REGINFO_TARGET_DESC 42 #include "XCoreGenRegisterInfo.inc" 49 static inline bool isImmUs(
unsigned val) {
53 static inline bool isImmU6(
unsigned val) {
54 return val < (1 << 6);
58 return val < (1 << 16);
64 unsigned Reg,
unsigned FrameReg,
int Offset ) {
71 BuildMI(MBB, II, dl, TII.get(XCore::LDW_2rus),
Reg)
77 BuildMI(MBB, II, dl, TII.get(XCore::STW_2rus))
84 BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l2rus),
Reg)
95 unsigned Reg,
unsigned FrameReg,
97 assert(RS &&
"requiresRegisterScavenging failed");
101 unsigned ScratchOffset = RS->
scavengeRegister(&XCore::GRRegsRegClass, II, 0);
107 BuildMI(MBB, II, dl, TII.get(XCore::LDW_3r),
Reg)
113 BuildMI(MBB, II, dl, TII.get(XCore::STW_l3r))
120 BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l3r),
Reg)
140 NewOpcode = (isU6) ? XCore::LDWSP_ru6 : XCore::LDWSP_lru6;
146 NewOpcode = (isU6) ? XCore::STWSP_ru6 : XCore::STWSP_lru6;
147 BuildMI(MBB, II, dl, TII.get(NewOpcode))
153 NewOpcode = (isU6) ? XCore::LDAWSP_ru6 : XCore::LDAWSP_lru6;
165 assert(RS &&
"requiresRegisterScavenging failed");
171 unsigned ScratchBase;
172 if (OpCode==XCore::STWFI) {
177 BuildMI(MBB, II, dl, TII.get(XCore::LDAWSP_ru6), ScratchBase).addImm(0);
178 unsigned ScratchOffset = RS->
scavengeRegister(&XCore::GRRegsRegClass, II, 0);
184 BuildMI(MBB, II, dl, TII.get(XCore::LDW_3r),
Reg)
190 BuildMI(MBB, II, dl, TII.get(XCore::STW_l3r))
197 BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l3r),
Reg)
214 static const MCPhysReg CalleeSavedRegs[] = {
216 XCore::R8, XCore::R9, XCore::R10,
219 static const MCPhysReg CalleeSavedRegsFP[] = {
221 XCore::R8, XCore::R9,
226 return CalleeSavedRegsFP;
227 return CalleeSavedRegs;
235 Reserved.
set(XCore::DP);
236 Reserved.
set(XCore::SP);
237 Reserved.
set(XCore::LR);
238 if (TFI->
hasFP(MF)) {
239 Reserved.
set(XCore::R10);
261 int SPAdj,
unsigned FIOperandNum,
263 assert(SPAdj == 0 &&
"Unexpected");
300 assert(Offset%4 == 0 &&
"Misaligned stack offset");
306 assert(XCore::GRRegsRegClass.
contains(Reg) &&
"Unexpected register operand");
308 if (TFI->
hasFP(MF)) {
328 return TFI->
hasFP(MF) ? XCore::R10 : XCore::SP;
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
bool hasDebugInfo() const
Returns true if valid debug info is present.
This class represents lattice values for constants.
void ChangeToRegister(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
ChangeToRegister - Replace this operand with a new register operand of the specified value...
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
unsigned getReg() const
getReg - Returns the register number.
MachineModuleInfo & getMMI() const
bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override
return AArch64::GPR64RegClass contains(Reg)
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
const HexagonInstrInfo * TII
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
static bool needsFrameMoves(const MachineFunction &MF)
Return whether to emit frame moves.
virtual const TargetInstrInfo * getInstrInfo() const
unsigned getKillRegState(bool B)
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
void ChangeToImmediate(int64_t ImmVal)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value...
MachineBasicBlock::iterator loadImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned Reg, uint64_t Value) const
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
bool useFPForScavengingIndex(const MachineFunction &MF) const override
This file declares the machine register scavenger class.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
static void InsertSPImmInst(MachineBasicBlock::iterator II, const XCoreInstrInfo &TII, unsigned Reg, int Offset)
unsigned getFrameRegister(const MachineFunction &MF) const override
static void InsertFPConstInst(MachineBasicBlock::iterator II, const XCoreInstrInfo &TII, unsigned Reg, unsigned FrameReg, int Offset, RegScavenger *RS)
void print(raw_ostream &OS, bool IsStandalone=true, bool SkipOpers=false, bool SkipDebugLoc=false, bool AddNewLine=true, const TargetInstrInfo *TII=nullptr) const
Print this MI to OS.
bool hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register...
bool requiresRegisterScavenging(const MachineFunction &MF) const override
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static bool isImmUs(unsigned val)
mmo_iterator memoperands_begin() const
Access to memory operands of the instruction.
bool isDebugValue() const
MachineOperand class - Representation of each machine instruction operand.
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
BitVector getReservedRegs(const MachineFunction &MF) const override
static bool isImmU6(unsigned val)
const Function & getFunction() const
Return the LLVM function that this machine code represents.
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
const MachineBasicBlock * getParent() const
Representation of each machine instruction.
static bool isImmU16(unsigned val)
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
unsigned scavengeRegister(const TargetRegisterClass *RC, MachineBasicBlock::iterator I, int SPAdj)
Make a register of the specific register class available and do the appropriate bookkeeping.
static void InsertSPConstInst(MachineBasicBlock::iterator II, const XCoreInstrInfo &TII, unsigned Reg, int Offset, RegScavenger *RS)
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
void eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
static void InsertFPImmInst(MachineBasicBlock::iterator II, const XCoreInstrInfo &TII, unsigned Reg, unsigned FrameReg, int Offset)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
void setRegUsed(unsigned Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Tell the scavenger a register is used.
const MachineOperand & getOperand(unsigned i) const
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects...
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...