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