Update comment.
[oota-llvm.git] / lib / Target / ARM / ARMRegisterInfo.cpp
1 //===- ARMRegisterInfo.cpp - ARM Register Information -----------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the "Instituto Nokia de Tecnologia" and
6 // is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 //
11 // This file contains the ARM implementation of the MRegisterInfo class.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "ARM.h"
16 #include "ARMAddressingModes.h"
17 #include "ARMInstrInfo.h"
18 #include "ARMMachineFunctionInfo.h"
19 #include "ARMRegisterInfo.h"
20 #include "ARMSubtarget.h"
21 #include "llvm/Constants.h"
22 #include "llvm/DerivedTypes.h"
23 #include "llvm/CodeGen/MachineConstantPool.h"
24 #include "llvm/CodeGen/MachineFrameInfo.h"
25 #include "llvm/CodeGen/MachineFunction.h"
26 #include "llvm/CodeGen/MachineInstrBuilder.h"
27 #include "llvm/CodeGen/MachineLocation.h"
28 #include "llvm/Target/TargetFrameInfo.h"
29 #include "llvm/Target/TargetMachine.h"
30 #include "llvm/Target/TargetOptions.h"
31 #include "llvm/ADT/SmallVector.h"
32 #include "llvm/ADT/STLExtras.h"
33 #include <algorithm>
34 #include <iostream>
35 using namespace llvm;
36
37 unsigned ARMRegisterInfo::getRegisterNumbering(unsigned RegEnum) {
38   using namespace ARM;
39   switch (RegEnum) {
40   case R0:  case S0:  case D0:  return 0;
41   case R1:  case S1:  case D1:  return 1;
42   case R2:  case S2:  case D2:  return 2;
43   case R3:  case S3:  case D3:  return 3;
44   case R4:  case S4:  case D4:  return 4;
45   case R5:  case S5:  case D5:  return 5;
46   case R6:  case S6:  case D6:  return 6;
47   case R7:  case S7:  case D7:  return 7;
48   case R8:  case S8:  case D8:  return 8;
49   case R9:  case S9:  case D9:  return 9;
50   case R10: case S10: case D10: return 10;
51   case R11: case S11: case D11: return 11;
52   case R12: case S12: case D12: return 12;
53   case SP:  case S13: case D13: return 13;
54   case LR:  case S14: case D14: return 14;
55   case PC:  case S15: case D15: return 15;
56   case S16: return 16;
57   case S17: return 17;
58   case S18: return 18;
59   case S19: return 19;
60   case S20: return 20;
61   case S21: return 21;
62   case S22: return 22;
63   case S23: return 23;
64   case S24: return 24;
65   case S25: return 25;
66   case S26: return 26;
67   case S27: return 27;
68   case S28: return 28;
69   case S29: return 29;
70   case S30: return 30;
71   case S31: return 31;
72   default:
73     std::cerr << "Unknown ARM register!\n";
74     abort();
75   }
76 }
77
78 ARMRegisterInfo::ARMRegisterInfo(const TargetInstrInfo &tii,
79                                  const ARMSubtarget &sti)
80   : ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
81     TII(tii), STI(sti),
82     FramePtr(STI.useThumbBacktraces() ? ARM::R7 : ARM::R11) {
83 }
84
85 bool ARMRegisterInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
86                                                 MachineBasicBlock::iterator MI,
87                                 const std::vector<CalleeSavedInfo> &CSI) const {
88   MachineFunction &MF = *MBB.getParent();
89   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
90   if (!AFI->isThumbFunction() || CSI.empty())
91     return false;
92
93   MachineInstrBuilder MIB = BuildMI(MBB, MI, TII.get(ARM::tPUSH));
94   for (unsigned i = CSI.size(); i != 0; --i)
95     MIB.addReg(CSI[i-1].getReg());
96   return true;
97 }
98
99 bool ARMRegisterInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
100                                                  MachineBasicBlock::iterator MI,
101                                 const std::vector<CalleeSavedInfo> &CSI) const {
102   MachineFunction &MF = *MBB.getParent();
103   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
104   if (!AFI->isThumbFunction() || CSI.empty())
105     return false;
106
107   MachineInstr *PopMI = new MachineInstr(TII.get(ARM::tPOP));
108   MBB.insert(MI, PopMI);
109   for (unsigned i = CSI.size(); i != 0; --i) {
110     unsigned Reg = CSI[i-1].getReg();
111     if (Reg == ARM::LR) {
112       Reg = ARM::PC;
113       PopMI->setInstrDescriptor(TII.get(ARM::tPOP_RET));
114       MBB.erase(MI);
115     }
116     PopMI->addRegOperand(Reg, true);
117   }
118   return true;
119 }
120
121 void ARMRegisterInfo::
122 storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
123                     unsigned SrcReg, int FI,
124                     const TargetRegisterClass *RC) const {
125   if (RC == ARM::GPRRegisterClass) {
126     MachineFunction &MF = *MBB.getParent();
127     ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
128     if (AFI->isThumbFunction())
129       BuildMI(MBB, I, TII.get(ARM::tSTRspi)).addReg(SrcReg)
130         .addFrameIndex(FI).addImm(0);
131     else
132       BuildMI(MBB, I, TII.get(ARM::STR)).addReg(SrcReg)
133           .addFrameIndex(FI).addReg(0).addImm(0);
134   } else if (RC == ARM::DPRRegisterClass) {
135     BuildMI(MBB, I, TII.get(ARM::FSTD)).addReg(SrcReg)
136     .addFrameIndex(FI).addImm(0);
137   } else {
138     assert(RC == ARM::SPRRegisterClass && "Unknown regclass!");
139     BuildMI(MBB, I, TII.get(ARM::FSTS)).addReg(SrcReg)
140       .addFrameIndex(FI).addImm(0);
141   }
142 }
143
144 void ARMRegisterInfo::
145 loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
146                      unsigned DestReg, int FI,
147                      const TargetRegisterClass *RC) const {
148   if (RC == ARM::GPRRegisterClass) {
149     MachineFunction &MF = *MBB.getParent();
150     ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
151     if (AFI->isThumbFunction())
152       BuildMI(MBB, I, TII.get(ARM::tLDRspi), DestReg)
153         .addFrameIndex(FI).addImm(0);
154     else
155       BuildMI(MBB, I, TII.get(ARM::LDR), DestReg)
156       .addFrameIndex(FI).addReg(0).addImm(0);
157   } else if (RC == ARM::DPRRegisterClass) {
158     BuildMI(MBB, I, TII.get(ARM::FLDD), DestReg)
159       .addFrameIndex(FI).addImm(0);
160   } else {
161     assert(RC == ARM::SPRRegisterClass && "Unknown regclass!");
162     BuildMI(MBB, I, TII.get(ARM::FLDS), DestReg)
163       .addFrameIndex(FI).addImm(0);
164   }
165 }
166
167 void ARMRegisterInfo::copyRegToReg(MachineBasicBlock &MBB,
168                                    MachineBasicBlock::iterator I,
169                                    unsigned DestReg, unsigned SrcReg,
170                                    const TargetRegisterClass *RC) const {
171   if (RC == ARM::GPRRegisterClass) {
172     MachineFunction &MF = *MBB.getParent();
173     ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
174     BuildMI(MBB, I, TII.get(AFI->isThumbFunction() ? ARM::tMOVrr : ARM::MOVrr),
175             DestReg).addReg(SrcReg);
176   } else if (RC == ARM::SPRRegisterClass)
177     BuildMI(MBB, I, TII.get(ARM::FCPYS), DestReg).addReg(SrcReg);
178   else if (RC == ARM::DPRRegisterClass)
179     BuildMI(MBB, I, TII.get(ARM::FCPYD), DestReg).addReg(SrcReg);
180   else
181     abort();
182 }
183
184 MachineInstr *ARMRegisterInfo::foldMemoryOperand(MachineInstr *MI,
185                                                  unsigned OpNum, int FI) const {
186   unsigned Opc = MI->getOpcode();
187   MachineInstr *NewMI = NULL;
188   switch (Opc) {
189   default: break;
190   case ARM::MOVrr: {
191     if (OpNum == 0) { // move -> store
192       unsigned SrcReg = MI->getOperand(1).getReg();
193       NewMI = BuildMI(TII.get(ARM::STR)).addReg(SrcReg).addFrameIndex(FI)
194         .addReg(0).addImm(0);
195     } else {          // move -> load
196       unsigned DstReg = MI->getOperand(0).getReg();
197       NewMI = BuildMI(TII.get(ARM::LDR), DstReg).addFrameIndex(FI).addReg(0)
198         .addImm(0);
199     }
200     break;
201   }
202   case ARM::tMOVrr: {
203     if (OpNum == 0) { // move -> store
204       unsigned SrcReg = MI->getOperand(1).getReg();
205       NewMI = BuildMI(TII.get(ARM::tSTRspi)).addReg(SrcReg).addFrameIndex(FI)
206         .addImm(0);
207     } else {          // move -> load
208       unsigned DstReg = MI->getOperand(0).getReg();
209       NewMI = BuildMI(TII.get(ARM::tLDRspi), DstReg).addFrameIndex(FI)
210         .addImm(0);
211     }
212     break;
213   }
214   case ARM::FCPYS: {
215     if (OpNum == 0) { // move -> store
216       unsigned SrcReg = MI->getOperand(1).getReg();
217       NewMI = BuildMI(TII.get(ARM::FSTS)).addReg(SrcReg).addFrameIndex(FI)
218         .addImm(0);
219     } else {          // move -> load
220       unsigned DstReg = MI->getOperand(0).getReg();
221       NewMI = BuildMI(TII.get(ARM::FLDS), DstReg).addFrameIndex(FI).addImm(0);
222     }
223     break;
224   }
225   case ARM::FCPYD: {
226     if (OpNum == 0) { // move -> store
227       unsigned SrcReg = MI->getOperand(1).getReg();
228       NewMI = BuildMI(TII.get(ARM::FSTD)).addReg(SrcReg).addFrameIndex(FI)
229         .addImm(0);
230     } else {          // move -> load
231       unsigned DstReg = MI->getOperand(0).getReg();
232       NewMI = BuildMI(TII.get(ARM::FLDD), DstReg).addFrameIndex(FI).addImm(0);
233     }
234     break;
235   }
236   }
237
238   if (NewMI)
239     NewMI->copyKillDeadInfo(MI);
240   return NewMI;
241 }
242
243 const unsigned* ARMRegisterInfo::getCalleeSavedRegs() const {
244   static const unsigned CalleeSavedRegs[] = {
245     ARM::LR, ARM::R11, ARM::R10, ARM::R9, ARM::R8,
246     ARM::R7, ARM::R6,  ARM::R5,  ARM::R4,
247
248     ARM::D15, ARM::D14, ARM::D13, ARM::D12,
249     ARM::D11, ARM::D10, ARM::D9,  ARM::D8,
250     0
251   };
252
253   static const unsigned DarwinCalleeSavedRegs[] = {
254     ARM::LR,  ARM::R7,  ARM::R6, ARM::R5, ARM::R4,
255     ARM::R11, ARM::R10, ARM::R9, ARM::R8,
256
257     ARM::D15, ARM::D14, ARM::D13, ARM::D12,
258     ARM::D11, ARM::D10, ARM::D9,  ARM::D8,
259     0
260   };
261   return STI.isTargetDarwin() ? DarwinCalleeSavedRegs : CalleeSavedRegs;
262 }
263
264 const TargetRegisterClass* const *
265 ARMRegisterInfo::getCalleeSavedRegClasses() const {
266   static const TargetRegisterClass * const CalleeSavedRegClasses[] = {
267     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
268     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
269     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
270
271     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
272     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
273     0
274   };
275   return CalleeSavedRegClasses;
276 }
277
278 /// hasFP - Return true if the specified function should have a dedicated frame
279 /// pointer register.  This is true if the function has variable sized allocas
280 /// or if frame pointer elimination is disabled.
281 ///
282 bool ARMRegisterInfo::hasFP(const MachineFunction &MF) const {
283   return NoFramePointerElim || MF.getFrameInfo()->hasVarSizedObjects();
284 }
285
286 /// emitARMRegPlusImmediate - Emits a series of instructions to materialize
287 /// a destreg = basereg + immediate in ARM code.
288 static
289 void emitARMRegPlusImmediate(MachineBasicBlock &MBB,
290                              MachineBasicBlock::iterator &MBBI,
291                              unsigned DestReg, unsigned BaseReg,
292                              int NumBytes, const TargetInstrInfo &TII) {
293   bool isSub = NumBytes < 0;
294   if (isSub) NumBytes = -NumBytes;
295
296   while (NumBytes) {
297     unsigned RotAmt = ARM_AM::getSOImmValRotate(NumBytes);
298     unsigned ThisVal = NumBytes & ARM_AM::rotr32(0xFF, RotAmt);
299     assert(ThisVal && "Didn't extract field correctly");
300     
301     // We will handle these bits from offset, clear them.
302     NumBytes &= ~ThisVal;
303     
304     // Get the properly encoded SOImmVal field.
305     int SOImmVal = ARM_AM::getSOImmVal(ThisVal);
306     assert(SOImmVal != -1 && "Bit extraction didn't work?");
307     
308     // Build the new ADD / SUB.
309     BuildMI(MBB, MBBI, TII.get(isSub ? ARM::SUBri : ARM::ADDri), DestReg)
310       .addReg(BaseReg).addImm(SOImmVal);
311     BaseReg = DestReg;
312   }
313 }
314
315 /// isLowRegister - Returns true if the register is low register r0-r7.
316 ///
317 static bool isLowRegister(unsigned Reg) {
318   using namespace ARM;
319   switch (Reg) {
320   case R0:  case R1:  case R2:  case R3:
321   case R4:  case R5:  case R6:  case R7:
322     return true;
323   default:
324     return false;
325   }
326 }
327
328 /// calcNumMI - Returns the number of instructions required to materialize
329 /// the specific add / sub r, c instruction.
330 static unsigned calcNumMI(int Opc, int ExtraOpc, unsigned Bytes,
331                           unsigned NumBits, unsigned Scale) {
332   unsigned NumMIs = 0;
333   unsigned Chunk = ((1 << NumBits) - 1) * Scale;
334
335   if (Opc == ARM::tADDrSPi) {
336     unsigned ThisVal = (Bytes > Chunk) ? Chunk : Bytes;
337     Bytes -= ThisVal;
338     NumMIs++;
339     NumBits = 8;
340     Scale = 1;
341     Chunk = ((1 << NumBits) - 1) * Scale;
342   }
343
344   NumMIs += Bytes / Chunk;
345   if ((Bytes % Chunk) != 0)
346     NumMIs++;
347   if (ExtraOpc)
348     NumMIs++;
349   return NumMIs;
350 }
351
352 /// emitThumbRegPlusConstPool - Emits a series of instructions to materialize
353 /// a destreg = basereg + immediate in Thumb code. Load the immediate from a
354 /// constpool entry.
355 static
356 void emitThumbRegPlusConstPool(MachineBasicBlock &MBB,
357                                MachineBasicBlock::iterator &MBBI,
358                                unsigned DestReg, unsigned BaseReg,
359                                int NumBytes, const TargetInstrInfo &TII) {
360     MachineFunction &MF = *MBB.getParent();
361     MachineConstantPool *ConstantPool = MF.getConstantPool();
362     bool isHigh = !isLowRegister(DestReg) || !isLowRegister(BaseReg);
363     bool isSub = false;
364     // Subtract doesn't have high register version. Load the negative value
365     // if either base or dest register is a high register.
366     if (NumBytes < 0 && !isHigh) {
367       isSub = true;
368       NumBytes = -NumBytes;
369     }
370     Constant *C = ConstantInt::get(Type::Int32Ty, NumBytes);
371     unsigned Idx = ConstantPool->getConstantPoolIndex(C, 2);
372     unsigned LdReg = DestReg;
373     if (DestReg == ARM::SP) {
374       assert(BaseReg == ARM::SP && "Unexpected!");
375       LdReg = ARM::R3;
376       BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R3);
377     }
378     // Load the constant.
379     BuildMI(MBB, MBBI, TII.get(ARM::tLDRpci), LdReg).addConstantPoolIndex(Idx);
380     // Emit add / sub.
381     int Opc = (isSub) ? ARM::tSUBrr : (isHigh ? ARM::tADDhirr : ARM::tADDrr);
382     const MachineInstrBuilder MIB = BuildMI(MBB, MBBI, TII.get(Opc), DestReg);
383     if (DestReg == ARM::SP)
384       MIB.addReg(BaseReg).addReg(LdReg);
385     else
386       MIB.addReg(LdReg).addReg(BaseReg);
387     if (DestReg == ARM::SP)
388       BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), ARM::R3).addReg(ARM::R12);
389 }
390
391 /// emitThumbRegPlusImmediate - Emits a series of instructions to materialize
392 /// a destreg = basereg + immediate in Thumb code.
393 static
394 void emitThumbRegPlusImmediate(MachineBasicBlock &MBB,
395                                MachineBasicBlock::iterator &MBBI,
396                                unsigned DestReg, unsigned BaseReg,
397                                int NumBytes, const TargetInstrInfo &TII) {
398   bool isSub = NumBytes < 0;
399   unsigned Bytes = (unsigned)NumBytes;
400   if (isSub) Bytes = -NumBytes;
401   bool isMul4 = (Bytes & 3) == 0;
402   bool isTwoAddr = false;
403   bool DstNeBase = false;
404   unsigned NumBits = 1;
405   unsigned Scale = 1;
406   int Opc = 0;
407   int ExtraOpc = 0;
408
409   if (DestReg == BaseReg && BaseReg == ARM::SP) {
410     assert(isMul4 && "Thumb sp inc / dec size must be multiple of 4!");
411     NumBits = 7;
412     Scale = 4;
413     Opc = isSub ? ARM::tSUBspi : ARM::tADDspi;
414     isTwoAddr = true;
415   } else if (!isSub && BaseReg == ARM::SP) {
416     // r1 = add sp, 403
417     // =>
418     // r1 = add sp, 100 * 4
419     // r1 = add r1, 3
420     if (!isMul4) {
421       Bytes &= ~3;
422       ExtraOpc = ARM::tADDi3;
423     }
424     NumBits = 8;
425     Scale = 4;
426     Opc = ARM::tADDrSPi;
427   } else {
428     // sp = sub sp, c
429     // r1 = sub sp, c
430     // r8 = sub sp, c
431     if (DestReg != BaseReg)
432       DstNeBase = true;
433     NumBits = 8;
434     Opc = isSub ? ARM::tSUBi8 : ARM::tADDi8;
435     isTwoAddr = true;
436   }
437
438   unsigned NumMIs = calcNumMI(Opc, ExtraOpc, Bytes, NumBits, Scale);
439   unsigned Threshold = (DestReg == ARM::SP) ? 4 : 3;
440   if (NumMIs > Threshold) {
441     // This will expand into too many instructions. Load the immediate from a
442     // constpool entry.
443     emitThumbRegPlusConstPool(MBB, MBBI, DestReg, BaseReg, NumBytes, TII);
444     return;
445   }
446
447   if (DstNeBase) {
448     if (isLowRegister(DestReg) && isLowRegister(BaseReg)) {
449       // If both are low registers, emit DestReg = add BaseReg, max(Imm, 7)
450       unsigned Chunk = (1 << 3) - 1;
451       unsigned ThisVal = (Bytes > Chunk) ? Chunk : Bytes;
452       Bytes -= ThisVal;
453       BuildMI(MBB, MBBI, TII.get(isSub ? ARM::tSUBi3 : ARM::tADDi3), DestReg)
454         .addReg(BaseReg).addImm(ThisVal);
455     } else {
456       BuildMI(MBB, MBBI, TII.get(ARM::tMOVrr), DestReg).addReg(BaseReg);
457     }
458     BaseReg = DestReg;
459   }
460
461   unsigned Chunk = ((1 << NumBits) - 1) * Scale;
462   while (Bytes) {
463     unsigned ThisVal = (Bytes > Chunk) ? Chunk : Bytes;
464     Bytes -= ThisVal;
465     ThisVal /= Scale;
466     // Build the new tADD / tSUB.
467     if (isTwoAddr)
468       BuildMI(MBB, MBBI, TII.get(Opc), DestReg).addReg(DestReg).addImm(ThisVal);
469     else {
470       BuildMI(MBB, MBBI, TII.get(Opc), DestReg).addReg(BaseReg).addImm(ThisVal);
471       BaseReg = DestReg;
472
473       if (Opc == ARM::tADDrSPi) {
474         // r4 = add sp, imm
475         // r4 = add r4, imm
476         // ...
477         NumBits = 8;
478         Scale = 1;
479         Chunk = ((1 << NumBits) - 1) * Scale;
480         Opc = isSub ? ARM::tSUBi8 : ARM::tADDi8;
481         isTwoAddr = true;
482       }
483     }
484   }
485
486   if (ExtraOpc)
487     BuildMI(MBB, MBBI, TII.get(ExtraOpc), DestReg).addReg(DestReg)
488       .addImm(((unsigned)NumBytes) & 3);
489 }
490
491 static
492 void emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
493                   int NumBytes, bool isThumb, const TargetInstrInfo &TII) {
494   if (isThumb)
495     emitThumbRegPlusImmediate(MBB, MBBI, ARM::SP, ARM::SP, NumBytes, TII);
496   else
497     emitARMRegPlusImmediate(MBB, MBBI, ARM::SP, ARM::SP, NumBytes, TII);
498 }
499
500 void ARMRegisterInfo::
501 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
502                               MachineBasicBlock::iterator I) const {
503   if (hasFP(MF)) {
504     // If we have alloca, convert as follows:
505     // ADJCALLSTACKDOWN -> sub, sp, sp, amount
506     // ADJCALLSTACKUP   -> add, sp, sp, amount
507     MachineInstr *Old = I;
508     unsigned Amount = Old->getOperand(0).getImmedValue();
509     if (Amount != 0) {
510       ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
511       // We need to keep the stack aligned properly.  To do this, we round the
512       // amount of space needed for the outgoing arguments up to the next
513       // alignment boundary.
514       unsigned Align = MF.getTarget().getFrameInfo()->getStackAlignment();
515       Amount = (Amount+Align-1)/Align*Align;
516
517       // Replace the pseudo instruction with a new instruction...
518       if (Old->getOpcode() == ARM::ADJCALLSTACKDOWN) {
519         emitSPUpdate(MBB, I, -Amount, AFI->isThumbFunction(), TII);
520       } else {
521         assert(Old->getOpcode() == ARM::ADJCALLSTACKUP);
522         emitSPUpdate(MBB, I, Amount, AFI->isThumbFunction(), TII);
523       }
524     }
525   }
526   MBB.erase(I);
527 }
528
529 /// emitThumbConstant - Emit a series of instructions to materialize a
530 /// constant.
531 static void emitThumbConstant(MachineBasicBlock &MBB,
532                               MachineBasicBlock::iterator &MBBI,
533                               unsigned DestReg, int Imm,
534                               const TargetInstrInfo &TII) {
535   bool isSub = Imm < 0;
536   if (isSub) Imm = -Imm;
537
538   int Chunk = (1 << 8) - 1;
539   int ThisVal = (Imm > Chunk) ? Chunk : Imm;
540   Imm -= ThisVal;
541   BuildMI(MBB, MBBI, TII.get(ARM::tMOVri8), DestReg).addImm(ThisVal);
542   if (Imm > 0) 
543     emitThumbRegPlusImmediate(MBB, MBBI, DestReg, DestReg, Imm, TII);
544   if (isSub)
545     BuildMI(MBB, MBBI, TII.get(ARM::tNEG), DestReg).addReg(DestReg);
546 }
547
548 void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{
549   unsigned i = 0;
550   MachineInstr &MI = *II;
551   MachineBasicBlock &MBB = *MI.getParent();
552   MachineFunction &MF = *MBB.getParent();
553   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
554   bool isThumb = AFI->isThumbFunction();
555
556   while (!MI.getOperand(i).isFrameIndex()) {
557     ++i;
558     assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
559   }
560   
561   unsigned FrameReg = ARM::SP;
562   int FrameIndex = MI.getOperand(i).getFrameIndex();
563   int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + 
564                MF.getFrameInfo()->getStackSize();
565
566   if (AFI->isGPRCalleeSavedArea1Frame(FrameIndex))
567     Offset -= AFI->getGPRCalleeSavedArea1Offset();
568   else if (AFI->isGPRCalleeSavedArea2Frame(FrameIndex))
569     Offset -= AFI->getGPRCalleeSavedArea2Offset();
570   else if (AFI->isDPRCalleeSavedAreaFrame(FrameIndex))
571     Offset -= AFI->getDPRCalleeSavedAreaOffset();
572   else if (hasFP(MF)) {
573     // There is alloca()'s in this function, must reference off the frame
574     // pointer instead.
575     FrameReg = getFrameRegister(MF);
576     Offset -= AFI->getFramePtrSpillOffset();
577   }
578
579   unsigned Opcode = MI.getOpcode();
580   const TargetInstrDescriptor &Desc = TII.get(Opcode);
581   unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
582   bool isSub = false;
583   
584   if (Opcode == ARM::ADDri) {
585     Offset += MI.getOperand(i+1).getImm();
586     if (Offset == 0) {
587       // Turn it into a move.
588       MI.setInstrDescriptor(TII.get(ARM::MOVrr));
589       MI.getOperand(i).ChangeToRegister(FrameReg, false);
590       MI.RemoveOperand(i+1);
591       return;
592     } else if (Offset < 0) {
593       Offset = -Offset;
594       isSub = true;
595       MI.setInstrDescriptor(TII.get(ARM::SUBri));
596     }
597
598     // Common case: small offset, fits into instruction.
599     int ImmedOffset = ARM_AM::getSOImmVal(Offset);
600     if (ImmedOffset != -1) {
601       // Replace the FrameIndex with sp / fp
602       MI.getOperand(i).ChangeToRegister(FrameReg, false);
603       MI.getOperand(i+1).ChangeToImmediate(ImmedOffset);
604       return;
605     }
606     
607     // Otherwise, we fallback to common code below to form the imm offset with
608     // a sequence of ADDri instructions.  First though, pull as much of the imm
609     // into this ADDri as possible.
610     unsigned RotAmt = ARM_AM::getSOImmValRotate(Offset);
611     unsigned ThisImmVal = Offset & ARM_AM::rotr32(0xFF, (32-RotAmt) & 31);
612     
613     // We will handle these bits from offset, clear them.
614     Offset &= ~ThisImmVal;
615     
616     // Get the properly encoded SOImmVal field.
617     int ThisSOImmVal = ARM_AM::getSOImmVal(ThisImmVal);
618     assert(ThisSOImmVal != -1 && "Bit extraction didn't work?");    
619     MI.getOperand(i+1).ChangeToImmediate(ThisSOImmVal);
620   } else if (Opcode == ARM::tADDrSPi) {
621     Offset += MI.getOperand(i+1).getImm();
622     assert((Offset & 3) == 0 &&
623            "Thumb add/sub sp, #imm immediate must be multiple of 4!");
624     Offset >>= 2;
625     if (Offset == 0) {
626       // Turn it into a move.
627       MI.setInstrDescriptor(TII.get(ARM::tMOVrr));
628       MI.getOperand(i).ChangeToRegister(FrameReg, false);
629       MI.RemoveOperand(i+1);
630       return;
631     }
632
633     // Common case: small offset, fits into instruction.
634     if ((Offset & ~255U) == 0) {
635       // Replace the FrameIndex with sp / fp
636       MI.getOperand(i).ChangeToRegister(FrameReg, false);
637       MI.getOperand(i+1).ChangeToImmediate(Offset);
638       return;
639     }
640
641     unsigned DestReg = MI.getOperand(0).getReg();
642     if (Offset > 0) {
643       // Translate r0 = add sp, imm to
644       // r0 = add sp, 255*4
645       // r0 = add r0, (imm - 255*4)
646       MI.getOperand(i).ChangeToRegister(FrameReg, false);
647       MI.getOperand(i+1).ChangeToImmediate(255);
648       Offset = (Offset - 255) << 2;
649       MachineBasicBlock::iterator NII = next(II);
650       emitThumbRegPlusImmediate(MBB, NII, DestReg, DestReg, Offset, TII);
651     } else {
652       // Translate r0 = add sp, -imm to
653       // r0 = -imm (this is then translated into a series of instructons)
654       // r0 = add r0, sp
655       Offset <<= 2;
656       emitThumbConstant(MBB, II, DestReg, Offset, TII);
657       MI.setInstrDescriptor(TII.get(ARM::tADDhirr));
658       MI.getOperand(i).ChangeToRegister(DestReg, false);
659       MI.getOperand(i+1).ChangeToRegister(FrameReg, false);
660     }
661     return;
662   } else {
663     unsigned ImmIdx = 0;
664     int InstrOffs = 0;
665     unsigned NumBits = 0;
666     unsigned Scale = 1;
667     switch (AddrMode) {
668     case ARMII::AddrMode2: {
669       ImmIdx = i+2;
670       InstrOffs = ARM_AM::getAM2Offset(MI.getOperand(ImmIdx).getImm());
671       if (ARM_AM::getAM2Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub)
672         InstrOffs *= -1;
673       NumBits = 12;
674       break;
675     }
676     case ARMII::AddrMode3: {
677       ImmIdx = i+2;
678       InstrOffs = ARM_AM::getAM3Offset(MI.getOperand(ImmIdx).getImm());
679       if (ARM_AM::getAM3Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub)
680         InstrOffs *= -1;
681       NumBits = 8;
682       break;
683     }
684     case ARMII::AddrMode5: {
685       ImmIdx = i+1;
686       InstrOffs = ARM_AM::getAM5Offset(MI.getOperand(ImmIdx).getImm());
687       if (ARM_AM::getAM5Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub)
688         InstrOffs *= -1;
689       NumBits = 8;
690       Scale = 4;
691       break;
692     }
693     case ARMII::AddrModeTs: {
694       ImmIdx = i+1;
695       InstrOffs = MI.getOperand(ImmIdx).getImm();
696       NumBits = 8;
697       Scale = 4;
698       break;
699     }
700     default:
701       std::cerr << "Unsupported addressing mode!\n";
702       abort();
703       break;
704     }
705
706     Offset += InstrOffs * Scale;
707     assert((Scale == 1 || (Offset & (Scale-1)) == 0) &&
708            "Can't encode this offset!");
709     if (Offset < 0) {
710       Offset = -Offset;
711       isSub = true;
712     }
713
714     MachineOperand &ImmOp = MI.getOperand(ImmIdx);
715     int ImmedOffset = Offset / Scale;
716     unsigned Mask = (1 << NumBits) - 1;
717     if ((unsigned)Offset <= Mask * Scale) {
718       // Replace the FrameIndex with sp
719       MI.getOperand(i).ChangeToRegister(FrameReg, false);
720       if (isSub)
721         ImmedOffset |= 1 << NumBits;
722       ImmOp.ChangeToImmediate(ImmedOffset);
723       return;
724     }
725
726     // Otherwise, it didn't fit. Pull in what we can to simplify the immediate.
727     if (AddrMode == ARMII::AddrModeTs) {
728       // Thumb tLDRspi, tSTRspi. These will change to instructions that use a
729       // different base register.
730       NumBits = 5;
731       Mask = (1 << NumBits) - 1;
732     }
733
734     ImmedOffset = ImmedOffset & Mask;
735     if (isSub)
736       ImmedOffset |= 1 << NumBits;
737     ImmOp.ChangeToImmediate(ImmedOffset);
738     Offset &= ~(Mask*Scale);
739   }
740   
741   // If we get here, the immediate doesn't fit into the instruction.  We folded
742   // as much as possible above, handle the rest, providing a register that is
743   // SP+LargeImm.
744   assert(Offset && "This code isn't needed if offset already handled!");
745
746   if (isThumb) {
747     if (TII.isLoad(Opcode)) {
748       // Use the destination register to materialize sp + offset.
749       unsigned TmpReg = MI.getOperand(0).getReg();
750       emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg,
751                                 isSub ? -Offset : Offset, TII);
752       MI.setInstrDescriptor(TII.get(ARM::tLDR));
753       MI.getOperand(i).ChangeToRegister(TmpReg, false);
754       MI.addRegOperand(0, false); // tLDR has an extra register operand.
755     } else if (TII.isStore(Opcode)) {
756       // FIXME! This is horrific!!! We need register scavenging.
757       // Our temporary workaround has marked r3 unavailable. Of course, r3 is
758       // also a ABI register so it's possible that is is the register that is
759       // being storing here. If that's the case, we do the following:
760       // r12 = r2
761       // Use r2 to materialize sp + offset
762       // str r12, r2
763       // r2 = r12
764       unsigned ValReg = MI.getOperand(0).getReg();
765       unsigned TmpReg = ARM::R3;
766       if (ValReg == ARM::R3) {
767         BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12).addReg(ARM::R2);
768         TmpReg = ARM::R2;
769       }
770       emitThumbRegPlusImmediate(MBB, II, TmpReg, FrameReg,
771                                 isSub ? -Offset : Offset, TII);
772       MI.setInstrDescriptor(TII.get(ARM::tSTR));
773       MI.getOperand(i).ChangeToRegister(TmpReg, false);
774       MI.addRegOperand(0, false); // tSTR has an extra register operand.
775       if (ValReg == ARM::R3)
776         BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R2).addReg(ARM::R12);
777     } else
778       assert(false && "Unexpected opcode!");
779   } else {
780     // Insert a set of r12 with the full address: r12 = sp + offset
781     // If the offset we have is too large to fit into the instruction, we need
782     // to form it with a series of ADDri's.  Do this by taking 8-bit chunks
783     // out of 'Offset'.
784     emitARMRegPlusImmediate(MBB, II, ARM::R12, FrameReg,
785                             isSub ? -Offset : Offset, TII);
786     MI.getOperand(i).ChangeToRegister(ARM::R12, false);
787   }
788 }
789
790 void ARMRegisterInfo::
791 processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const {
792   // This tells PEI to spill the FP as if it is any other callee-save register
793   // to take advantage the eliminateFrameIndex machinery. This also ensures it
794   // is spilled in the order specified by getCalleeSavedRegs() to make it easier
795   // to combine multiple loads / stores.
796   bool CanEliminateFrame = true;
797   bool CS1Spilled = false;
798   bool LRSpilled = false;
799   unsigned NumGPRSpills = 0;
800   SmallVector<unsigned, 4> UnspilledCS1GPRs;
801   SmallVector<unsigned, 4> UnspilledCS2GPRs;
802
803   // Don't spill FP if the frame can be eliminated. This is determined
804   // by scanning the callee-save registers to see if any is used.
805   const unsigned *CSRegs = getCalleeSavedRegs();
806   const TargetRegisterClass* const *CSRegClasses = getCalleeSavedRegClasses();
807   for (unsigned i = 0; CSRegs[i]; ++i) {
808     unsigned Reg = CSRegs[i];
809     bool Spilled = false;
810     if (MF.isPhysRegUsed(Reg)) {
811       Spilled = true;
812       CanEliminateFrame = false;
813     } else {
814       // Check alias registers too.
815       for (const unsigned *Aliases = getAliasSet(Reg); *Aliases; ++Aliases) {
816         if (MF.isPhysRegUsed(*Aliases)) {
817           Spilled = true;
818           CanEliminateFrame = false;
819         }
820       }
821     }
822
823     if (CSRegClasses[i] == &ARM::GPRRegClass) {
824       if (Spilled) {
825         NumGPRSpills++;
826
827         if (!STI.isTargetDarwin()) {
828           if (Reg == ARM::LR)
829             LRSpilled = true;
830           else
831             CS1Spilled = true;
832           continue;
833         }
834
835         // Keep track if LR and any of R4, R5, R6, and R7 is spilled.
836         switch (Reg) {
837         case ARM::LR:
838           LRSpilled = true;
839           // Fallthrough
840         case ARM::R4:
841         case ARM::R5:
842         case ARM::R6:
843         case ARM::R7:
844           CS1Spilled = true;
845           break;
846         default:
847           break;
848         }
849       } else { 
850         if (!STI.isTargetDarwin()) {
851           UnspilledCS1GPRs.push_back(Reg);
852           continue;
853         }
854
855         switch (Reg) {
856         case ARM::R4:
857         case ARM::R5:
858         case ARM::R6:
859         case ARM::R7:
860         case ARM::LR:
861           UnspilledCS1GPRs.push_back(Reg);
862           break;
863         default:
864           UnspilledCS2GPRs.push_back(Reg);
865           break;
866         }
867       }
868     }
869   }
870
871   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
872   bool ForceLRSpill = false;
873   if (!LRSpilled && AFI->isThumbFunction()) {
874     unsigned FnSize = ARM::GetFunctionSize(MF);
875     // Force LR spill if the Thumb function size is > 2048. This enables the
876     // use of BL to implement far jump. If it turns out that it's not needed
877     // the branch fix up path will undo it.
878     if (FnSize >= (1 << 11)) {
879       CanEliminateFrame = false;
880       ForceLRSpill = true;
881     }
882   }
883
884   if (hasFP(MF)) {
885     MF.changePhyRegUsed(FramePtr, true);
886     NumGPRSpills++;
887     CanEliminateFrame = false;
888   }
889
890   if (!CanEliminateFrame) {
891     AFI->setHasStackFrame(true);
892
893     // If LR is not spilled, but at least one of R4, R5, R6, and R7 is spilled.
894     // Spill LR as well so we can fold BX_RET to the registers restore (LDM).
895     if (!LRSpilled && CS1Spilled) {
896       MF.changePhyRegUsed(ARM::LR, true);
897       NumGPRSpills++;
898       UnspilledCS1GPRs.erase(std::find(UnspilledCS1GPRs.begin(),
899                                     UnspilledCS1GPRs.end(), (unsigned)ARM::LR));
900       ForceLRSpill = false;
901     }
902
903     // If stack and double are 8-byte aligned and we are spilling an odd number
904     // of GPRs. Spill one extra callee save GPR so we won't have to pad between
905     // the integer and double callee save areas.
906     unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
907     if (TargetAlign == 8 && (NumGPRSpills & 1)) {
908       if (CS1Spilled && !UnspilledCS1GPRs.empty())
909         MF.changePhyRegUsed(UnspilledCS1GPRs.front(), true);
910       else if (!UnspilledCS2GPRs.empty())
911         MF.changePhyRegUsed(UnspilledCS2GPRs.front(), true);
912     }
913   }
914
915   if (ForceLRSpill) {
916     MF.changePhyRegUsed(ARM::LR, true);
917     AFI->setLRIsForceSpilled(true);
918   }
919 }
920
921 /// Move iterator pass the next bunch of callee save load / store ops for
922 /// the particular spill area (1: integer area 1, 2: integer area 2,
923 /// 3: fp area, 0: don't care).
924 static void movePastCSLoadStoreOps(MachineBasicBlock &MBB,
925                                    MachineBasicBlock::iterator &MBBI,
926                                    int Opc, unsigned Area,
927                                    const ARMSubtarget &STI) {
928   while (MBBI != MBB.end() &&
929          MBBI->getOpcode() == Opc && MBBI->getOperand(1).isFrameIndex()) {
930     if (Area != 0) {
931       bool Done = false;
932       unsigned Category = 0;
933       switch (MBBI->getOperand(0).getReg()) {
934       case ARM::R4:  case ARM::R5:  case ARM::R6: case ARM::R7:
935       case ARM::LR:
936         Category = 1;
937         break;
938       case ARM::R8:  case ARM::R9:  case ARM::R10: case ARM::R11:
939         Category = STI.isTargetDarwin() ? 2 : 1;
940         break;
941       case ARM::D8:  case ARM::D9:  case ARM::D10: case ARM::D11:
942       case ARM::D12: case ARM::D13: case ARM::D14: case ARM::D15:
943         Category = 3;
944         break;
945       default:
946         Done = true;
947         break;
948       }
949       if (Done || Category != Area)
950         break;
951     }
952
953     ++MBBI;
954   }
955 }
956
957 void ARMRegisterInfo::emitPrologue(MachineFunction &MF) const {
958   MachineBasicBlock &MBB = MF.front();
959   MachineBasicBlock::iterator MBBI = MBB.begin();
960   MachineFrameInfo  *MFI = MF.getFrameInfo();
961   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
962   bool isThumb = AFI->isThumbFunction();
963   unsigned VARegSaveSize = AFI->getVarArgsRegSaveSize();
964   unsigned Align = MF.getTarget().getFrameInfo()->getStackAlignment();
965   unsigned NumBytes = MFI->getStackSize();
966   const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
967
968   if (isThumb) {
969     // Thumb add/sub sp, imm8 instructions implicitly multiply the offset by 4.
970     NumBytes = (NumBytes + 3) & ~3;
971     MFI->setStackSize(NumBytes);
972   }
973
974   // Determine the sizes of each callee-save spill areas and record which frame
975   // belongs to which callee-save spill areas.
976   unsigned GPRCS1Size = 0, GPRCS2Size = 0, DPRCSSize = 0;
977   int FramePtrSpillFI = 0;
978   if (!AFI->hasStackFrame()) {
979     if (NumBytes != 0)
980       emitSPUpdate(MBB, MBBI, -NumBytes, isThumb, TII);
981     return;
982   }
983
984   if (VARegSaveSize)
985     emitSPUpdate(MBB, MBBI, -VARegSaveSize, isThumb, TII);
986
987   for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
988     unsigned Reg = CSI[i].getReg();
989     int FI = CSI[i].getFrameIdx();
990     switch (Reg) {
991     case ARM::R4:
992     case ARM::R5:
993     case ARM::R6:
994     case ARM::R7:
995     case ARM::LR:
996       if (Reg == FramePtr)
997         FramePtrSpillFI = FI;
998       AFI->addGPRCalleeSavedArea1Frame(FI);
999       GPRCS1Size += 4;
1000       break;
1001     case ARM::R8:
1002     case ARM::R9:
1003     case ARM::R10:
1004     case ARM::R11:
1005       if (Reg == FramePtr)
1006         FramePtrSpillFI = FI;
1007       if (STI.isTargetDarwin()) {
1008         AFI->addGPRCalleeSavedArea2Frame(FI);
1009         GPRCS2Size += 4;
1010       } else {
1011         AFI->addGPRCalleeSavedArea1Frame(FI);
1012         GPRCS1Size += 4;
1013       }
1014       break;
1015     default:
1016       AFI->addDPRCalleeSavedAreaFrame(FI);
1017       DPRCSSize += 8;
1018     }
1019   }
1020
1021   if (Align == 8 && (GPRCS1Size & 7) != 0)
1022     // Pad CS1 to ensure proper alignment.
1023     GPRCS1Size += 4;
1024
1025   if (!isThumb) {
1026     // Build the new SUBri to adjust SP for integer callee-save spill area 1.
1027     emitSPUpdate(MBB, MBBI, -GPRCS1Size, isThumb, TII);
1028     movePastCSLoadStoreOps(MBB, MBBI, ARM::STR, 1, STI);
1029   } else if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPUSH)
1030     ++MBBI;
1031
1032   // Point FP to the stack slot that contains the previous FP.
1033   if (hasFP(MF))
1034     BuildMI(MBB, MBBI, TII.get(isThumb ? ARM::tADDrSPi : ARM::ADDri), FramePtr)
1035       .addFrameIndex(FramePtrSpillFI).addImm(0);
1036
1037   if (!isThumb) {
1038     // Build the new SUBri to adjust SP for integer callee-save spill area 2.
1039     emitSPUpdate(MBB, MBBI, -GPRCS2Size, false, TII);
1040
1041     // Build the new SUBri to adjust SP for FP callee-save spill area.
1042     movePastCSLoadStoreOps(MBB, MBBI, ARM::STR, 2, STI);
1043     emitSPUpdate(MBB, MBBI, -DPRCSSize, false, TII);
1044   }
1045
1046   // Determine starting offsets of spill areas.
1047   unsigned DPRCSOffset  = NumBytes - (GPRCS1Size + GPRCS2Size + DPRCSSize);
1048   unsigned GPRCS2Offset = DPRCSOffset + DPRCSSize;
1049   unsigned GPRCS1Offset = GPRCS2Offset + GPRCS2Size;
1050   AFI->setFramePtrSpillOffset(MFI->getObjectOffset(FramePtrSpillFI) + NumBytes);
1051   AFI->setGPRCalleeSavedArea1Offset(GPRCS1Offset);
1052   AFI->setGPRCalleeSavedArea2Offset(GPRCS2Offset);
1053   AFI->setDPRCalleeSavedAreaOffset(DPRCSOffset);
1054   
1055   NumBytes = DPRCSOffset;
1056   if (NumBytes) {
1057     // Insert it after all the callee-save spills.
1058     if (!isThumb)
1059       movePastCSLoadStoreOps(MBB, MBBI, ARM::FSTD, 3, STI);
1060     emitSPUpdate(MBB, MBBI, -NumBytes, isThumb, TII);
1061   }
1062
1063   AFI->setGPRCalleeSavedArea1Size(GPRCS1Size);
1064   AFI->setGPRCalleeSavedArea2Size(GPRCS2Size);
1065   AFI->setDPRCalleeSavedAreaSize(DPRCSSize);
1066 }
1067
1068 static bool isCalleeSavedRegister(unsigned Reg, const unsigned *CSRegs) {
1069   for (unsigned i = 0; CSRegs[i]; ++i)
1070     if (Reg == CSRegs[i])
1071       return true;
1072   return false;
1073 }
1074
1075 static bool isCSRestore(MachineInstr *MI, const unsigned *CSRegs) {
1076   return ((MI->getOpcode() == ARM::FLDD ||
1077            MI->getOpcode() == ARM::LDR  ||
1078            MI->getOpcode() == ARM::tLDRspi) &&
1079           MI->getOperand(1).isFrameIndex() &&
1080           isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs));
1081 }
1082
1083 void ARMRegisterInfo::emitEpilogue(MachineFunction &MF,
1084                                    MachineBasicBlock &MBB) const {
1085   MachineBasicBlock::iterator MBBI = prior(MBB.end());
1086   assert((MBBI->getOpcode() == ARM::BX_RET ||
1087           MBBI->getOpcode() == ARM::tBX_RET ||
1088           MBBI->getOpcode() == ARM::tPOP_RET) &&
1089          "Can only insert epilog into returning blocks");
1090
1091   MachineFrameInfo *MFI = MF.getFrameInfo();
1092   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
1093   bool isThumb = AFI->isThumbFunction();
1094   unsigned VARegSaveSize = AFI->getVarArgsRegSaveSize();
1095   int NumBytes = (int)MFI->getStackSize();
1096   if (!AFI->hasStackFrame()) {
1097     if (NumBytes != 0)
1098       emitSPUpdate(MBB, MBBI, NumBytes, isThumb, TII);
1099     return;
1100   }
1101
1102   // Unwind MBBI to point to first LDR / FLDD.
1103   const unsigned *CSRegs = getCalleeSavedRegs();
1104   if (MBBI != MBB.begin()) {
1105     do
1106       --MBBI;
1107     while (MBBI != MBB.begin() && isCSRestore(MBBI, CSRegs));
1108     if (!isCSRestore(MBBI, CSRegs))
1109       ++MBBI;
1110   }
1111
1112   // Move SP to start of FP callee save spill area.
1113   NumBytes -= (AFI->getGPRCalleeSavedArea1Size() +
1114                AFI->getGPRCalleeSavedArea2Size() +
1115                AFI->getDPRCalleeSavedAreaSize());
1116   if (isThumb)
1117     emitSPUpdate(MBB, MBBI, NumBytes, isThumb, TII);
1118   else {
1119     if (hasFP(MF)){
1120       NumBytes = AFI->getFramePtrSpillOffset() - NumBytes;
1121       // Reset SP based on frame pointer only if the stack frame extends beyond
1122       // frame pointer stack slot.
1123       if (AFI->getGPRCalleeSavedArea2Size() ||
1124           AFI->getDPRCalleeSavedAreaSize()  ||
1125           AFI->getDPRCalleeSavedAreaOffset())
1126         if (NumBytes)
1127           BuildMI(MBB, MBBI, TII.get(ARM::SUBri), ARM::SP).addReg(FramePtr)
1128             .addImm(NumBytes);
1129         else
1130           BuildMI(MBB, MBBI, TII.get(ARM::MOVrr), ARM::SP).addReg(FramePtr);
1131     } else if (NumBytes) {
1132       emitSPUpdate(MBB, MBBI, NumBytes, false, TII);
1133     }
1134     // Move SP to start of integer callee save spill area 2.
1135     movePastCSLoadStoreOps(MBB, MBBI, ARM::FLDD, 3, STI);
1136     emitSPUpdate(MBB, MBBI, AFI->getDPRCalleeSavedAreaSize(), false, TII);
1137
1138     // Move SP to start of integer callee save spill area 1.
1139     movePastCSLoadStoreOps(MBB, MBBI, ARM::LDR, 2, STI);
1140     emitSPUpdate(MBB, MBBI, AFI->getGPRCalleeSavedArea2Size(), false, TII);
1141
1142     // Move SP to SP upon entry to the function.
1143     movePastCSLoadStoreOps(MBB, MBBI, ARM::LDR, 1, STI);
1144     emitSPUpdate(MBB, MBBI, AFI->getGPRCalleeSavedArea1Size(), false, TII);
1145   }
1146
1147   if (VARegSaveSize)
1148     emitSPUpdate(MBB, MBBI, VARegSaveSize, isThumb, TII);
1149 }
1150
1151 unsigned ARMRegisterInfo::getRARegister() const {
1152   return ARM::LR;
1153 }
1154
1155 unsigned ARMRegisterInfo::getFrameRegister(MachineFunction &MF) const {
1156   return STI.useThumbBacktraces() ? ARM::R7 : ARM::R11;
1157 }
1158
1159 #include "ARMGenRegisterInfo.inc"
1160