LLVM API Documentation
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(); }