LLVM API Documentation
00001 //===- SPURegisterInfo.cpp - Cell SPU Register Information ----------------===// 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 Cell implementation of the TargetRegisterInfo class. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #define DEBUG_TYPE "reginfo" 00015 #include "SPU.h" 00016 #include "SPURegisterInfo.h" 00017 #include "SPURegisterNames.h" 00018 #include "SPUInstrBuilder.h" 00019 #include "SPUSubtarget.h" 00020 #include "SPUMachineFunction.h" 00021 #include "SPUFrameInfo.h" 00022 #include "llvm/Constants.h" 00023 #include "llvm/Type.h" 00024 #include "llvm/CodeGen/ValueTypes.h" 00025 #include "llvm/CodeGen/MachineInstrBuilder.h" 00026 #include "llvm/CodeGen/MachineModuleInfo.h" 00027 #include "llvm/CodeGen/MachineFunction.h" 00028 #include "llvm/CodeGen/MachineFrameInfo.h" 00029 #include "llvm/CodeGen/MachineLocation.h" 00030 #include "llvm/CodeGen/MachineRegisterInfo.h" 00031 #include "llvm/CodeGen/ValueTypes.h" 00032 #include "llvm/Target/TargetFrameInfo.h" 00033 #include "llvm/Target/TargetInstrInfo.h" 00034 #include "llvm/Target/TargetMachine.h" 00035 #include "llvm/Target/TargetOptions.h" 00036 #include "llvm/Support/CommandLine.h" 00037 #include "llvm/Support/Debug.h" 00038 #include "llvm/Support/MathExtras.h" 00039 #include "llvm/ADT/BitVector.h" 00040 #include "llvm/ADT/STLExtras.h" 00041 #include <cstdlib> 00042 00043 using namespace llvm; 00044 00045 /// getRegisterNumbering - Given the enum value for some register, e.g. 00046 /// PPC::F14, return the number that it corresponds to (e.g. 14). 00047 unsigned SPURegisterInfo::getRegisterNumbering(unsigned RegEnum) { 00048 using namespace SPU; 00049 switch (RegEnum) { 00050 case SPU::R0: return 0; 00051 case SPU::R1: return 1; 00052 case SPU::R2: return 2; 00053 case SPU::R3: return 3; 00054 case SPU::R4: return 4; 00055 case SPU::R5: return 5; 00056 case SPU::R6: return 6; 00057 case SPU::R7: return 7; 00058 case SPU::R8: return 8; 00059 case SPU::R9: return 9; 00060 case SPU::R10: return 10; 00061 case SPU::R11: return 11; 00062 case SPU::R12: return 12; 00063 case SPU::R13: return 13; 00064 case SPU::R14: return 14; 00065 case SPU::R15: return 15; 00066 case SPU::R16: return 16; 00067 case SPU::R17: return 17; 00068 case SPU::R18: return 18; 00069 case SPU::R19: return 19; 00070 case SPU::R20: return 20; 00071 case SPU::R21: return 21; 00072 case SPU::R22: return 22; 00073 case SPU::R23: return 23; 00074 case SPU::R24: return 24; 00075 case SPU::R25: return 25; 00076 case SPU::R26: return 26; 00077 case SPU::R27: return 27; 00078 case SPU::R28: return 28; 00079 case SPU::R29: return 29; 00080 case SPU::R30: return 30; 00081 case SPU::R31: return 31; 00082 case SPU::R32: return 32; 00083 case SPU::R33: return 33; 00084 case SPU::R34: return 34; 00085 case SPU::R35: return 35; 00086 case SPU::R36: return 36; 00087 case SPU::R37: return 37; 00088 case SPU::R38: return 38; 00089 case SPU::R39: return 39; 00090 case SPU::R40: return 40; 00091 case SPU::R41: return 41; 00092 case SPU::R42: return 42; 00093 case SPU::R43: return 43; 00094 case SPU::R44: return 44; 00095 case SPU::R45: return 45; 00096 case SPU::R46: return 46; 00097 case SPU::R47: return 47; 00098 case SPU::R48: return 48; 00099 case SPU::R49: return 49; 00100 case SPU::R50: return 50; 00101 case SPU::R51: return 51; 00102 case SPU::R52: return 52; 00103 case SPU::R53: return 53; 00104 case SPU::R54: return 54; 00105 case SPU::R55: return 55; 00106 case SPU::R56: return 56; 00107 case SPU::R57: return 57; 00108 case SPU::R58: return 58; 00109 case SPU::R59: return 59; 00110 case SPU::R60: return 60; 00111 case SPU::R61: return 61; 00112 case SPU::R62: return 62; 00113 case SPU::R63: return 63; 00114 case SPU::R64: return 64; 00115 case SPU::R65: return 65; 00116 case SPU::R66: return 66; 00117 case SPU::R67: return 67; 00118 case SPU::R68: return 68; 00119 case SPU::R69: return 69; 00120 case SPU::R70: return 70; 00121 case SPU::R71: return 71; 00122 case SPU::R72: return 72; 00123 case SPU::R73: return 73; 00124 case SPU::R74: return 74; 00125 case SPU::R75: return 75; 00126 case SPU::R76: return 76; 00127 case SPU::R77: return 77; 00128 case SPU::R78: return 78; 00129 case SPU::R79: return 79; 00130 case SPU::R80: return 80; 00131 case SPU::R81: return 81; 00132 case SPU::R82: return 82; 00133 case SPU::R83: return 83; 00134 case SPU::R84: return 84; 00135 case SPU::R85: return 85; 00136 case SPU::R86: return 86; 00137 case SPU::R87: return 87; 00138 case SPU::R88: return 88; 00139 case SPU::R89: return 89; 00140 case SPU::R90: return 90; 00141 case SPU::R91: return 91; 00142 case SPU::R92: return 92; 00143 case SPU::R93: return 93; 00144 case SPU::R94: return 94; 00145 case SPU::R95: return 95; 00146 case SPU::R96: return 96; 00147 case SPU::R97: return 97; 00148 case SPU::R98: return 98; 00149 case SPU::R99: return 99; 00150 case SPU::R100: return 100; 00151 case SPU::R101: return 101; 00152 case SPU::R102: return 102; 00153 case SPU::R103: return 103; 00154 case SPU::R104: return 104; 00155 case SPU::R105: return 105; 00156 case SPU::R106: return 106; 00157 case SPU::R107: return 107; 00158 case SPU::R108: return 108; 00159 case SPU::R109: return 109; 00160 case SPU::R110: return 110; 00161 case SPU::R111: return 111; 00162 case SPU::R112: return 112; 00163 case SPU::R113: return 113; 00164 case SPU::R114: return 114; 00165 case SPU::R115: return 115; 00166 case SPU::R116: return 116; 00167 case SPU::R117: return 117; 00168 case SPU::R118: return 118; 00169 case SPU::R119: return 119; 00170 case SPU::R120: return 120; 00171 case SPU::R121: return 121; 00172 case SPU::R122: return 122; 00173 case SPU::R123: return 123; 00174 case SPU::R124: return 124; 00175 case SPU::R125: return 125; 00176 case SPU::R126: return 126; 00177 case SPU::R127: return 127; 00178 default: 00179 cerr << "Unhandled reg in SPURegisterInfo::getRegisterNumbering!\n"; 00180 abort(); 00181 } 00182 } 00183 00184 SPURegisterInfo::SPURegisterInfo(const SPUSubtarget &subtarget, 00185 const TargetInstrInfo &tii) : 00186 SPUGenRegisterInfo(SPU::ADJCALLSTACKDOWN, SPU::ADJCALLSTACKUP), 00187 Subtarget(subtarget), 00188 TII(tii) 00189 { 00190 } 00191 00192 // SPU's 128-bit registers used for argument passing: 00193 static const unsigned SPU_ArgRegs[] = { 00194 SPU::R3, SPU::R4, SPU::R5, SPU::R6, SPU::R7, SPU::R8, SPU::R9, 00195 SPU::R10, SPU::R11, SPU::R12, SPU::R13, SPU::R14, SPU::R15, SPU::R16, 00196 SPU::R17, SPU::R18, SPU::R19, SPU::R20, SPU::R21, SPU::R22, SPU::R23, 00197 SPU::R24, SPU::R25, SPU::R26, SPU::R27, SPU::R28, SPU::R29, SPU::R30, 00198 SPU::R31, SPU::R32, SPU::R33, SPU::R34, SPU::R35, SPU::R36, SPU::R37, 00199 SPU::R38, SPU::R39, SPU::R40, SPU::R41, SPU::R42, SPU::R43, SPU::R44, 00200 SPU::R45, SPU::R46, SPU::R47, SPU::R48, SPU::R49, SPU::R50, SPU::R51, 00201 SPU::R52, SPU::R53, SPU::R54, SPU::R55, SPU::R56, SPU::R57, SPU::R58, 00202 SPU::R59, SPU::R60, SPU::R61, SPU::R62, SPU::R63, SPU::R64, SPU::R65, 00203 SPU::R66, SPU::R67, SPU::R68, SPU::R69, SPU::R70, SPU::R71, SPU::R72, 00204 SPU::R73, SPU::R74, SPU::R75, SPU::R76, SPU::R77, SPU::R78, SPU::R79 00205 }; 00206 00207 const unsigned * 00208 SPURegisterInfo::getArgRegs() 00209 { 00210 return SPU_ArgRegs; 00211 } 00212 00213 unsigned 00214 SPURegisterInfo::getNumArgRegs() 00215 { 00216 return sizeof(SPU_ArgRegs) / sizeof(SPU_ArgRegs[0]); 00217 } 00218 00219 const unsigned * 00220 SPURegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const 00221 { 00222 // Cell ABI calling convention 00223 static const unsigned SPU_CalleeSaveRegs[] = { 00224 SPU::R80, SPU::R81, SPU::R82, SPU::R83, 00225 SPU::R84, SPU::R85, SPU::R86, SPU::R87, 00226 SPU::R88, SPU::R89, SPU::R90, SPU::R91, 00227 SPU::R92, SPU::R93, SPU::R94, SPU::R95, 00228 SPU::R96, SPU::R97, SPU::R98, SPU::R99, 00229 SPU::R100, SPU::R101, SPU::R102, SPU::R103, 00230 SPU::R104, SPU::R105, SPU::R106, SPU::R107, 00231 SPU::R108, SPU::R109, SPU::R110, SPU::R111, 00232 SPU::R112, SPU::R113, SPU::R114, SPU::R115, 00233 SPU::R116, SPU::R117, SPU::R118, SPU::R119, 00234 SPU::R120, SPU::R121, SPU::R122, SPU::R123, 00235 SPU::R124, SPU::R125, SPU::R126, SPU::R127, 00236 SPU::R2, /* environment pointer */ 00237 SPU::R1, /* stack pointer */ 00238 SPU::R0, /* link register */ 00239 0 /* end */ 00240 }; 00241 00242 return SPU_CalleeSaveRegs; 00243 } 00244 00245 const TargetRegisterClass* const* 00246 SPURegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const 00247 { 00248 // Cell ABI Calling Convention 00249 static const TargetRegisterClass * const SPU_CalleeSaveRegClasses[] = { 00250 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00251 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00252 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00253 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00254 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00255 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00256 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00257 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00258 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00259 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00260 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00261 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00262 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00263 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00264 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00265 &SPU::GPRCRegClass, &SPU::GPRCRegClass, &SPU::GPRCRegClass, 00266 &SPU::GPRCRegClass, /* environment pointer */ 00267 &SPU::GPRCRegClass, /* stack pointer */ 00268 &SPU::GPRCRegClass, /* link register */ 00269 0 /* end */ 00270 }; 00271 00272 return SPU_CalleeSaveRegClasses; 00273 } 00274 00275 /*! 00276 R0 (link register), R1 (stack pointer) and R2 (environment pointer -- this is 00277 generally unused) are the Cell's reserved registers 00278 */ 00279 BitVector SPURegisterInfo::getReservedRegs(const MachineFunction &MF) const { 00280 BitVector Reserved(getNumRegs()); 00281 Reserved.set(SPU::R0); // LR 00282 Reserved.set(SPU::R1); // SP 00283 Reserved.set(SPU::R2); // environment pointer 00284 return Reserved; 00285 } 00286 00287 //===----------------------------------------------------------------------===// 00288 // Stack Frame Processing methods 00289 //===----------------------------------------------------------------------===// 00290 00291 // needsFP - Return true if the specified function should have a dedicated frame 00292 // pointer register. This is true if the function has variable sized allocas or 00293 // if frame pointer elimination is disabled. 00294 // 00295 static bool needsFP(const MachineFunction &MF) { 00296 const MachineFrameInfo *MFI = MF.getFrameInfo(); 00297 return NoFramePointerElim || MFI->hasVarSizedObjects(); 00298 } 00299 00300 //-------------------------------------------------------------------------- 00301 // hasFP - Return true if the specified function actually has a dedicated frame 00302 // pointer register. This is true if the function needs a frame pointer and has 00303 // a non-zero stack size. 00304 bool 00305 SPURegisterInfo::hasFP(const MachineFunction &MF) const { 00306 const MachineFrameInfo *MFI = MF.getFrameInfo(); 00307 return MFI->getStackSize() && needsFP(MF); 00308 } 00309 00310 //-------------------------------------------------------------------------- 00311 void 00312 SPURegisterInfo::eliminateCallFramePseudoInstr(MachineFunction &MF, 00313 MachineBasicBlock &MBB, 00314 MachineBasicBlock::iterator I) 00315 const 00316 { 00317 // Simply discard ADJCALLSTACKDOWN, ADJCALLSTACKUP instructions. 00318 MBB.erase(I); 00319 } 00320 00321 void 00322 SPURegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, 00323 RegScavenger *RS) const 00324 { 00325 unsigned i = 0; 00326 MachineInstr &MI = *II; 00327 MachineBasicBlock &MBB = *MI.getParent(); 00328 MachineFunction &MF = *MBB.getParent(); 00329 MachineFrameInfo *MFI = MF.getFrameInfo(); 00330 00331 while (!MI.getOperand(i).isFI()) { 00332 ++i; 00333 assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!"); 00334 } 00335 00336 MachineOperand &SPOp = MI.getOperand(i); 00337 int FrameIndex = SPOp.getIndex(); 00338 00339 // Now add the frame object offset to the offset from r1. 00340 int Offset = MFI->getObjectOffset(FrameIndex); 00341 00342 // Most instructions, except for generated FrameIndex additions using AIr32 00343 // and ILAr32, have the immediate in operand 1. AIr32 and ILAr32 have the 00344 // immediate in operand 2. 00345 unsigned OpNo = 1; 00346 if (MI.getOpcode() == SPU::AIr32 || MI.getOpcode() == SPU::ILAr32) 00347 OpNo = 2; 00348 00349 MachineOperand &MO = MI.getOperand(OpNo); 00350 00351 // Offset is biased by $lr's slot at the bottom. 00352 Offset += MO.getImm() + MFI->getStackSize() + SPUFrameInfo::minStackSize(); 00353 assert((Offset & 0xf) == 0 00354 && "16-byte alignment violated in eliminateFrameIndex"); 00355 00356 // Replace the FrameIndex with base register with $sp (aka $r1) 00357 SPOp.ChangeToRegister(SPU::R1, false); 00358 if (Offset > SPUFrameInfo::maxFrameOffset() 00359 || Offset < SPUFrameInfo::minFrameOffset()) { 00360 cerr << "Large stack adjustment (" 00361 << Offset 00362 << ") in SPURegisterInfo::eliminateFrameIndex."; 00363 } else { 00364 MO.ChangeToImmediate(Offset); 00365 } 00366 } 00367 00368 /// determineFrameLayout - Determine the size of the frame and maximum call 00369 /// frame size. 00370 void 00371 SPURegisterInfo::determineFrameLayout(MachineFunction &MF) const 00372 { 00373 MachineFrameInfo *MFI = MF.getFrameInfo(); 00374 00375 // Get the number of bytes to allocate from the FrameInfo 00376 unsigned FrameSize = MFI->getStackSize(); 00377 00378 // Get the alignments provided by the target, and the maximum alignment 00379 // (if any) of the fixed frame objects. 00380 unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); 00381 unsigned Align = std::max(TargetAlign, MFI->getMaxAlignment()); 00382 assert(isPowerOf2_32(Align) && "Alignment is not power of 2"); 00383 unsigned AlignMask = Align - 1; 00384 00385 // Get the maximum call frame size of all the calls. 00386 unsigned maxCallFrameSize = MFI->getMaxCallFrameSize(); 00387 00388 // If we have dynamic alloca then maxCallFrameSize needs to be aligned so 00389 // that allocations will be aligned. 00390 if (MFI->hasVarSizedObjects()) 00391 maxCallFrameSize = (maxCallFrameSize + AlignMask) & ~AlignMask; 00392 00393 // Update maximum call frame size. 00394 MFI->setMaxCallFrameSize(maxCallFrameSize); 00395 00396 // Include call frame size in total. 00397 FrameSize += maxCallFrameSize; 00398 00399 // Make sure the frame is aligned. 00400 FrameSize = (FrameSize + AlignMask) & ~AlignMask; 00401 00402 // Update frame info. 00403 MFI->setStackSize(FrameSize); 00404 } 00405 00406 void SPURegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 00407 RegScavenger *RS) 00408 const { 00409 // Mark LR and SP unused, since the prolog spills them to stack and 00410 // we don't want anyone else to spill them for us. 00411 // 00412 // Also, unless R2 is really used someday, don't spill it automatically. 00413 MF.getRegInfo().setPhysRegUnused(SPU::R0); 00414 MF.getRegInfo().setPhysRegUnused(SPU::R1); 00415 MF.getRegInfo().setPhysRegUnused(SPU::R2); 00416 } 00417 00418 void SPURegisterInfo::emitPrologue(MachineFunction &MF) const 00419 { 00420 MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB 00421 MachineBasicBlock::iterator MBBI = MBB.begin(); 00422 MachineFrameInfo *MFI = MF.getFrameInfo(); 00423 MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); 00424 00425 // Prepare for debug frame info. 00426 bool hasDebugInfo = MMI && MMI->hasDebugInfo(); 00427 unsigned FrameLabelId = 0; 00428 00429 // Move MBBI back to the beginning of the function. 00430 MBBI = MBB.begin(); 00431 00432 // Work out frame sizes. 00433 determineFrameLayout(MF); 00434 int FrameSize = MFI->getStackSize(); 00435 00436 assert((FrameSize & 0xf) == 0 00437 && "SPURegisterInfo::emitPrologue: FrameSize not aligned"); 00438 00439 if (FrameSize > 0 || MFI->hasCalls()) { 00440 FrameSize = -(FrameSize + SPUFrameInfo::minStackSize()); 00441 if (hasDebugInfo) { 00442 // Mark effective beginning of when frame pointer becomes valid. 00443 FrameLabelId = MMI->NextLabelID(); 00444 BuildMI(MBB, MBBI, TII.get(SPU::DBG_LABEL)).addImm(FrameLabelId); 00445 } 00446 00447 // Adjust stack pointer, spilling $lr -> 16($sp) and $sp -> -FrameSize($sp) 00448 // for the ABI 00449 BuildMI(MBB, MBBI, TII.get(SPU::STQDr32), SPU::R0).addImm(16) 00450 .addReg(SPU::R1); 00451 if (isS10Constant(FrameSize)) { 00452 // Spill $sp to adjusted $sp 00453 BuildMI(MBB, MBBI, TII.get(SPU::STQDr32), SPU::R1).addImm(FrameSize) 00454 .addReg(SPU::R1); 00455 // Adjust $sp by required amout 00456 BuildMI(MBB, MBBI, TII.get(SPU::AIr32), SPU::R1).addReg(SPU::R1) 00457 .addImm(FrameSize); 00458 } else if (FrameSize <= (1 << 16) - 1 && FrameSize >= -(1 << 16)) { 00459 // Frame size can be loaded into ILr32n, so temporarily spill $r2 and use 00460 // $r2 to adjust $sp: 00461 BuildMI(MBB, MBBI, TII.get(SPU::STQDr128), SPU::R2) 00462 .addImm(-16) 00463 .addReg(SPU::R1); 00464 BuildMI(MBB, MBBI, TII.get(SPU::ILr32), SPU::R2) 00465 .addImm(FrameSize); 00466 BuildMI(MBB, MBBI, TII.get(SPU::STQDr32), SPU::R1) 00467 .addReg(SPU::R2) 00468 .addReg(SPU::R1); 00469 BuildMI(MBB, MBBI, TII.get(SPU::Ar32), SPU::R1) 00470 .addReg(SPU::R1) 00471 .addReg(SPU::R2); 00472 BuildMI(MBB, MBBI, TII.get(SPU::SFIr32), SPU::R2) 00473 .addReg(SPU::R2) 00474 .addImm(16); 00475 BuildMI(MBB, MBBI, TII.get(SPU::LQXr128), SPU::R2) 00476 .addReg(SPU::R2) 00477 .addReg(SPU::R1); 00478 } else { 00479 cerr << "Unhandled frame size: " << FrameSize << "\n"; 00480 abort(); 00481 } 00482 00483 if (hasDebugInfo) { 00484 std::vector<MachineMove> &Moves = MMI->getFrameMoves(); 00485 00486 // Show update of SP. 00487 MachineLocation SPDst(MachineLocation::VirtualFP); 00488 MachineLocation SPSrc(MachineLocation::VirtualFP, -FrameSize); 00489 Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc)); 00490 00491 // Add callee saved registers to move list. 00492 const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); 00493 for (unsigned I = 0, E = CSI.size(); I != E; ++I) { 00494 int Offset = MFI->getObjectOffset(CSI[I].getFrameIdx()); 00495 unsigned Reg = CSI[I].getReg(); 00496 if (Reg == SPU::R0) continue; 00497 MachineLocation CSDst(MachineLocation::VirtualFP, Offset); 00498 MachineLocation CSSrc(Reg); 00499 Moves.push_back(MachineMove(FrameLabelId, CSDst, CSSrc)); 00500 } 00501 00502 // Mark effective beginning of when frame pointer is ready. 00503 unsigned ReadyLabelId = MMI->NextLabelID(); 00504 BuildMI(MBB, MBBI, TII.get(SPU::DBG_LABEL)).addImm(ReadyLabelId); 00505 00506 MachineLocation FPDst(SPU::R1); 00507 MachineLocation FPSrc(MachineLocation::VirtualFP); 00508 Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc)); 00509 } 00510 } else { 00511 // This is a leaf function -- insert a branch hint iff there are 00512 // sufficient number instructions in the basic block. Note that 00513 // this is just a best guess based on the basic block's size. 00514 if (MBB.size() >= (unsigned) SPUFrameInfo::branchHintPenalty()) { 00515 MachineBasicBlock::iterator MBBI = prior(MBB.end()); 00516 // Insert terminator label 00517 unsigned BranchLabelId = MMI->NextLabelID(); 00518 BuildMI(MBB, MBBI, TII.get(SPU::DBG_LABEL)).addImm(BranchLabelId); 00519 } 00520 } 00521 } 00522 00523 void 00524 SPURegisterInfo::emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const 00525 { 00526 MachineBasicBlock::iterator MBBI = prior(MBB.end()); 00527 const MachineFrameInfo *MFI = MF.getFrameInfo(); 00528 int FrameSize = MFI->getStackSize(); 00529 int LinkSlotOffset = SPUFrameInfo::stackSlotSize(); 00530 00531 assert(MBBI->getOpcode() == SPU::RET && 00532 "Can only insert epilog into returning blocks"); 00533 assert((FrameSize & 0xf) == 0 00534 && "SPURegisterInfo::emitEpilogue: FrameSize not aligned"); 00535 if (FrameSize > 0 || MFI->hasCalls()) { 00536 FrameSize = FrameSize + SPUFrameInfo::minStackSize(); 00537 if (isS10Constant(FrameSize + LinkSlotOffset)) { 00538 // Reload $lr, adjust $sp by required amount 00539 // Note: We do this to slightly improve dual issue -- not by much, but it 00540 // is an opportunity for dual issue. 00541 BuildMI(MBB, MBBI, TII.get(SPU::LQDr128), SPU::R0) 00542 .addImm(FrameSize + LinkSlotOffset) 00543 .addReg(SPU::R1); 00544 BuildMI(MBB, MBBI, TII.get(SPU::AIr32), SPU::R1) 00545 .addReg(SPU::R1) 00546 .addImm(FrameSize); 00547 } else if (FrameSize <= (1 << 16) - 1 && FrameSize >= -(1 << 16)) { 00548 // Frame size can be loaded into ILr32n, so temporarily spill $r2 and use 00549 // $r2 to adjust $sp: 00550 BuildMI(MBB, MBBI, TII.get(SPU::STQDr128), SPU::R2) 00551 .addImm(16) 00552 .addReg(SPU::R1); 00553 BuildMI(MBB, MBBI, TII.get(SPU::ILr32), SPU::R2) 00554 .addImm(FrameSize); 00555 BuildMI(MBB, MBBI, TII.get(SPU::Ar32), SPU::R1) 00556 .addReg(SPU::R1) 00557 .addReg(SPU::R2); 00558 BuildMI(MBB, MBBI, TII.get(SPU::LQDr128), SPU::R0) 00559 .addImm(16) 00560 .addReg(SPU::R2); 00561 BuildMI(MBB, MBBI, TII.get(SPU::SFIr32), SPU::R2). 00562 addReg(SPU::R2) 00563 .addImm(16); 00564 BuildMI(MBB, MBBI, TII.get(SPU::LQXr128), SPU::R2) 00565 .addReg(SPU::R2) 00566 .addReg(SPU::R1); 00567 } else { 00568 cerr << "Unhandled frame size: " << FrameSize << "\n"; 00569 abort(); 00570 } 00571 } 00572 } 00573 00574 unsigned 00575 SPURegisterInfo::getRARegister() const 00576 { 00577 return SPU::R0; 00578 } 00579 00580 unsigned 00581 SPURegisterInfo::getFrameRegister(MachineFunction &MF) const 00582 { 00583 return SPU::R1; 00584 } 00585 00586 void 00587 SPURegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves) const 00588 { 00589 // Initial state of the frame pointer is R1. 00590 MachineLocation Dst(MachineLocation::VirtualFP); 00591 MachineLocation Src(SPU::R1, 0); 00592 Moves.push_back(MachineMove(0, Dst, Src)); 00593 } 00594 00595 00596 int 00597 SPURegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const { 00598 // FIXME: Most probably dwarf numbers differs for Linux and Darwin 00599 return SPUGenRegisterInfo::getDwarfRegNumFull(RegNum, 0); 00600 } 00601 00602 #include "SPUGenRegisterInfo.inc"