a444f376cb1eed29936691874fff5d0be769ef02
[oota-llvm.git] / lib / Target / X86 / X86RegisterInfo.cpp
1 //===-- X86RegisterInfo.cpp - X86 Register Information --------------------===//
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 X86 implementation of the TargetRegisterInfo class.
11 // This file is responsible for the frame pointer elimination optimization
12 // on X86.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "X86RegisterInfo.h"
17 #include "X86InstrBuilder.h"
18 #include "X86MachineFunctionInfo.h"
19 #include "X86Subtarget.h"
20 #include "X86TargetMachine.h"
21 #include "llvm/ADT/BitVector.h"
22 #include "llvm/ADT/STLExtras.h"
23 #include "llvm/CodeGen/MachineFrameInfo.h"
24 #include "llvm/CodeGen/MachineFunction.h"
25 #include "llvm/CodeGen/MachineFunctionPass.h"
26 #include "llvm/CodeGen/MachineInstrBuilder.h"
27 #include "llvm/CodeGen/MachineModuleInfo.h"
28 #include "llvm/CodeGen/MachineRegisterInfo.h"
29 #include "llvm/CodeGen/MachineValueType.h"
30 #include "llvm/IR/Constants.h"
31 #include "llvm/IR/Function.h"
32 #include "llvm/IR/Type.h"
33 #include "llvm/MC/MCAsmInfo.h"
34 #include "llvm/Support/CommandLine.h"
35 #include "llvm/Support/ErrorHandling.h"
36 #include "llvm/Target/TargetFrameLowering.h"
37 #include "llvm/Target/TargetInstrInfo.h"
38 #include "llvm/Target/TargetMachine.h"
39 #include "llvm/Target/TargetOptions.h"
40
41 using namespace llvm;
42
43 #define GET_REGINFO_TARGET_DESC
44 #include "X86GenRegisterInfo.inc"
45
46 cl::opt<bool>
47 ForceStackAlign("force-align-stack",
48                  cl::desc("Force align the stack to the minimum alignment"
49                            " needed for the function."),
50                  cl::init(false), cl::Hidden);
51
52 static cl::opt<bool>
53 EnableBasePointer("x86-use-base-pointer", cl::Hidden, cl::init(true),
54           cl::desc("Enable use of a base pointer for complex stack frames"));
55
56 X86RegisterInfo::X86RegisterInfo(const X86Subtarget &STI)
57     : X86GenRegisterInfo(
58           (STI.is64Bit() ? X86::RIP : X86::EIP),
59           X86_MC::getDwarfRegFlavour(STI.getTargetTriple(), false),
60           X86_MC::getDwarfRegFlavour(STI.getTargetTriple(), true),
61           (STI.is64Bit() ? X86::RIP : X86::EIP)),
62       Subtarget(STI) {
63   X86_MC::InitLLVM2SEHRegisterMapping(this);
64
65   // Cache some information.
66   Is64Bit = Subtarget.is64Bit();
67   IsWin64 = Subtarget.isTargetWin64();
68
69   // Use a callee-saved register as the base pointer.  These registers must
70   // not conflict with any ABI requirements.  For example, in 32-bit mode PIC
71   // requires GOT in the EBX register before function calls via PLT GOT pointer.
72   if (Is64Bit) {
73     SlotSize = 8;
74     bool Use64BitReg = 
75       Subtarget.isTarget64BitLP64() || Subtarget.isTargetNaCl64();
76     StackPtr = Use64BitReg ? X86::RSP : X86::ESP;
77     FramePtr = Use64BitReg ? X86::RBP : X86::EBP;
78     BasePtr = Use64BitReg ? X86::RBX : X86::EBX;
79   } else {
80     SlotSize = 4;
81     StackPtr = X86::ESP;
82     FramePtr = X86::EBP;
83     BasePtr = X86::ESI;
84   }
85 }
86
87 bool
88 X86RegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const {
89   // ExeDepsFixer and PostRAScheduler require liveness.
90   return true;
91 }
92
93 int
94 X86RegisterInfo::getSEHRegNum(unsigned i) const {
95   return getEncodingValue(i);
96 }
97
98 const TargetRegisterClass *
99 X86RegisterInfo::getSubClassWithSubReg(const TargetRegisterClass *RC,
100                                        unsigned Idx) const {
101   // The sub_8bit sub-register index is more constrained in 32-bit mode.
102   // It behaves just like the sub_8bit_hi index.
103   if (!Is64Bit && Idx == X86::sub_8bit)
104     Idx = X86::sub_8bit_hi;
105
106   // Forward to TableGen's default version.
107   return X86GenRegisterInfo::getSubClassWithSubReg(RC, Idx);
108 }
109
110 const TargetRegisterClass *
111 X86RegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A,
112                                           const TargetRegisterClass *B,
113                                           unsigned SubIdx) const {
114   // The sub_8bit sub-register index is more constrained in 32-bit mode.
115   if (!Is64Bit && SubIdx == X86::sub_8bit) {
116     A = X86GenRegisterInfo::getSubClassWithSubReg(A, X86::sub_8bit_hi);
117     if (!A)
118       return nullptr;
119   }
120   return X86GenRegisterInfo::getMatchingSuperRegClass(A, B, SubIdx);
121 }
122
123 const TargetRegisterClass *
124 X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
125                                            const MachineFunction &MF) const {
126   // Don't allow super-classes of GR8_NOREX.  This class is only used after
127   // extracting sub_8bit_hi sub-registers.  The H sub-registers cannot be copied
128   // to the full GR8 register class in 64-bit mode, so we cannot allow the
129   // reigster class inflation.
130   //
131   // The GR8_NOREX class is always used in a way that won't be constrained to a
132   // sub-class, so sub-classes like GR8_ABCD_L are allowed to expand to the
133   // full GR8 class.
134   if (RC == &X86::GR8_NOREXRegClass)
135     return RC;
136
137   const TargetRegisterClass *Super = RC;
138   TargetRegisterClass::sc_iterator I = RC->getSuperClasses();
139   do {
140     switch (Super->getID()) {
141     case X86::GR8RegClassID:
142     case X86::GR16RegClassID:
143     case X86::GR32RegClassID:
144     case X86::GR64RegClassID:
145     case X86::FR32RegClassID:
146     case X86::FR64RegClassID:
147     case X86::RFP32RegClassID:
148     case X86::RFP64RegClassID:
149     case X86::RFP80RegClassID:
150     case X86::VR128RegClassID:
151     case X86::VR256RegClassID:
152       // Don't return a super-class that would shrink the spill size.
153       // That can happen with the vector and float classes.
154       if (Super->getSize() == RC->getSize())
155         return Super;
156     }
157     Super = *I++;
158   } while (Super);
159   return RC;
160 }
161
162 const TargetRegisterClass *
163 X86RegisterInfo::getPointerRegClass(const MachineFunction &MF,
164                                     unsigned Kind) const {
165   switch (Kind) {
166   default: llvm_unreachable("Unexpected Kind in getPointerRegClass!");
167   case 0: // Normal GPRs.
168     if (Subtarget.isTarget64BitLP64())
169       return &X86::GR64RegClass;
170     return &X86::GR32RegClass;
171   case 1: // Normal GPRs except the stack pointer (for encoding reasons).
172     if (Subtarget.isTarget64BitLP64())
173       return &X86::GR64_NOSPRegClass;
174     return &X86::GR32_NOSPRegClass;
175   case 2: // Available for tailcall (not callee-saved GPRs).
176     if (Subtarget.isTargetWin64())
177       return &X86::GR64_TCW64RegClass;
178     else if (Subtarget.is64Bit())
179       return &X86::GR64_TCRegClass;
180
181     const Function *F = MF.getFunction();
182     bool hasHipeCC = (F ? F->getCallingConv() == CallingConv::HiPE : false);
183     if (hasHipeCC)
184       return &X86::GR32RegClass;
185     return &X86::GR32_TCRegClass;
186   }
187 }
188
189 const TargetRegisterClass *
190 X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
191   if (RC == &X86::CCRRegClass) {
192     if (Is64Bit)
193       return &X86::GR64RegClass;
194     else
195       return &X86::GR32RegClass;
196   }
197   return RC;
198 }
199
200 unsigned
201 X86RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
202                                      MachineFunction &MF) const {
203   const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
204
205   unsigned FPDiff = TFI->hasFP(MF) ? 1 : 0;
206   switch (RC->getID()) {
207   default:
208     return 0;
209   case X86::GR32RegClassID:
210     return 4 - FPDiff;
211   case X86::GR64RegClassID:
212     return 12 - FPDiff;
213   case X86::VR128RegClassID:
214     return Subtarget.is64Bit() ? 10 : 4;
215   case X86::VR64RegClassID:
216     return 4;
217   }
218 }
219
220 const MCPhysReg *
221 X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
222   bool HasAVX = Subtarget.hasAVX();
223   bool HasAVX512 = Subtarget.hasAVX512();
224   bool CallsEHReturn = MF->getMMI().callsEHReturn();
225
226   assert(MF && "MachineFunction required");
227   switch (MF->getFunction()->getCallingConv()) {
228   case CallingConv::GHC:
229   case CallingConv::HiPE:
230     return CSR_NoRegs_SaveList;
231   case CallingConv::AnyReg:
232     if (HasAVX)
233       return CSR_64_AllRegs_AVX_SaveList;
234     return CSR_64_AllRegs_SaveList;
235   case CallingConv::PreserveMost:
236     return CSR_64_RT_MostRegs_SaveList;
237   case CallingConv::PreserveAll:
238     if (HasAVX)
239       return CSR_64_RT_AllRegs_AVX_SaveList;
240     return CSR_64_RT_AllRegs_SaveList;
241   case CallingConv::Intel_OCL_BI: {
242     if (HasAVX512 && IsWin64)
243       return CSR_Win64_Intel_OCL_BI_AVX512_SaveList;
244     if (HasAVX512 && Is64Bit)
245       return CSR_64_Intel_OCL_BI_AVX512_SaveList;
246     if (HasAVX && IsWin64)
247       return CSR_Win64_Intel_OCL_BI_AVX_SaveList;
248     if (HasAVX && Is64Bit)
249       return CSR_64_Intel_OCL_BI_AVX_SaveList;
250     if (!HasAVX && !IsWin64 && Is64Bit)
251       return CSR_64_Intel_OCL_BI_SaveList;
252     break;
253   }
254   case CallingConv::Cold:
255     if (Is64Bit)
256       return CSR_64_MostRegs_SaveList;
257     break;
258   case CallingConv::X86_64_Win64:
259     return CSR_Win64_SaveList;
260   case CallingConv::X86_64_SysV:
261     if (CallsEHReturn)
262       return CSR_64EHRet_SaveList;
263     return CSR_64_SaveList;
264   default:
265     break;
266   }
267
268   if (Is64Bit) {
269     if (IsWin64)
270       return CSR_Win64_SaveList;
271     if (CallsEHReturn)
272       return CSR_64EHRet_SaveList;
273     return CSR_64_SaveList;
274   }
275   if (CallsEHReturn)
276     return CSR_32EHRet_SaveList;
277   return CSR_32_SaveList;
278 }
279
280 const uint32_t*
281 X86RegisterInfo::getCallPreservedMask(CallingConv::ID CC) const {
282   bool HasAVX = Subtarget.hasAVX();
283   bool HasAVX512 = Subtarget.hasAVX512();
284
285   switch (CC) {
286   case CallingConv::GHC:
287   case CallingConv::HiPE:
288     return CSR_NoRegs_RegMask;
289   case CallingConv::AnyReg:
290     if (HasAVX)
291       return CSR_64_AllRegs_AVX_RegMask;
292     return CSR_64_AllRegs_RegMask;
293   case CallingConv::PreserveMost:
294     return CSR_64_RT_MostRegs_RegMask;
295   case CallingConv::PreserveAll:
296     if (HasAVX)
297       return CSR_64_RT_AllRegs_AVX_RegMask;
298     return CSR_64_RT_AllRegs_RegMask;
299   case CallingConv::Intel_OCL_BI: {
300     if (HasAVX512 && IsWin64)
301       return CSR_Win64_Intel_OCL_BI_AVX512_RegMask;
302     if (HasAVX512 && Is64Bit)
303       return CSR_64_Intel_OCL_BI_AVX512_RegMask;
304     if (HasAVX && IsWin64)
305       return CSR_Win64_Intel_OCL_BI_AVX_RegMask;
306     if (HasAVX && Is64Bit)
307       return CSR_64_Intel_OCL_BI_AVX_RegMask;
308     if (!HasAVX && !IsWin64 && Is64Bit)
309       return CSR_64_Intel_OCL_BI_RegMask;
310     break;
311   }
312   case CallingConv::Cold:
313     if (Is64Bit)
314       return CSR_64_MostRegs_RegMask;
315     break;
316   default:
317     break;
318   case CallingConv::X86_64_Win64:
319     return CSR_Win64_RegMask;
320   case CallingConv::X86_64_SysV:
321     return CSR_64_RegMask;
322   }
323
324   // Unlike getCalleeSavedRegs(), we don't have MMI so we can't check
325   // callsEHReturn().
326   if (Is64Bit) {
327     if (IsWin64)
328       return CSR_Win64_RegMask;
329     return CSR_64_RegMask;
330   }
331   return CSR_32_RegMask;
332 }
333
334 const uint32_t*
335 X86RegisterInfo::getNoPreservedMask() const {
336   return CSR_NoRegs_RegMask;
337 }
338
339 BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
340   BitVector Reserved(getNumRegs());
341   const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
342
343   // Set the stack-pointer register and its aliases as reserved.
344   for (MCSubRegIterator I(X86::RSP, this, /*IncludeSelf=*/true); I.isValid();
345        ++I)
346     Reserved.set(*I);
347
348   // Set the instruction pointer register and its aliases as reserved.
349   for (MCSubRegIterator I(X86::RIP, this, /*IncludeSelf=*/true); I.isValid();
350        ++I)
351     Reserved.set(*I);
352
353   // Set the frame-pointer register and its aliases as reserved if needed.
354   if (TFI->hasFP(MF)) {
355     for (MCSubRegIterator I(X86::RBP, this, /*IncludeSelf=*/true); I.isValid();
356          ++I)
357       Reserved.set(*I);
358   }
359
360   // Set the base-pointer register and its aliases as reserved if needed.
361   if (hasBasePointer(MF)) {
362     CallingConv::ID CC = MF.getFunction()->getCallingConv();
363     const uint32_t* RegMask = getCallPreservedMask(CC);
364     if (MachineOperand::clobbersPhysReg(RegMask, getBaseRegister()))
365       report_fatal_error(
366         "Stack realignment in presence of dynamic allocas is not supported with"
367         "this calling convention.");
368
369     unsigned BasePtr = getX86SubSuperRegister(getBaseRegister(), MVT::i64,
370                                               false);
371     for (MCSubRegIterator I(BasePtr, this, /*IncludeSelf=*/true);
372          I.isValid(); ++I)
373       Reserved.set(*I);
374   }
375
376   // Mark the segment registers as reserved.
377   Reserved.set(X86::CS);
378   Reserved.set(X86::SS);
379   Reserved.set(X86::DS);
380   Reserved.set(X86::ES);
381   Reserved.set(X86::FS);
382   Reserved.set(X86::GS);
383
384   // Mark the floating point stack registers as reserved.
385   for (unsigned n = 0; n != 8; ++n)
386     Reserved.set(X86::ST0 + n);
387
388   // Reserve the registers that only exist in 64-bit mode.
389   if (!Is64Bit) {
390     // These 8-bit registers are part of the x86-64 extension even though their
391     // super-registers are old 32-bits.
392     Reserved.set(X86::SIL);
393     Reserved.set(X86::DIL);
394     Reserved.set(X86::BPL);
395     Reserved.set(X86::SPL);
396
397     for (unsigned n = 0; n != 8; ++n) {
398       // R8, R9, ...
399       for (MCRegAliasIterator AI(X86::R8 + n, this, true); AI.isValid(); ++AI)
400         Reserved.set(*AI);
401
402       // XMM8, XMM9, ...
403       for (MCRegAliasIterator AI(X86::XMM8 + n, this, true); AI.isValid(); ++AI)
404         Reserved.set(*AI);
405     }
406   }
407   if (!Is64Bit || !Subtarget.hasAVX512()) {
408     for (unsigned n = 16; n != 32; ++n) {
409       for (MCRegAliasIterator AI(X86::XMM0 + n, this, true); AI.isValid(); ++AI)
410         Reserved.set(*AI);
411     }
412   }
413
414   return Reserved;
415 }
416
417 //===----------------------------------------------------------------------===//
418 // Stack Frame Processing methods
419 //===----------------------------------------------------------------------===//
420
421 bool X86RegisterInfo::hasBasePointer(const MachineFunction &MF) const {
422    const MachineFrameInfo *MFI = MF.getFrameInfo();
423
424    if (!EnableBasePointer)
425      return false;
426
427    // When we need stack realignment, we can't address the stack from the frame
428    // pointer.  When we have dynamic allocas or stack-adjusting inline asm, we
429    // can't address variables from the stack pointer.  MS inline asm can
430    // reference locals while also adjusting the stack pointer.  When we can't
431    // use both the SP and the FP, we need a separate base pointer register.
432    bool CantUseFP = needsStackRealignment(MF);
433    bool CantUseSP =
434        MFI->hasVarSizedObjects() || MFI->hasInlineAsmWithSPAdjust();
435    return CantUseFP && CantUseSP;
436 }
437
438 bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const {
439   if (MF.getFunction()->hasFnAttribute("no-realign-stack"))
440     return false;
441
442   const MachineFrameInfo *MFI = MF.getFrameInfo();
443   const MachineRegisterInfo *MRI = &MF.getRegInfo();
444
445   // Stack realignment requires a frame pointer.  If we already started
446   // register allocation with frame pointer elimination, it is too late now.
447   if (!MRI->canReserveReg(FramePtr))
448     return false;
449
450   // If a base pointer is necessary.  Check that it isn't too late to reserve
451   // it.
452   if (MFI->hasVarSizedObjects())
453     return MRI->canReserveReg(BasePtr);
454   return true;
455 }
456
457 bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
458   const MachineFrameInfo *MFI = MF.getFrameInfo();
459   const Function *F = MF.getFunction();
460   unsigned StackAlign =
461     MF.getSubtarget().getFrameLowering()->getStackAlignment();
462   bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
463                               F->hasFnAttribute(Attribute::StackAlignment));
464
465   // If we've requested that we force align the stack do so now.
466   if (ForceStackAlign)
467     return canRealignStack(MF);
468
469   return requiresRealignment && canRealignStack(MF);
470 }
471
472 bool X86RegisterInfo::hasReservedSpillSlot(const MachineFunction &MF,
473                                            unsigned Reg, int &FrameIdx) const {
474   // Since X86 defines assignCalleeSavedSpillSlots which always return true
475   // this function neither used nor tested.
476   llvm_unreachable("Unused function on X86. Otherwise need a test case.");
477 }
478
479 void
480 X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
481                                      int SPAdj, unsigned FIOperandNum,
482                                      RegScavenger *RS) const {
483   MachineInstr &MI = *II;
484   MachineFunction &MF = *MI.getParent()->getParent();
485   const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
486   int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
487   unsigned BasePtr;
488
489   unsigned Opc = MI.getOpcode();
490   bool AfterFPPop = Opc == X86::TAILJMPm64 || Opc == X86::TAILJMPm;
491   if (hasBasePointer(MF))
492     BasePtr = (FrameIndex < 0 ? FramePtr : getBaseRegister());
493   else if (needsStackRealignment(MF))
494     BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr);
495   else if (AfterFPPop)
496     BasePtr = StackPtr;
497   else
498     BasePtr = (TFI->hasFP(MF) ? FramePtr : StackPtr);
499
500   // FRAME_ALLOC uses a single offset, with no register. It only works in the
501   // simple FP case, and doesn't work with stack realignment. On 32-bit, the
502   // offset is from the traditional base pointer location.  On 64-bit, the
503   // offset is from the SP at the end of the prologue, not the FP location. This
504   // matches the behavior of llvm.frameaddress.
505   if (Opc == TargetOpcode::FRAME_ALLOC) {
506     assert(TFI->hasFP(MF) && "frame alloc requires FP");
507     MachineOperand &FI = MI.getOperand(FIOperandNum);
508     const MachineFrameInfo *MFI = MF.getFrameInfo();
509     int Offset = MFI->getObjectOffset(FrameIndex) - TFI->getOffsetOfLocalArea();
510     bool IsWinEH = MF.getTarget().getMCAsmInfo()->usesWindowsCFI();
511     if (IsWinEH)
512       Offset += MFI->getStackSize();
513     else
514       Offset += SlotSize;
515     FI.ChangeToImmediate(Offset);
516     return;
517   }
518
519   // For LEA64_32r when BasePtr is 32-bits (X32) we can use full-size 64-bit
520   // register as source operand, semantic is the same and destination is
521   // 32-bits. It saves one byte per lea in code since 0x67 prefix is avoided.
522   if (Opc == X86::LEA64_32r && X86::GR32RegClass.contains(BasePtr))
523     BasePtr = getX86SubSuperRegister(BasePtr, MVT::i64, false);
524
525   // This must be part of a four operand memory reference.  Replace the
526   // FrameIndex with base register with EBP.  Add an offset to the offset.
527   MI.getOperand(FIOperandNum).ChangeToRegister(BasePtr, false);
528
529   // Now add the frame object offset to the offset from EBP.
530   int FIOffset;
531   if (AfterFPPop) {
532     // Tail call jmp happens after FP is popped.
533     const MachineFrameInfo *MFI = MF.getFrameInfo();
534     FIOffset = MFI->getObjectOffset(FrameIndex) - TFI->getOffsetOfLocalArea();
535   } else
536     FIOffset = TFI->getFrameIndexOffset(MF, FrameIndex);
537
538   if (BasePtr == StackPtr)
539     FIOffset += SPAdj;
540
541   // The frame index format for stackmaps and patchpoints is different from the
542   // X86 format. It only has a FI and an offset.
543   if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) {
544     assert(BasePtr == FramePtr && "Expected the FP as base register");
545     int64_t Offset = MI.getOperand(FIOperandNum + 1).getImm() + FIOffset;
546     MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
547     return;
548   }
549
550   if (MI.getOperand(FIOperandNum+3).isImm()) {
551     // Offset is a 32-bit integer.
552     int Imm = (int)(MI.getOperand(FIOperandNum + 3).getImm());
553     int Offset = FIOffset + Imm;
554     assert((!Is64Bit || isInt<32>((long long)FIOffset + Imm)) &&
555            "Requesting 64-bit offset in 32-bit immediate!");
556     MI.getOperand(FIOperandNum + 3).ChangeToImmediate(Offset);
557   } else {
558     // Offset is symbolic. This is extremely rare.
559     uint64_t Offset = FIOffset +
560       (uint64_t)MI.getOperand(FIOperandNum+3).getOffset();
561     MI.getOperand(FIOperandNum + 3).setOffset(Offset);
562   }
563 }
564
565 unsigned X86RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
566   const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
567   return TFI->hasFP(MF) ? FramePtr : StackPtr;
568 }
569
570 unsigned X86RegisterInfo::getPtrSizedFrameRegister(
571     const MachineFunction &MF) const {
572   unsigned FrameReg = getFrameRegister(MF);
573   if (Subtarget.isTarget64BitILP32())
574     FrameReg = getX86SubSuperRegister(FrameReg, MVT::i32, false);
575   return FrameReg;
576 }
577
578 namespace llvm {
579 unsigned getX86SubSuperRegister(unsigned Reg, MVT::SimpleValueType VT,
580                                 bool High) {
581   switch (VT) {
582   default: llvm_unreachable("Unexpected VT");
583   case MVT::i8:
584     if (High) {
585       switch (Reg) {
586       default: return getX86SubSuperRegister(Reg, MVT::i64);
587       case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
588         return X86::SI;
589       case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
590         return X86::DI;
591       case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
592         return X86::BP;
593       case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
594         return X86::SP;
595       case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
596         return X86::AH;
597       case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
598         return X86::DH;
599       case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
600         return X86::CH;
601       case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
602         return X86::BH;
603       }
604     } else {
605       switch (Reg) {
606       default: llvm_unreachable("Unexpected register");
607       case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
608         return X86::AL;
609       case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
610         return X86::DL;
611       case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
612         return X86::CL;
613       case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
614         return X86::BL;
615       case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
616         return X86::SIL;
617       case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
618         return X86::DIL;
619       case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
620         return X86::BPL;
621       case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
622         return X86::SPL;
623       case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
624         return X86::R8B;
625       case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
626         return X86::R9B;
627       case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
628         return X86::R10B;
629       case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
630         return X86::R11B;
631       case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
632         return X86::R12B;
633       case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
634         return X86::R13B;
635       case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
636         return X86::R14B;
637       case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
638         return X86::R15B;
639       }
640     }
641   case MVT::i16:
642     switch (Reg) {
643     default: llvm_unreachable("Unexpected register");
644     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
645       return X86::AX;
646     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
647       return X86::DX;
648     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
649       return X86::CX;
650     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
651       return X86::BX;
652     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
653       return X86::SI;
654     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
655       return X86::DI;
656     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
657       return X86::BP;
658     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
659       return X86::SP;
660     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
661       return X86::R8W;
662     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
663       return X86::R9W;
664     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
665       return X86::R10W;
666     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
667       return X86::R11W;
668     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
669       return X86::R12W;
670     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
671       return X86::R13W;
672     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
673       return X86::R14W;
674     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
675       return X86::R15W;
676     }
677   case MVT::i32:
678     switch (Reg) {
679     default: llvm_unreachable("Unexpected register");
680     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
681       return X86::EAX;
682     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
683       return X86::EDX;
684     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
685       return X86::ECX;
686     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
687       return X86::EBX;
688     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
689       return X86::ESI;
690     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
691       return X86::EDI;
692     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
693       return X86::EBP;
694     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
695       return X86::ESP;
696     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
697       return X86::R8D;
698     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
699       return X86::R9D;
700     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
701       return X86::R10D;
702     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
703       return X86::R11D;
704     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
705       return X86::R12D;
706     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
707       return X86::R13D;
708     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
709       return X86::R14D;
710     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
711       return X86::R15D;
712     }
713   case MVT::i64:
714     switch (Reg) {
715     default: llvm_unreachable("Unexpected register");
716     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
717       return X86::RAX;
718     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
719       return X86::RDX;
720     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
721       return X86::RCX;
722     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
723       return X86::RBX;
724     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
725       return X86::RSI;
726     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
727       return X86::RDI;
728     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
729       return X86::RBP;
730     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
731       return X86::RSP;
732     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
733       return X86::R8;
734     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
735       return X86::R9;
736     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
737       return X86::R10;
738     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
739       return X86::R11;
740     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
741       return X86::R12;
742     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
743       return X86::R13;
744     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
745       return X86::R14;
746     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
747       return X86::R15;
748     }
749   }
750 }
751
752 unsigned get512BitSuperRegister(unsigned Reg) {
753   if (Reg >= X86::XMM0 && Reg <= X86::XMM31)
754     return X86::ZMM0 + (Reg - X86::XMM0);
755   if (Reg >= X86::YMM0 && Reg <= X86::YMM31)
756     return X86::ZMM0 + (Reg - X86::YMM0);
757   if (Reg >= X86::ZMM0 && Reg <= X86::ZMM31)
758     return Reg;
759   llvm_unreachable("Unexpected SIMD register");
760 }
761
762 }