41 #define GET_REGINFO_TARGET_DESC
42 #include "ARMGenRegisterInfo.inc"
48 FramePtr((STI.isTargetDarwin() || STI.isThumb()) ?
ARM::R7 :
ARM::R11),
58 if (!MF)
return RegList;
64 return CSR_NoRegs_SaveList;
69 return CSR_AAPCS_SaveList;
73 return CSR_FIQ_SaveList;
77 return CSR_GenericInt_SaveList;
88 return CSR_NoRegs_RegMask;
90 ? CSR_iOS_RegMask : CSR_AAPCS_RegMask;
95 return CSR_NoRegs_RegMask;
112 ? CSR_iOS_ThisReturn_RegMask : CSR_AAPCS_ThisReturn_RegMask;
121 Reserved.
set(ARM::SP);
122 Reserved.
set(ARM::PC);
123 Reserved.
set(ARM::FPSCR);
124 Reserved.
set(ARM::APSR_NZCV);
131 Reserved.
set(ARM::R9);
134 assert(ARM::D31 == ARM::D16 + 15);
135 for (
unsigned i = 0; i != 16; ++i)
136 Reserved.
set(ARM::D16 + i);
141 if (Reserved.
test(*SI)) Reserved.
set(*
I);
152 switch (Super->
getID()) {
153 case ARM::GPRRegClassID:
154 case ARM::SPRRegClassID:
155 case ARM::DPRRegClassID:
156 case ARM::QPRRegClassID:
157 case ARM::QQPRRegClassID:
158 case ARM::QQQQPRRegClassID:
159 case ARM::GPRPairRegClassID:
170 return &ARM::GPRRegClass;
175 if (RC == &ARM::CCRRegClass)
185 switch (RC->
getID()) {
188 case ARM::tGPRRegClassID:
189 return TFI->
hasFP(MF) ? 4 : 5;
190 case ARM::GPRRegClassID: {
191 unsigned FP = TFI->
hasFP(MF) ? 1 : 0;
194 case ARM::SPRRegClassID:
195 case ARM::DPRRegClassID:
203 if (ARM::GPRPairRegClass.contains(*Supers))
204 return RI->
getSubReg(*Supers, Odd ? ARM::gsub_1 : ARM::gsub_0);
219 switch (Hint.first) {
234 unsigned PairedPhys = 0;
235 if (VRM && VRM->
hasPhys(Hint.second)) {
243 std::find(Order.
begin(), Order.
end(), PairedPhys) != Order.
end())
247 for (
unsigned I = 0, E = Order.
size();
I != E; ++
I) {
248 unsigned Reg = Order[
I];
249 if (Reg == PairedPhys || (getEncodingValue(Reg) & 1) != Odd)
271 unsigned OtherReg = Hint.second;
273 if (Hint.second == Reg)
285 switch (RC->
getID()) {
286 case ARM::DPRRegClassID:
287 case ARM::DPR_8RegClassID:
288 case ARM::DPR_VFP2RegClassID:
289 case ARM::QPRRegClassID:
290 case ARM::QPR_8RegClassID:
291 case ARM::QPR_VFP2RegClassID:
292 case ARM::SPRRegClassID:
293 case ARM::SPR_8RegClassID:
362 bool requiresRealignment =
394 unsigned DestReg,
unsigned SubIdx,
int Val,
396 unsigned PredReg,
unsigned MIFlags)
const {
406 .addConstantPoolIndex(Idx)
435 int64_t InstrOffs = 0;
450 InstrOffs = -InstrOffs;
458 InstrOffs = -InstrOffs;
465 InstrOffs = -InstrOffs;
478 return InstrOffs * Scale;
488 assert(i < MI->getNumOperands() &&
"Instr doesn't have FrameIndex operand!");
502 case ARM::LDRi12:
case ARM::LDRH:
case ARM::LDRBi12:
503 case ARM::STRi12:
case ARM::STRH:
case ARM::STRBi12:
504 case ARM::t2LDRi12:
case ARM::t2LDRi8:
505 case ARM::t2STRi12:
case ARM::t2STRi8:
506 case ARM::VLDRS:
case ARM::VLDRD:
507 case ARM::VSTRS:
case ARM::VSTRD:
508 case ARM::tSTRspi:
case ARM::tLDRspi:
528 int64_t FPOffset = Offset - 8;
548 if (TFI->
hasFP(MF) &&
569 unsigned BaseReg,
int FrameIdx,
570 int64_t Offset)
const {
577 if (Ins != MBB->
end())
578 DL = Ins->getDebugLoc();
587 .addFrameIndex(FrameIdx).addImm(Offset));
595 unsigned BaseReg, int64_t Offset)
const {
606 "This resolveFrameIndex does not support Thumb1!");
610 assert(i < MI.
getNumOperands() &&
"Instr doesn't have FrameIndex operand!");
619 assert (Done &&
"Unable to resolve frame index!");
624 int64_t Offset)
const {
631 assert(i < MI->getNumOperands() &&
"Instr doesn't have FrameIndex operand!");
638 unsigned NumBits = 0;
640 bool isSigned =
true;
678 if ((Offset & (Scale-1)) != 0)
681 if (isSigned && Offset < 0)
684 unsigned Mask = (1 << NumBits) - 1;
685 if ((
unsigned)Offset <= Mask * Scale)
693 int SPAdj,
unsigned FIOperandNum,
704 "This eliminateFrameIndex does not support Thumb1!");
717 "Cannot use SP to access the emergency spill slot in "
718 "functions without a reserved call frame");
720 "Cannot use SP to access the emergency spill slot in "
721 "functions with variable sized frame objects");
725 assert(!MI.
isDebugValue() &&
"DBG_VALUEs should be handled in target-independent code");
744 "This code isn't needed if offset already handled!");
746 unsigned ScratchReg = 0;
758 Offset, Pred, PredReg,
TII);
762 Offset, Pred, PredReg,
TII);
unsigned getFrameRegister(const MachineFunction &MF) const
bool hasPhys(unsigned virtReg) const
returns true if the specified virtual register is mapped to a physical register
unsigned getStackAlignment() const
void push_back(const T &Elt)
const MachineFunction * getParent() const
The machine constant pool.
void resolveFrameIndex(MachineBasicBlock::iterator I, unsigned BaseReg, int64_t Offset) const
bool hasReservedCallFrame(const MachineFunction &MF) const
LLVMContext & getContext() const
static unsigned char getAM3Offset(unsigned AM3Opc)
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
ARMBaseRegisterInfo(const ARMSubtarget &STI)
void ChangeToRegister(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const
virtual void eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=NULL) const
unsigned createVirtualRegister(const TargetRegisterClass *RegClass)
static bool isVirtualRegister(unsigned Reg)
void emitT2RegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, unsigned DestReg, unsigned BaseReg, int NumBytes, ARMCC::CondCodes Pred, unsigned PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
bool adjustsStack() const
int ResolveFrameIndexReference(const MachineFunction &MF, int FI, unsigned &FrameReg, int SPAdj) const
const MCInstrDesc & getDesc() const
bool isThumbFunction() const
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
const Function * getFunction() const
bool hasAttribute(unsigned Index, Attribute::AttrKind Kind) const
Return true if the attribute exists at the given index.
const MCPhysReg * iterator
virtual bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const
bool canReserveReg(unsigned PhysReg) const
const TargetRegisterClass * getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const
CallingConv::ID getCallingConv() const
virtual bool requiresRegisterScavenging(const MachineFunction &MF) const
Code Generation virtual methods...
unsigned getMaxAlignment() const
bool isR9Reserved() const
int64_t getLocalFrameSize() const
getLocalFrameSize - Get the size of the local object blob.
BitVector getReservedRegs(const MachineFunction &MF) const
static const MachineInstrBuilder & AddDefaultPred(const MachineInstrBuilder &MIB)
static unsigned getPairedGPR(unsigned Reg, bool Odd, const MCRegisterInfo *RI)
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC) const
const HexagonInstrInfo * TII
std::pair< unsigned, unsigned > getRegAllocationHint(unsigned Reg) const
virtual bool hasFP(const MachineFunction &MF) const =0
#define llvm_unreachable(msg)
bool DisableFramePointerElim(const MachineFunction &MF) const
unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const
bool rewriteARMFrameIndex(MachineInstr &MI, unsigned FrameRegIdx, unsigned FrameReg, int &Offset, const ARMBaseInstrInfo &TII)
Abstract Stack Frame Information.
bool isFrameAddressTaken() const
ID
LLVM Calling Convention Representation.
bool rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx, unsigned FrameReg, int &Offset, const ARMBaseInstrInfo &TII)
void setRegAllocationHint(unsigned Reg, unsigned Type, unsigned PrefReg)
const MachineInstrBuilder & addImm(int64_t Val) const
virtual void getRegAllocationHints(unsigned VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM=0) const
unsigned getNumOperands() const
virtual bool avoidWriteAfterWrite(const TargetRegisterClass *RC) const
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
unsigned getLocalFrameMaxAlign() const
bool isThumb1OnlyFunction() const
size_t size() const
size - Get the array size.
const TargetRegisterClass * constrainRegClass(unsigned Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const
const MachineBasicBlock * getParent() const
bool isDebugValue() const
unsigned getDefRegState(bool B)
bundle_iterator< MachineInstr, instr_iterator > iterator
const uint32_t * getCallPreservedMask(CallingConv::ID) const
void UpdateRegAllocHint(unsigned Reg, unsigned NewReg, MachineFunction &MF) const
LLVM Constant Representation.
bool isReserved(unsigned PhysReg) const
static unsigned char getAM5Offset(unsigned AM5Opc)
const MachineOperand & getOperand(unsigned i) const
unsigned getSubReg(unsigned Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo...
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
MachineConstantPool * getConstantPool()
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
const TargetRegisterClass *const * sc_iterator
virtual const TargetFrameLowering * getFrameLowering() const
int64_t getFrameIndexInstrOffset(const MachineInstr *MI, int Idx) const
void emitARMRegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, unsigned DestReg, unsigned BaseReg, int NumBytes, ARMCC::CondCodes Pred, unsigned PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
const MCInstrDesc & get(unsigned Opcode) const
virtual bool hasReservedCallFrame(const MachineFunction &MF) const
bool canRealignStack(const MachineFunction &MF) const
bool needsStackRealignment(const MachineFunction &MF) const
bool isScavengingFrameIndex(int FI) const
Query whether a frame index is a scavenging frame index.
const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const
static AddrOpc getAM2Op(unsigned AM2Opc)
virtual const TargetInstrInfo * getInstrInfo() const
static const MachineInstrBuilder & AddDefaultCC(const MachineInstrBuilder &MIB)
static unsigned getAM2Offset(unsigned AM2Opc)
bool test(unsigned Idx) const
const uint32_t * getNoPreservedMask() const
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
MachineFrameInfo * getFrameInfo()
AttributeSet getAttributes() const
Return the attribute list for this Function.
const uint16_t * getCalleeSavedRegs(const MachineFunction *MF=0) const
Code Generation virtual methods...
bool hasBasePointer(const MachineFunction &MF) const
AddrMode
ARM Addressing Modes.
void getRegAllocationHints(unsigned VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM) const
static AddrOpc getAM3Op(unsigned AM3Opc)
int findFirstPredOperandIdx() const
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
MachineRegisterInfo & getRegInfo()
static IntegerType * getInt32Ty(LLVMContext &C)
const TargetMachine & getTarget() const
bool hasVarSizedObjects() const
static AddrOpc getAM5Op(unsigned AM5Opc)
virtual void emitLoadConstPool(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, unsigned DestReg, unsigned SubIdx, int Val, ARMCC::CondCodes Pred=ARMCC::AL, unsigned PredReg=0, unsigned MIFlags=MachineInstr::NoFlags) const
unsigned getReg() const
getReg - Returns the register number.
StringRef getValueAsString() const
Return the attribute's value as a string. This requires the attribute to be a string attribute...
bool cannotEliminateFrame(const MachineFunction &MF) const
const uint32_t * getThisReturnPreservedMask(CallingConv::ID) const
virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const
bool isFrameOffsetLegal(const MachineInstr *MI, int64_t Offset) const
unsigned getPhys(unsigned virtReg) const
returns the physical register mapped to the specified virtual register
const TargetRegisterClass * getRegClass(const MCInstrDesc &TID, unsigned OpNum, const TargetRegisterInfo *TRI, const MachineFunction &MF) const
const MCRegisterInfo & MRI
bool isThumb2Function() const
void materializeFrameBaseRegister(MachineBasicBlock *MBB, unsigned BaseReg, int FrameIdx, int64_t Offset) const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
sc_iterator getSuperClasses() const
unsigned getConstantPoolIndex(const Constant *C, unsigned Alignment)
DebugLoc getDebugLoc() const
unsigned FramePtr
FramePtr - ARM physical register used as frame ptr.