LLVM API Documentation

X86RegisterInfo.cpp

Go to the documentation of this file.
00001 //===- X86RegisterInfo.cpp - X86 Register Information -----------*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file contains the X86 implementation of the TargetRegisterInfo class.
00011 // This file is responsible for the frame pointer elimination optimization
00012 // on X86.
00013 //
00014 //===----------------------------------------------------------------------===//
00015 
00016 #include "X86.h"
00017 #include "X86RegisterInfo.h"
00018 #include "X86InstrBuilder.h"
00019 #include "X86MachineFunctionInfo.h"
00020 #include "X86Subtarget.h"
00021 #include "X86TargetMachine.h"
00022 #include "llvm/Constants.h"
00023 #include "llvm/Function.h"
00024 #include "llvm/Type.h"
00025 #include "llvm/CodeGen/ValueTypes.h"
00026 #include "llvm/CodeGen/MachineInstrBuilder.h"
00027 #include "llvm/CodeGen/MachineFunction.h"
00028 #include "llvm/CodeGen/MachineFunctionPass.h"
00029 #include "llvm/CodeGen/MachineFrameInfo.h"
00030 #include "llvm/CodeGen/MachineLocation.h"
00031 #include "llvm/CodeGen/MachineModuleInfo.h"
00032 #include "llvm/CodeGen/MachineRegisterInfo.h"
00033 #include "llvm/Target/TargetAsmInfo.h"
00034 #include "llvm/Target/TargetFrameInfo.h"
00035 #include "llvm/Target/TargetInstrInfo.h"
00036 #include "llvm/Target/TargetMachine.h"
00037 #include "llvm/Target/TargetOptions.h"
00038 #include "llvm/ADT/BitVector.h"
00039 #include "llvm/ADT/STLExtras.h"
00040 #include "llvm/Support/Compiler.h"
00041 using namespace llvm;
00042 
00043 X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
00044                                  const TargetInstrInfo &tii)
00045   : X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ?
00046                          X86::ADJCALLSTACKDOWN64 :
00047                          X86::ADJCALLSTACKDOWN32,
00048                        tm.getSubtarget<X86Subtarget>().is64Bit() ?
00049                          X86::ADJCALLSTACKUP64 :
00050                          X86::ADJCALLSTACKUP32),
00051     TM(tm), TII(tii) {
00052   // Cache some information.
00053   const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
00054   Is64Bit = Subtarget->is64Bit();
00055   IsWin64 = Subtarget->isTargetWin64();
00056   StackAlign = TM.getFrameInfo()->getStackAlignment();
00057   if (Is64Bit) {
00058     SlotSize = 8;
00059     StackPtr = X86::RSP;
00060     FramePtr = X86::RBP;
00061   } else {
00062     SlotSize = 4;
00063     StackPtr = X86::ESP;
00064     FramePtr = X86::EBP;
00065   }
00066 }
00067 
00068 // getDwarfRegNum - This function maps LLVM register identifiers to the
00069 // Dwarf specific numbering, used in debug info and exception tables.
00070 
00071 int X86RegisterInfo::getDwarfRegNum(unsigned RegNo, bool isEH) const {
00072   const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
00073   unsigned Flavour = DWARFFlavour::X86_64;
00074   if (!Subtarget->is64Bit()) {
00075     if (Subtarget->isTargetDarwin()) {
00076       if (isEH)
00077         Flavour = DWARFFlavour::X86_32_DarwinEH;
00078       else
00079         Flavour = DWARFFlavour::X86_32_Generic;
00080     } else if (Subtarget->isTargetCygMing()) {
00081       // Unsupported by now, just quick fallback
00082       Flavour = DWARFFlavour::X86_32_Generic;
00083     } else {
00084       Flavour = DWARFFlavour::X86_32_Generic;
00085     }
00086   }
00087 
00088   return X86GenRegisterInfo::getDwarfRegNumFull(RegNo, Flavour);
00089 }
00090 
00091 // getX86RegNum - This function maps LLVM register identifiers to their X86
00092 // specific numbering, which is used in various places encoding instructions.
00093 //
00094 unsigned X86RegisterInfo::getX86RegNum(unsigned RegNo) {
00095   switch(RegNo) {
00096   case X86::RAX: case X86::EAX: case X86::AX: case X86::AL: return N86::EAX;
00097   case X86::RCX: case X86::ECX: case X86::CX: case X86::CL: return N86::ECX;
00098   case X86::RDX: case X86::EDX: case X86::DX: case X86::DL: return N86::EDX;
00099   case X86::RBX: case X86::EBX: case X86::BX: case X86::BL: return N86::EBX;
00100   case X86::RSP: case X86::ESP: case X86::SP: case X86::SPL: case X86::AH:
00101     return N86::ESP;
00102   case X86::RBP: case X86::EBP: case X86::BP: case X86::BPL: case X86::CH:
00103     return N86::EBP;
00104   case X86::RSI: case X86::ESI: case X86::SI: case X86::SIL: case X86::DH:
00105     return N86::ESI;
00106   case X86::RDI: case X86::EDI: case X86::DI: case X86::DIL: case X86::BH:
00107     return N86::EDI;
00108 
00109   case X86::R8:  case X86::R8D:  case X86::R8W:  case X86::R8B:
00110     return N86::EAX;
00111   case X86::R9:  case X86::R9D:  case X86::R9W:  case X86::R9B:
00112     return N86::ECX;
00113   case X86::R10: case X86::R10D: case X86::R10W: case X86::R10B:
00114     return N86::EDX;
00115   case X86::R11: case X86::R11D: case X86::R11W: case X86::R11B:
00116     return N86::EBX;
00117   case X86::R12: case X86::R12D: case X86::R12W: case X86::R12B:
00118     return N86::ESP;
00119   case X86::R13: case X86::R13D: case X86::R13W: case X86::R13B:
00120     return N86::EBP;
00121   case X86::R14: case X86::R14D: case X86::R14W: case X86::R14B:
00122     return N86::ESI;
00123   case X86::R15: case X86::R15D: case X86::R15W: case X86::R15B:
00124     return N86::EDI;
00125 
00126   case X86::ST0: case X86::ST1: case X86::ST2: case X86::ST3:
00127   case X86::ST4: case X86::ST5: case X86::ST6: case X86::ST7:
00128     return RegNo-X86::ST0;
00129 
00130   case X86::XMM0: case X86::XMM8: case X86::MM0:
00131     return 0;
00132   case X86::XMM1: case X86::XMM9: case X86::MM1:
00133     return 1;
00134   case X86::XMM2: case X86::XMM10: case X86::MM2:
00135     return 2;
00136   case X86::XMM3: case X86::XMM11: case X86::MM3:
00137     return 3;
00138   case X86::XMM4: case X86::XMM12: case X86::MM4:
00139     return 4;
00140   case X86::XMM5: case X86::XMM13: case X86::MM5:
00141     return 5;
00142   case X86::XMM6: case X86::XMM14: case X86::MM6:
00143     return 6;
00144   case X86::XMM7: case X86::XMM15: case X86::MM7:
00145     return 7;
00146 
00147   default:
00148     assert(isVirtualRegister(RegNo) && "Unknown physical register!");
00149     assert(0 && "Register allocator hasn't allocated reg correctly yet!");
00150     return 0;
00151   }
00152 }
00153 
00154 const TargetRegisterClass *
00155 X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
00156   if (RC == &X86::CCRRegClass) {
00157     if (Is64Bit)
00158       return &X86::GR64RegClass;
00159     else
00160       return &X86::GR32RegClass;
00161   }
00162   return NULL;
00163 }
00164 
00165 const unsigned *
00166 X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
00167   bool callsEHReturn = false;
00168 
00169   if (MF) {
00170     const MachineFrameInfo *MFI = MF->getFrameInfo();
00171     const MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
00172     callsEHReturn = (MMI ? MMI->callsEHReturn() : false);
00173   }
00174 
00175   static const unsigned CalleeSavedRegs32Bit[] = {
00176     X86::ESI, X86::EDI, X86::EBX, X86::EBP,  0
00177   };
00178 
00179   static const unsigned CalleeSavedRegs32EHRet[] = {
00180     X86::EAX, X86::EDX, X86::ESI, X86::EDI, X86::EBX, X86::EBP,  0
00181   };
00182 
00183   static const unsigned CalleeSavedRegs64Bit[] = {
00184     X86::RBX, X86::R12, X86::R13, X86::R14, X86::R15, X86::RBP, 0
00185   };
00186 
00187   static const unsigned CalleeSavedRegs64EHRet[] = {
00188     X86::RAX, X86::RDX, X86::RBX, X86::R12,
00189     X86::R13, X86::R14, X86::R15, X86::RBP, 0
00190   };
00191 
00192   static const unsigned CalleeSavedRegsWin64[] = {
00193     X86::RBX,   X86::RBP,   X86::RDI,   X86::RSI,
00194     X86::R12,   X86::R13,   X86::R14,   X86::R15,
00195     X86::XMM6,  X86::XMM7,  X86::XMM8,  X86::XMM9,
00196     X86::XMM10, X86::XMM11, X86::XMM12, X86::XMM13,
00197     X86::XMM14, X86::XMM15, 0
00198   };
00199 
00200   if (Is64Bit) {
00201     if (IsWin64)
00202       return CalleeSavedRegsWin64;
00203     else
00204       return (callsEHReturn ? CalleeSavedRegs64EHRet : CalleeSavedRegs64Bit);
00205   } else {
00206     return (callsEHReturn ? CalleeSavedRegs32EHRet : CalleeSavedRegs32Bit);
00207   }
00208 }
00209 
00210 const TargetRegisterClass* const*
00211 X86RegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const {
00212   bool callsEHReturn = false;
00213 
00214   if (MF) {
00215     const MachineFrameInfo *MFI = MF->getFrameInfo();
00216     const MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
00217     callsEHReturn = (MMI ? MMI->callsEHReturn() : false);
00218   }
00219 
00220   static const TargetRegisterClass * const CalleeSavedRegClasses32Bit[] = {
00221     &X86::GR32RegClass, &X86::GR32RegClass,
00222     &X86::GR32RegClass, &X86::GR32RegClass,  0
00223   };
00224   static const TargetRegisterClass * const CalleeSavedRegClasses32EHRet[] = {
00225     &X86::GR32RegClass, &X86::GR32RegClass,
00226     &X86::GR32RegClass, &X86::GR32RegClass,
00227     &X86::GR32RegClass, &X86::GR32RegClass,  0
00228   };
00229   static const TargetRegisterClass * const CalleeSavedRegClasses64Bit[] = {
00230     &X86::GR64RegClass, &X86::GR64RegClass,
00231     &X86::GR64RegClass, &X86::GR64RegClass,
00232     &X86::GR64RegClass, &X86::GR64RegClass, 0
00233   };
00234   static const TargetRegisterClass * const CalleeSavedRegClasses64EHRet[] = {
00235     &X86::GR64RegClass, &X86::GR64RegClass,
00236     &X86::GR64RegClass, &X86::GR64RegClass,
00237     &X86::GR64RegClass, &X86::GR64RegClass,
00238     &X86::GR64RegClass, &X86::GR64RegClass, 0
00239   };
00240   static const TargetRegisterClass * const CalleeSavedRegClassesWin64[] = {
00241     &X86::GR64RegClass,  &X86::GR64RegClass,
00242     &X86::GR64RegClass,  &X86::GR64RegClass,
00243     &X86::GR64RegClass,  &X86::GR64RegClass,
00244     &X86::GR64RegClass,  &X86::GR64RegClass,
00245     &X86::VR128RegClass, &X86::VR128RegClass,
00246     &X86::VR128RegClass, &X86::VR128RegClass,
00247     &X86::VR128RegClass, &X86::VR128RegClass,
00248     &X86::VR128RegClass, &X86::VR128RegClass,
00249     &X86::VR128RegClass, &X86::VR128RegClass, 0
00250   };
00251 
00252   if (Is64Bit) {
00253     if (IsWin64)
00254       return CalleeSavedRegClassesWin64;
00255     else
00256       return (callsEHReturn ?
00257               CalleeSavedRegClasses64EHRet : CalleeSavedRegClasses64Bit);
00258   } else {
00259     return (callsEHReturn ?
00260             CalleeSavedRegClasses32EHRet : CalleeSavedRegClasses32Bit);
00261   }
00262 }
00263 
00264 BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
00265   BitVector Reserved(getNumRegs());
00266   // Set the stack-pointer register and its aliases as reserved.
00267   Reserved.set(X86::RSP);
00268   Reserved.set(X86::ESP);
00269   Reserved.set(X86::SP);
00270   Reserved.set(X86::SPL);
00271   // Set the frame-pointer register and its aliases as reserved if needed.
00272   if (hasFP(MF)) {
00273     Reserved.set(X86::RBP);
00274     Reserved.set(X86::EBP);
00275     Reserved.set(X86::BP);
00276     Reserved.set(X86::BPL);
00277   }
00278   // Mark the x87 stack registers as reserved, since they don't
00279   // behave normally with respect to liveness. We don't fully
00280   // model the effects of x87 stack pushes and pops after
00281   // stackification.
00282   Reserved.set(X86::ST0);
00283   Reserved.set(X86::ST1);
00284   Reserved.set(X86::ST2);
00285   Reserved.set(X86::ST3);
00286   Reserved.set(X86::ST4);
00287   Reserved.set(X86::ST5);
00288   Reserved.set(X86::ST6);
00289   Reserved.set(X86::ST7);
00290   return Reserved;
00291 }
00292 
00293 //===----------------------------------------------------------------------===//
00294 // Stack Frame Processing methods
00295 //===----------------------------------------------------------------------===//
00296 
00297 static unsigned calculateMaxStackAlignment(const MachineFrameInfo *FFI) {
00298   unsigned MaxAlign = 0;
00299   for (int i = FFI->getObjectIndexBegin(),
00300          e = FFI->getObjectIndexEnd(); i != e; ++i) {
00301     if (FFI->isDeadObjectIndex(i))
00302       continue;
00303     unsigned Align = FFI->getObjectAlignment(i);
00304     MaxAlign = std::max(MaxAlign, Align);
00305   }
00306 
00307   return MaxAlign;
00308 }
00309 
00310 // hasFP - Return true if the specified function should have a dedicated frame
00311 // pointer register.  This is true if the function has variable sized allocas or
00312 // if frame pointer elimination is disabled.
00313 //
00314 bool X86RegisterInfo::hasFP(const MachineFunction &MF) const {
00315   const MachineFrameInfo *MFI = MF.getFrameInfo();
00316   const MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
00317 
00318   return (NoFramePointerElim ||
00319           needsStackRealignment(MF) ||
00320           MFI->hasVarSizedObjects() ||
00321           MFI->isFrameAddressTaken() ||
00322           MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer() ||
00323           (MMI && MMI->callsUnwindInit()));
00324 }
00325 
00326 bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
00327   const MachineFrameInfo *MFI = MF.getFrameInfo();;
00328 
00329   // FIXME: Currently we don't support stack realignment for functions with
00330   // variable-sized allocas
00331   return (RealignStack &&
00332           (MFI->getMaxAlignment() > StackAlign &&
00333            !MFI->hasVarSizedObjects()));
00334 }
00335 
00336 bool X86RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
00337   return !MF.getFrameInfo()->hasVarSizedObjects();
00338 }
00339 
00340 int
00341 X86RegisterInfo::getFrameIndexOffset(MachineFunction &MF, int FI) const {
00342   int Offset = MF.getFrameInfo()->getObjectOffset(FI) + SlotSize;
00343   uint64_t StackSize = MF.getFrameInfo()->getStackSize();
00344 
00345   if (needsStackRealignment(MF)) {
00346     if (FI < 0)
00347       // Skip the saved EBP
00348       Offset += SlotSize;
00349     else {
00350       unsigned Align = MF.getFrameInfo()->getObjectAlignment(FI);
00351       assert( (-(Offset + StackSize)) % Align == 0);
00352       Align = 0;
00353       return Offset + StackSize;
00354     }
00355 
00356     // FIXME: Support tail calls
00357   } else {
00358     if (!hasFP(MF))
00359       return Offset + StackSize;
00360 
00361     // Skip the saved EBP
00362     Offset += SlotSize;
00363 
00364     // Skip the RETADDR move area
00365     X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
00366     int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
00367     if (TailCallReturnAddrDelta < 0) Offset -= TailCallReturnAddrDelta;
00368   }
00369 
00370   return Offset;
00371 }
00372 
00373 void X86RegisterInfo::
00374 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
00375                               MachineBasicBlock::iterator I) const {
00376   if (!hasReservedCallFrame(MF)) {
00377     // If the stack pointer can be changed after prologue, turn the
00378     // adjcallstackup instruction into a 'sub ESP, <amt>' and the
00379     // adjcallstackdown instruction into 'add ESP, <amt>'
00380     // TODO: consider using push / pop instead of sub + store / add
00381     MachineInstr *Old = I;
00382     uint64_t Amount = Old->getOperand(0).getImm();
00383     if (Amount != 0) {
00384       // We need to keep the stack aligned properly.  To do this, we round the
00385       // amount of space needed for the outgoing arguments up to the next
00386       // alignment boundary.
00387       Amount = (Amount+StackAlign-1)/StackAlign*StackAlign;
00388 
00389       MachineInstr *New = 0;
00390       if (Old->getOpcode() == getCallFrameSetupOpcode()) {
00391         New = BuildMI(MF, TII.get(Is64Bit ? X86::SUB64ri32 : X86::SUB32ri),
00392                       StackPtr).addReg(StackPtr).addImm(Amount);
00393       } else {
00394         assert(Old->getOpcode() == getCallFrameDestroyOpcode());
00395         // factor out the amount the callee already popped.
00396         uint64_t CalleeAmt = Old->getOperand(1).getImm();
00397         Amount -= CalleeAmt;
00398         if (Amount) {
00399           unsigned Opc = (Amount < 128) ?
00400             (Is64Bit ? X86::ADD64ri8 : X86::ADD32ri8) :
00401             (Is64Bit ? X86::ADD64ri32 : X86::ADD32ri);
00402           New = BuildMI(MF, TII.get(Opc), StackPtr)
00403             .addReg(StackPtr).addImm(Amount);
00404         }
00405       }
00406 
00407       if (New) {
00408         // The EFLAGS implicit def is dead.
00409         New->getOperand(3).setIsDead();
00410 
00411         // Replace the pseudo instruction with a new instruction...
00412         MBB.insert(I, New);
00413       }
00414     }
00415   } else if (I->getOpcode() == getCallFrameDestroyOpcode()) {
00416     // If we are performing frame pointer elimination and if the callee pops
00417     // something off the stack pointer, add it back.  We do this until we have
00418     // more advanced stack pointer tracking ability.
00419     if (uint64_t CalleeAmt = I->getOperand(1).getImm()) {
00420       unsigned Opc = (CalleeAmt < 128) ?
00421         (Is64Bit ? X86::SUB64ri8 : X86::SUB32ri8) :
00422         (Is64Bit ? X86::SUB64ri32 : X86::SUB32ri);
00423       MachineInstr *New =
00424         BuildMI(MF, TII.get(Opc), StackPtr).addReg(StackPtr).addImm(CalleeAmt);
00425       // The EFLAGS implicit def is dead.
00426       New->getOperand(3).setIsDead();
00427 
00428       MBB.insert(I, New);
00429     }
00430   }
00431 
00432   MBB.erase(I);
00433 }
00434 
00435 void X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
00436                                           int SPAdj, RegScavenger *RS) const{
00437   assert(SPAdj == 0 && "Unexpected");
00438 
00439   unsigned i = 0;
00440   MachineInstr &MI = *II;
00441   MachineFunction &MF = *MI.getParent()->getParent();
00442   while (!MI.getOperand(i).isFI()) {
00443     ++i;
00444     assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
00445   }
00446 
00447   int FrameIndex = MI.getOperand(i).getIndex();
00448 
00449   unsigned BasePtr;
00450   if (needsStackRealignment(MF))
00451     BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr);
00452   else
00453     BasePtr = (hasFP(MF) ? FramePtr : StackPtr);
00454 
00455   // This must be part of a four operand memory reference.  Replace the
00456   // FrameIndex with base register with EBP.  Add an offset to the offset.
00457   MI.getOperand(i).ChangeToRegister(BasePtr, false);
00458 
00459   // Now add the frame object offset to the offset from EBP.
00460   if (MI.getOperand(i+3).isImm()) {
00461     // Offset is a 32-bit integer.
00462     int Offset = getFrameIndexOffset(MF, FrameIndex) +
00463       (int)(MI.getOperand(i+3).getImm());
00464   
00465      MI.getOperand(i+3).ChangeToImmediate(Offset);
00466   } else {
00467     // Offset is symbolic. This is extremely rare.
00468     uint64_t Offset = getFrameIndexOffset(MF, FrameIndex) +
00469                       (uint64_t)MI.getOperand(i+3).getOffset();
00470     MI.getOperand(i+3).setOffset(Offset);
00471   }
00472 }
00473 
00474 void
00475 X86RegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
00476                                                       RegScavenger *RS) const {
00477   MachineFrameInfo *FFI = MF.getFrameInfo();
00478 
00479   // Calculate and set max stack object alignment early, so we can decide
00480   // whether we will need stack realignment (and thus FP).
00481   unsigned MaxAlign = std::max(FFI->getMaxAlignment(),
00482                                calculateMaxStackAlignment(FFI));
00483 
00484   FFI->setMaxAlignment(MaxAlign);
00485 }
00486 
00487 void
00488 X86RegisterInfo::processFunctionBeforeFrameFinalized(MachineFunction &MF) const{
00489   X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
00490   int32_t TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
00491   if (TailCallReturnAddrDelta < 0) {
00492     // create RETURNADDR area
00493     //   arg
00494     //   arg
00495     //   RETADDR
00496     //   { ...
00497     //     RETADDR area
00498     //     ...
00499     //   }
00500     //   [EBP]
00501     MF.getFrameInfo()->
00502       CreateFixedObject(-TailCallReturnAddrDelta,
00503                         (-1*SlotSize)+TailCallReturnAddrDelta);
00504   }
00505   if (hasFP(MF)) {
00506     assert((TailCallReturnAddrDelta <= 0) &&
00507            "The Delta should always be zero or negative");
00508     // Create a frame entry for the EBP register that must be saved.
00509     int FrameIdx = MF.getFrameInfo()->CreateFixedObject(SlotSize,
00510                                                         (int)SlotSize * -2+
00511                                                        TailCallReturnAddrDelta);
00512     assert(FrameIdx == MF.getFrameInfo()->getObjectIndexBegin() &&
00513            "Slot for EBP register must be last in order to be found!");
00514     FrameIdx = 0;
00515   }
00516 }
00517 
00518 /// emitSPUpdate - Emit a series of instructions to increment / decrement the
00519 /// stack pointer by a constant value.
00520 static
00521 void emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
00522                   unsigned StackPtr, int64_t NumBytes, bool Is64Bit,
00523                   const TargetInstrInfo &TII) {
00524   bool isSub = NumBytes < 0;
00525   uint64_t Offset = isSub ? -NumBytes : NumBytes;
00526   unsigned Opc = isSub
00527     ? ((Offset < 128) ?
00528        (Is64Bit ? X86::SUB64ri8 : X86::SUB32ri8) :
00529        (Is64Bit ? X86::SUB64ri32 : X86::SUB32ri))
00530     : ((Offset < 128) ?
00531        (Is64Bit ? X86::ADD64ri8 : X86::ADD32ri8) :
00532        (Is64Bit ? X86::ADD64ri32 : X86::ADD32ri));
00533   uint64_t Chunk = (1LL << 31) - 1;
00534 
00535   while (Offset) {
00536     uint64_t ThisVal = (Offset > Chunk) ? Chunk : Offset;
00537     MachineInstr *MI =
00538       BuildMI(MBB, MBBI, TII.get(Opc), StackPtr).addReg(StackPtr).addImm(ThisVal);
00539     // The EFLAGS implicit def is dead.
00540     MI->getOperand(3).setIsDead();
00541     Offset -= ThisVal;
00542   }
00543 }
00544 
00545 // mergeSPUpdatesUp - Merge two stack-manipulating instructions upper iterator.
00546 static
00547 void mergeSPUpdatesUp(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
00548                       unsigned StackPtr, uint64_t *NumBytes = NULL) {
00549   if (MBBI == MBB.begin()) return;
00550 
00551   MachineBasicBlock::iterator PI = prior(MBBI);
00552   unsigned Opc = PI->getOpcode();
00553   if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
00554        Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
00555       PI->getOperand(0).getReg() == StackPtr) {
00556     if (NumBytes)
00557       *NumBytes += PI->getOperand(2).getImm();
00558     MBB.erase(PI);
00559   } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
00560               Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
00561              PI->getOperand(0).getReg() == StackPtr) {
00562     if (NumBytes)
00563       *NumBytes -= PI->getOperand(2).getImm();
00564     MBB.erase(PI);
00565   }
00566 }
00567 
00568 // mergeSPUpdatesUp - Merge two stack-manipulating instructions lower iterator.
00569 static
00570 void mergeSPUpdatesDown(MachineBasicBlock &MBB,
00571                         MachineBasicBlock::iterator &MBBI,
00572                         unsigned StackPtr, uint64_t *NumBytes = NULL) {
00573   return;
00574 
00575   if (MBBI == MBB.end()) return;
00576 
00577   MachineBasicBlock::iterator NI = next(MBBI);
00578   if (NI == MBB.end()) return;
00579 
00580   unsigned Opc = NI->getOpcode();
00581   if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
00582        Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
00583       NI->getOperand(0).getReg() == StackPtr) {
00584     if (NumBytes)
00585       *NumBytes -= NI->getOperand(2).getImm();
00586     MBB.erase(NI);
00587     MBBI = NI;
00588   } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
00589               Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
00590              NI->getOperand(0).getReg() == StackPtr) {
00591     if (NumBytes)
00592       *NumBytes += NI->getOperand(2).getImm();
00593     MBB.erase(NI);
00594     MBBI = NI;
00595   }
00596 }
00597 
00598 /// mergeSPUpdates - Checks the instruction before/after the passed
00599 /// instruction. If it is an ADD/SUB instruction it is deleted
00600 /// argument and the stack adjustment is returned as a positive value for ADD
00601 /// and a negative for SUB.
00602 static int mergeSPUpdates(MachineBasicBlock &MBB,
00603                            MachineBasicBlock::iterator &MBBI,
00604                            unsigned StackPtr,
00605                            bool doMergeWithPrevious) {
00606 
00607   if ((doMergeWithPrevious && MBBI == MBB.begin()) ||
00608       (!doMergeWithPrevious && MBBI == MBB.end()))
00609     return 0;
00610 
00611   int Offset = 0;
00612 
00613   MachineBasicBlock::iterator PI = doMergeWithPrevious ? prior(MBBI) : MBBI;
00614   MachineBasicBlock::iterator NI = doMergeWithPrevious ? 0 : next(MBBI);
00615   unsigned Opc = PI->getOpcode();
00616   if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
00617        Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
00618       PI->getOperand(0).getReg() == StackPtr){
00619     Offset += PI->getOperand(2).getImm();
00620     MBB.erase(PI);
00621     if (!doMergeWithPrevious) MBBI = NI;
00622   } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
00623               Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
00624              PI->getOperand(0).getReg() == StackPtr) {
00625     Offset -= PI->getOperand(2).getImm();
00626     MBB.erase(PI);
00627     if (!doMergeWithPrevious) MBBI = NI;
00628   }
00629 
00630   return Offset;
00631 }
00632 
00633 void X86RegisterInfo::emitFrameMoves(MachineFunction &MF,
00634                                      unsigned FrameLabelId,
00635                                      unsigned ReadyLabelId) const {
00636   MachineFrameInfo *MFI = MF.getFrameInfo();
00637   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
00638   if (!MMI)
00639     return;
00640 
00641   uint64_t StackSize = MFI->getStackSize();
00642   std::vector<MachineMove> &Moves = MMI->getFrameMoves();
00643   const TargetData *TD = MF.getTarget().getTargetData();
00644 
00645   // Calculate amount of bytes used for return address storing
00646   int stackGrowth =
00647     (MF.getTarget().getFrameInfo()->getStackGrowthDirection() ==
00648      TargetFrameInfo::StackGrowsUp ?
00649      TD->getPointerSize() : -TD->getPointerSize());
00650 
00651   if (StackSize) {
00652     // Show update of SP.
00653     if (hasFP(MF)) {
00654       // Adjust SP
00655       MachineLocation SPDst(MachineLocation::VirtualFP);
00656       MachineLocation SPSrc(MachineLocation::VirtualFP, 2*stackGrowth);
00657       Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
00658     } else {
00659       MachineLocation SPDst(MachineLocation::VirtualFP);
00660       MachineLocation SPSrc(MachineLocation::VirtualFP,
00661                             -StackSize+stackGrowth);
00662       Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
00663     }
00664   } else {
00665     //FIXME: Verify & implement for FP
00666     MachineLocation SPDst(StackPtr);
00667     MachineLocation SPSrc(StackPtr, stackGrowth);
00668     Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
00669   }
00670 
00671   // Add callee saved registers to move list.
00672   const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
00673 
00674   // FIXME: This is dirty hack. The code itself is pretty mess right now.
00675   // It should be rewritten from scratch and generalized sometimes.
00676 
00677   // Determine maximum offset (minumum due to stack growth)
00678   int64_t MaxOffset = 0;
00679   for (unsigned I = 0, E = CSI.size(); I!=E; ++I)
00680     MaxOffset = std::min(MaxOffset,
00681                          MFI->getObjectOffset(CSI[I].getFrameIdx()));
00682 
00683   // Calculate offsets
00684   int64_t saveAreaOffset = (hasFP(MF) ? 3 : 2)*stackGrowth;
00685   for (unsigned I = 0, E = CSI.size(); I!=E; ++I) {
00686     int64_t Offset = MFI->getObjectOffset(CSI[I].getFrameIdx());
00687     unsigned Reg = CSI[I].getReg();
00688     Offset = (MaxOffset-Offset+saveAreaOffset);
00689     MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
00690     MachineLocation CSSrc(Reg);
00691     Moves.push_back(MachineMove(FrameLabelId, CSDst, CSSrc));
00692   }
00693 
00694   if (hasFP(MF)) {
00695     // Save FP
00696     MachineLocation FPDst(MachineLocation::VirtualFP, 2*stackGrowth);
00697     MachineLocation FPSrc(FramePtr);
00698     Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc));
00699   }
00700 
00701   MachineLocation FPDst(hasFP(MF) ? FramePtr : StackPtr);
00702   MachineLocation FPSrc(MachineLocation::VirtualFP);
00703   Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc));
00704 }
00705 
00706 
00707 void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
00708   MachineBasicBlock &MBB = MF.front();   // Prolog goes in entry BB
00709   MachineFrameInfo *MFI = MF.getFrameInfo();
00710   const Function* Fn = MF.getFunction();
00711   const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
00712   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
00713   X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
00714   MachineBasicBlock::iterator MBBI = MBB.begin();
00715   bool needsFrameMoves = (MMI && MMI->hasDebugInfo()) ||
00716                           !Fn->doesNotThrow() ||
00717                           UnwindTablesMandatory;
00718   // Prepare for frame info.
00719   unsigned FrameLabelId = 0;
00720 
00721   // Get the number of bytes to allocate from the FrameInfo.
00722   uint64_t StackSize = MFI->getStackSize();
00723   // Get desired stack alignment
00724   uint64_t MaxAlign  = MFI->getMaxAlignment();
00725 
00726   // Add RETADDR move area to callee saved frame size.
00727   int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
00728   if (TailCallReturnAddrDelta < 0)
00729     X86FI->setCalleeSavedFrameSize(
00730           X86FI->getCalleeSavedFrameSize() +(-TailCallReturnAddrDelta));
00731 
00732   // If this is x86-64 and the Red Zone is not disabled, if we are a leaf
00733   // function, and use up to 128 bytes of stack space, don't have a frame
00734   // pointer, calls, or dynamic alloca then we do not need to adjust the
00735   // stack pointer (we fit in the Red Zone).
00736   if (Is64Bit && !DisableRedZone &&
00737       !needsStackRealignment(MF) &&
00738       !MFI->hasVarSizedObjects() &&                // No dynamic alloca.
00739       !MFI->hasCalls()) {                          // No calls.
00740     uint64_t MinSize = X86FI->getCalleeSavedFrameSize();
00741     if (hasFP(MF)) MinSize += SlotSize;
00742     StackSize = std::max(MinSize,
00743                          StackSize > 128 ? StackSize - 128 : 0);
00744     MFI->setStackSize(StackSize);
00745   }
00746 
00747   // Insert stack pointer adjustment for later moving of return addr.  Only
00748   // applies to tail call optimized functions where the callee argument stack
00749   // size is bigger than the callers.
00750   if (TailCallReturnAddrDelta < 0) {
00751     MachineInstr *MI =
00752       BuildMI(MBB, MBBI, TII.get(Is64Bit? X86::SUB64ri32 : X86::SUB32ri),
00753               StackPtr).addReg(StackPtr).addImm(-TailCallReturnAddrDelta);
00754     // The EFLAGS implicit def is dead.
00755     MI->getOperand(3).setIsDead();
00756   }
00757 
00758   uint64_t NumBytes = 0;
00759   if (hasFP(MF)) {
00760     // Calculate required stack adjustment
00761     uint64_t FrameSize = StackSize - SlotSize;
00762     if (needsStackRealignment(MF))
00763       FrameSize = (FrameSize + MaxAlign - 1)/MaxAlign*MaxAlign;
00764 
00765     NumBytes = FrameSize - X86FI->getCalleeSavedFrameSize();
00766 
00767     // Get the offset of the stack slot for the EBP register... which is
00768     // guaranteed to be the last slot by processFunctionBeforeFrameFinalized.
00769     // Update the frame offset adjustment.
00770     MFI->setOffsetAdjustment(-NumBytes);
00771 
00772     // Save EBP into the appropriate stack slot...
00773     BuildMI(MBB, MBBI, TII.get(Is64Bit ? X86::PUSH64r : X86::PUSH32r))
00774       .addReg(FramePtr, /*isDef=*/false, /*isImp=*/false, /*isKill=*/true);
00775 
00776     if (needsFrameMoves) {
00777       // Mark effective beginning of when frame pointer becomes valid.
00778       FrameLabelId = MMI->NextLabelID();
00779       BuildMI(MBB, MBBI, TII.get(X86::DBG_LABEL)).addImm(FrameLabelId);
00780     }
00781 
00782     // Update EBP with the new base value...
00783     BuildMI(MBB, MBBI, TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr), FramePtr)
00784       .addReg(StackPtr);
00785 
00786     // Mark the FramePtr as live-in in every block except the entry.
00787     for (MachineFunction::iterator I = next(MF.begin()), E = MF.end();
00788          I != E; ++I)
00789       I->addLiveIn(FramePtr);
00790 
00791     // Realign stack
00792     if (needsStackRealignment(MF)) {
00793       MachineInstr *MI =
00794         BuildMI(MBB, MBBI,
00795                 TII.get(Is64Bit ? X86::AND64ri32 : X86::AND32ri),
00796                 StackPtr).addReg(StackPtr).addImm(-MaxAlign);
00797       // The EFLAGS implicit def is dead.
00798       MI->getOperand(3).setIsDead();
00799     }
00800   } else
00801     NumBytes = StackSize - X86FI->getCalleeSavedFrameSize();
00802 
00803   unsigned ReadyLabelId = 0;
00804   if (needsFrameMoves) {
00805     // Mark effective beginning of when frame pointer is ready.
00806     ReadyLabelId = MMI->NextLabelID();
00807     BuildMI(MBB, MBBI, TII.get(X86::DBG_LABEL)).addImm(ReadyLabelId);
00808   }
00809 
00810   // Skip the callee-saved push instructions.
00811   while (MBBI != MBB.end() &&
00812          (MBBI->getOpcode() == X86::PUSH32r ||
00813           MBBI->getOpcode() == X86::PUSH64r))
00814     ++MBBI;
00815 
00816   if (NumBytes) {   // adjust stack pointer: ESP -= numbytes
00817     if (NumBytes >= 4096 && Subtarget->isTargetCygMing()) {
00818       // Check, whether EAX is livein for this function
00819       bool isEAXAlive = false;
00820       for (MachineRegisterInfo::livein_iterator
00821            II = MF.getRegInfo().livein_begin(),
00822            EE = MF.getRegInfo().livein_end(); (II != EE) && !isEAXAlive; ++II) {
00823         unsigned Reg = II->first;
00824         isEAXAlive = (Reg == X86::EAX || Reg == X86::AX ||
00825                       Reg == X86::AH || Reg == X86::AL);
00826       }
00827 
00828       // Function prologue calls _alloca to probe the stack when allocating
00829       // more than 4k bytes in one go. Touching the stack at 4K increments is
00830       // necessary to ensure that the guard pages used by the OS virtual memory
00831       // manager are allocated in correct sequence.
00832       if (!isEAXAlive) {
00833         BuildMI(MBB, MBBI, TII.get(X86::MOV32ri), X86::EAX).addImm(NumBytes);
00834         BuildMI(MBB, MBBI, TII.get(X86::CALLpcrel32))
00835           .addExternalSymbol("_alloca");
00836       } else {
00837         // Save EAX
00838         BuildMI(MBB, MBBI, TII.get(X86::PUSH32r))
00839           .addReg(X86::EAX, /*isDef=*/false, /*isImp=*/false, /*isKill=*/true);
00840         // Allocate NumBytes-4 bytes on stack. We'll also use 4 already
00841         // allocated bytes for EAX.
00842         BuildMI(MBB, MBBI, TII.get(X86::MOV32ri), X86::EAX).addImm(NumBytes-4);
00843         BuildMI(MBB, MBBI, TII.get(X86::CALLpcrel32))
00844           .addExternalSymbol("_alloca");
00845         // Restore EAX
00846         MachineInstr *MI = addRegOffset(BuildMI(MF, TII.get(X86::MOV32rm),X86::EAX),
00847                                         StackPtr, false, NumBytes-4);
00848         MBB.insert(MBBI, MI);
00849       }
00850     } else {
00851       // If there is an SUB32ri of ESP immediately before this instruction,
00852       // merge the two. This can be the case when tail call elimination is
00853       // enabled and the callee has more arguments then the caller.
00854       NumBytes -= mergeSPUpdates(MBB, MBBI, StackPtr, true);
00855       // If there is an ADD32ri or SUB32ri of ESP immediately after this
00856       // instruction, merge the two instructions.
00857       mergeSPUpdatesDown(MBB, MBBI, StackPtr, &NumBytes);
00858 
00859       if (NumBytes)
00860         emitSPUpdate(MBB, MBBI, StackPtr, -(int64_t)NumBytes, Is64Bit, TII);
00861     }
00862   }
00863 
00864   if (needsFrameMoves)
00865     emitFrameMoves(MF, FrameLabelId, ReadyLabelId);
00866 }
00867 
00868 void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
00869                                    MachineBasicBlock &MBB) const {
00870   const MachineFrameInfo *MFI = MF.getFrameInfo();
00871   X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
00872   MachineBasicBlock::iterator MBBI = prior(MBB.end());
00873   unsigned RetOpcode = MBBI->getOpcode();
00874 
00875   switch (RetOpcode) {
00876   case X86::RET:
00877   case X86::RETI:
00878   case X86::TCRETURNdi:
00879   case X86::TCRETURNri:
00880   case X86::TCRETURNri64:
00881   case X86::TCRETURNdi64:
00882   case X86::EH_RETURN:
00883   case X86::EH_RETURN64:
00884   case X86::TAILJMPd:
00885   case X86::TAILJMPr:
00886   case X86::TAILJMPm: break;  // These are ok
00887   default:
00888     assert(0 && "Can only insert epilog into returning blocks");
00889   }
00890 
00891   // Get the number of bytes to allocate from the FrameInfo
00892   uint64_t StackSize = MFI->getStackSize();
00893   uint64_t MaxAlign  = MFI->getMaxAlignment();
00894   unsigned CSSize = X86FI->getCalleeSavedFrameSize();
00895   uint64_t NumBytes = 0;
00896 
00897   if (hasFP(MF)) {
00898     // Calculate required stack adjustment
00899     uint64_t FrameSize = StackSize - SlotSize;
00900     if (needsStackRealignment(MF))
00901       FrameSize = (FrameSize + MaxAlign - 1)/MaxAlign*MaxAlign;
00902 
00903     NumBytes = FrameSize - CSSize;
00904 
00905     // pop EBP.
00906     BuildMI(MBB, MBBI, TII.get(Is64Bit ? X86::POP64r : X86::POP32r), FramePtr);
00907   } else
00908     NumBytes = StackSize - CSSize;
00909 
00910   // Skip the callee-saved pop instructions.
00911   MachineBasicBlock::iterator LastCSPop = MBBI;
00912   while (MBBI != MBB.begin()) {
00913     MachineBasicBlock::iterator PI = prior(MBBI);
00914     unsigned Opc = PI->getOpcode();
00915     if (Opc != X86::POP32r && Opc != X86::POP64r &&
00916         !PI->getDesc().isTerminator())
00917       break;
00918     --MBBI;
00919   }
00920 
00921   // If there is an ADD32ri or SUB32ri of ESP immediately before this
00922   // instruction, merge the two instructions.
00923   if (NumBytes || MFI->hasVarSizedObjects())
00924     mergeSPUpdatesUp(MBB, MBBI, StackPtr, &NumBytes);
00925 
00926   // If dynamic alloca is used, then reset esp to point to the last callee-saved
00927   // slot before popping them off! Same applies for the case, when stack was
00928   // realigned
00929   if (needsStackRealignment(MF)) {
00930     // We cannot use LEA here, because stack pointer was realigned. We need to
00931     // deallocate local frame back
00932     if (CSSize) {
00933       emitSPUpdate(MBB, MBBI, StackPtr, NumBytes, Is64Bit, TII);
00934       MBBI = prior(LastCSPop);
00935     }
00936 
00937     BuildMI(MBB, MBBI,
00938             TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr),
00939             StackPtr).addReg(FramePtr);
00940   } else if (MFI->hasVarSizedObjects()) {
00941     if (CSSize) {
00942       unsigned Opc = Is64Bit ? X86::LEA64r : X86::LEA32r;
00943       MachineInstr *MI = addRegOffset(BuildMI(MF, TII.get(Opc), StackPtr),
00944                                       FramePtr, false, -CSSize);
00945       MBB.insert(MBBI, MI);
00946     } else
00947       BuildMI(MBB, MBBI, TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr),
00948               StackPtr).addReg(FramePtr);
00949 
00950   } else {
00951     // adjust stack pointer back: ESP += numbytes
00952     if (NumBytes)
00953       emitSPUpdate(MBB, MBBI, StackPtr, NumBytes, Is64Bit, TII);
00954   }
00955 
00956   // We're returning from function via eh_return.
00957   if (RetOpcode == X86::EH_RETURN || RetOpcode == X86::EH_RETURN64) {
00958     MBBI = prior(MBB.end());
00959     MachineOperand &DestAddr  = MBBI->getOperand(0);
00960     assert(DestAddr.isReg() && "Offset should be in register!");
00961     BuildMI(MBB, MBBI,
00962             TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr),
00963             StackPtr).addReg(DestAddr.getReg());
00964   // Tail call return: adjust the stack pointer and jump to callee
00965   } else if (RetOpcode == X86::TCRETURNri || RetOpcode == X86::TCRETURNdi ||
00966              RetOpcode== X86::TCRETURNri64 || RetOpcode == X86::TCRETURNdi64) {
00967     MBBI = prior(MBB.end());
00968     MachineOperand &JumpTarget = MBBI->getOperand(0);
00969     MachineOperand &StackAdjust = MBBI->getOperand(1);
00970     assert(StackAdjust.isImm() && "Expecting immediate value.");
00971 
00972     // Adjust stack pointer.
00973     int StackAdj = StackAdjust.getImm();
00974     int MaxTCDelta = X86FI->getTCReturnAddrDelta();
00975     int Offset = 0;
00976     assert(MaxTCDelta <= 0 && "MaxTCDelta should never be positive");
00977     // Incoporate the retaddr area.
00978     Offset = StackAdj-MaxTCDelta;
00979     assert(Offset >= 0 && "Offset should never be negative");
00980     if (Offset) {
00981       // Check for possible merge with preceeding ADD instruction.
00982       Offset += mergeSPUpdates(MBB, MBBI, StackPtr, true);
00983       emitSPUpdate(MBB, MBBI, StackPtr, Offset, Is64Bit, TII);
00984     }
00985     // Jump to label or value in register.
00986     if (RetOpcode == X86::TCRETURNdi|| RetOpcode == X86::TCRETURNdi64)
00987       BuildMI(MBB, MBBI, TII.get(X86::TAILJMPd)).
00988         addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset());
00989     else if (RetOpcode== X86::TCRETURNri64) {
00990       BuildMI(MBB, MBBI, TII.get(X86::TAILJMPr64), JumpTarget.getReg());
00991     } else
00992        BuildMI(MBB, MBBI, TII.get(X86::TAILJMPr), JumpTarget.getReg());
00993     // Delete the pseudo instruction TCRETURN.
00994     MBB.erase(MBBI);
00995   } else if ((RetOpcode == X86::RET || RetOpcode == X86::RETI) &&
00996              (X86FI->getTCReturnAddrDelta() < 0)) {
00997     // Add the return addr area delta back since we are not tail calling.
00998     int delta = -1*X86FI->getTCReturnAddrDelta();
00999     MBBI = prior(MBB.end());
01000     // Check for possible merge with preceeding ADD instruction.
01001     delta += mergeSPUpdates(MBB, MBBI, StackPtr, true);
01002     emitSPUpdate(MBB, MBBI, StackPtr, delta, Is64Bit, TII);
01003   }
01004 }
01005 
01006 unsigned X86RegisterInfo::getRARegister() const {
01007   if (Is64Bit)
01008     return X86::RIP;  // Should have dwarf #16
01009   else
01010     return X86::EIP;  // Should have dwarf #8
01011 }
01012 
01013 unsigned X86RegisterInfo::getFrameRegister(MachineFunction &MF) const {
01014   return hasFP(MF) ? FramePtr : StackPtr;
01015 }
01016 
01017 void X86RegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves)
01018                                                                          const {
01019   // Calculate amount of bytes used for return address storing
01020   int stackGrowth = (Is64Bit ? -8 : -4);
01021 
01022   // Initial state of the frame pointer is esp+4.
01023   MachineLocation Dst(MachineLocation::VirtualFP);
01024   MachineLocation Src(StackPtr, stackGrowth);
01025   Moves.push_back(MachineMove(0, Dst, Src));
01026 
01027   // Add return address to move list
01028   MachineLocation CSDst(StackPtr, stackGrowth);
01029   MachineLocation CSSrc(getRARegister());
01030   Moves.push_back(MachineMove(0, CSDst, CSSrc));
01031 }
01032 
01033 unsigned X86RegisterInfo::getEHExceptionRegister() const {
01034   assert(0 && "What is the exception register");
01035   return 0;
01036 }
01037 
01038 unsigned X86RegisterInfo::getEHHandlerRegister() const {
01039   assert(0 && "What is the exception handler register");
01040   return 0;
01041 }
01042 
01043 namespace llvm {
01044 unsigned getX86SubSuperRegister(unsigned Reg, MVT VT, bool High) {
01045   switch (VT.getSimpleVT()) {
01046   default: return Reg;
01047   case MVT::i8:
01048     if (High) {
01049       switch (Reg) {
01050       default: return 0;
01051       case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
01052         return X86::AH;
01053       case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
01054         return X86::DH;
01055       case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
01056         return X86::CH;
01057       case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
01058         return X86::BH;
01059       }
01060     } else {
01061       switch (Reg) {
01062       default: return 0;
01063       case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
01064         return X86::AL;
01065       case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
01066         return X86::DL;
01067       case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
01068         return X86::CL;
01069       case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
01070         return X86::BL;
01071       case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
01072         return X86::SIL;
01073       case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
01074         return X86::DIL;
01075       case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
01076         return X86::BPL;
01077       case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
01078         return X86::SPL;
01079       case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
01080         return X86::R8B;
01081       case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
01082         return X86::R9B;
01083       case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
01084         return X86::R10B;
01085       case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
01086         return X86::R11B;
01087       case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
01088         return X86::R12B;
01089       case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
01090         return X86::R13B;
01091       case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
01092         return X86::R14B;
01093       case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
01094         return X86::R15B;
01095       }
01096     }
01097   case MVT::i16:
01098     switch (Reg) {
01099     default: return Reg;
01100     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
01101       return X86::AX;
01102     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
01103       return X86::DX;
01104     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
01105       return X86::CX;
01106     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
01107       return X86::BX;
01108     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
01109       return X86::SI;
01110     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
01111       return X86::DI;
01112     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
01113       return X86::BP;
01114     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
01115       return X86::SP;
01116     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
01117       return X86::R8W;
01118     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
01119       return X86::R9W;
01120     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
01121       return X86::R10W;
01122     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
01123       return X86::R11W;
01124     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
01125       return X86::R12W;
01126     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
01127       return X86::R13W;
01128     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
01129       return X86::R14W;
01130     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
01131       return X86::R15W;
01132     }
01133   case MVT::i32:
01134     switch (Reg) {
01135     default: return Reg;
01136     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
01137       return X86::EAX;
01138     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
01139       return X86::EDX;
01140     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
01141       return X86::ECX;
01142     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
01143       return X86::EBX;
01144     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
01145       return X86::ESI;
01146     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
01147       return X86::EDI;
01148     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
01149       return X86::EBP;
01150     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
01151       return X86::ESP;
01152     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
01153       return X86::R8D;
01154     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
01155       return X86::R9D;
01156     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
01157       return X86::R10D;
01158     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
01159       return X86::R11D;
01160     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
01161       return X86::R12D;
01162     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
01163       return X86::R13D;
01164     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
01165       return X86::R14D;
01166     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
01167       return X86::R15D;
01168     }
01169   case MVT::i64:
01170     switch (Reg) {
01171     default: return Reg;
01172     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
01173       return X86::RAX;
01174     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
01175       return X86::RDX;
01176     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
01177       return X86::RCX;
01178     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
01179       return X86::RBX;
01180     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
01181       return X86::RSI;
01182     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
01183       return X86::RDI;
01184     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
01185       return X86::RBP;
01186     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
01187       return X86::RSP;
01188     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
01189       return X86::R8;
01190     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
01191       return X86::R9;
01192     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
01193       return X86::R10;
01194     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
01195       return X86::R11;
01196     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
01197       return X86::R12;
01198     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
01199       return X86::R13;
01200     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
01201       return X86::R14;
01202     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
01203       return X86::R15;
01204     }
01205   }
01206 
01207   return Reg;
01208 }
01209 }
01210 
01211 #include "X86GenRegisterInfo.inc"
01212 
01213 namespace {
01214   struct VISIBILITY_HIDDEN MSAC : public MachineFunctionPass {
01215     static char ID;
01216     MSAC() : MachineFunctionPass(&ID) {}
01217 
01218     virtual bool runOnMachineFunction(MachineFunction &MF) {
01219       MachineFrameInfo *FFI = MF.getFrameInfo();
01220       MachineRegisterInfo &RI = MF.getRegInfo();
01221 
01222       // Calculate max stack alignment of all already allocated stack objects.
01223       unsigned MaxAlign = calculateMaxStackAlignment(FFI);
01224 
01225       // Be over-conservative: scan over all vreg defs and find, whether vector
01226       // registers are used. If yes - there is probability, that vector register
01227       // will be spilled and thus stack needs to be aligned properly.
01228       for (unsigned RegNum = TargetRegisterInfo::FirstVirtualRegister;
01229            RegNum < RI.getLastVirtReg(); ++RegNum)
01230         MaxAlign = std::max(MaxAlign, RI.getRegClass(RegNum)->getAlignment());
01231 
01232       FFI->setMaxAlignment(MaxAlign);
01233 
01234       return false;
01235     }
01236 
01237     virtual const char *getPassName() const {
01238       return "X86 Maximal Stack Alignment Calculator";
01239     }
01240   };
01241 
01242   char MSAC::ID = 0;
01243 }
01244 
01245 FunctionPass*
01246 llvm::createX86MaxStackAlignmentCalculatorPass() { return new MSAC(); }