ARMBaseRegisterInfo.cpp revision d5b03f252c0db6b49a242abab63d7c5a260fceae
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 "ARMFrameLowering.h"
19#include "ARMInstrInfo.h"
20#include "ARMMachineFunctionInfo.h"
21#include "ARMSubtarget.h"
22#include "llvm/Constants.h"
23#include "llvm/DerivedTypes.h"
24#include "llvm/Function.h"
25#include "llvm/LLVMContext.h"
26#include "llvm/CodeGen/MachineConstantPool.h"
27#include "llvm/CodeGen/MachineFrameInfo.h"
28#include "llvm/CodeGen/MachineFunction.h"
29#include "llvm/CodeGen/MachineInstrBuilder.h"
30#include "llvm/CodeGen/MachineLocation.h"
31#include "llvm/CodeGen/MachineRegisterInfo.h"
32#include "llvm/CodeGen/RegisterScavenging.h"
33#include "llvm/Support/Debug.h"
34#include "llvm/Support/ErrorHandling.h"
35#include "llvm/Support/raw_ostream.h"
36#include "llvm/Target/TargetFrameLowering.h"
37#include "llvm/Target/TargetMachine.h"
38#include "llvm/Target/TargetOptions.h"
39#include "llvm/ADT/BitVector.h"
40#include "llvm/ADT/SmallVector.h"
41#include "llvm/Support/CommandLine.h"
42
43#define GET_REGINFO_MC_DESC
44#define GET_REGINFO_TARGET_DESC
45#include "ARMGenRegisterInfo.inc"
46
47using namespace llvm;
48
49static cl::opt<bool>
50ForceAllBaseRegAlloc("arm-force-base-reg-alloc", cl::Hidden, cl::init(false),
51          cl::desc("Force use of virtual base registers for stack load/store"));
52static cl::opt<bool>
53EnableLocalStackAlloc("enable-local-stack-alloc", cl::init(true), cl::Hidden,
54          cl::desc("Enable pre-regalloc stack frame index allocation"));
55static cl::opt<bool>
56EnableBasePointer("arm-use-base-pointer", cl::Hidden, cl::init(true),
57          cl::desc("Enable use of a base pointer for complex stack frames"));
58
59ARMBaseRegisterInfo::ARMBaseRegisterInfo(const ARMBaseInstrInfo &tii,
60                                         const ARMSubtarget &sti)
61  : ARMGenRegisterInfo(), TII(tii), STI(sti),
62    FramePtr((STI.isTargetDarwin() || STI.isThumb()) ? ARM::R7 : ARM::R11),
63    BasePtr(ARM::R6) {
64}
65
66const unsigned*
67ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
68  static const unsigned CalleeSavedRegs[] = {
69    ARM::LR, ARM::R11, ARM::R10, ARM::R9, ARM::R8,
70    ARM::R7, ARM::R6,  ARM::R5,  ARM::R4,
71
72    ARM::D15, ARM::D14, ARM::D13, ARM::D12,
73    ARM::D11, ARM::D10, ARM::D9,  ARM::D8,
74    0
75  };
76
77  static const unsigned DarwinCalleeSavedRegs[] = {
78    // Darwin ABI deviates from ARM standard ABI. R9 is not a callee-saved
79    // register.
80    ARM::LR,  ARM::R7,  ARM::R6, ARM::R5, ARM::R4,
81    ARM::R11, ARM::R10, ARM::R8,
82
83    ARM::D15, ARM::D14, ARM::D13, ARM::D12,
84    ARM::D11, ARM::D10, ARM::D9,  ARM::D8,
85    0
86  };
87  return STI.isTargetDarwin() ? DarwinCalleeSavedRegs : CalleeSavedRegs;
88}
89
90BitVector ARMBaseRegisterInfo::
91getReservedRegs(const MachineFunction &MF) const {
92  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
93
94  // FIXME: avoid re-calculating this every time.
95  BitVector Reserved(getNumRegs());
96  Reserved.set(ARM::SP);
97  Reserved.set(ARM::PC);
98  Reserved.set(ARM::FPSCR);
99  if (TFI->hasFP(MF))
100    Reserved.set(FramePtr);
101  if (hasBasePointer(MF))
102    Reserved.set(BasePtr);
103  // Some targets reserve R9.
104  if (STI.isR9Reserved())
105    Reserved.set(ARM::R9);
106  // Reserve D16-D31 if the subtarget doesn't support them.
107  if (!STI.hasVFP3() || STI.hasD16()) {
108    assert(ARM::D31 == ARM::D16 + 15);
109    for (unsigned i = 0; i != 16; ++i)
110      Reserved.set(ARM::D16 + i);
111  }
112  return Reserved;
113}
114
115bool ARMBaseRegisterInfo::isReservedReg(const MachineFunction &MF,
116                                        unsigned Reg) const {
117  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
118
119  switch (Reg) {
120  default: break;
121  case ARM::SP:
122  case ARM::PC:
123    return true;
124  case ARM::R6:
125    if (hasBasePointer(MF))
126      return true;
127    break;
128  case ARM::R7:
129  case ARM::R11:
130    if (FramePtr == Reg && TFI->hasFP(MF))
131      return true;
132    break;
133  case ARM::R9:
134    return STI.isR9Reserved();
135  }
136
137  return false;
138}
139
140const TargetRegisterClass *
141ARMBaseRegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A,
142                                              const TargetRegisterClass *B,
143                                              unsigned SubIdx) const {
144  switch (SubIdx) {
145  default: return 0;
146  case ARM::ssub_0:
147  case ARM::ssub_1:
148  case ARM::ssub_2:
149  case ARM::ssub_3: {
150    // S sub-registers.
151    if (A->getSize() == 8) {
152      if (B == &ARM::SPR_8RegClass)
153        return &ARM::DPR_8RegClass;
154      assert(B == &ARM::SPRRegClass && "Expecting SPR register class!");
155      if (A == &ARM::DPR_8RegClass)
156        return A;
157      return &ARM::DPR_VFP2RegClass;
158    }
159
160    if (A->getSize() == 16) {
161      if (B == &ARM::SPR_8RegClass)
162        return &ARM::QPR_8RegClass;
163      return &ARM::QPR_VFP2RegClass;
164    }
165
166    if (A->getSize() == 32) {
167      if (B == &ARM::SPR_8RegClass)
168        return 0;  // Do not allow coalescing!
169      return &ARM::QQPR_VFP2RegClass;
170    }
171
172    assert(A->getSize() == 64 && "Expecting a QQQQ register class!");
173    return 0;  // Do not allow coalescing!
174  }
175  case ARM::dsub_0:
176  case ARM::dsub_1:
177  case ARM::dsub_2:
178  case ARM::dsub_3: {
179    // D sub-registers.
180    if (A->getSize() == 16) {
181      if (B == &ARM::DPR_VFP2RegClass)
182        return &ARM::QPR_VFP2RegClass;
183      if (B == &ARM::DPR_8RegClass)
184        return 0;  // Do not allow coalescing!
185      return A;
186    }
187
188    if (A->getSize() == 32) {
189      if (B == &ARM::DPR_VFP2RegClass)
190        return &ARM::QQPR_VFP2RegClass;
191      if (B == &ARM::DPR_8RegClass)
192        return 0;  // Do not allow coalescing!
193      return A;
194    }
195
196    assert(A->getSize() == 64 && "Expecting a QQQQ register class!");
197    if (B != &ARM::DPRRegClass)
198      return 0;  // Do not allow coalescing!
199    return A;
200  }
201  case ARM::dsub_4:
202  case ARM::dsub_5:
203  case ARM::dsub_6:
204  case ARM::dsub_7: {
205    // D sub-registers of QQQQ registers.
206    if (A->getSize() == 64 && B == &ARM::DPRRegClass)
207      return A;
208    return 0;  // Do not allow coalescing!
209  }
210
211  case ARM::qsub_0:
212  case ARM::qsub_1: {
213    // Q sub-registers.
214    if (A->getSize() == 32) {
215      if (B == &ARM::QPR_VFP2RegClass)
216        return &ARM::QQPR_VFP2RegClass;
217      if (B == &ARM::QPR_8RegClass)
218        return 0;  // Do not allow coalescing!
219      return A;
220    }
221
222    assert(A->getSize() == 64 && "Expecting a QQQQ register class!");
223    if (B == &ARM::QPRRegClass)
224      return A;
225    return 0;  // Do not allow coalescing!
226  }
227  case ARM::qsub_2:
228  case ARM::qsub_3: {
229    // Q sub-registers of QQQQ registers.
230    if (A->getSize() == 64 && B == &ARM::QPRRegClass)
231      return A;
232    return 0;  // Do not allow coalescing!
233  }
234  }
235  return 0;
236}
237
238bool
239ARMBaseRegisterInfo::canCombineSubRegIndices(const TargetRegisterClass *RC,
240                                          SmallVectorImpl<unsigned> &SubIndices,
241                                          unsigned &NewSubIdx) const {
242
243  unsigned Size = RC->getSize() * 8;
244  if (Size < 6)
245    return 0;
246
247  NewSubIdx = 0;  // Whole register.
248  unsigned NumRegs = SubIndices.size();
249  if (NumRegs == 8) {
250    // 8 D registers -> 1 QQQQ register.
251    return (Size == 512 &&
252            SubIndices[0] == ARM::dsub_0 &&
253            SubIndices[1] == ARM::dsub_1 &&
254            SubIndices[2] == ARM::dsub_2 &&
255            SubIndices[3] == ARM::dsub_3 &&
256            SubIndices[4] == ARM::dsub_4 &&
257            SubIndices[5] == ARM::dsub_5 &&
258            SubIndices[6] == ARM::dsub_6 &&
259            SubIndices[7] == ARM::dsub_7);
260  } else if (NumRegs == 4) {
261    if (SubIndices[0] == ARM::qsub_0) {
262      // 4 Q registers -> 1 QQQQ register.
263      return (Size == 512 &&
264              SubIndices[1] == ARM::qsub_1 &&
265              SubIndices[2] == ARM::qsub_2 &&
266              SubIndices[3] == ARM::qsub_3);
267    } else if (SubIndices[0] == ARM::dsub_0) {
268      // 4 D registers -> 1 QQ register.
269      if (Size >= 256 &&
270          SubIndices[1] == ARM::dsub_1 &&
271          SubIndices[2] == ARM::dsub_2 &&
272          SubIndices[3] == ARM::dsub_3) {
273        if (Size == 512)
274          NewSubIdx = ARM::qqsub_0;
275        return true;
276      }
277    } else if (SubIndices[0] == ARM::dsub_4) {
278      // 4 D registers -> 1 QQ register (2nd).
279      if (Size == 512 &&
280          SubIndices[1] == ARM::dsub_5 &&
281          SubIndices[2] == ARM::dsub_6 &&
282          SubIndices[3] == ARM::dsub_7) {
283        NewSubIdx = ARM::qqsub_1;
284        return true;
285      }
286    } else if (SubIndices[0] == ARM::ssub_0) {
287      // 4 S registers -> 1 Q register.
288      if (Size >= 128 &&
289          SubIndices[1] == ARM::ssub_1 &&
290          SubIndices[2] == ARM::ssub_2 &&
291          SubIndices[3] == ARM::ssub_3) {
292        if (Size >= 256)
293          NewSubIdx = ARM::qsub_0;
294        return true;
295      }
296    }
297  } else if (NumRegs == 2) {
298    if (SubIndices[0] == ARM::qsub_0) {
299      // 2 Q registers -> 1 QQ register.
300      if (Size >= 256 && SubIndices[1] == ARM::qsub_1) {
301        if (Size == 512)
302          NewSubIdx = ARM::qqsub_0;
303        return true;
304      }
305    } else if (SubIndices[0] == ARM::qsub_2) {
306      // 2 Q registers -> 1 QQ register (2nd).
307      if (Size == 512 && SubIndices[1] == ARM::qsub_3) {
308        NewSubIdx = ARM::qqsub_1;
309        return true;
310      }
311    } else if (SubIndices[0] == ARM::dsub_0) {
312      // 2 D registers -> 1 Q register.
313      if (Size >= 128 && SubIndices[1] == ARM::dsub_1) {
314        if (Size >= 256)
315          NewSubIdx = ARM::qsub_0;
316        return true;
317      }
318    } else if (SubIndices[0] == ARM::dsub_2) {
319      // 2 D registers -> 1 Q register (2nd).
320      if (Size >= 256 && SubIndices[1] == ARM::dsub_3) {
321        NewSubIdx = ARM::qsub_1;
322        return true;
323      }
324    } else if (SubIndices[0] == ARM::dsub_4) {
325      // 2 D registers -> 1 Q register (3rd).
326      if (Size == 512 && SubIndices[1] == ARM::dsub_5) {
327        NewSubIdx = ARM::qsub_2;
328        return true;
329      }
330    } else if (SubIndices[0] == ARM::dsub_6) {
331      // 2 D registers -> 1 Q register (3rd).
332      if (Size == 512 && SubIndices[1] == ARM::dsub_7) {
333        NewSubIdx = ARM::qsub_3;
334        return true;
335      }
336    } else if (SubIndices[0] == ARM::ssub_0) {
337      // 2 S registers -> 1 D register.
338      if (SubIndices[1] == ARM::ssub_1) {
339        if (Size >= 128)
340          NewSubIdx = ARM::dsub_0;
341        return true;
342      }
343    } else if (SubIndices[0] == ARM::ssub_2) {
344      // 2 S registers -> 1 D register (2nd).
345      if (Size >= 128 && SubIndices[1] == ARM::ssub_3) {
346        NewSubIdx = ARM::dsub_1;
347        return true;
348      }
349    }
350  }
351  return false;
352}
353
354const TargetRegisterClass*
355ARMBaseRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC)
356                                                                         const {
357  const TargetRegisterClass *Super = RC;
358  TargetRegisterClass::sc_iterator I = RC->superclasses_begin();
359  do {
360    switch (Super->getID()) {
361    case ARM::GPRRegClassID:
362    case ARM::SPRRegClassID:
363    case ARM::DPRRegClassID:
364    case ARM::QPRRegClassID:
365    case ARM::QQPRRegClassID:
366    case ARM::QQQQPRRegClassID:
367      return Super;
368    }
369    Super = *I++;
370  } while (Super);
371  return RC;
372}
373
374const TargetRegisterClass *
375ARMBaseRegisterInfo::getPointerRegClass(unsigned Kind) const {
376  return ARM::GPRRegisterClass;
377}
378
379unsigned
380ARMBaseRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
381                                         MachineFunction &MF) const {
382  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
383
384  switch (RC->getID()) {
385  default:
386    return 0;
387  case ARM::tGPRRegClassID:
388    return TFI->hasFP(MF) ? 4 : 5;
389  case ARM::GPRRegClassID: {
390    unsigned FP = TFI->hasFP(MF) ? 1 : 0;
391    return 10 - FP - (STI.isR9Reserved() ? 1 : 0);
392  }
393  case ARM::SPRRegClassID:  // Currently not used as 'rep' register class.
394  case ARM::DPRRegClassID:
395    return 32 - 10;
396  }
397}
398
399/// getRawAllocationOrder - Returns the register allocation order for a
400/// specified register class with a target-dependent hint.
401ArrayRef<unsigned>
402ARMBaseRegisterInfo::getRawAllocationOrder(const TargetRegisterClass *RC,
403                                           unsigned HintType, unsigned HintReg,
404                                           const MachineFunction &MF) const {
405  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
406  // Alternative register allocation orders when favoring even / odd registers
407  // of register pairs.
408
409  // No FP, R9 is available.
410  static const unsigned GPREven1[] = {
411    ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R8, ARM::R10,
412    ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R7,
413    ARM::R9, ARM::R11
414  };
415  static const unsigned GPROdd1[] = {
416    ARM::R1, ARM::R3, ARM::R5, ARM::R7, ARM::R9, ARM::R11,
417    ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6,
418    ARM::R8, ARM::R10
419  };
420
421  // FP is R7, R9 is available.
422  static const unsigned GPREven2[] = {
423    ARM::R0, ARM::R2, ARM::R4,          ARM::R8, ARM::R10,
424    ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R6,
425    ARM::R9, ARM::R11
426  };
427  static const unsigned GPROdd2[] = {
428    ARM::R1, ARM::R3, ARM::R5,          ARM::R9, ARM::R11,
429    ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6,
430    ARM::R8, ARM::R10
431  };
432
433  // FP is R11, R9 is available.
434  static const unsigned GPREven3[] = {
435    ARM::R0, ARM::R2, ARM::R4, ARM::R6, ARM::R8,
436    ARM::R1, ARM::R3, ARM::R10,ARM::R12,ARM::LR, ARM::R5, ARM::R7,
437    ARM::R9
438  };
439  static const unsigned GPROdd3[] = {
440    ARM::R1, ARM::R3, ARM::R5, ARM::R6, ARM::R9,
441    ARM::R0, ARM::R2, ARM::R10,ARM::R12,ARM::LR, ARM::R4, ARM::R7,
442    ARM::R8
443  };
444
445  // No FP, R9 is not available.
446  static const unsigned GPREven4[] = {
447    ARM::R0, ARM::R2, ARM::R4, ARM::R6,          ARM::R10,
448    ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R7, ARM::R8,
449    ARM::R11
450  };
451  static const unsigned GPROdd4[] = {
452    ARM::R1, ARM::R3, ARM::R5, ARM::R7,          ARM::R11,
453    ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8,
454    ARM::R10
455  };
456
457  // FP is R7, R9 is not available.
458  static const unsigned GPREven5[] = {
459    ARM::R0, ARM::R2, ARM::R4,                   ARM::R10,
460    ARM::R1, ARM::R3, ARM::R12,ARM::LR, ARM::R5, ARM::R6, ARM::R8,
461    ARM::R11
462  };
463  static const unsigned GPROdd5[] = {
464    ARM::R1, ARM::R3, ARM::R5,                   ARM::R11,
465    ARM::R0, ARM::R2, ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8,
466    ARM::R10
467  };
468
469  // FP is R11, R9 is not available.
470  static const unsigned GPREven6[] = {
471    ARM::R0, ARM::R2, ARM::R4, ARM::R6,
472    ARM::R1, ARM::R3, ARM::R10,ARM::R12,ARM::LR, ARM::R5, ARM::R7, ARM::R8
473  };
474  static const unsigned GPROdd6[] = {
475    ARM::R1, ARM::R3, ARM::R5, ARM::R7,
476    ARM::R0, ARM::R2, ARM::R10,ARM::R12,ARM::LR, ARM::R4, ARM::R6, ARM::R8
477  };
478
479  // We only support even/odd hints for GPR and rGPR.
480  if (RC != ARM::GPRRegisterClass && RC != ARM::rGPRRegisterClass)
481    return RC->getRawAllocationOrder(MF);
482
483  if (HintType == ARMRI::RegPairEven) {
484    if (isPhysicalRegister(HintReg) && getRegisterPairEven(HintReg, MF) == 0)
485      // It's no longer possible to fulfill this hint. Return the default
486      // allocation order.
487      return RC->getRawAllocationOrder(MF);
488
489    if (!TFI->hasFP(MF)) {
490      if (!STI.isR9Reserved())
491        return ArrayRef<unsigned>(GPREven1);
492      else
493        return ArrayRef<unsigned>(GPREven4);
494    } else if (FramePtr == ARM::R7) {
495      if (!STI.isR9Reserved())
496        return ArrayRef<unsigned>(GPREven2);
497      else
498        return ArrayRef<unsigned>(GPREven5);
499    } else { // FramePtr == ARM::R11
500      if (!STI.isR9Reserved())
501        return ArrayRef<unsigned>(GPREven3);
502      else
503        return ArrayRef<unsigned>(GPREven6);
504    }
505  } else if (HintType == ARMRI::RegPairOdd) {
506    if (isPhysicalRegister(HintReg) && getRegisterPairOdd(HintReg, MF) == 0)
507      // It's no longer possible to fulfill this hint. Return the default
508      // allocation order.
509      return RC->getRawAllocationOrder(MF);
510
511    if (!TFI->hasFP(MF)) {
512      if (!STI.isR9Reserved())
513        return ArrayRef<unsigned>(GPROdd1);
514      else
515        return ArrayRef<unsigned>(GPROdd4);
516    } else if (FramePtr == ARM::R7) {
517      if (!STI.isR9Reserved())
518        return ArrayRef<unsigned>(GPROdd2);
519      else
520        return ArrayRef<unsigned>(GPROdd5);
521    } else { // FramePtr == ARM::R11
522      if (!STI.isR9Reserved())
523        return ArrayRef<unsigned>(GPROdd3);
524      else
525        return ArrayRef<unsigned>(GPROdd6);
526    }
527  }
528  return RC->getRawAllocationOrder(MF);
529}
530
531/// ResolveRegAllocHint - Resolves the specified register allocation hint
532/// to a physical register. Returns the physical register if it is successful.
533unsigned
534ARMBaseRegisterInfo::ResolveRegAllocHint(unsigned Type, unsigned Reg,
535                                         const MachineFunction &MF) const {
536  if (Reg == 0 || !isPhysicalRegister(Reg))
537    return 0;
538  if (Type == 0)
539    return Reg;
540  else if (Type == (unsigned)ARMRI::RegPairOdd)
541    // Odd register.
542    return getRegisterPairOdd(Reg, MF);
543  else if (Type == (unsigned)ARMRI::RegPairEven)
544    // Even register.
545    return getRegisterPairEven(Reg, MF);
546  return 0;
547}
548
549void
550ARMBaseRegisterInfo::UpdateRegAllocHint(unsigned Reg, unsigned NewReg,
551                                        MachineFunction &MF) const {
552  MachineRegisterInfo *MRI = &MF.getRegInfo();
553  std::pair<unsigned, unsigned> Hint = MRI->getRegAllocationHint(Reg);
554  if ((Hint.first == (unsigned)ARMRI::RegPairOdd ||
555       Hint.first == (unsigned)ARMRI::RegPairEven) &&
556      TargetRegisterInfo::isVirtualRegister(Hint.second)) {
557    // If 'Reg' is one of the even / odd register pair and it's now changed
558    // (e.g. coalesced) into a different register. The other register of the
559    // pair allocation hint must be updated to reflect the relationship
560    // change.
561    unsigned OtherReg = Hint.second;
562    Hint = MRI->getRegAllocationHint(OtherReg);
563    if (Hint.second == Reg)
564      // Make sure the pair has not already divorced.
565      MRI->setRegAllocationHint(OtherReg, Hint.first, NewReg);
566  }
567}
568
569bool
570ARMBaseRegisterInfo::avoidWriteAfterWrite(const TargetRegisterClass *RC) const {
571  // CortexA9 has a Write-after-write hazard for NEON registers.
572  if (!STI.isCortexA9())
573    return false;
574
575  switch (RC->getID()) {
576  case ARM::DPRRegClassID:
577  case ARM::DPR_8RegClassID:
578  case ARM::DPR_VFP2RegClassID:
579  case ARM::QPRRegClassID:
580  case ARM::QPR_8RegClassID:
581  case ARM::QPR_VFP2RegClassID:
582  case ARM::SPRRegClassID:
583  case ARM::SPR_8RegClassID:
584    // Avoid reusing S, D, and Q registers.
585    // Don't increase register pressure for QQ and QQQQ.
586    return true;
587  default:
588    return false;
589  }
590}
591
592bool ARMBaseRegisterInfo::hasBasePointer(const MachineFunction &MF) const {
593  const MachineFrameInfo *MFI = MF.getFrameInfo();
594  const ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
595
596  if (!EnableBasePointer)
597    return false;
598
599  if (needsStackRealignment(MF) && MFI->hasVarSizedObjects())
600    return true;
601
602  // Thumb has trouble with negative offsets from the FP. Thumb2 has a limited
603  // negative range for ldr/str (255), and thumb1 is positive offsets only.
604  // It's going to be better to use the SP or Base Pointer instead. When there
605  // are variable sized objects, we can't reference off of the SP, so we
606  // reserve a Base Pointer.
607  if (AFI->isThumbFunction() && MFI->hasVarSizedObjects()) {
608    // Conservatively estimate whether the negative offset from the frame
609    // pointer will be sufficient to reach. If a function has a smallish
610    // frame, it's less likely to have lots of spills and callee saved
611    // space, so it's all more likely to be within range of the frame pointer.
612    // If it's wrong, the scavenger will still enable access to work, it just
613    // won't be optimal.
614    if (AFI->isThumb2Function() && MFI->getLocalFrameSize() < 128)
615      return false;
616    return true;
617  }
618
619  return false;
620}
621
622bool ARMBaseRegisterInfo::canRealignStack(const MachineFunction &MF) const {
623  const MachineFrameInfo *MFI = MF.getFrameInfo();
624  const ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
625  // We can't realign the stack if:
626  // 1. Dynamic stack realignment is explicitly disabled,
627  // 2. This is a Thumb1 function (it's not useful, so we don't bother), or
628  // 3. There are VLAs in the function and the base pointer is disabled.
629  return (RealignStack && !AFI->isThumb1OnlyFunction() &&
630          (!MFI->hasVarSizedObjects() || EnableBasePointer));
631}
632
633bool ARMBaseRegisterInfo::
634needsStackRealignment(const MachineFunction &MF) const {
635  const MachineFrameInfo *MFI = MF.getFrameInfo();
636  const Function *F = MF.getFunction();
637  unsigned StackAlign = MF.getTarget().getFrameLowering()->getStackAlignment();
638  bool requiresRealignment = ((MFI->getLocalFrameMaxAlign() > StackAlign) ||
639                               F->hasFnAttr(Attribute::StackAlignment));
640
641  return requiresRealignment && canRealignStack(MF);
642}
643
644bool ARMBaseRegisterInfo::
645cannotEliminateFrame(const MachineFunction &MF) const {
646  const MachineFrameInfo *MFI = MF.getFrameInfo();
647  if (DisableFramePointerElim(MF) && MFI->adjustsStack())
648    return true;
649  return MFI->hasVarSizedObjects() || MFI->isFrameAddressTaken()
650    || needsStackRealignment(MF);
651}
652
653unsigned ARMBaseRegisterInfo::getRARegister() const {
654  return ARM::LR;
655}
656
657unsigned
658ARMBaseRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
659  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
660
661  if (TFI->hasFP(MF))
662    return FramePtr;
663  return ARM::SP;
664}
665
666unsigned ARMBaseRegisterInfo::getEHExceptionRegister() const {
667  llvm_unreachable("What is the exception register");
668  return 0;
669}
670
671unsigned ARMBaseRegisterInfo::getEHHandlerRegister() const {
672  llvm_unreachable("What is the exception handler register");
673  return 0;
674}
675
676int ARMBaseRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
677  return ARMGenRegisterInfo::getDwarfRegNumFull(RegNum, 0);
678}
679
680int ARMBaseRegisterInfo::getLLVMRegNum(unsigned DwarfRegNo, bool isEH) const {
681  return ARMGenRegisterInfo::getLLVMRegNumFull(DwarfRegNo,0);
682}
683
684unsigned ARMBaseRegisterInfo::getRegisterPairEven(unsigned Reg,
685                                              const MachineFunction &MF) const {
686  switch (Reg) {
687  default: break;
688  // Return 0 if either register of the pair is a special register.
689  // So no R12, etc.
690  case ARM::R1:
691    return ARM::R0;
692  case ARM::R3:
693    return ARM::R2;
694  case ARM::R5:
695    return ARM::R4;
696  case ARM::R7:
697    return (isReservedReg(MF, ARM::R7) || isReservedReg(MF, ARM::R6))
698      ? 0 : ARM::R6;
699  case ARM::R9:
700    return isReservedReg(MF, ARM::R9)  ? 0 :ARM::R8;
701  case ARM::R11:
702    return isReservedReg(MF, ARM::R11) ? 0 : ARM::R10;
703
704  case ARM::S1:
705    return ARM::S0;
706  case ARM::S3:
707    return ARM::S2;
708  case ARM::S5:
709    return ARM::S4;
710  case ARM::S7:
711    return ARM::S6;
712  case ARM::S9:
713    return ARM::S8;
714  case ARM::S11:
715    return ARM::S10;
716  case ARM::S13:
717    return ARM::S12;
718  case ARM::S15:
719    return ARM::S14;
720  case ARM::S17:
721    return ARM::S16;
722  case ARM::S19:
723    return ARM::S18;
724  case ARM::S21:
725    return ARM::S20;
726  case ARM::S23:
727    return ARM::S22;
728  case ARM::S25:
729    return ARM::S24;
730  case ARM::S27:
731    return ARM::S26;
732  case ARM::S29:
733    return ARM::S28;
734  case ARM::S31:
735    return ARM::S30;
736
737  case ARM::D1:
738    return ARM::D0;
739  case ARM::D3:
740    return ARM::D2;
741  case ARM::D5:
742    return ARM::D4;
743  case ARM::D7:
744    return ARM::D6;
745  case ARM::D9:
746    return ARM::D8;
747  case ARM::D11:
748    return ARM::D10;
749  case ARM::D13:
750    return ARM::D12;
751  case ARM::D15:
752    return ARM::D14;
753  case ARM::D17:
754    return ARM::D16;
755  case ARM::D19:
756    return ARM::D18;
757  case ARM::D21:
758    return ARM::D20;
759  case ARM::D23:
760    return ARM::D22;
761  case ARM::D25:
762    return ARM::D24;
763  case ARM::D27:
764    return ARM::D26;
765  case ARM::D29:
766    return ARM::D28;
767  case ARM::D31:
768    return ARM::D30;
769  }
770
771  return 0;
772}
773
774unsigned ARMBaseRegisterInfo::getRegisterPairOdd(unsigned Reg,
775                                             const MachineFunction &MF) const {
776  switch (Reg) {
777  default: break;
778  // Return 0 if either register of the pair is a special register.
779  // So no R12, etc.
780  case ARM::R0:
781    return ARM::R1;
782  case ARM::R2:
783    return ARM::R3;
784  case ARM::R4:
785    return ARM::R5;
786  case ARM::R6:
787    return (isReservedReg(MF, ARM::R7) || isReservedReg(MF, ARM::R6))
788      ? 0 : ARM::R7;
789  case ARM::R8:
790    return isReservedReg(MF, ARM::R9)  ? 0 :ARM::R9;
791  case ARM::R10:
792    return isReservedReg(MF, ARM::R11) ? 0 : ARM::R11;
793
794  case ARM::S0:
795    return ARM::S1;
796  case ARM::S2:
797    return ARM::S3;
798  case ARM::S4:
799    return ARM::S5;
800  case ARM::S6:
801    return ARM::S7;
802  case ARM::S8:
803    return ARM::S9;
804  case ARM::S10:
805    return ARM::S11;
806  case ARM::S12:
807    return ARM::S13;
808  case ARM::S14:
809    return ARM::S15;
810  case ARM::S16:
811    return ARM::S17;
812  case ARM::S18:
813    return ARM::S19;
814  case ARM::S20:
815    return ARM::S21;
816  case ARM::S22:
817    return ARM::S23;
818  case ARM::S24:
819    return ARM::S25;
820  case ARM::S26:
821    return ARM::S27;
822  case ARM::S28:
823    return ARM::S29;
824  case ARM::S30:
825    return ARM::S31;
826
827  case ARM::D0:
828    return ARM::D1;
829  case ARM::D2:
830    return ARM::D3;
831  case ARM::D4:
832    return ARM::D5;
833  case ARM::D6:
834    return ARM::D7;
835  case ARM::D8:
836    return ARM::D9;
837  case ARM::D10:
838    return ARM::D11;
839  case ARM::D12:
840    return ARM::D13;
841  case ARM::D14:
842    return ARM::D15;
843  case ARM::D16:
844    return ARM::D17;
845  case ARM::D18:
846    return ARM::D19;
847  case ARM::D20:
848    return ARM::D21;
849  case ARM::D22:
850    return ARM::D23;
851  case ARM::D24:
852    return ARM::D25;
853  case ARM::D26:
854    return ARM::D27;
855  case ARM::D28:
856    return ARM::D29;
857  case ARM::D30:
858    return ARM::D31;
859  }
860
861  return 0;
862}
863
864/// emitLoadConstPool - Emits a load from constpool to materialize the
865/// specified immediate.
866void ARMBaseRegisterInfo::
867emitLoadConstPool(MachineBasicBlock &MBB,
868                  MachineBasicBlock::iterator &MBBI,
869                  DebugLoc dl,
870                  unsigned DestReg, unsigned SubIdx, int Val,
871                  ARMCC::CondCodes Pred,
872                  unsigned PredReg, unsigned MIFlags) const {
873  MachineFunction &MF = *MBB.getParent();
874  MachineConstantPool *ConstantPool = MF.getConstantPool();
875  const Constant *C =
876        ConstantInt::get(Type::getInt32Ty(MF.getFunction()->getContext()), Val);
877  unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4);
878
879  BuildMI(MBB, MBBI, dl, TII.get(ARM::LDRcp))
880    .addReg(DestReg, getDefRegState(true), SubIdx)
881    .addConstantPoolIndex(Idx)
882    .addImm(0).addImm(Pred).addReg(PredReg)
883    .setMIFlags(MIFlags);
884}
885
886bool ARMBaseRegisterInfo::
887requiresRegisterScavenging(const MachineFunction &MF) const {
888  return true;
889}
890
891bool ARMBaseRegisterInfo::
892requiresFrameIndexScavenging(const MachineFunction &MF) const {
893  return true;
894}
895
896bool ARMBaseRegisterInfo::
897requiresVirtualBaseRegisters(const MachineFunction &MF) const {
898  return EnableLocalStackAlloc;
899}
900
901static void
902emitSPUpdate(bool isARM,
903             MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
904             DebugLoc dl, const ARMBaseInstrInfo &TII,
905             int NumBytes,
906             ARMCC::CondCodes Pred = ARMCC::AL, unsigned PredReg = 0) {
907  if (isARM)
908    emitARMRegPlusImmediate(MBB, MBBI, dl, ARM::SP, ARM::SP, NumBytes,
909                            Pred, PredReg, TII);
910  else
911    emitT2RegPlusImmediate(MBB, MBBI, dl, ARM::SP, ARM::SP, NumBytes,
912                           Pred, PredReg, TII);
913}
914
915
916void ARMBaseRegisterInfo::
917eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
918                              MachineBasicBlock::iterator I) const {
919  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
920  if (!TFI->hasReservedCallFrame(MF)) {
921    // If we have alloca, convert as follows:
922    // ADJCALLSTACKDOWN -> sub, sp, sp, amount
923    // ADJCALLSTACKUP   -> add, sp, sp, amount
924    MachineInstr *Old = I;
925    DebugLoc dl = Old->getDebugLoc();
926    unsigned Amount = Old->getOperand(0).getImm();
927    if (Amount != 0) {
928      // We need to keep the stack aligned properly.  To do this, we round the
929      // amount of space needed for the outgoing arguments up to the next
930      // alignment boundary.
931      unsigned Align = TFI->getStackAlignment();
932      Amount = (Amount+Align-1)/Align*Align;
933
934      ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
935      assert(!AFI->isThumb1OnlyFunction() &&
936             "This eliminateCallFramePseudoInstr does not support Thumb1!");
937      bool isARM = !AFI->isThumbFunction();
938
939      // Replace the pseudo instruction with a new instruction...
940      unsigned Opc = Old->getOpcode();
941      int PIdx = Old->findFirstPredOperandIdx();
942      ARMCC::CondCodes Pred = (PIdx == -1)
943        ? ARMCC::AL : (ARMCC::CondCodes)Old->getOperand(PIdx).getImm();
944      if (Opc == ARM::ADJCALLSTACKDOWN || Opc == ARM::tADJCALLSTACKDOWN) {
945        // Note: PredReg is operand 2 for ADJCALLSTACKDOWN.
946        unsigned PredReg = Old->getOperand(2).getReg();
947        emitSPUpdate(isARM, MBB, I, dl, TII, -Amount, Pred, PredReg);
948      } else {
949        // Note: PredReg is operand 3 for ADJCALLSTACKUP.
950        unsigned PredReg = Old->getOperand(3).getReg();
951        assert(Opc == ARM::ADJCALLSTACKUP || Opc == ARM::tADJCALLSTACKUP);
952        emitSPUpdate(isARM, MBB, I, dl, TII, Amount, Pred, PredReg);
953      }
954    }
955  }
956  MBB.erase(I);
957}
958
959int64_t ARMBaseRegisterInfo::
960getFrameIndexInstrOffset(const MachineInstr *MI, int Idx) const {
961  const MCInstrDesc &Desc = MI->getDesc();
962  unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
963  int64_t InstrOffs = 0;;
964  int Scale = 1;
965  unsigned ImmIdx = 0;
966  switch (AddrMode) {
967  case ARMII::AddrModeT2_i8:
968  case ARMII::AddrModeT2_i12:
969  case ARMII::AddrMode_i12:
970    InstrOffs = MI->getOperand(Idx+1).getImm();
971    Scale = 1;
972    break;
973  case ARMII::AddrMode5: {
974    // VFP address mode.
975    const MachineOperand &OffOp = MI->getOperand(Idx+1);
976    InstrOffs = ARM_AM::getAM5Offset(OffOp.getImm());
977    if (ARM_AM::getAM5Op(OffOp.getImm()) == ARM_AM::sub)
978      InstrOffs = -InstrOffs;
979    Scale = 4;
980    break;
981  }
982  case ARMII::AddrMode2: {
983    ImmIdx = Idx+2;
984    InstrOffs = ARM_AM::getAM2Offset(MI->getOperand(ImmIdx).getImm());
985    if (ARM_AM::getAM2Op(MI->getOperand(ImmIdx).getImm()) == ARM_AM::sub)
986      InstrOffs = -InstrOffs;
987    break;
988  }
989  case ARMII::AddrMode3: {
990    ImmIdx = Idx+2;
991    InstrOffs = ARM_AM::getAM3Offset(MI->getOperand(ImmIdx).getImm());
992    if (ARM_AM::getAM3Op(MI->getOperand(ImmIdx).getImm()) == ARM_AM::sub)
993      InstrOffs = -InstrOffs;
994    break;
995  }
996  case ARMII::AddrModeT1_s: {
997    ImmIdx = Idx+1;
998    InstrOffs = MI->getOperand(ImmIdx).getImm();
999    Scale = 4;
1000    break;
1001  }
1002  default:
1003    llvm_unreachable("Unsupported addressing mode!");
1004    break;
1005  }
1006
1007  return InstrOffs * Scale;
1008}
1009
1010/// needsFrameBaseReg - Returns true if the instruction's frame index
1011/// reference would be better served by a base register other than FP
1012/// or SP. Used by LocalStackFrameAllocation to determine which frame index
1013/// references it should create new base registers for.
1014bool ARMBaseRegisterInfo::
1015needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const {
1016  for (unsigned i = 0; !MI->getOperand(i).isFI(); ++i) {
1017    assert(i < MI->getNumOperands() &&"Instr doesn't have FrameIndex operand!");
1018  }
1019
1020  // It's the load/store FI references that cause issues, as it can be difficult
1021  // to materialize the offset if it won't fit in the literal field. Estimate
1022  // based on the size of the local frame and some conservative assumptions
1023  // about the rest of the stack frame (note, this is pre-regalloc, so
1024  // we don't know everything for certain yet) whether this offset is likely
1025  // to be out of range of the immediate. Return true if so.
1026
1027  // We only generate virtual base registers for loads and stores, so
1028  // return false for everything else.
1029  unsigned Opc = MI->getOpcode();
1030  switch (Opc) {
1031  case ARM::LDRi12: case ARM::LDRH: case ARM::LDRBi12:
1032  case ARM::STRi12: case ARM::STRH: case ARM::STRBi12:
1033  case ARM::t2LDRi12: case ARM::t2LDRi8:
1034  case ARM::t2STRi12: case ARM::t2STRi8:
1035  case ARM::VLDRS: case ARM::VLDRD:
1036  case ARM::VSTRS: case ARM::VSTRD:
1037  case ARM::tSTRspi: case ARM::tLDRspi:
1038    if (ForceAllBaseRegAlloc)
1039      return true;
1040    break;
1041  default:
1042    return false;
1043  }
1044
1045  // Without a virtual base register, if the function has variable sized
1046  // objects, all fixed-size local references will be via the frame pointer,
1047  // Approximate the offset and see if it's legal for the instruction.
1048  // Note that the incoming offset is based on the SP value at function entry,
1049  // so it'll be negative.
1050  MachineFunction &MF = *MI->getParent()->getParent();
1051  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
1052  MachineFrameInfo *MFI = MF.getFrameInfo();
1053  ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
1054
1055  // Estimate an offset from the frame pointer.
1056  // Conservatively assume all callee-saved registers get pushed. R4-R6
1057  // will be earlier than the FP, so we ignore those.
1058  // R7, LR
1059  int64_t FPOffset = Offset - 8;
1060  // ARM and Thumb2 functions also need to consider R8-R11 and D8-D15
1061  if (!AFI->isThumbFunction() || !AFI->isThumb1OnlyFunction())
1062    FPOffset -= 80;
1063  // Estimate an offset from the stack pointer.
1064  // The incoming offset is relating to the SP at the start of the function,
1065  // but when we access the local it'll be relative to the SP after local
1066  // allocation, so adjust our SP-relative offset by that allocation size.
1067  Offset = -Offset;
1068  Offset += MFI->getLocalFrameSize();
1069  // Assume that we'll have at least some spill slots allocated.
1070  // FIXME: This is a total SWAG number. We should run some statistics
1071  //        and pick a real one.
1072  Offset += 128; // 128 bytes of spill slots
1073
1074  // If there is a frame pointer, try using it.
1075  // The FP is only available if there is no dynamic realignment. We
1076  // don't know for sure yet whether we'll need that, so we guess based
1077  // on whether there are any local variables that would trigger it.
1078  unsigned StackAlign = TFI->getStackAlignment();
1079  if (TFI->hasFP(MF) &&
1080      !((MFI->getLocalFrameMaxAlign() > StackAlign) && canRealignStack(MF))) {
1081    if (isFrameOffsetLegal(MI, FPOffset))
1082      return false;
1083  }
1084  // If we can reference via the stack pointer, try that.
1085  // FIXME: This (and the code that resolves the references) can be improved
1086  //        to only disallow SP relative references in the live range of
1087  //        the VLA(s). In practice, it's unclear how much difference that
1088  //        would make, but it may be worth doing.
1089  if (!MFI->hasVarSizedObjects() && isFrameOffsetLegal(MI, Offset))
1090    return false;
1091
1092  // The offset likely isn't legal, we want to allocate a virtual base register.
1093  return true;
1094}
1095
1096/// materializeFrameBaseRegister - Insert defining instruction(s) for BaseReg to
1097/// be a pointer to FrameIdx at the beginning of the basic block.
1098void ARMBaseRegisterInfo::
1099materializeFrameBaseRegister(MachineBasicBlock *MBB,
1100                             unsigned BaseReg, int FrameIdx,
1101                             int64_t Offset) const {
1102  ARMFunctionInfo *AFI = MBB->getParent()->getInfo<ARMFunctionInfo>();
1103  unsigned ADDriOpc = !AFI->isThumbFunction() ? ARM::ADDri :
1104    (AFI->isThumb1OnlyFunction() ? ARM::tADDrSPi : ARM::t2ADDri);
1105
1106  MachineBasicBlock::iterator Ins = MBB->begin();
1107  DebugLoc DL;                  // Defaults to "unknown"
1108  if (Ins != MBB->end())
1109    DL = Ins->getDebugLoc();
1110
1111  const MCInstrDesc &MCID = TII.get(ADDriOpc);
1112  MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo();
1113  MRI.constrainRegClass(BaseReg, TII.getRegClass(MCID, 0, this));
1114
1115  MachineInstrBuilder MIB = BuildMI(*MBB, Ins, DL, MCID, BaseReg)
1116    .addFrameIndex(FrameIdx).addImm(Offset);
1117
1118  if (!AFI->isThumb1OnlyFunction())
1119    AddDefaultCC(AddDefaultPred(MIB));
1120}
1121
1122void
1123ARMBaseRegisterInfo::resolveFrameIndex(MachineBasicBlock::iterator I,
1124                                       unsigned BaseReg, int64_t Offset) const {
1125  MachineInstr &MI = *I;
1126  MachineBasicBlock &MBB = *MI.getParent();
1127  MachineFunction &MF = *MBB.getParent();
1128  ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
1129  int Off = Offset; // ARM doesn't need the general 64-bit offsets
1130  unsigned i = 0;
1131
1132  assert(!AFI->isThumb1OnlyFunction() &&
1133         "This resolveFrameIndex does not support Thumb1!");
1134
1135  while (!MI.getOperand(i).isFI()) {
1136    ++i;
1137    assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
1138  }
1139  bool Done = false;
1140  if (!AFI->isThumbFunction())
1141    Done = rewriteARMFrameIndex(MI, i, BaseReg, Off, TII);
1142  else {
1143    assert(AFI->isThumb2Function());
1144    Done = rewriteT2FrameIndex(MI, i, BaseReg, Off, TII);
1145  }
1146  assert (Done && "Unable to resolve frame index!");
1147}
1148
1149bool ARMBaseRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
1150                                             int64_t Offset) const {
1151  const MCInstrDesc &Desc = MI->getDesc();
1152  unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
1153  unsigned i = 0;
1154
1155  while (!MI->getOperand(i).isFI()) {
1156    ++i;
1157    assert(i < MI->getNumOperands() &&"Instr doesn't have FrameIndex operand!");
1158  }
1159
1160  // AddrMode4 and AddrMode6 cannot handle any offset.
1161  if (AddrMode == ARMII::AddrMode4 || AddrMode == ARMII::AddrMode6)
1162    return Offset == 0;
1163
1164  unsigned NumBits = 0;
1165  unsigned Scale = 1;
1166  bool isSigned = true;
1167  switch (AddrMode) {
1168  case ARMII::AddrModeT2_i8:
1169  case ARMII::AddrModeT2_i12:
1170    // i8 supports only negative, and i12 supports only positive, so
1171    // based on Offset sign, consider the appropriate instruction
1172    Scale = 1;
1173    if (Offset < 0) {
1174      NumBits = 8;
1175      Offset = -Offset;
1176    } else {
1177      NumBits = 12;
1178    }
1179    break;
1180  case ARMII::AddrMode5:
1181    // VFP address mode.
1182    NumBits = 8;
1183    Scale = 4;
1184    break;
1185  case ARMII::AddrMode_i12:
1186  case ARMII::AddrMode2:
1187    NumBits = 12;
1188    break;
1189  case ARMII::AddrMode3:
1190    NumBits = 8;
1191    break;
1192  case ARMII::AddrModeT1_s:
1193    NumBits = 5;
1194    Scale = 4;
1195    isSigned = false;
1196    break;
1197  default:
1198    llvm_unreachable("Unsupported addressing mode!");
1199    break;
1200  }
1201
1202  Offset += getFrameIndexInstrOffset(MI, i);
1203  // Make sure the offset is encodable for instructions that scale the
1204  // immediate.
1205  if ((Offset & (Scale-1)) != 0)
1206    return false;
1207
1208  if (isSigned && Offset < 0)
1209    Offset = -Offset;
1210
1211  unsigned Mask = (1 << NumBits) - 1;
1212  if ((unsigned)Offset <= Mask * Scale)
1213    return true;
1214
1215  return false;
1216}
1217
1218void
1219ARMBaseRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
1220                                         int SPAdj, RegScavenger *RS) const {
1221  unsigned i = 0;
1222  MachineInstr &MI = *II;
1223  MachineBasicBlock &MBB = *MI.getParent();
1224  MachineFunction &MF = *MBB.getParent();
1225  const ARMFrameLowering *TFI =
1226    static_cast<const ARMFrameLowering*>(MF.getTarget().getFrameLowering());
1227  ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
1228  assert(!AFI->isThumb1OnlyFunction() &&
1229         "This eliminateFrameIndex does not support Thumb1!");
1230
1231  while (!MI.getOperand(i).isFI()) {
1232    ++i;
1233    assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
1234  }
1235
1236  int FrameIndex = MI.getOperand(i).getIndex();
1237  unsigned FrameReg;
1238
1239  int Offset = TFI->ResolveFrameIndexReference(MF, FrameIndex, FrameReg, SPAdj);
1240
1241  // Special handling of dbg_value instructions.
1242  if (MI.isDebugValue()) {
1243    MI.getOperand(i).  ChangeToRegister(FrameReg, false /*isDef*/);
1244    MI.getOperand(i+1).ChangeToImmediate(Offset);
1245    return;
1246  }
1247
1248  // Modify MI as necessary to handle as much of 'Offset' as possible
1249  bool Done = false;
1250  if (!AFI->isThumbFunction())
1251    Done = rewriteARMFrameIndex(MI, i, FrameReg, Offset, TII);
1252  else {
1253    assert(AFI->isThumb2Function());
1254    Done = rewriteT2FrameIndex(MI, i, FrameReg, Offset, TII);
1255  }
1256  if (Done)
1257    return;
1258
1259  // If we get here, the immediate doesn't fit into the instruction.  We folded
1260  // as much as possible above, handle the rest, providing a register that is
1261  // SP+LargeImm.
1262  assert((Offset ||
1263          (MI.getDesc().TSFlags & ARMII::AddrModeMask) == ARMII::AddrMode4 ||
1264          (MI.getDesc().TSFlags & ARMII::AddrModeMask) == ARMII::AddrMode6) &&
1265         "This code isn't needed if offset already handled!");
1266
1267  unsigned ScratchReg = 0;
1268  int PIdx = MI.findFirstPredOperandIdx();
1269  ARMCC::CondCodes Pred = (PIdx == -1)
1270    ? ARMCC::AL : (ARMCC::CondCodes)MI.getOperand(PIdx).getImm();
1271  unsigned PredReg = (PIdx == -1) ? 0 : MI.getOperand(PIdx+1).getReg();
1272  if (Offset == 0)
1273    // Must be addrmode4/6.
1274    MI.getOperand(i).ChangeToRegister(FrameReg, false, false, false);
1275  else {
1276    ScratchReg = MF.getRegInfo().createVirtualRegister(ARM::GPRRegisterClass);
1277    if (!AFI->isThumbFunction())
1278      emitARMRegPlusImmediate(MBB, II, MI.getDebugLoc(), ScratchReg, FrameReg,
1279                              Offset, Pred, PredReg, TII);
1280    else {
1281      assert(AFI->isThumb2Function());
1282      emitT2RegPlusImmediate(MBB, II, MI.getDebugLoc(), ScratchReg, FrameReg,
1283                             Offset, Pred, PredReg, TII);
1284    }
1285    // Update the original instruction to use the scratch register.
1286    MI.getOperand(i).ChangeToRegister(ScratchReg, false, false, true);
1287    if (MI.getOpcode() == ARM::t2ADDrSPi)
1288      MI.setDesc(TII.get(ARM::t2ADDri));
1289    else if (MI.getOpcode() == ARM::t2SUBrSPi)
1290      MI.setDesc(TII.get(ARM::t2SUBri));
1291  }
1292}
1293