32 PPC::V0 , PPC::V1 ,
PPC::V2 , PPC::V3 ,
PPC::V4 , PPC::V5 , PPC::V6 , PPC::V7 ,
33 PPC::V8 , PPC::V9 , PPC::V10, PPC::V11, PPC::V12, PPC::V13, PPC::V14, PPC::V15,
34 PPC::V16, PPC::V17, PPC::V18, PPC::V19, PPC::V20, PPC::V21, PPC::V22, PPC::V23,
35 PPC::V24, PPC::V25, PPC::V26, PPC::V27, PPC::V28, PPC::V29, PPC::V30, PPC::V31
54 assert(MBBI != Entry->
end() && MBBI->getOpcode() == PPC::MTVRSAVE);
55 MBBI->eraseFromParent();
57 bool RemovedAllMTVRSAVEs =
true;
62 if (!
I->empty() &&
I->back().isReturn()) {
64 for (MBBI =
I->end(); MBBI !=
I->begin(); ) {
66 if (MBBI->getOpcode() == PPC::MTVRSAVE) {
67 MBBI->eraseFromParent();
72 RemovedAllMTVRSAVEs &= FoundIt;
78 if (RemovedAllMTVRSAVEs) {
80 assert(MBBI != Entry->
begin() &&
"UPDATE_VRSAVE is first instr in block?");
82 assert(MBBI->getOpcode() == PPC::MFVRSAVE &&
"VRSAVE instrs wandered?");
83 MBBI->eraseFromParent();
98 unsigned UsedRegMask = 0;
99 for (
unsigned i = 0; i != 32; ++i)
101 UsedRegMask |= 1 << (31-i);
110 UsedRegMask &= ~(1 << (31-RegNo));
115 UsedRegMask != 0 && BI != BE; ++BI) {
122 if (!MO.
isReg() || !PPC::VRRCRegClass.contains(MO.
getReg()))
125 UsedRegMask &= ~(1 << (31-RegNo));
130 if (UsedRegMask == 0) {
139 if ((UsedRegMask & 0xFFFF) == UsedRegMask) {
140 if (DstReg != SrcReg)
148 }
else if ((UsedRegMask & 0xFFFF0000) == UsedRegMask) {
149 if (DstReg != SrcReg)
152 .
addImm(UsedRegMask >> 16);
156 .
addImm(UsedRegMask >> 16);
158 if (DstReg != SrcReg)
161 .
addImm(UsedRegMask >> 16);
165 .
addImm(UsedRegMask >> 16);
169 .
addImm(UsedRegMask & 0xFFFF);
200 bool UseEstimate)
const {
210 unsigned AlignMask = std::max(MaxAlign, TargetAlign) - 1;
222 if (!DisableRedZone &&
242 maxCallFrameSize = std::max(maxCallFrameSize, minCallFrameSize);
247 maxCallFrameSize = (maxCallFrameSize + AlignMask) & ~AlignMask;
254 FrameSize += maxCallFrameSize;
257 FrameSize = (FrameSize + AlignMask) & ~AlignMask;
296 unsigned FPReg = is31 ? PPC::R31 : PPC::R1;
297 unsigned FP8Reg = is31 ? PPC::X31 : PPC::X1;
302 unsigned BPReg = HasBP ? (
unsigned) PPC::R30 : FPReg;
303 unsigned BP8Reg = HasBP ? (
unsigned) PPC::X30 : FPReg;
309 for (
unsigned I = 0, E = MBBI->getNumOperands();
I != E; ++
I) {
349 bool isPPC64 = Subtarget.
isPPC64();
353 assert((isDarwinABI || isSVR4ABI) &&
354 "Currently only Darwin and SVR4 ABIs are supported for PowerPC.");
362 for (
unsigned i = 0; MBBI != MBB.
end(); ++i, ++MBBI) {
363 if (MBBI->getOpcode() == PPC::UPDATE_VRSAVE) {
374 int NegFrameSize = -FrameSize;
386 bool HasFP =
hasFP(MF);
389 unsigned SPReg = isPPC64 ? PPC::X1 : PPC::R1;
390 unsigned BPReg = isPPC64 ? PPC::X30 : PPC::R30;
391 unsigned FPReg = isPPC64 ? PPC::X31 : PPC::R31;
392 unsigned LRReg = isPPC64 ? PPC::LR8 : PPC::LR;
393 unsigned ScratchReg = isPPC64 ? PPC::X0 : PPC::R0;
394 unsigned TempReg = isPPC64 ? PPC::X12 : PPC::R12;
396 const MCInstrDesc& MFLRInst = TII.get(isPPC64 ? PPC::MFLR8
400 const MCInstrDesc& StoreUpdtInst = TII.get(isPPC64 ? PPC::STDU
402 const MCInstrDesc& StoreUpdtIdxInst = TII.get(isPPC64 ? PPC::STDUX
404 const MCInstrDesc& LoadImmShiftedInst = TII.get(isPPC64 ? PPC::LIS8
406 const MCInstrDesc& OrImmInst = TII.get(isPPC64 ? PPC::ORI8
408 const MCInstrDesc& OrInst = TII.get(isPPC64 ? PPC::OR8
410 const MCInstrDesc& SubtractCarryingInst = TII.get(isPPC64 ? PPC::SUBFC8
412 const MCInstrDesc& SubtractImmCarryingInst = TII.get(isPPC64 ? PPC::SUBFIC8
419 assert((isPPC64 || !isSVR4ABI || !(!FrameSize && (MustSaveLR || HasFP))) &&
420 "FrameSize must be >0 to save/restore the FP or LR for 32-bit SVR4.");
429 assert(FPIndex &&
"No Frame Pointer Save Slot!");
441 assert(BPIndex &&
"No Base Pointer Save Slot!");
451 if (HasBP && MaxAlign > 1)
453 "Invalid alignment!");
457 bool isLargeFrame = !
isInt<16>(NegFrameSize);
460 BuildMI(MBB, MBBI, dl, MFLRInst, ScratchReg);
462 assert((isPPC64 || MustSaveCRs.
empty()) &&
463 "Prologue CR saving supported only in 64-bit mode");
465 if (!MustSaveCRs.
empty()) {
467 BuildMI(MBB, MBBI, dl, TII.get(PPC::MFCR8), TempReg);
468 for (
unsigned i = 0, e = MustSaveCRs.
size(); i != e; ++i)
474 BuildMI(MBB, MBBI, dl, StoreInst)
481 BuildMI(MBB, MBBI, dl, StoreInst)
488 BuildMI(MBB, MBBI, dl, StoreInst)
493 if (!MustSaveCRs.
empty())
494 BuildMI(MBB, MBBI, dl, TII.get(PPC::STW8))
500 if (!FrameSize)
return;
507 BuildMI(MBB, MBBI, dl, OrInst, BPReg)
512 if (HasBP && MaxAlign > 1) {
514 BuildMI(MBB, MBBI, dl, TII.get(PPC::RLDICL), ScratchReg)
519 BuildMI(MBB, MBBI, dl, TII.get(PPC::RLWINM), ScratchReg)
525 BuildMI(MBB, MBBI, dl, SubtractImmCarryingInst, ScratchReg)
529 BuildMI(MBB, MBBI, dl, LoadImmShiftedInst, TempReg)
530 .
addImm(NegFrameSize >> 16);
531 BuildMI(MBB, MBBI, dl, OrImmInst, TempReg)
533 .
addImm(NegFrameSize & 0xFFFF);
534 BuildMI(MBB, MBBI, dl, SubtractCarryingInst, ScratchReg)
538 BuildMI(MBB, MBBI, dl, StoreUpdtIdxInst, SPReg)
543 }
else if (!isLargeFrame) {
544 BuildMI(MBB, MBBI, dl, StoreUpdtInst, SPReg)
550 BuildMI(MBB, MBBI, dl, LoadImmShiftedInst, ScratchReg)
551 .
addImm(NegFrameSize >> 16);
552 BuildMI(MBB, MBBI, dl, OrImmInst, ScratchReg)
554 .
addImm(NegFrameSize & 0xFFFF);
555 BuildMI(MBB, MBBI, dl, StoreUpdtIdxInst, SPReg)
563 if (needsFrameMoves) {
569 assert(NegFrameSize);
596 BuildMI(MBB, MBBI, dl, OrInst, FPReg)
600 if (needsFrameMoves) {
611 if (needsFrameMoves) {
612 MCSymbol *Label = HasFP ? ReadyLabel : FrameLabel;
616 for (
unsigned I = 0, E = CSI.size();
I != E; ++
I) {
617 unsigned Reg = CSI[
I].getReg();
618 if (Reg == PPC::LR || Reg == PPC::LR8 || Reg ==
PPC::RM)
continue;
622 if (PPC::CRBITRCRegClass.contains(Reg))
627 if (isSVR4ABI && (PPC::CR2 <= Reg && Reg <= PPC::CR4)
628 && MustSaveCRs.
empty())
633 if (isSVR4ABI && isPPC64 && (PPC::CR2 <= Reg && Reg <= PPC::CR4)) {
649 assert(MBBI != MBB.
end() &&
"Returning block has no terminator");
655 unsigned RetOpcode = MBBI->getOpcode();
658 assert((RetOpcode == PPC::BLR ||
659 RetOpcode == PPC::TCRETURNri ||
660 RetOpcode == PPC::TCRETURNdi ||
661 RetOpcode == PPC::TCRETURNai ||
662 RetOpcode == PPC::TCRETURNri8 ||
663 RetOpcode == PPC::TCRETURNdi8 ||
664 RetOpcode == PPC::TCRETURNai8) &&
665 "Can only insert epilog into returning blocks");
674 bool isPPC64 = Subtarget.
isPPC64();
684 bool HasFP =
hasFP(MF);
687 unsigned SPReg = isPPC64 ? PPC::X1 : PPC::R1;
688 unsigned BPReg = isPPC64 ? PPC::X30 : PPC::R30;
689 unsigned FPReg = isPPC64 ? PPC::X31 : PPC::R31;
690 unsigned ScratchReg = isPPC64 ? PPC::X0 : PPC::R0;
691 unsigned TempReg = isPPC64 ? PPC::X12 : PPC::R12;
692 const MCInstrDesc& MTLRInst = TII.get( isPPC64 ? PPC::MTLR8
696 const MCInstrDesc& LoadImmShiftedInst = TII.get( isPPC64 ? PPC::LIS8
698 const MCInstrDesc& OrImmInst = TII.get( isPPC64 ? PPC::ORI8
700 const MCInstrDesc& AddImmInst = TII.get( isPPC64 ? PPC::ADDI8
702 const MCInstrDesc& AddInst = TII.get( isPPC64 ? PPC::ADD8
712 assert(FPIndex &&
"No Frame Pointer Save Slot!");
724 assert(BPIndex &&
"No Base Pointer Save Slot!");
732 bool UsesTCRet = RetOpcode == PPC::TCRETURNri ||
733 RetOpcode == PPC::TCRETURNdi ||
734 RetOpcode == PPC::TCRETURNai ||
735 RetOpcode == PPC::TCRETURNri8 ||
736 RetOpcode == PPC::TCRETURNdi8 ||
737 RetOpcode == PPC::TCRETURNai8;
742 assert(StackAdjust.
isImm() &&
"Expecting immediate value.");
744 int StackAdj = StackAdjust.
getImm();
745 int Delta = StackAdj - MaxTCRetDelta;
746 assert((Delta >= 0) &&
"Delta must be positive");
748 FrameSize += (StackAdj +Delta);
750 FrameSize += StackAdj;
755 bool isLargeFrame = !
isInt<16>(FrameSize);
766 assert(HasFP &&
"Expecting a valid frame pointer.");
768 BuildMI(MBB, MBBI, dl, AddImmInst, SPReg)
771 BuildMI(MBB, MBBI, dl, LoadImmShiftedInst, ScratchReg)
773 BuildMI(MBB, MBBI, dl, OrImmInst, ScratchReg)
775 .
addImm(FrameSize & 0xFFFF);
776 BuildMI(MBB, MBBI, dl, AddInst)
782 BuildMI(MBB, MBBI, dl, AddImmInst, SPReg)
786 BuildMI(MBB, MBBI, dl, LoadInst, SPReg)
794 BuildMI(MBB, MBBI, dl, LoadInst, ScratchReg)
798 assert((isPPC64 || MustSaveCRs.
empty()) &&
799 "Epilogue CR restoring supported only in 64-bit mode");
801 if (!MustSaveCRs.
empty())
802 BuildMI(MBB, MBBI, dl, TII.
get(PPC::LWZ8), TempReg)
807 BuildMI(MBB, MBBI, dl, LoadInst, FPReg)
812 BuildMI(MBB, MBBI, dl, LoadInst, BPReg)
816 if (!MustSaveCRs.
empty())
817 for (
unsigned i = 0, e = MustSaveCRs.
size(); i != e; ++i)
818 BuildMI(MBB, MBBI, dl, TII.
get(PPC::MTOCRF8), MustSaveCRs[i])
831 if (CallerAllocatedAmt &&
isInt<16>(CallerAllocatedAmt)) {
832 BuildMI(MBB, MBBI, dl, AddImmInst, SPReg)
835 BuildMI(MBB, MBBI, dl, LoadImmShiftedInst, ScratchReg)
836 .
addImm(CallerAllocatedAmt >> 16);
837 BuildMI(MBB, MBBI, dl, OrImmInst, ScratchReg)
839 .
addImm(CallerAllocatedAmt & 0xFFFF);
840 BuildMI(MBB, MBBI, dl, AddInst)
845 }
else if (RetOpcode == PPC::TCRETURNdi) {
850 }
else if (RetOpcode == PPC::TCRETURNri) {
852 assert(MBBI->getOperand(0).isReg() &&
"Expecting register operand.");
853 BuildMI(MBB, MBBI, dl, TII.
get(PPC::TAILBCTR));
854 }
else if (RetOpcode == PPC::TCRETURNai) {
858 }
else if (RetOpcode == PPC::TCRETURNdi8) {
863 }
else if (RetOpcode == PPC::TCRETURNri8) {
865 assert(MBBI->getOperand(0).isReg() &&
"Expecting register operand.");
866 BuildMI(MBB, MBBI, dl, TII.
get(PPC::TAILBCTR8));
867 }
else if (RetOpcode == PPC::TCRETURNai8) {
896 unsigned LR = RegInfo->getRARegister();
903 bool isPPC64 = Subtarget.
isPPC64();
935 if (!isPPC64 && !isDarwinABI &&
957 if (CSI.empty() && !
needsFP(MF)) {
962 unsigned MinGPR = PPC::R31;
963 unsigned MinG8R = PPC::X31;
964 unsigned MinFPR = PPC::F31;
965 unsigned MinVR = PPC::V31;
967 bool HasGPSaveArea =
false;
968 bool HasG8SaveArea =
false;
969 bool HasFPSaveArea =
false;
970 bool HasVRSAVESaveArea =
false;
971 bool HasVRSaveArea =
false;
978 for (
unsigned i = 0, e = CSI.size(); i != e; ++i) {
979 unsigned Reg = CSI[i].getReg();
980 if (PPC::GPRCRegClass.contains(Reg)) {
981 HasGPSaveArea =
true;
988 }
else if (PPC::G8RCRegClass.contains(Reg)) {
989 HasG8SaveArea =
true;
996 }
else if (PPC::F8RCRegClass.contains(Reg)) {
997 HasFPSaveArea =
true;
1004 }
else if (PPC::CRBITRCRegClass.contains(Reg) ||
1005 PPC::CRRCRegClass.contains(Reg)) {
1007 }
else if (PPC::VRSAVERCRegClass.contains(Reg)) {
1008 HasVRSAVESaveArea =
true;
1009 }
else if (PPC::VRRCRegClass.contains(Reg)) {
1010 HasVRSaveArea =
true;
1025 int64_t LowerBound = 0;
1031 LowerBound = TCSPDelta;
1036 if (HasFPSaveArea) {
1037 for (
unsigned i = 0, e = FPRegs.
size(); i != e; ++i) {
1038 int FI = FPRegs[i].getFrameIdx();
1043 LowerBound -= (31 - TRI->getEncodingValue(MinFPR) + 1) * 8;
1049 HasGPSaveArea =
true;
1052 assert(FI &&
"No Frame Pointer Save Slot!");
1060 HasGPSaveArea =
true;
1063 assert(FI &&
"No Base Pointer Save Slot!");
1070 if (HasGPSaveArea || HasG8SaveArea) {
1073 for (
unsigned i = 0, e = GPRegs.
size(); i != e; ++i) {
1074 int FI = GPRegs[i].getFrameIdx();
1081 for (
unsigned i = 0, e = G8Regs.
size(); i != e; ++i) {
1082 int FI = G8Regs[i].getFrameIdx();
1088 std::min<unsigned>(TRI->getEncodingValue(MinGPR),
1089 TRI->getEncodingValue(MinG8R));
1092 LowerBound -= (31 - MinReg + 1) * 8;
1094 LowerBound -= (31 - MinReg + 1) * 4;
1105 for (
unsigned i = 0, e = CSI.size(); i != e; ++i) {
1106 unsigned Reg = CSI[i].getReg();
1108 if ((Subtarget.
isSVR4ABI() && Reg == PPC::CR2)
1111 (PPC::CRBITRCRegClass.contains(Reg) ||
1112 PPC::CRRCRegClass.contains(Reg)))) {
1113 int FI = CSI[i].getFrameIdx();
1122 if (HasVRSAVESaveArea) {
1126 for (
unsigned i = 0, e = CSI.size(); i != e; ++i) {
1127 unsigned Reg = CSI[i].getReg();
1129 if (PPC::VRSAVERCRegClass.contains(Reg)) {
1130 int FI = CSI[i].getFrameIdx();
1139 if (HasVRSaveArea) {
1141 LowerBound = (LowerBound - 15) & ~(15);
1143 for (
unsigned i = 0, e = VRegs.
size(); i != e; ++i) {
1144 int FI = VRegs[i].getFrameIdx();
1196 const std::vector<CalleeSavedInfo> &CSI,
1208 bool CRSpilled =
false;
1211 for (
unsigned i = 0, e = CSI.size(); i != e; ++i) {
1212 unsigned Reg = CSI[i].getReg();
1216 if (Reg == PPC::VRSAVE && !Subtarget.
isDarwinABI())
1220 bool IsCRField = PPC::CR2 <= Reg && Reg <= PPC::CR4;
1225 if (CRSpilled && IsCRField) {
1242 CRMIB =
BuildMI(*MF, DL, TII.get(PPC::MFCR), PPC::R12)
1249 CSI[i].getFrameIdx()));
1254 CSI[i].getFrameIdx(), RC, TRI);
1262 bool CR2Spilled,
bool CR3Spilled,
bool CR4Spilled,
1264 const std::vector<CalleeSavedInfo> &CSI,
unsigned CSIIndex) {
1270 unsigned RestoreOp, MoveReg;
1279 CSI[CSIIndex].getFrameIdx()));
1280 RestoreOp = PPC::MTOCRF;
1285 MBB.
insert(MI,
BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR2)
1289 MBB.
insert(MI,
BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR3)
1293 MBB.
insert(MI,
BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR4)
1303 I->getOpcode() == PPC::ADJCALLSTACKUP) {
1305 if (
int CalleeAmt = I->getOperand(1).getImm()) {
1306 bool is64Bit = Subtarget.
isPPC64();
1308 unsigned StackReg = is64Bit ? PPC::X1 : PPC::R1;
1309 unsigned TmpReg = is64Bit ? PPC::X0 : PPC::R0;
1310 unsigned ADDIInstr = is64Bit ? PPC::ADDI8 : PPC::ADDI;
1311 unsigned ADDInstr = is64Bit ? PPC::ADD8 : PPC::ADD4;
1312 unsigned LISInstr = is64Bit ? PPC::LIS8 : PPC::LIS;
1313 unsigned ORIInstr = is64Bit ? PPC::ORI8 : PPC::ORI;
1318 BuildMI(MBB, I, dl, TII.get(ADDIInstr), StackReg)
1323 BuildMI(MBB, MBBI, dl, TII.get(LISInstr), TmpReg)
1324 .addImm(CalleeAmt >> 16);
1325 BuildMI(MBB, MBBI, dl, TII.get(ORIInstr), TmpReg)
1327 .
addImm(CalleeAmt & 0xFFFF);
1328 BuildMI(MBB, MBBI, dl, TII.get(ADDInstr), StackReg)
1341 const std::vector<CalleeSavedInfo> &CSI,
1352 bool CR2Spilled =
false;
1353 bool CR3Spilled =
false;
1354 bool CR4Spilled =
false;
1355 unsigned CSIIndex = 0;
1360 bool AtStart = I == MBB.
begin();
1365 for (
unsigned i = 0, e = CSI.size(); i != e; ++i) {
1366 unsigned Reg = CSI[i].getReg();
1371 if (Reg == PPC::VRSAVE && !Subtarget.
isDarwinABI())
1374 if (Reg == PPC::CR2) {
1380 }
else if (Reg == PPC::CR3) {
1383 }
else if (Reg == PPC::CR4) {
1389 if ((CR2Spilled || CR3Spilled || CR4Spilled)
1390 && !(PPC::CR2 <= Reg && Reg <= PPC::CR4)) {
1393 CR2Spilled, CR3Spilled, CR4Spilled,
1394 MBB,
I, CSI, CSIIndex);
1395 CR2Spilled = CR3Spilled = CR4Spilled =
false;
1402 assert(I != MBB.
begin() &&
1403 "loadRegFromStackSlot didn't insert any code!");
1416 if (CR2Spilled || CR3Spilled || CR4Spilled) {
1419 MBB,
I, CSI, CSIIndex);
void replaceFPWithRealFP(MachineFunction &MF) const
bool isInt< 32 >(int64_t x)
unsigned getStackAlignment() const
void push_back(const T &Elt)
const MachineFunction * getParent() const
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
instr_iterator erase(instr_iterator I)
int getDwarfRegNum(unsigned RegNum, bool isEH) const
Map a target register to an equivalent dwarf register number. Returns -1 if there is no equivalent va...
const GlobalValue * getGlobal() const
int getTailCallSPDelta() const
const TargetRegisterClass * getMinimalPhysRegClass(unsigned Reg, EVT VT=MVT::Other) const
void eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const
livein_iterator livein_end() const
void addMustSaveCR(unsigned Reg)
static MCCFIInstruction createOffset(MCSymbol *L, unsigned Register, int Offset)
.cfi_offset Previous value of Register is saved at offset Offset from CFA.
static void RemoveVRSaveCode(MachineInstr *MI)
bool adjustsStack() const
void addLiveIn(unsigned Reg)
void setFramePointerSaveIndex(int Idx)
void processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS=NULL) const
bool isLRStoreRequired() const
const Function * getFunction() const
bool hasAttribute(unsigned Index, Attribute::AttrKind Kind) const
Return true if the attribute exists at the given index.
static MCCFIInstruction createDefCfaOffset(MCSymbol *L, int Offset)
.cfi_def_cfa_offset modifies a rule for computing CFA. Register remains the same, but offset is new...
CallingConv::ID getCallingConv() const
static void restoreCRs(bool isPPC64, bool is31, bool CR2Spilled, bool CR3Spilled, bool CR4Spilled, MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector< CalleeSavedInfo > &CSI, unsigned CSIIndex)
unsigned getMaxAlignment() const
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
uint64_t getStackSize() const
MCSymbol * CreateTempSymbol()
const HexagonInstrInfo * TII
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
#define llvm_unreachable(msg)
unsigned getMinReservedArea() const
bool DisableFramePointerElim(const MachineFunction &MF) const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Abstract Stack Frame Information.
bool isFrameAddressTaken() const
bool isVRSAVESpilled() const
bool hasDebugInfo() const
const MachineInstrBuilder & addImm(int64_t Val) const
unsigned getNumOperands() const
int getBasePointerSaveIndex() const
static bool hasNonRISpills(const MachineFunction &MF)
const MachineBasicBlock & front() const
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
static const uint16_t VRRegNo[]
iterator getLastNonDebugInstr()
int getFramePointerSaveIndex() const
const SmallVectorImpl< unsigned > & getMustSaveCRs() const
unsigned getKillRegState(bool B)
unsigned estimateStackSize(const MachineFunction &MF) const
Estimate and return the size of the stack frame.
const MachineBasicBlock * getParent() const
bundle_iterator< MachineInstr, instr_iterator > iterator
bool isReturn(QueryType Type=AnyInBundle) const
void addScavengingSpillSlot(MachineFunction &MF, RegScavenger *RS) const
unsigned getAlignment() const
static MCCFIInstruction createDefCfaRegister(MCSymbol *L, unsigned Register)
.cfi_def_cfa_register modifies a rule for computing CFA. From now on Register will be used instead of...
void setStackSize(uint64_t Size)
const MachineOperand & getOperand(unsigned i) const
static unsigned getBasePointerSaveOffset(bool isPPC64, bool isDarwinABI)
void setBasePointerSaveIndex(int Idx)
unsigned GuaranteedTailCallOpt
int64_t getOffset() const
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
static unsigned getMinCallFrameSize(bool isPPC64, bool isDarwinABI)
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
const MCInstrDesc & get(unsigned Opcode) const
int64_t getObjectOffset(int ObjectIdx) const
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset=0, bool mem=true)
void setCRSpillFrameIndex(int idx)
cl::opt< bool > DisableRedZone("disable-red-zone", cl::desc("Do not emit code that uses the red zone."), cl::init(false))
virtual const TargetInstrInfo * getInstrInfo() const
static unsigned getFramePointerSaveOffset(bool isPPC64, bool isDarwinABI)
const MCContext & getContext() const
void addScavengingFrameIndex(int FI)
Add a scavenging frame index.
void setPhysRegUnused(unsigned Reg)
unsigned getMaxCallFrameSize() const
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
static bool spillsVRSAVE(const MachineFunction &MF)
livein_iterator livein_begin() const
static void HandleVRSaveUpdate(MachineInstr *MI, const TargetInstrInfo &TII)
MachineFrameInfo * getFrameInfo()
static bool hasSpills(const MachineFunction &MF)
unsigned determineFrameLayout(MachineFunction &MF, bool UpdateMF=true, bool UseEstimate=false) const
unsigned Log2_32(uint32_t Value)
AttributeSet getAttributes() const
Return the attribute list for this Function.
static bool spillsCR(const MachineFunction &MF)
static bool MustSaveLR(const MachineFunction &MF, unsigned LR)
def_iterator def_begin(unsigned RegNo) const
bool needsFP(const MachineFunction &MF) const
bool hasFP(const MachineFunction &MF) const
const MCRegisterInfo * getRegisterInfo() const
static DebugLoc get(unsigned Line, unsigned Col, MDNode *Scope, MDNode *InlinedAt=0)
int CreateStackObject(uint64_t Size, unsigned Alignment, bool isSS, bool MayNeedSP=false, const AllocaInst *Alloca=0)
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const
MachineRegisterInfo & getRegInfo()
void setReg(unsigned Reg)
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector< CalleeSavedInfo > &CSI, const TargetRegisterInfo *TRI) const
void setMaxCallFrameSize(unsigned S)
void addFrameInst(const MCCFIInstruction &Inst)
const TargetMachine & getTarget() const
void emitPrologue(MachineFunction &MF) const
instr_iterator insert(instr_iterator I, MachineInstr *M)
virtual const TargetRegisterInfo * getRegisterInfo() const
bool isInt< 16 >(int64_t x)
bool hasVarSizedObjects() const
bool hasNonRISpills() const
std::vector< std::pair< unsigned, unsigned > >::const_iterator livein_iterator
unsigned getReg() const
getReg - Returns the register number.
static def_iterator def_end()
void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, RegScavenger *RS=NULL) const
uint16_t getEncodingValue(unsigned RegNo) const
Returns the encoding for RegNo.
bool isPhysRegUsed(unsigned Reg) const
BasicBlockListType::iterator iterator
void setObjectOffset(int ObjectIdx, int64_t SPOffset)
bool isPowerOf2_32(uint32_t Value)
MachineModuleInfo & getMMI() const
const MCRegisterInfo & MRI
int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool Immutable)
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
bool hasBasePointer(const MachineFunction &MF) const
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector< CalleeSavedInfo > &CSI, const TargetRegisterInfo *TRI) const
static unsigned getReturnSaveOffset(bool isPPC64, bool isDarwinABI)
void setMustSaveLR(bool U)
DebugLoc getDebugLoc() const