54 uint64_t NumBytes = 0;
57 uint64_t FrameSize = StackSize - 2;
66 BuildMI(MBB, MBBI, DL, TII.
get(MSP430::PUSH16r))
70 BuildMI(MBB, MBBI, DL, TII.
get(MSP430::MOV16rr), MSP430::FPW)
76 I->addLiveIn(MSP430::FPW);
82 while (MBBI != MBB.
end() && (MBBI->getOpcode() == MSP430::PUSH16r))
85 if (MBBI != MBB.
end())
86 DL = MBBI->getDebugLoc();
98 BuildMI(MBB, MBBI, DL, TII.
get(MSP430::SUB16ri), MSP430::SPW)
99 .addReg(MSP430::SPW).
addImm(NumBytes);
114 unsigned RetOpcode = MBBI->getOpcode();
119 case MSP430::RETI:
break;
127 uint64_t NumBytes = 0;
131 uint64_t FrameSize = StackSize - 2;
132 NumBytes = FrameSize - CSSize;
135 BuildMI(MBB, MBBI, DL, TII.
get(MSP430::POP16r), MSP430::FPW);
137 NumBytes = StackSize - CSSize;
140 while (MBBI != MBB.
begin()) {
142 unsigned Opc = PI->getOpcode();
143 if (Opc != MSP430::POP16r && !PI->isTerminator())
148 DL = MBBI->getDebugLoc();
157 TII.
get(MSP430::MOV16rr), MSP430::SPW).addReg(MSP430::FPW);
161 TII.
get(MSP430::SUB16ri), MSP430::SPW)
162 .addReg(MSP430::SPW).
addImm(CSSize);
170 BuildMI(MBB, MBBI, DL, TII.
get(MSP430::ADD16ri), MSP430::SPW)
171 .addReg(MSP430::SPW).
addImm(NumBytes);
182 const std::vector<CalleeSavedInfo> &CSI,
188 if (MI != MBB.
end()) DL = MI->getDebugLoc();
195 for (
unsigned i = CSI.size(); i != 0; --i) {
196 unsigned Reg = CSI[i-1].getReg();
199 BuildMI(MBB, MI, DL, TII.
get(MSP430::PUSH16r))
208 const std::vector<CalleeSavedInfo> &CSI,
214 if (MI != MBB.
end()) DL = MI->getDebugLoc();
219 for (
unsigned i = 0, e = CSI.size(); i != e; ++i)
220 BuildMI(MBB, MI, DL, TII.
get(MSP430::POP16r), CSI[i].getReg());
243 Amount = (Amount+StackAlign-1)/StackAlign*StackAlign;
246 if (Old->
getOpcode() == TII.getCallFrameSetupOpcode()) {
248 TII.get(MSP430::SUB16ri), MSP430::SPW)
249 .addReg(MSP430::SPW).
addImm(Amount);
251 assert(Old->
getOpcode() == TII.getCallFrameDestroyOpcode());
257 TII.get(MSP430::ADD16ri), MSP430::SPW)
258 .addReg(MSP430::SPW).
addImm(Amount);
269 }
else if (I->getOpcode() == TII.getCallFrameDestroyOpcode()) {
272 if (uint64_t CalleeAmt = I->getOperand(1).getImm()) {
276 MSP430::SPW).addReg(MSP430::SPW).
addImm(CalleeAmt);
295 "Slot for FPW register must be last in order to be found!");
unsigned getStackAlignment() const
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector< CalleeSavedInfo > &CSI, const TargetRegisterInfo *TRI) const
const MachineFunction * getParent() const
instr_iterator erase(instr_iterator I)
void processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS=NULL) const
void emitPrologue(MachineFunction &MF) const
void addLiveIn(unsigned Reg)
void setIsDead(bool Val=true)
uint64_t getStackSize() const
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector< CalleeSavedInfo > &CSI, const TargetRegisterInfo *TRI) const
const HexagonInstrInfo * TII
#define llvm_unreachable(msg)
bool DisableFramePointerElim(const MachineFunction &MF) const
Abstract Stack Frame Information.
bool isFrameAddressTaken() const
const MachineInstrBuilder & addImm(int64_t Val) const
bool hasFP(const MachineFunction &MF) const
const MachineBasicBlock & front() const
int getObjectIndexBegin() const
iterator getLastNonDebugInstr()
bundle_iterator< MachineInstr, instr_iterator > iterator
unsigned getCalleeSavedFrameSize() const
const MachineOperand & getOperand(unsigned i) const
void eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const
ItTy next(ItTy it, Dist n)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
const MCInstrDesc & get(unsigned Opcode) const
virtual const TargetInstrInfo * getInstrInfo() const
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const
void setOffsetAdjustment(int Adj)
MachineFrameInfo * getFrameInfo()
bool hasReservedCallFrame(const MachineFunction &MF) const
static DebugLoc get(unsigned Line, unsigned Col, MDNode *Scope, MDNode *InlinedAt=0)
void setCalleeSavedFrameSize(unsigned bytes)
const TargetMachine & getTarget() const
instr_iterator insert(instr_iterator I, MachineInstr *M)
bool hasVarSizedObjects() const
BasicBlockListType::iterator iterator
ItTy prior(ItTy it, Dist n)
int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool Immutable)
DebugLoc getDebugLoc() const