Fix frame index elimination to correctly handle thumb-2 addressing modes that don...
[oota-llvm.git] / lib / Target / ARM / ARMBaseRegisterInfo.cpp
1 //===- ARMBaseRegisterInfo.cpp - ARM Register Information -----------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the base ARM implementation of TargetRegisterInfo class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "ARM.h"
15 #include "ARMAddressingModes.h"
16 #include "ARMBaseInstrInfo.h"
17 #include "ARMBaseRegisterInfo.h"
18 #include "ARMInstrInfo.h"
19 #include "ARMMachineFunctionInfo.h"
20 #include "ARMSubtarget.h"
21 #include "llvm/Constants.h"
22 #include "llvm/DerivedTypes.h"
23 #include "llvm/Function.h"
24 #include "llvm/LLVMContext.h"
25 #include "llvm/CodeGen/MachineConstantPool.h"
26 #include "llvm/CodeGen/MachineFrameInfo.h"
27 #include "llvm/CodeGen/MachineFunction.h"
28 #include "llvm/CodeGen/MachineInstrBuilder.h"
29 #include "llvm/CodeGen/MachineLocation.h"
30 #include "llvm/CodeGen/MachineRegisterInfo.h"
31 #include "llvm/CodeGen/RegisterScavenging.h"
32 #include "llvm/Support/ErrorHandling.h"
33 #include "llvm/Support/raw_ostream.h"
34 #include "llvm/Target/TargetFrameInfo.h"
35 #include "llvm/Target/TargetMachine.h"
36 #include "llvm/Target/TargetOptions.h"
37 #include "llvm/ADT/BitVector.h"
38 #include "llvm/ADT/SmallVector.h"
39 using namespace llvm;
40
41 unsigned ARMBaseRegisterInfo::getRegisterNumbering(unsigned RegEnum,
42                                                    bool *isSPVFP) {
43   if (isSPVFP)
44     *isSPVFP = false;
45
46   using namespace ARM;
47   switch (RegEnum) {
48   default:
49     llvm_unreachable("Unknown ARM register!");
50   case R0:  case D0:  case Q0:  return 0;
51   case R1:  case D1:  case Q1:  return 1;
52   case R2:  case D2:  case Q2:  return 2;
53   case R3:  case D3:  case Q3:  return 3;
54   case R4:  case D4:  case Q4:  return 4;
55   case R5:  case D5:  case Q5:  return 5;
56   case R6:  case D6:  case Q6:  return 6;
57   case R7:  case D7:  case Q7:  return 7;
58   case R8:  case D8:  case Q8:  return 8;
59   case R9:  case D9:  case Q9:  return 9;
60   case R10: case D10: case Q10: return 10;
61   case R11: case D11: case Q11: return 11;
62   case R12: case D12: case Q12: return 12;
63   case SP:  case D13: case Q13: return 13;
64   case LR:  case D14: case Q14: return 14;
65   case PC:  case D15: case Q15: return 15;
66
67   case D16: return 16;
68   case D17: return 17;
69   case D18: return 18;
70   case D19: return 19;
71   case D20: return 20;
72   case D21: return 21;
73   case D22: return 22;
74   case D23: return 23;
75   case D24: return 24;
76   case D25: return 25;
77   case D26: return 27;
78   case D27: return 27;
79   case D28: return 28;
80   case D29: return 29;
81   case D30: return 30;
82   case D31: return 31;
83
84   case S0: case S1: case S2: case S3:
85   case S4: case S5: case S6: case S7:
86   case S8: case S9: case S10: case S11:
87   case S12: case S13: case S14: case S15:
88   case S16: case S17: case S18: case S19:
89   case S20: case S21: case S22: case S23:
90   case S24: case S25: case S26: case S27:
91   case S28: case S29: case S30: case S31: {
92     if (isSPVFP)
93       *isSPVFP = true;
94     switch (RegEnum) {
95     default: return 0; // Avoid compile time warning.
96     case S0: return 0;
97     case S1: return 1;
98     case S2: return 2;
99     case S3: return 3;
100     case S4: return 4;
101     case S5: return 5;
102     case S6: return 6;
103     case S7: return 7;
104     case S8: return 8;
105     case S9: return 9;
106     case S10: return 10;
107     case S11: return 11;
108     case S12: return 12;
109     case S13: return 13;
110     case S14: return 14;
111     case S15: return 15;
112     case S16: return 16;
113     case S17: return 17;
114     case S18: return 18;
115     case S19: return 19;
116     case S20: return 20;
117     case S21: return 21;
118     case S22: return 22;
119     case S23: return 23;
120     case S24: return 24;
121     case S25: return 25;
122     case S26: return 26;
123     case S27: return 27;
124     case S28: return 28;
125     case S29: return 29;
126     case S30: return 30;
127     case S31: return 31;
128     }
129   }
130   }
131 }
132
133 ARMBaseRegisterInfo::ARMBaseRegisterInfo(const ARMBaseInstrInfo &tii,
134                                          const ARMSubtarget &sti)
135   : ARMGenRegisterInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
136     TII(tii), STI(sti),
137     FramePtr((STI.isTargetDarwin() || STI.isThumb()) ? ARM::R7 : ARM::R11) {
138 }
139
140 unsigned ARMBaseRegisterInfo::
141 getOpcode(int Op) const {
142   return TII.getOpcode((ARMII::Op)Op);
143 }
144
145 unsigned ARMBaseRegisterInfo::
146 unsignedOffsetOpcodeToSigned(unsigned opcode, unsigned *NumBits) const {
147   return TII.unsignedOffsetOpcodeToSigned(opcode, NumBits);
148 }
149
150 const unsigned*
151 ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
152   static const unsigned CalleeSavedRegs[] = {
153     ARM::LR, ARM::R11, ARM::R10, ARM::R9, ARM::R8,
154     ARM::R7, ARM::R6,  ARM::R5,  ARM::R4,
155
156     ARM::D15, ARM::D14, ARM::D13, ARM::D12,
157     ARM::D11, ARM::D10, ARM::D9,  ARM::D8,
158     0
159   };
160
161   static const unsigned DarwinCalleeSavedRegs[] = {
162     // Darwin ABI deviates from ARM standard ABI. R9 is not a callee-saved
163     // register.
164     ARM::LR,  ARM::R7,  ARM::R6, ARM::R5, ARM::R4,
165     ARM::R11, ARM::R10, ARM::R8,
166
167     ARM::D15, ARM::D14, ARM::D13, ARM::D12,
168     ARM::D11, ARM::D10, ARM::D9,  ARM::D8,
169     0
170   };
171   return STI.isTargetDarwin() ? DarwinCalleeSavedRegs : CalleeSavedRegs;
172 }
173
174 const TargetRegisterClass* const *
175 ARMBaseRegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const {
176   static const TargetRegisterClass * const CalleeSavedRegClasses[] = {
177     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
178     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
179     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
180
181     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
182     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
183     0
184   };
185
186   static const TargetRegisterClass * const ThumbCalleeSavedRegClasses[] = {
187     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
188     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::tGPRRegClass,
189     &ARM::tGPRRegClass,&ARM::tGPRRegClass,&ARM::tGPRRegClass,
190
191     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
192     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
193     0
194   };
195
196   static const TargetRegisterClass * const DarwinCalleeSavedRegClasses[] = {
197     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
198     &ARM::GPRRegClass, &ARM::GPRRegClass, &ARM::GPRRegClass,
199     &ARM::GPRRegClass, &ARM::GPRRegClass,
200
201     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
202     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
203     0
204   };
205
206   static const TargetRegisterClass * const DarwinThumbCalleeSavedRegClasses[] ={
207     &ARM::GPRRegClass,  &ARM::tGPRRegClass, &ARM::tGPRRegClass,
208     &ARM::tGPRRegClass, &ARM::tGPRRegClass, &ARM::GPRRegClass,
209     &ARM::GPRRegClass,  &ARM::GPRRegClass,
210
211     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
212     &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass, &ARM::DPRRegClass,
213     0
214   };
215
216   if (STI.isThumb1Only()) {
217     return STI.isTargetDarwin()
218       ? DarwinThumbCalleeSavedRegClasses : ThumbCalleeSavedRegClasses;
219   }
220   return STI.isTargetDarwin()
221     ? DarwinCalleeSavedRegClasses : CalleeSavedRegClasses;
222 }
223
224 BitVector ARMBaseRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
225   // FIXME: avoid re-calculating this everytime.
226   BitVector Reserved(getNumRegs());
227   Reserved.set(ARM::SP);
228   Reserved.set(ARM::PC);
229   if (STI.isTargetDarwin() || hasFP(MF))
230     Reserved.set(FramePtr);
231   // Some targets reserve R9.
232   if (STI.isR9Reserved())
233     Reserved.set(ARM::R9);
234   return Reserved;
235 }
236
237 bool
238 ARMBaseRegisterInfo::isReservedReg(const MachineFunction &MF, unsigned Reg) const {
239   switch (Reg) {
240   default: break;
241   case ARM::SP:
242   case ARM::PC:
243     return true;
244   case ARM::R7:
245   case ARM::R11:
246     if (FramePtr == Reg && (STI.isTargetDarwin() || hasFP(MF)))
247       return true;
248     break;
249   case ARM::R9:
250     return STI.isR9Reserved();
251   }
252
253   return false;
254 }
255
256 const TargetRegisterClass *ARMBaseRegisterInfo::getPointerRegClass() const {
257   return &ARM::GPRRegClass;
258 }
259
260 /// getAllocationOrder - Returns the register allocation order for a specified
261 /// register class in the form of a pair of TargetRegisterClass iterators.
262 std::pair<TargetRegisterClass::iterator,TargetRegisterClass::iterator>
263 ARMBaseRegisterInfo::getAllocationOrder(const TargetRegisterClass *RC,
264                                         unsigned HintType, unsigned HintReg,
265                                         const MachineFunction &MF) const {
266   // Alternative register allocation orders when favoring even / odd registers
267   // of register pairs.
268
269   // No FP, R9 is available.
270   static const unsigned GPREven1[] = {
271     ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R8, ARM::R10,
272     ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R7,
273     ARM::R9, ARM::R11
274   };
275   static const unsigned GPROdd1[] = {
276     ARM::R1, ARM::R3, ARM::R5, ARM::R7, ARM::R9, ARM::R11,
277     ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6,
278     ARM::R8, ARM::R10
279   };
280
281   // FP is R7, R9 is available.
282   static const unsigned GPREven2[] = {
283     ARM::R0, ARM::R2, ARM::R4,          ARM::R8, ARM::R10,
284     ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R6,
285     ARM::R9, ARM::R11
286   };
287   static const unsigned GPROdd2[] = {
288     ARM::R1, ARM::R3, ARM::R5,          ARM::R9, ARM::R11,
289     ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6,
290     ARM::R8, ARM::R10
291   };
292
293   // FP is R11, R9 is available.
294   static const unsigned GPREven3[] = {
295     ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R8,
296     ARM::R1, ARM::R3, ARM::R10,ARM::R12,ARM::LR, ARM::R5, ARM::R7,
297     ARM::R9
298   };
299   static const unsigned GPROdd3[] = {
300     ARM::R1, ARM::R3, ARM::R5, ARM::R6, ARM::R9,
301     ARM::R0, ARM::R2, ARM::R10,ARM::R12,ARM::LR, ARM::R4, ARM::R7,
302     ARM::R8
303   };
304
305   // No FP, R9 is not available.
306   static const unsigned GPREven4[] = {
307     ARM::R0, ARM::R2, ARM::R4, ARM::R6,          ARM::R10,
308     ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R7, ARM::R8,
309     ARM::R11
310   };
311   static const unsigned GPROdd4[] = {
312     ARM::R1, ARM::R3, ARM::R5, ARM::R7,          ARM::R11,
313     ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8,
314     ARM::R10
315   };
316
317   // FP is R7, R9 is not available.
318   static const unsigned GPREven5[] = {
319     ARM::R0, ARM::R2, ARM::R4,                   ARM::R10,
320     ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R6, ARM::R8,
321     ARM::R11
322   };
323   static const unsigned GPROdd5[] = {
324     ARM::R1, ARM::R3, ARM::R5,                   ARM::R11,
325     ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8,
326     ARM::R10
327   };
328
329   // FP is R11, R9 is not available.
330   static const unsigned GPREven6[] = {
331     ARM::R0, ARM::R2, ARM::R4, ARM::R6,
332     ARM::R1, ARM::R3, ARM::R10,ARM::R12,ARM::LR, ARM::R5, ARM::R7, ARM::R8
333   };
334   static const unsigned GPROdd6[] = {
335     ARM::R1, ARM::R3, ARM::R5, ARM::R7,
336     ARM::R0, ARM::R2, ARM::R10,ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8
337   };
338
339
340   if (HintType == ARMRI::RegPairEven) {
341     if (isPhysicalRegister(HintReg) && getRegisterPairEven(HintReg, MF) == 0)
342       // It's no longer possible to fulfill this hint. Return the default
343       // allocation order.
344       return std::make_pair(RC->allocation_order_begin(MF),
345                             RC->allocation_order_end(MF));
346
347     if (!STI.isTargetDarwin() && !hasFP(MF)) {
348       if (!STI.isR9Reserved())
349         return std::make_pair(GPREven1,
350                               GPREven1 + (sizeof(GPREven1)/sizeof(unsigned)));
351       else
352         return std::make_pair(GPREven4,
353                               GPREven4 + (sizeof(GPREven4)/sizeof(unsigned)));
354     } else if (FramePtr == ARM::R7) {
355       if (!STI.isR9Reserved())
356         return std::make_pair(GPREven2,
357                               GPREven2 + (sizeof(GPREven2)/sizeof(unsigned)));
358       else
359         return std::make_pair(GPREven5,
360                               GPREven5 + (sizeof(GPREven5)/sizeof(unsigned)));
361     } else { // FramePtr == ARM::R11
362       if (!STI.isR9Reserved())
363         return std::make_pair(GPREven3,
364                               GPREven3 + (sizeof(GPREven3)/sizeof(unsigned)));
365       else
366         return std::make_pair(GPREven6,
367                               GPREven6 + (sizeof(GPREven6)/sizeof(unsigned)));
368     }
369   } else if (HintType == ARMRI::RegPairOdd) {
370     if (isPhysicalRegister(HintReg) && getRegisterPairOdd(HintReg, MF) == 0)
371       // It's no longer possible to fulfill this hint. Return the default
372       // allocation order.
373       return std::make_pair(RC->allocation_order_begin(MF),
374                             RC->allocation_order_end(MF));
375
376     if (!STI.isTargetDarwin() && !hasFP(MF)) {
377       if (!STI.isR9Reserved())
378         return std::make_pair(GPROdd1,
379                               GPROdd1 + (sizeof(GPROdd1)/sizeof(unsigned)));
380       else
381         return std::make_pair(GPROdd4,
382                               GPROdd4 + (sizeof(GPROdd4)/sizeof(unsigned)));
383     } else if (FramePtr == ARM::R7) {
384       if (!STI.isR9Reserved())
385         return std::make_pair(GPROdd2,
386                               GPROdd2 + (sizeof(GPROdd2)/sizeof(unsigned)));
387       else
388         return std::make_pair(GPROdd5,
389                               GPROdd5 + (sizeof(GPROdd5)/sizeof(unsigned)));
390     } else { // FramePtr == ARM::R11
391       if (!STI.isR9Reserved())
392         return std::make_pair(GPROdd3,
393                               GPROdd3 + (sizeof(GPROdd3)/sizeof(unsigned)));
394       else
395         return std::make_pair(GPROdd6,
396                               GPROdd6 + (sizeof(GPROdd6)/sizeof(unsigned)));
397     }
398   }
399   return std::make_pair(RC->allocation_order_begin(MF),
400                         RC->allocation_order_end(MF));
401 }
402
403 /// ResolveRegAllocHint - Resolves the specified register allocation hint
404 /// to a physical register. Returns the physical register if it is successful.
405 unsigned
406 ARMBaseRegisterInfo::ResolveRegAllocHint(unsigned Type, unsigned Reg,
407                                          const MachineFunction &MF) const {
408   if (Reg == 0 || !isPhysicalRegister(Reg))
409     return 0;
410   if (Type == 0)
411     return Reg;
412   else if (Type == (unsigned)ARMRI::RegPairOdd)
413     // Odd register.
414     return getRegisterPairOdd(Reg, MF);
415   else if (Type == (unsigned)ARMRI::RegPairEven)
416     // Even register.
417     return getRegisterPairEven(Reg, MF);
418   return 0;
419 }
420
421 void
422 ARMBaseRegisterInfo::UpdateRegAllocHint(unsigned Reg, unsigned NewReg,
423                                         MachineFunction &MF) const {
424   MachineRegisterInfo *MRI = &MF.getRegInfo();
425   std::pair<unsigned, unsigned> Hint = MRI->getRegAllocationHint(Reg);
426   if ((Hint.first == (unsigned)ARMRI::RegPairOdd ||
427        Hint.first == (unsigned)ARMRI::RegPairEven) &&
428       Hint.second && TargetRegisterInfo::isVirtualRegister(Hint.second)) {
429     // If 'Reg' is one of the even / odd register pair and it's now changed
430     // (e.g. coalesced) into a different register. The other register of the
431     // pair allocation hint must be updated to reflect the relationship
432     // change.
433     unsigned OtherReg = Hint.second;
434     Hint = MRI->getRegAllocationHint(OtherReg);
435     if (Hint.second == Reg)
436       // Make sure the pair has not already divorced.
437       MRI->setRegAllocationHint(OtherReg, Hint.first, NewReg);
438   }
439 }
440
441 /// hasFP - Return true if the specified function should have a dedicated frame
442 /// pointer register.  This is true if the function has variable sized allocas
443 /// or if frame pointer elimination is disabled.
444 ///
445 bool ARMBaseRegisterInfo::hasFP(const MachineFunction &MF) const {
446   const MachineFrameInfo *MFI = MF.getFrameInfo();
447   return (NoFramePointerElim ||
448           MFI->hasVarSizedObjects() ||
449           MFI->isFrameAddressTaken());
450 }
451
452 static unsigned estimateStackSize(MachineFunction &MF, MachineFrameInfo *MFI) {
453   const MachineFrameInfo *FFI = MF.getFrameInfo();
454   int Offset = 0;
455   for (int i = FFI->getObjectIndexBegin(); i != 0; ++i) {
456     int FixedOff = -FFI->getObjectOffset(i);
457     if (FixedOff > Offset) Offset = FixedOff;
458   }
459   for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
460     if (FFI->isDeadObjectIndex(i))
461       continue;
462     Offset += FFI->getObjectSize(i);
463     unsigned Align = FFI->getObjectAlignment(i);
464     // Adjust to alignment boundary
465     Offset = (Offset+Align-1)/Align*Align;
466   }
467   return (unsigned)Offset;
468 }
469
470 void
471 ARMBaseRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
472                                                           RegScavenger *RS) const {
473   // This tells PEI to spill the FP as if it is any other callee-save register
474   // to take advantage the eliminateFrameIndex machinery. This also ensures it
475   // is spilled in the order specified by getCalleeSavedRegs() to make it easier
476   // to combine multiple loads / stores.
477   bool CanEliminateFrame = true;
478   bool CS1Spilled = false;
479   bool LRSpilled = false;
480   unsigned NumGPRSpills = 0;
481   SmallVector<unsigned, 4> UnspilledCS1GPRs;
482   SmallVector<unsigned, 4> UnspilledCS2GPRs;
483   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
484
485   // Don't spill FP if the frame can be eliminated. This is determined
486   // by scanning the callee-save registers to see if any is used.
487   const unsigned *CSRegs = getCalleeSavedRegs();
488   const TargetRegisterClass* const *CSRegClasses = getCalleeSavedRegClasses();
489   for (unsigned i = 0; CSRegs[i]; ++i) {
490     unsigned Reg = CSRegs[i];
491     bool Spilled = false;
492     if (MF.getRegInfo().isPhysRegUsed(Reg)) {
493       AFI->setCSRegisterIsSpilled(Reg);
494       Spilled = true;
495       CanEliminateFrame = false;
496     } else {
497       // Check alias registers too.
498       for (const unsigned *Aliases = getAliasSet(Reg); *Aliases; ++Aliases) {
499         if (MF.getRegInfo().isPhysRegUsed(*Aliases)) {
500           Spilled = true;
501           CanEliminateFrame = false;
502         }
503       }
504     }
505
506     if (CSRegClasses[i] == &ARM::GPRRegClass) {
507       if (Spilled) {
508         NumGPRSpills++;
509
510         if (!STI.isTargetDarwin()) {
511           if (Reg == ARM::LR)
512             LRSpilled = true;
513           CS1Spilled = true;
514           continue;
515         }
516
517         // Keep track if LR and any of R4, R5, R6, and R7 is spilled.
518         switch (Reg) {
519         case ARM::LR:
520           LRSpilled = true;
521           // Fallthrough
522         case ARM::R4:
523         case ARM::R5:
524         case ARM::R6:
525         case ARM::R7:
526           CS1Spilled = true;
527           break;
528         default:
529           break;
530         }
531       } else {
532         if (!STI.isTargetDarwin()) {
533           UnspilledCS1GPRs.push_back(Reg);
534           continue;
535         }
536
537         switch (Reg) {
538         case ARM::R4:
539         case ARM::R5:
540         case ARM::R6:
541         case ARM::R7:
542         case ARM::LR:
543           UnspilledCS1GPRs.push_back(Reg);
544           break;
545         default:
546           UnspilledCS2GPRs.push_back(Reg);
547           break;
548         }
549       }
550     }
551   }
552
553   bool ForceLRSpill = false;
554   if (!LRSpilled && AFI->isThumb1OnlyFunction()) {
555     unsigned FnSize = TII.GetFunctionSizeInBytes(MF);
556     // Force LR to be spilled if the Thumb function size is > 2048. This enables
557     // use of BL to implement far jump. If it turns out that it's not needed
558     // then the branch fix up path will undo it.
559     if (FnSize >= (1 << 11)) {
560       CanEliminateFrame = false;
561       ForceLRSpill = true;
562     }
563   }
564
565   bool ExtraCSSpill = false;
566   if (!CanEliminateFrame || hasFP(MF)) {
567     AFI->setHasStackFrame(true);
568
569     // If LR is not spilled, but at least one of R4, R5, R6, and R7 is spilled.
570     // Spill LR as well so we can fold BX_RET to the registers restore (LDM).
571     if (!LRSpilled && CS1Spilled) {
572       MF.getRegInfo().setPhysRegUsed(ARM::LR);
573       AFI->setCSRegisterIsSpilled(ARM::LR);
574       NumGPRSpills++;
575       UnspilledCS1GPRs.erase(std::find(UnspilledCS1GPRs.begin(),
576                                     UnspilledCS1GPRs.end(), (unsigned)ARM::LR));
577       ForceLRSpill = false;
578       ExtraCSSpill = true;
579     }
580
581     // Darwin ABI requires FP to point to the stack slot that contains the
582     // previous FP.
583     if (STI.isTargetDarwin() || hasFP(MF)) {
584       MF.getRegInfo().setPhysRegUsed(FramePtr);
585       NumGPRSpills++;
586     }
587
588     // If stack and double are 8-byte aligned and we are spilling an odd number
589     // of GPRs. Spill one extra callee save GPR so we won't have to pad between
590     // the integer and double callee save areas.
591     unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
592     if (TargetAlign == 8 && (NumGPRSpills & 1)) {
593       if (CS1Spilled && !UnspilledCS1GPRs.empty()) {
594         for (unsigned i = 0, e = UnspilledCS1GPRs.size(); i != e; ++i) {
595           unsigned Reg = UnspilledCS1GPRs[i];
596           // Don't spill high register if the function is thumb1
597           if (!AFI->isThumb1OnlyFunction() ||
598               isARMLowRegister(Reg) || Reg == ARM::LR) {
599             MF.getRegInfo().setPhysRegUsed(Reg);
600             AFI->setCSRegisterIsSpilled(Reg);
601             if (!isReservedReg(MF, Reg))
602               ExtraCSSpill = true;
603             break;
604           }
605         }
606       } else if (!UnspilledCS2GPRs.empty() &&
607                  !AFI->isThumb1OnlyFunction()) {
608         unsigned Reg = UnspilledCS2GPRs.front();
609         MF.getRegInfo().setPhysRegUsed(Reg);
610         AFI->setCSRegisterIsSpilled(Reg);
611         if (!isReservedReg(MF, Reg))
612           ExtraCSSpill = true;
613       }
614     }
615
616     // Estimate if we might need to scavenge a register at some point in order
617     // to materialize a stack offset. If so, either spill one additional
618     // callee-saved register or reserve a special spill slot to facilitate
619     // register scavenging.
620     if (RS && !ExtraCSSpill && !AFI->isThumb1OnlyFunction()) {
621       MachineFrameInfo  *MFI = MF.getFrameInfo();
622       unsigned Size = estimateStackSize(MF, MFI);
623       unsigned Limit = (1 << 12) - 1;
624       for (MachineFunction::iterator BB = MF.begin(),E = MF.end();BB != E; ++BB)
625         for (MachineBasicBlock::iterator I= BB->begin(); I != BB->end(); ++I) {
626           for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
627             if (I->getOperand(i).isFI()) {
628               unsigned Opcode = I->getOpcode();
629               const TargetInstrDesc &Desc = TII.get(Opcode);
630               unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
631               if (AddrMode == ARMII::AddrMode3) {
632                 Limit = (1 << 8) - 1;
633                 goto DoneEstimating;
634               } else if (AddrMode == ARMII::AddrMode5) {
635                 unsigned ThisLimit = ((1 << 8) - 1) * 4;
636                 if (ThisLimit < Limit)
637                   Limit = ThisLimit;
638               }
639             }
640         }
641     DoneEstimating:
642       if (Size >= Limit) {
643         // If any non-reserved CS register isn't spilled, just spill one or two
644         // extra. That should take care of it!
645         unsigned NumExtras = TargetAlign / 4;
646         SmallVector<unsigned, 2> Extras;
647         while (NumExtras && !UnspilledCS1GPRs.empty()) {
648           unsigned Reg = UnspilledCS1GPRs.back();
649           UnspilledCS1GPRs.pop_back();
650           if (!isReservedReg(MF, Reg)) {
651             Extras.push_back(Reg);
652             NumExtras--;
653           }
654         }
655         while (NumExtras && !UnspilledCS2GPRs.empty()) {
656           unsigned Reg = UnspilledCS2GPRs.back();
657           UnspilledCS2GPRs.pop_back();
658           if (!isReservedReg(MF, Reg)) {
659             Extras.push_back(Reg);
660             NumExtras--;
661           }
662         }
663         if (Extras.size() && NumExtras == 0) {
664           for (unsigned i = 0, e = Extras.size(); i != e; ++i) {
665             MF.getRegInfo().setPhysRegUsed(Extras[i]);
666             AFI->setCSRegisterIsSpilled(Extras[i]);
667           }
668         } else {
669           // Reserve a slot closest to SP or frame pointer.
670           const TargetRegisterClass *RC = &ARM::GPRRegClass;
671           RS->setScavengingFrameIndex(MFI->CreateStackObject(RC->getSize(),
672                                                            RC->getAlignment()));
673         }
674       }
675     }
676   }
677
678   if (ForceLRSpill) {
679     MF.getRegInfo().setPhysRegUsed(ARM::LR);
680     AFI->setCSRegisterIsSpilled(ARM::LR);
681     AFI->setLRIsSpilledForFarJump(true);
682   }
683 }
684
685 unsigned ARMBaseRegisterInfo::getRARegister() const {
686   return ARM::LR;
687 }
688
689 unsigned ARMBaseRegisterInfo::getFrameRegister(MachineFunction &MF) const {
690   if (STI.isTargetDarwin() || hasFP(MF))
691     return FramePtr;
692   return ARM::SP;
693 }
694
695 unsigned ARMBaseRegisterInfo::getEHExceptionRegister() const {
696   llvm_unreachable("What is the exception register");
697   return 0;
698 }
699
700 unsigned ARMBaseRegisterInfo::getEHHandlerRegister() const {
701   llvm_unreachable("What is the exception handler register");
702   return 0;
703 }
704
705 int ARMBaseRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
706   return ARMGenRegisterInfo::getDwarfRegNumFull(RegNum, 0);
707 }
708
709 unsigned ARMBaseRegisterInfo::getRegisterPairEven(unsigned Reg,
710                                                const MachineFunction &MF) const {
711   switch (Reg) {
712   default: break;
713   // Return 0 if either register of the pair is a special register.
714   // So no R12, etc.
715   case ARM::R1:
716     return ARM::R0;
717   case ARM::R3:
718     // FIXME!
719     return STI.isThumb1Only() ? 0 : ARM::R2;
720   case ARM::R5:
721     return ARM::R4;
722   case ARM::R7:
723     return isReservedReg(MF, ARM::R7)  ? 0 : ARM::R6;
724   case ARM::R9:
725     return isReservedReg(MF, ARM::R9)  ? 0 :ARM::R8;
726   case ARM::R11:
727     return isReservedReg(MF, ARM::R11) ? 0 : ARM::R10;
728
729   case ARM::S1:
730     return ARM::S0;
731   case ARM::S3:
732     return ARM::S2;
733   case ARM::S5:
734     return ARM::S4;
735   case ARM::S7:
736     return ARM::S6;
737   case ARM::S9:
738     return ARM::S8;
739   case ARM::S11:
740     return ARM::S10;
741   case ARM::S13:
742     return ARM::S12;
743   case ARM::S15:
744     return ARM::S14;
745   case ARM::S17:
746     return ARM::S16;
747   case ARM::S19:
748     return ARM::S18;
749   case ARM::S21:
750     return ARM::S20;
751   case ARM::S23:
752     return ARM::S22;
753   case ARM::S25:
754     return ARM::S24;
755   case ARM::S27:
756     return ARM::S26;
757   case ARM::S29:
758     return ARM::S28;
759   case ARM::S31:
760     return ARM::S30;
761
762   case ARM::D1:
763     return ARM::D0;
764   case ARM::D3:
765     return ARM::D2;
766   case ARM::D5:
767     return ARM::D4;
768   case ARM::D7:
769     return ARM::D6;
770   case ARM::D9:
771     return ARM::D8;
772   case ARM::D11:
773     return ARM::D10;
774   case ARM::D13:
775     return ARM::D12;
776   case ARM::D15:
777     return ARM::D14;
778   case ARM::D17:
779     return ARM::D16;
780   case ARM::D19:
781     return ARM::D18;
782   case ARM::D21:
783     return ARM::D20;
784   case ARM::D23:
785     return ARM::D22;
786   case ARM::D25:
787     return ARM::D24;
788   case ARM::D27:
789     return ARM::D26;
790   case ARM::D29:
791     return ARM::D28;
792   case ARM::D31:
793     return ARM::D30;
794   }
795
796   return 0;
797 }
798
799 unsigned ARMBaseRegisterInfo::getRegisterPairOdd(unsigned Reg,
800                                              const MachineFunction &MF) const {
801   switch (Reg) {
802   default: break;
803   // Return 0 if either register of the pair is a special register.
804   // So no R12, etc.
805   case ARM::R0:
806     return ARM::R1;
807   case ARM::R2:
808     // FIXME!
809     return STI.isThumb1Only() ? 0 : ARM::R3;
810   case ARM::R4:
811     return ARM::R5;
812   case ARM::R6:
813     return isReservedReg(MF, ARM::R7)  ? 0 : ARM::R7;
814   case ARM::R8:
815     return isReservedReg(MF, ARM::R9)  ? 0 :ARM::R9;
816   case ARM::R10:
817     return isReservedReg(MF, ARM::R11) ? 0 : ARM::R11;
818
819   case ARM::S0:
820     return ARM::S1;
821   case ARM::S2:
822     return ARM::S3;
823   case ARM::S4:
824     return ARM::S5;
825   case ARM::S6:
826     return ARM::S7;
827   case ARM::S8:
828     return ARM::S9;
829   case ARM::S10:
830     return ARM::S11;
831   case ARM::S12:
832     return ARM::S13;
833   case ARM::S14:
834     return ARM::S15;
835   case ARM::S16:
836     return ARM::S17;
837   case ARM::S18:
838     return ARM::S19;
839   case ARM::S20:
840     return ARM::S21;
841   case ARM::S22:
842     return ARM::S23;
843   case ARM::S24:
844     return ARM::S25;
845   case ARM::S26:
846     return ARM::S27;
847   case ARM::S28:
848     return ARM::S29;
849   case ARM::S30:
850     return ARM::S31;
851
852   case ARM::D0:
853     return ARM::D1;
854   case ARM::D2:
855     return ARM::D3;
856   case ARM::D4:
857     return ARM::D5;
858   case ARM::D6:
859     return ARM::D7;
860   case ARM::D8:
861     return ARM::D9;
862   case ARM::D10:
863     return ARM::D11;
864   case ARM::D12:
865     return ARM::D13;
866   case ARM::D14:
867     return ARM::D15;
868   case ARM::D16:
869     return ARM::D17;
870   case ARM::D18:
871     return ARM::D19;
872   case ARM::D20:
873     return ARM::D21;
874   case ARM::D22:
875     return ARM::D23;
876   case ARM::D24:
877     return ARM::D25;
878   case ARM::D26:
879     return ARM::D27;
880   case ARM::D28:
881     return ARM::D29;
882   case ARM::D30:
883     return ARM::D31;
884   }
885
886   return 0;
887 }
888
889 // FIXME: Dup in ARMBaseInstrInfo.cpp
890 static inline
891 const MachineInstrBuilder &AddDefaultPred(const MachineInstrBuilder &MIB) {
892   return MIB.addImm((int64_t)ARMCC::AL).addReg(0);
893 }
894
895 static inline
896 const MachineInstrBuilder &AddDefaultCC(const MachineInstrBuilder &MIB) {
897   return MIB.addReg(0);
898 }
899
900 /// emitLoadConstPool - Emits a load from constpool to materialize the
901 /// specified immediate.
902 void ARMBaseRegisterInfo::
903 emitLoadConstPool(MachineBasicBlock &MBB,
904                   MachineBasicBlock::iterator &MBBI,
905                   DebugLoc dl,
906                   unsigned DestReg, unsigned SubIdx, int Val,
907                   ARMCC::CondCodes Pred,
908                   unsigned PredReg) const {
909   MachineFunction &MF = *MBB.getParent();
910   MachineConstantPool *ConstantPool = MF.getConstantPool();
911   Constant *C =
912              MF.getFunction()->getContext().getConstantInt(Type::Int32Ty, Val);
913   unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4);
914
915   BuildMI(MBB, MBBI, dl, TII.get(ARM::LDRcp))
916     .addReg(DestReg, getDefRegState(true), SubIdx)
917     .addConstantPoolIndex(Idx)
918     .addReg(0).addImm(0).addImm(Pred).addReg(PredReg);
919 }
920
921 bool ARMBaseRegisterInfo::
922 requiresRegisterScavenging(const MachineFunction &MF) const {
923   return true;
924 }
925
926 // hasReservedCallFrame - Under normal circumstances, when a frame pointer is
927 // not required, we reserve argument space for call sites in the function
928 // immediately on entry to the current function. This eliminates the need for
929 // add/sub sp brackets around call sites. Returns true if the call frame is
930 // included as part of the stack frame.
931 bool ARMBaseRegisterInfo::
932 hasReservedCallFrame(MachineFunction &MF) const {
933   const MachineFrameInfo *FFI = MF.getFrameInfo();
934   unsigned CFSize = FFI->getMaxCallFrameSize();
935   // It's not always a good idea to include the call frame as part of the
936   // stack frame. ARM (especially Thumb) has small immediate offset to
937   // address the stack frame. So a large call frame can cause poor codegen
938   // and may even makes it impossible to scavenge a register.
939   if (CFSize >= ((1 << 12) - 1) / 2)  // Half of imm12
940     return false;
941
942   return !MF.getFrameInfo()->hasVarSizedObjects();
943 }
944
945 /// emitARMRegPlusImmediate - Emits a series of instructions to materialize
946 /// a destreg = basereg + immediate in ARM code.
947 static
948 void emitARMRegPlusImmediate(MachineBasicBlock &MBB,
949                              MachineBasicBlock::iterator &MBBI,
950                              unsigned DestReg, unsigned BaseReg, int NumBytes,
951                              ARMCC::CondCodes Pred, unsigned PredReg,
952                              const ARMBaseInstrInfo &TII,
953                              DebugLoc dl) {
954   bool isSub = NumBytes < 0;
955   if (isSub) NumBytes = -NumBytes;
956
957   while (NumBytes) {
958     unsigned RotAmt = ARM_AM::getSOImmValRotate(NumBytes);
959     unsigned ThisVal = NumBytes & ARM_AM::rotr32(0xFF, RotAmt);
960     assert(ThisVal && "Didn't extract field correctly");
961
962     // We will handle these bits from offset, clear them.
963     NumBytes &= ~ThisVal;
964
965     assert(ARM_AM::getSOImmVal(ThisVal) != -1 && "Bit extraction didn't work?");
966
967     // Build the new ADD / SUB.
968     BuildMI(MBB, MBBI, dl, TII.get(TII.getOpcode(isSub ? ARMII::SUBri : ARMII::ADDri)), DestReg)
969       .addReg(BaseReg, RegState::Kill).addImm(ThisVal)
970       .addImm((unsigned)Pred).addReg(PredReg).addReg(0);
971     BaseReg = DestReg;
972   }
973 }
974
975 static void
976 emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
977              const ARMBaseInstrInfo &TII, DebugLoc dl,
978              int NumBytes,
979              ARMCC::CondCodes Pred = ARMCC::AL, unsigned PredReg = 0) {
980   emitARMRegPlusImmediate(MBB, MBBI, ARM::SP, ARM::SP, NumBytes,
981                           Pred, PredReg, TII, dl);
982 }
983
984 void ARMBaseRegisterInfo::
985 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
986                               MachineBasicBlock::iterator I) const {
987   if (!hasReservedCallFrame(MF)) {
988     // If we have alloca, convert as follows:
989     // ADJCALLSTACKDOWN -> sub, sp, sp, amount
990     // ADJCALLSTACKUP   -> add, sp, sp, amount
991     MachineInstr *Old = I;
992     DebugLoc dl = Old->getDebugLoc();
993     unsigned Amount = Old->getOperand(0).getImm();
994     if (Amount != 0) {
995       // We need to keep the stack aligned properly.  To do this, we round the
996       // amount of space needed for the outgoing arguments up to the next
997       // alignment boundary.
998       unsigned Align = MF.getTarget().getFrameInfo()->getStackAlignment();
999       Amount = (Amount+Align-1)/Align*Align;
1000
1001       // Replace the pseudo instruction with a new instruction...
1002       unsigned Opc = Old->getOpcode();
1003       ARMCC::CondCodes Pred = (ARMCC::CondCodes)Old->getOperand(1).getImm();
1004       if (Opc == ARM::ADJCALLSTACKDOWN || Opc == ARM::tADJCALLSTACKDOWN) {
1005         // Note: PredReg is operand 2 for ADJCALLSTACKDOWN.
1006         unsigned PredReg = Old->getOperand(2).getReg();
1007         emitSPUpdate(MBB, I, TII, dl, -Amount, Pred, PredReg);
1008       } else {
1009         // Note: PredReg is operand 3 for ADJCALLSTACKUP.
1010         unsigned PredReg = Old->getOperand(3).getReg();
1011         assert(Opc == ARM::ADJCALLSTACKUP || Opc == ARM::tADJCALLSTACKUP);
1012         emitSPUpdate(MBB, I, TII, dl, Amount, Pred, PredReg);
1013       }
1014     }
1015   }
1016   MBB.erase(I);
1017 }
1018
1019 /// findScratchRegister - Find a 'free' ARM register. If register scavenger
1020 /// is not being used, R12 is available. Otherwise, try for a call-clobbered
1021 /// register first and then a spilled callee-saved register if that fails.
1022 static
1023 unsigned findScratchRegister(RegScavenger *RS, const TargetRegisterClass *RC,
1024                              ARMFunctionInfo *AFI) {
1025   unsigned Reg = RS ? RS->FindUnusedReg(RC, true) : (unsigned) ARM::R12;
1026   assert (!AFI->isThumb1OnlyFunction());
1027   if (Reg == 0)
1028     // Try a already spilled CS register.
1029     Reg = RS->FindUnusedReg(RC, AFI->getSpilledCSRegisters());
1030
1031   return Reg;
1032 }
1033
1034 void ARMBaseRegisterInfo::
1035 eliminateFrameIndex(MachineBasicBlock::iterator II,
1036                     int SPAdj, RegScavenger *RS) const{
1037   unsigned i = 0;
1038   MachineInstr &MI = *II;
1039   MachineBasicBlock &MBB = *MI.getParent();
1040   MachineFunction &MF = *MBB.getParent();
1041   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
1042   DebugLoc dl = MI.getDebugLoc();
1043
1044   while (!MI.getOperand(i).isFI()) {
1045     ++i;
1046     assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
1047   }
1048
1049   unsigned FrameReg = ARM::SP;
1050   int FrameIndex = MI.getOperand(i).getIndex();
1051   int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) +
1052                MF.getFrameInfo()->getStackSize() + SPAdj;
1053
1054   if (AFI->isGPRCalleeSavedArea1Frame(FrameIndex))
1055     Offset -= AFI->getGPRCalleeSavedArea1Offset();
1056   else if (AFI->isGPRCalleeSavedArea2Frame(FrameIndex))
1057     Offset -= AFI->getGPRCalleeSavedArea2Offset();
1058   else if (AFI->isDPRCalleeSavedAreaFrame(FrameIndex))
1059     Offset -= AFI->getDPRCalleeSavedAreaOffset();
1060   else if (hasFP(MF)) {
1061     assert(SPAdj == 0 && "Unexpected");
1062     // There is alloca()'s in this function, must reference off the frame
1063     // pointer instead.
1064     FrameReg = getFrameRegister(MF);
1065     Offset -= AFI->getFramePtrSpillOffset();
1066   }
1067
1068   unsigned Opcode = MI.getOpcode();
1069   const TargetInstrDesc &Desc = MI.getDesc();
1070   unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
1071   bool isSub = false;
1072
1073   // Memory operands in inline assembly always use AddrMode2.
1074   if (Opcode == ARM::INLINEASM)
1075     AddrMode = ARMII::AddrMode2;
1076
1077   if (Opcode == getOpcode(ARMII::ADDri)) {
1078     Offset += MI.getOperand(i+1).getImm();
1079     if (Offset == 0) {
1080       // Turn it into a move.
1081       MI.setDesc(TII.get(getOpcode(ARMII::MOVr)));
1082       MI.getOperand(i).ChangeToRegister(FrameReg, false);
1083       MI.RemoveOperand(i+1);
1084       return;
1085     } else if (Offset < 0) {
1086       Offset = -Offset;
1087       isSub = true;
1088       MI.setDesc(TII.get(getOpcode(ARMII::SUBri)));
1089     }
1090
1091     // Common case: small offset, fits into instruction.
1092     if (ARM_AM::getSOImmVal(Offset) != -1) {
1093       // Replace the FrameIndex with sp / fp
1094       MI.getOperand(i).ChangeToRegister(FrameReg, false);
1095       MI.getOperand(i+1).ChangeToImmediate(Offset);
1096       return;
1097     }
1098
1099     // Otherwise, we fallback to common code below to form the imm offset with
1100     // a sequence of ADDri instructions.  First though, pull as much of the imm
1101     // into this ADDri as possible.
1102     unsigned RotAmt = ARM_AM::getSOImmValRotate(Offset);
1103     unsigned ThisImmVal = Offset & ARM_AM::rotr32(0xFF, RotAmt);
1104
1105     // We will handle these bits from offset, clear them.
1106     Offset &= ~ThisImmVal;
1107
1108     // Get the properly encoded SOImmVal field.
1109     assert(ARM_AM::getSOImmVal(ThisImmVal) != -1 &&
1110            "Bit extraction didn't work?");
1111     MI.getOperand(i+1).ChangeToImmediate(ThisImmVal);
1112   } else {
1113     unsigned ImmIdx = 0;
1114     int InstrOffs = 0;
1115     unsigned NumBits = 0;
1116     unsigned Scale = 1;
1117     bool encodedOffset = true;
1118     bool HandlesNeg = true;
1119     switch (AddrMode) {
1120     case ARMII::AddrMode2: {
1121       ImmIdx = i+2;
1122       InstrOffs = ARM_AM::getAM2Offset(MI.getOperand(ImmIdx).getImm());
1123       if (ARM_AM::getAM2Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub)
1124         InstrOffs *= -1;
1125       NumBits = 12;
1126       break;
1127     }
1128     case ARMII::AddrMode3: {
1129       ImmIdx = i+2;
1130       InstrOffs = ARM_AM::getAM3Offset(MI.getOperand(ImmIdx).getImm());
1131       if (ARM_AM::getAM3Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub)
1132         InstrOffs *= -1;
1133       NumBits = 8;
1134       break;
1135     }
1136     case ARMII::AddrMode5: {
1137       ImmIdx = i+1;
1138       InstrOffs = ARM_AM::getAM5Offset(MI.getOperand(ImmIdx).getImm());
1139       if (ARM_AM::getAM5Op(MI.getOperand(ImmIdx).getImm()) == ARM_AM::sub)
1140         InstrOffs *= -1;
1141       NumBits = 8;
1142       Scale = 4;
1143       break;
1144     }
1145     case ARMII::AddrModeT2_i12: {
1146       ImmIdx = i+1;
1147       InstrOffs = MI.getOperand(ImmIdx).getImm();
1148       NumBits = 12;
1149       encodedOffset = false;
1150       HandlesNeg = false;
1151       break;
1152     }
1153     case ARMII::AddrModeT2_i8: {
1154       ImmIdx = i+1;
1155       InstrOffs = MI.getOperand(ImmIdx).getImm();
1156       NumBits = 8;
1157       encodedOffset = false;
1158       break;
1159     }
1160     case ARMII::AddrModeT2_so: {
1161       ImmIdx = i+2;
1162       InstrOffs = MI.getOperand(ImmIdx).getImm();
1163       encodedOffset = false;
1164       break;
1165     }
1166     default:
1167       llvm_unreachable("Unsupported addressing mode!");
1168       break;
1169     }
1170
1171     Offset += InstrOffs * Scale;
1172     assert((Offset & (Scale-1)) == 0 && "Can't encode this offset!");
1173     if (Offset < 0) {
1174       // For addrmodes that cannot handle negative offsets, convert to
1175       // an opcode that can, or set NumBits == 0 to avoid folding
1176       // address computation
1177       if (!HandlesNeg) {
1178         unsigned usop = unsignedOffsetOpcodeToSigned(Opcode, &NumBits);
1179         if (usop != 0) {
1180           MI.setDesc(TII.get(usop));
1181           HandlesNeg = true;
1182           Opcode = usop;
1183         }
1184         else {
1185           NumBits = 0;
1186         }
1187       }
1188
1189       Offset = -Offset;
1190       isSub = true;
1191     }
1192
1193     // Attempt to fold address comp. if opcode has offset bits
1194     if (NumBits > 0) {
1195       // Common case: small offset, fits into instruction.
1196       MachineOperand &ImmOp = MI.getOperand(ImmIdx);
1197       int ImmedOffset = Offset / Scale;
1198       unsigned Mask = (1 << NumBits) - 1;
1199       if ((unsigned)Offset <= Mask * Scale) {
1200         // Replace the FrameIndex with sp
1201         MI.getOperand(i).ChangeToRegister(FrameReg, false);
1202         if (isSub) {
1203           if (encodedOffset)
1204             ImmedOffset |= 1 << NumBits;
1205           else
1206             ImmedOffset = -ImmedOffset;
1207         }
1208         ImmOp.ChangeToImmediate(ImmedOffset);
1209         return;
1210       }
1211       
1212       // Otherwise, it didn't fit. Pull in what we can to simplify the immed.
1213       ImmedOffset = ImmedOffset & Mask;
1214       if (isSub) {
1215           if (encodedOffset)
1216             ImmedOffset |= 1 << NumBits;
1217           else
1218             ImmedOffset = -ImmedOffset;
1219       }
1220       ImmOp.ChangeToImmediate(ImmedOffset);
1221       Offset &= ~(Mask*Scale);
1222     }
1223   }
1224
1225   // If we get here, the immediate doesn't fit into the instruction.  We folded
1226   // as much as possible above, handle the rest, providing a register that is
1227   // SP+LargeImm.
1228   assert(Offset && "This code isn't needed if offset already handled!");
1229
1230   // Insert a set of r12 with the full address: r12 = sp + offset
1231   // If the offset we have is too large to fit into the instruction, we need
1232   // to form it with a series of ADDri's.  Do this by taking 8-bit chunks
1233   // out of 'Offset'.
1234   unsigned ScratchReg = findScratchRegister(RS, &ARM::GPRRegClass, AFI);
1235   if (ScratchReg == 0)
1236     // No register is "free". Scavenge a register.
1237     ScratchReg = RS->scavengeRegister(&ARM::GPRRegClass, II, SPAdj);
1238   int PIdx = MI.findFirstPredOperandIdx();
1239   ARMCC::CondCodes Pred = (PIdx == -1)
1240     ? ARMCC::AL : (ARMCC::CondCodes)MI.getOperand(PIdx).getImm();
1241   unsigned PredReg = (PIdx == -1) ? 0 : MI.getOperand(PIdx+1).getReg();
1242   emitARMRegPlusImmediate(MBB, II, ScratchReg, FrameReg,
1243                           isSub ? -Offset : Offset, Pred, PredReg, TII, dl);
1244   MI.getOperand(i).ChangeToRegister(ScratchReg, false, false, true);
1245 }
1246
1247 /// Move iterator pass the next bunch of callee save load / store ops for
1248 /// the particular spill area (1: integer area 1, 2: integer area 2,
1249 /// 3: fp area, 0: don't care).
1250 static void movePastCSLoadStoreOps(MachineBasicBlock &MBB,
1251                                    MachineBasicBlock::iterator &MBBI,
1252                                    int Opc, unsigned Area,
1253                                    const ARMSubtarget &STI) {
1254   while (MBBI != MBB.end() &&
1255          MBBI->getOpcode() == Opc && MBBI->getOperand(1).isFI()) {
1256     if (Area != 0) {
1257       bool Done = false;
1258       unsigned Category = 0;
1259       switch (MBBI->getOperand(0).getReg()) {
1260       case ARM::R4:  case ARM::R5:  case ARM::R6: case ARM::R7:
1261       case ARM::LR:
1262         Category = 1;
1263         break;
1264       case ARM::R8:  case ARM::R9:  case ARM::R10: case ARM::R11:
1265         Category = STI.isTargetDarwin() ? 2 : 1;
1266         break;
1267       case ARM::D8:  case ARM::D9:  case ARM::D10: case ARM::D11:
1268       case ARM::D12: case ARM::D13: case ARM::D14: case ARM::D15:
1269         Category = 3;
1270         break;
1271       default:
1272         Done = true;
1273         break;
1274       }
1275       if (Done || Category != Area)
1276         break;
1277     }
1278
1279     ++MBBI;
1280   }
1281 }
1282
1283 void ARMBaseRegisterInfo::
1284 emitPrologue(MachineFunction &MF) const {
1285   MachineBasicBlock &MBB = MF.front();
1286   MachineBasicBlock::iterator MBBI = MBB.begin();
1287   MachineFrameInfo  *MFI = MF.getFrameInfo();
1288   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
1289   unsigned VARegSaveSize = AFI->getVarArgsRegSaveSize();
1290   unsigned NumBytes = MFI->getStackSize();
1291   const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
1292   DebugLoc dl = (MBBI != MBB.end() ?
1293                  MBBI->getDebugLoc() : DebugLoc::getUnknownLoc());
1294
1295   // Determine the sizes of each callee-save spill areas and record which frame
1296   // belongs to which callee-save spill areas.
1297   unsigned GPRCS1Size = 0, GPRCS2Size = 0, DPRCSSize = 0;
1298   int FramePtrSpillFI = 0;
1299
1300   if (VARegSaveSize)
1301     emitSPUpdate(MBB, MBBI, TII, dl, -VARegSaveSize);
1302
1303   if (!AFI->hasStackFrame()) {
1304     if (NumBytes != 0)
1305       emitSPUpdate(MBB, MBBI, TII, dl, -NumBytes);
1306     return;
1307   }
1308
1309   for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1310     unsigned Reg = CSI[i].getReg();
1311     int FI = CSI[i].getFrameIdx();
1312     switch (Reg) {
1313     case ARM::R4:
1314     case ARM::R5:
1315     case ARM::R6:
1316     case ARM::R7:
1317     case ARM::LR:
1318       if (Reg == FramePtr)
1319         FramePtrSpillFI = FI;
1320       AFI->addGPRCalleeSavedArea1Frame(FI);
1321       GPRCS1Size += 4;
1322       break;
1323     case ARM::R8:
1324     case ARM::R9:
1325     case ARM::R10:
1326     case ARM::R11:
1327       if (Reg == FramePtr)
1328         FramePtrSpillFI = FI;
1329       if (STI.isTargetDarwin()) {
1330         AFI->addGPRCalleeSavedArea2Frame(FI);
1331         GPRCS2Size += 4;
1332       } else {
1333         AFI->addGPRCalleeSavedArea1Frame(FI);
1334         GPRCS1Size += 4;
1335       }
1336       break;
1337     default:
1338       AFI->addDPRCalleeSavedAreaFrame(FI);
1339       DPRCSSize += 8;
1340     }
1341   }
1342
1343   // Build the new SUBri to adjust SP for integer callee-save spill area 1.
1344   emitSPUpdate(MBB, MBBI, TII, dl, -GPRCS1Size);
1345   movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::STR), 1, STI);
1346
1347   // Darwin ABI requires FP to point to the stack slot that contains the
1348   // previous FP.
1349   if (STI.isTargetDarwin() || hasFP(MF)) {
1350     MachineInstrBuilder MIB =
1351       BuildMI(MBB, MBBI, dl, TII.get(getOpcode(ARMII::ADDri)), FramePtr)
1352       .addFrameIndex(FramePtrSpillFI).addImm(0);
1353     AddDefaultCC(AddDefaultPred(MIB));
1354   }
1355
1356   // Build the new SUBri to adjust SP for integer callee-save spill area 2.
1357   emitSPUpdate(MBB, MBBI, TII, dl, -GPRCS2Size);
1358
1359   // Build the new SUBri to adjust SP for FP callee-save spill area.
1360   movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::STR), 2, STI);
1361   emitSPUpdate(MBB, MBBI, TII, dl, -DPRCSSize);
1362
1363   // Determine starting offsets of spill areas.
1364   unsigned DPRCSOffset  = NumBytes - (GPRCS1Size + GPRCS2Size + DPRCSSize);
1365   unsigned GPRCS2Offset = DPRCSOffset + DPRCSSize;
1366   unsigned GPRCS1Offset = GPRCS2Offset + GPRCS2Size;
1367   AFI->setFramePtrSpillOffset(MFI->getObjectOffset(FramePtrSpillFI) + NumBytes);
1368   AFI->setGPRCalleeSavedArea1Offset(GPRCS1Offset);
1369   AFI->setGPRCalleeSavedArea2Offset(GPRCS2Offset);
1370   AFI->setDPRCalleeSavedAreaOffset(DPRCSOffset);
1371
1372   NumBytes = DPRCSOffset;
1373   if (NumBytes) {
1374     // Insert it after all the callee-save spills.
1375     movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::FSTD), 3, STI);
1376     emitSPUpdate(MBB, MBBI, TII, dl, -NumBytes);
1377   }
1378
1379   if (STI.isTargetELF() && hasFP(MF)) {
1380     MFI->setOffsetAdjustment(MFI->getOffsetAdjustment() -
1381                              AFI->getFramePtrSpillOffset());
1382   }
1383
1384   AFI->setGPRCalleeSavedArea1Size(GPRCS1Size);
1385   AFI->setGPRCalleeSavedArea2Size(GPRCS2Size);
1386   AFI->setDPRCalleeSavedAreaSize(DPRCSSize);
1387 }
1388
1389 static bool isCalleeSavedRegister(unsigned Reg, const unsigned *CSRegs) {
1390   for (unsigned i = 0; CSRegs[i]; ++i)
1391     if (Reg == CSRegs[i])
1392       return true;
1393   return false;
1394 }
1395
1396 static bool isCSRestore(MachineInstr *MI,
1397                         const ARMBaseInstrInfo &TII, 
1398                         const unsigned *CSRegs) {
1399   return ((MI->getOpcode() == (int)TII.getOpcode(ARMII::FLDD) ||
1400            MI->getOpcode() == (int)TII.getOpcode(ARMII::LDR)) &&
1401           MI->getOperand(1).isFI() &&
1402           isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs));
1403 }
1404
1405 void ARMBaseRegisterInfo::
1406 emitEpilogue(MachineFunction &MF,
1407              MachineBasicBlock &MBB) const {
1408   MachineBasicBlock::iterator MBBI = prior(MBB.end());
1409   assert(MBBI->getOpcode() == (int)getOpcode(ARMII::BX_RET) &&
1410          "Can only insert epilog into returning blocks");
1411   DebugLoc dl = MBBI->getDebugLoc();
1412   MachineFrameInfo *MFI = MF.getFrameInfo();
1413   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
1414   unsigned VARegSaveSize = AFI->getVarArgsRegSaveSize();
1415   int NumBytes = (int)MFI->getStackSize();
1416
1417   if (!AFI->hasStackFrame()) {
1418     if (NumBytes != 0)
1419       emitSPUpdate(MBB, MBBI, TII, dl, NumBytes);
1420   } else {
1421     // Unwind MBBI to point to first LDR / FLDD.
1422     const unsigned *CSRegs = getCalleeSavedRegs();
1423     if (MBBI != MBB.begin()) {
1424       do
1425         --MBBI;
1426       while (MBBI != MBB.begin() && isCSRestore(MBBI, TII, CSRegs));
1427       if (!isCSRestore(MBBI, TII, CSRegs))
1428         ++MBBI;
1429     }
1430
1431     // Move SP to start of FP callee save spill area.
1432     NumBytes -= (AFI->getGPRCalleeSavedArea1Size() +
1433                  AFI->getGPRCalleeSavedArea2Size() +
1434                  AFI->getDPRCalleeSavedAreaSize());
1435
1436     // Darwin ABI requires FP to point to the stack slot that contains the
1437     // previous FP.
1438     if ((STI.isTargetDarwin() && NumBytes) || hasFP(MF)) {
1439       NumBytes = AFI->getFramePtrSpillOffset() - NumBytes;
1440       // Reset SP based on frame pointer only if the stack frame extends beyond
1441       // frame pointer stack slot or target is ELF and the function has FP.
1442       if (AFI->getGPRCalleeSavedArea2Size() ||
1443           AFI->getDPRCalleeSavedAreaSize()  ||
1444           AFI->getDPRCalleeSavedAreaOffset()||
1445           hasFP(MF)) {
1446         if (NumBytes)
1447           BuildMI(MBB, MBBI, dl, TII.get(getOpcode(ARMII::SUBri)), ARM::SP)
1448             .addReg(FramePtr)
1449             .addImm(NumBytes)
1450             .addImm((unsigned)ARMCC::AL).addReg(0).addReg(0);
1451         else
1452           BuildMI(MBB, MBBI, dl, TII.get(getOpcode(ARMII::MOVr)), ARM::SP)
1453             .addReg(FramePtr)
1454             .addImm((unsigned)ARMCC::AL).addReg(0).addReg(0);
1455       }
1456     } else if (NumBytes) {
1457       emitSPUpdate(MBB, MBBI, TII, dl, NumBytes);
1458     }
1459
1460     // Move SP to start of integer callee save spill area 2.
1461     movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::FLDD), 3, STI);
1462     emitSPUpdate(MBB, MBBI, TII, dl, AFI->getDPRCalleeSavedAreaSize());
1463
1464     // Move SP to start of integer callee save spill area 1.
1465     movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::LDR), 2, STI);
1466     emitSPUpdate(MBB, MBBI, TII, dl, AFI->getGPRCalleeSavedArea2Size());
1467
1468     // Move SP to SP upon entry to the function.
1469     movePastCSLoadStoreOps(MBB, MBBI, getOpcode(ARMII::LDR), 1, STI);
1470     emitSPUpdate(MBB, MBBI, TII, dl, AFI->getGPRCalleeSavedArea1Size());
1471   }
1472
1473   if (VARegSaveSize)
1474     emitSPUpdate(MBB, MBBI, TII, dl, VARegSaveSize);
1475
1476 }
1477
1478 #include "ARMGenRegisterInfo.inc"