Lines Matching +full:armv4t +full:- +full:based

1 //===- Thumb1FrameLowering.cpp - Thumb1 Frame Information -----------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
59 if (CFSize >= ((1 << 8) - 1) * 4 / 2) // Half of imm8 * 4 in hasReservedCallFrame()
123 // ADJCALLSTACKDOWN -> sub, sp, sp, amount in eliminateCallFramePseudoInstr()
124 // ADJCALLSTACKUP -> add, sp, sp, amount in eliminateCallFramePseudoInstr()
137 emitCallSPUpdate(MBB, I, TII, dl, *RegInfo, -Amount); in eliminateCallFramePseudoInstr()
158 unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize(); in emitPrologue()
168 Register FramePtr = RegInfo->getFrameRegister(MF); in emitPrologue()
169 Register BasePtr = RegInfo->getBaseRegister(); in emitPrologue()
176 // Determine the sizes of each callee-save spill areas and record which frame in emitPrologue()
177 // belongs to which callee-save spill areas. in emitPrologue()
182 emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -ArgRegsSaveSize, in emitPrologue()
192 if (!AFI->hasStackFrame()) { in emitPrologue()
193 if (NumBytes - ArgRegsSaveSize != 0) { in emitPrologue()
195 -(NumBytes - ArgRegsSaveSize), in emitPrologue()
197 CFAOffset += NumBytes - ArgRegsSaveSize; in emitPrologue()
256 if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPUSH) { in emitPrologue()
261 // Find last push instruction for GPRCS2 - spilling of high registers in emitPrologue()
262 // (r8-r11) could consist of multiple tPUSH and tMOVr instructions. in emitPrologue()
266 while (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tMOVr && in emitPrologue()
267 MBBI->getFlag(MachineInstr::FrameSetup)) in emitPrologue()
269 if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPUSH && in emitPrologue()
270 MBBI->getFlag(MachineInstr::FrameSetup)) { in emitPrologue()
283 unsigned DPRCSOffset = NumBytes - ArgRegsSaveSize - in emitPrologue()
289 AFI->setFramePtrSpillOffset(MFI.getObjectOffset(FramePtrSpillFI) + in emitPrologue()
292 AFI->setFrameRecordSavedAreaSize(FRSize); in emitPrologue()
293 AFI->setGPRCalleeSavedArea1Offset(GPRCS1Offset); in emitPrologue()
294 AFI->setGPRCalleeSavedArea2Offset(GPRCS2Offset); in emitPrologue()
295 AFI->setDPRCalleeSavedAreaOffset(DPRCSOffset); in emitPrologue()
331 nullptr, MRI->getDwarfRegNum(FramePtr, true), (CFAOffset - FramePtrOffsetInBlock))); in emitPrologue()
338 nullptr, MRI->getDwarfRegNum(FramePtr, true))); in emitPrologue()
346 AFI->setShouldRestoreSPFromFP(true); in emitPrologue()
349 // Emit call frame information for the callee-saved low registers. in emitPrologue()
381 nullptr, MRI->getDwarfRegNum(Reg, true), MFI.getObjectOffset(FI))); in emitPrologue()
390 // Emit call frame information for the callee-saved high registers. in emitPrologue()
403 nullptr, MRI->getDwarfRegNum(Reg, true), MFI.getObjectOffset(FI))); in emitPrologue()
416 // Insert it after all the callee-save spills. in emitPrologue()
419 // the size of the frame. We know all callee-save registers are free in emitPrologue()
429 emitPrologueEpilogueSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -NumBytes, in emitPrologue()
442 MFI.setOffsetAdjustment(MFI.getOffsetAdjustment() - in emitPrologue()
443 AFI->getFramePtrSpillOffset()); in emitPrologue()
445 AFI->setGPRCalleeSavedArea1Size(GPRCS1Size); in emitPrologue()
446 AFI->setGPRCalleeSavedArea2Size(GPRCS2Size); in emitPrologue()
447 AFI->setDPRCalleeSavedAreaSize(DPRCSSize); in emitPrologue()
449 if (RegInfo->hasStackRealignment(MF)) { in emitPrologue()
477 AFI->setShouldRestoreSPFromFP(true); in emitPrologue()
484 if (RegInfo->hasBasePointer(MF)) in emitPrologue()
493 AFI->setShouldRestoreSPFromFP(true); in emitPrologue()
503 DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc(); in emitEpilogue()
511 unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize(); in emitEpilogue()
515 Register FramePtr = RegInfo->getFrameRegister(MF); in emitEpilogue()
517 if (!AFI->hasStackFrame()) { in emitEpilogue()
518 if (NumBytes - ArgRegsSaveSize != 0) in emitEpilogue()
520 NumBytes - ArgRegsSaveSize, ARM::NoRegister, in emitEpilogue()
526 --MBBI; in emitEpilogue()
527 while (MBBI != MBB.begin() && MBBI->getFlag(MachineInstr::FrameDestroy)); in emitEpilogue()
528 if (!MBBI->getFlag(MachineInstr::FrameDestroy)) in emitEpilogue()
533 NumBytes -= (AFI->getFrameRecordSavedAreaSize() + in emitEpilogue()
534 AFI->getGPRCalleeSavedArea1Size() + in emitEpilogue()
535 AFI->getGPRCalleeSavedArea2Size() + in emitEpilogue()
536 AFI->getDPRCalleeSavedAreaSize() + in emitEpilogue()
539 // We are likely to need a scratch register and we know all callee-save in emitEpilogue()
551 if (AFI->shouldRestoreSPFromFP()) { in emitEpilogue()
552 NumBytes = AFI->getFramePtrSpillOffset() - NumBytes; in emitEpilogue()
553 // Reset SP based on frame pointer only if the stack frame extends beyond in emitEpilogue()
559 emitThumbRegPlusImmediate(MBB, MBBI, dl, ScratchRegister, FramePtr, -NumBytes, in emitEpilogue()
571 if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tBX_RET && in emitEpilogue()
572 &MBB.front() != &*MBBI && std::prev(MBBI)->getOpcode() == ARM::tPOP) { in emitEpilogue()
600 const_cast<MachineFunction *>(&MF)->getInfo<ARMFunctionInfo>(); in needPopSpecialFixUp()
601 if (AFI->getArgRegsSaveSize()) in needPopSpecialFixUp()
604 // LR cannot be encoded with Thumb1, i.e., it requires a special fix-up. in needPopSpecialFixUp()
619 // Remember the first pop-friendly register and exit. in findTemporariesForLR()
626 // save a pop-friendly register. in findTemporariesForLR()
636 unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize(); in emitPopSpecialFixUp()
651 if (MBBI != MBB.end() && MBBI->getOpcode() != ARM::tB) in emitPopSpecialFixUp()
652 CanRestoreDirectly = (MBBI->getOpcode() == ARM::tBX_RET || in emitPopSpecialFixUp()
653 MBBI->getOpcode() == ARM::tPOP_RET); in emitPopSpecialFixUp()
656 MBBI_prev--; in emitPopSpecialFixUp()
657 assert(MBBI_prev->getOpcode() == ARM::tPOP); in emitPopSpecialFixUp()
659 if ((*MBB.succ_begin())->begin()->getOpcode() == ARM::tBX_RET) in emitPopSpecialFixUp()
667 if (!DoIt || MBBI->getOpcode() == ARM::tPOP_RET) in emitPopSpecialFixUp()
670 BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII.get(ARM::tPOP_RET)) in emitPopSpecialFixUp()
674 for (auto MO: MBBI->operands()) in emitPopSpecialFixUp()
689 // the callee-saved registers that are touched in the function in emitPopSpecialFixUp()
691 // Add those callee-saved now. in emitPopSpecialFixUp()
698 dl = MBBI->getDebugLoc(); in emitPopSpecialFixUp()
701 // The pre-decrement is on purpose here. in emitPopSpecialFixUp()
703 UsedRegs.stepBackward(*--InstUpToMBBI); in emitPopSpecialFixUp()
713 assert(PopFriendly.any() && "No allocatable pop-friendly register?!"); in emitPopSpecialFixUp()
725 // If we couldn't find a pop-friendly register, try restoring LR before in emitPopSpecialFixUp()
726 // popping the other callee-saved registers, so we could use one of them as a in emitPopSpecialFixUp()
731 PrevMBBI--; in emitPopSpecialFixUp()
732 if (PrevMBBI->getOpcode() == ARM::tPOP) { in emitPopSpecialFixUp()
754 .addImm(MBBI->getNumExplicitOperands() - 2) in emitPopSpecialFixUp()
782 if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPOP_RET) { in emitPopSpecialFixUp()
786 BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII.get(ARM::tPOP)) in emitPopSpecialFixUp()
790 for (auto MO: MBBI->operands()) in emitPopSpecialFixUp()
849 llvm_unreachable("callee-saved register of unexpected class"); in splitLowAndHighRegs()
962 DebugLoc DL = MI != MBB.end() ? MI->getDebugLoc() : DebugLoc(); in popRegsFromStack()
1046 if (!MBB.succ_empty() || MI->getOpcode() == ARM::TCRETURNdi || in popRegsFromStack()
1047 MI->getOpcode() == ARM::TCRETURNri || in popRegsFromStack()
1048 MI->getOpcode() == ARM::TCRETURNrinotr12) in popRegsFromStack()
1059 // ARMv4T requires BX, see emitEpilogue in popRegsFromStack()
1064 if (AFI->isCmseNSEntryFunction()) in popRegsFromStack()
1096 Register FPReg = RegInfo->getFrameRegister(MF); in spillCalleeSavedRegisters()
1115 // - Spilled low regs in spillCalleeSavedRegisters()
1116 // - Unused argument registers in spillCalleeSavedRegisters()
1142 bool IsVarArg = AFI->getArgRegsSaveSize() > 0; in restoreCalleeSavedRegisters()
1143 Register FPReg = RegInfo->getFrameRegister(MF); in restoreCalleeSavedRegisters()
1163 // - Spilled low regs in restoreCalleeSavedRegisters()
1164 // - Unused return registers in restoreCalleeSavedRegisters()
1171 if (Terminator != MBB.end() && Terminator->getOpcode() == ARM::tBX_RET) { in restoreCalleeSavedRegisters()
1176 for (auto Op : Terminator->implicit_operands()) { in restoreCalleeSavedRegisters()