LLVM API Documentation
00001 //===-- MipsRegisterInfo.cpp - MIPS 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 MIPS implementation of the TargetRegisterInfo class. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #define DEBUG_TYPE "mips-reg-info" 00015 00016 #include "MipsRegisterInfo.h" 00017 #include "Mips.h" 00018 #include "MipsAnalyzeImmediate.h" 00019 #include "MipsInstrInfo.h" 00020 #include "MipsMachineFunction.h" 00021 #include "MipsSubtarget.h" 00022 #include "llvm/ADT/BitVector.h" 00023 #include "llvm/ADT/STLExtras.h" 00024 #include "llvm/CodeGen/MachineFrameInfo.h" 00025 #include "llvm/CodeGen/MachineFunction.h" 00026 #include "llvm/CodeGen/MachineInstrBuilder.h" 00027 #include "llvm/CodeGen/ValueTypes.h" 00028 #include "llvm/DebugInfo.h" 00029 #include "llvm/IR/Constants.h" 00030 #include "llvm/IR/Type.h" 00031 #include "llvm/Support/CommandLine.h" 00032 #include "llvm/Support/Debug.h" 00033 #include "llvm/Support/ErrorHandling.h" 00034 #include "llvm/Support/raw_ostream.h" 00035 #include "llvm/Target/TargetFrameLowering.h" 00036 #include "llvm/Target/TargetInstrInfo.h" 00037 #include "llvm/Target/TargetMachine.h" 00038 #include "llvm/Target/TargetOptions.h" 00039 00040 #define GET_REGINFO_TARGET_DESC 00041 #include "MipsGenRegisterInfo.inc" 00042 00043 using namespace llvm; 00044 00045 MipsRegisterInfo::MipsRegisterInfo(const MipsSubtarget &ST) 00046 : MipsGenRegisterInfo(Mips::RA), Subtarget(ST) {} 00047 00048 unsigned MipsRegisterInfo::getPICCallReg() { return Mips::T9; } 00049 00050 00051 unsigned 00052 MipsRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC, 00053 MachineFunction &MF) const { 00054 switch (RC->getID()) { 00055 default: 00056 return 0; 00057 case Mips::CPURegsRegClassID: 00058 case Mips::CPU64RegsRegClassID: 00059 case Mips::DSPRegsRegClassID: { 00060 const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 00061 return 28 - TFI->hasFP(MF); 00062 } 00063 case Mips::FGR32RegClassID: 00064 return 32; 00065 case Mips::AFGR64RegClassID: 00066 return 16; 00067 case Mips::FGR64RegClassID: 00068 return 32; 00069 } 00070 } 00071 00072 //===----------------------------------------------------------------------===// 00073 // Callee Saved Registers methods 00074 //===----------------------------------------------------------------------===// 00075 00076 /// Mips Callee Saved Registers 00077 const uint16_t* MipsRegisterInfo:: 00078 getCalleeSavedRegs(const MachineFunction *MF) const { 00079 if (Subtarget.isSingleFloat()) 00080 return CSR_SingleFloatOnly_SaveList; 00081 else if (!Subtarget.hasMips64()) 00082 return CSR_O32_SaveList; 00083 else if (Subtarget.isABI_N32()) 00084 return CSR_N32_SaveList; 00085 00086 assert(Subtarget.isABI_N64()); 00087 return CSR_N64_SaveList; 00088 } 00089 00090 const uint32_t* 00091 MipsRegisterInfo::getCallPreservedMask(CallingConv::ID) const { 00092 if (Subtarget.isSingleFloat()) 00093 return CSR_SingleFloatOnly_RegMask; 00094 else if (!Subtarget.hasMips64()) 00095 return CSR_O32_RegMask; 00096 else if (Subtarget.isABI_N32()) 00097 return CSR_N32_RegMask; 00098 00099 assert(Subtarget.isABI_N64()); 00100 return CSR_N64_RegMask; 00101 } 00102 00103 const uint32_t *MipsRegisterInfo::getMips16RetHelperMask() { 00104 return CSR_Mips16RetHelper_RegMask; 00105 } 00106 00107 BitVector MipsRegisterInfo:: 00108 getReservedRegs(const MachineFunction &MF) const { 00109 static const uint16_t ReservedCPURegs[] = { 00110 Mips::ZERO, Mips::K0, Mips::K1, Mips::SP 00111 }; 00112 00113 static const uint16_t ReservedCPU64Regs[] = { 00114 Mips::ZERO_64, Mips::K0_64, Mips::K1_64, Mips::SP_64 00115 }; 00116 00117 BitVector Reserved(getNumRegs()); 00118 typedef TargetRegisterClass::const_iterator RegIter; 00119 00120 for (unsigned I = 0; I < array_lengthof(ReservedCPURegs); ++I) 00121 Reserved.set(ReservedCPURegs[I]); 00122 00123 for (unsigned I = 0; I < array_lengthof(ReservedCPU64Regs); ++I) 00124 Reserved.set(ReservedCPU64Regs[I]); 00125 00126 if (Subtarget.hasMips64()) { 00127 // Reserve all registers in AFGR64. 00128 for (RegIter Reg = Mips::AFGR64RegClass.begin(), 00129 EReg = Mips::AFGR64RegClass.end(); Reg != EReg; ++Reg) 00130 Reserved.set(*Reg); 00131 } else { 00132 // Reserve all registers in FGR64. 00133 for (RegIter Reg = Mips::FGR64RegClass.begin(), 00134 EReg = Mips::FGR64RegClass.end(); Reg != EReg; ++Reg) 00135 Reserved.set(*Reg); 00136 } 00137 // Reserve FP if this function should have a dedicated frame pointer register. 00138 if (MF.getTarget().getFrameLowering()->hasFP(MF)) { 00139 if (Subtarget.inMips16Mode()) 00140 Reserved.set(Mips::S0); 00141 else { 00142 Reserved.set(Mips::FP); 00143 Reserved.set(Mips::FP_64); 00144 } 00145 } 00146 00147 // Reserve hardware registers. 00148 Reserved.set(Mips::HWR29); 00149 Reserved.set(Mips::HWR29_64); 00150 00151 // Reserve DSP control register. 00152 Reserved.set(Mips::DSPPos); 00153 Reserved.set(Mips::DSPSCount); 00154 Reserved.set(Mips::DSPCarry); 00155 Reserved.set(Mips::DSPEFI); 00156 Reserved.set(Mips::DSPOutFlag); 00157 00158 // Reserve RA if in mips16 mode. 00159 if (Subtarget.inMips16Mode()) { 00160 Reserved.set(Mips::RA); 00161 Reserved.set(Mips::RA_64); 00162 } 00163 00164 // Reserve GP if small section is used. 00165 if (Subtarget.useSmallSection()) { 00166 Reserved.set(Mips::GP); 00167 Reserved.set(Mips::GP_64); 00168 } 00169 00170 return Reserved; 00171 } 00172 00173 bool 00174 MipsRegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const { 00175 return true; 00176 } 00177 00178 bool 00179 MipsRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const { 00180 return true; 00181 } 00182 00183 // FrameIndex represent objects inside a abstract stack. 00184 // We must replace FrameIndex with an stack/frame pointer 00185 // direct reference. 00186 void MipsRegisterInfo:: 00187 eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, 00188 unsigned FIOperandNum, RegScavenger *RS) const { 00189 MachineInstr &MI = *II; 00190 MachineFunction &MF = *MI.getParent()->getParent(); 00191 00192 DEBUG(errs() << "\nFunction : " << MF.getName() << "\n"; 00193 errs() << "<--------->\n" << MI); 00194 00195 int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); 00196 uint64_t stackSize = MF.getFrameInfo()->getStackSize(); 00197 int64_t spOffset = MF.getFrameInfo()->getObjectOffset(FrameIndex); 00198 00199 DEBUG(errs() << "FrameIndex : " << FrameIndex << "\n" 00200 << "spOffset : " << spOffset << "\n" 00201 << "stackSize : " << stackSize << "\n"); 00202 00203 eliminateFI(MI, FIOperandNum, FrameIndex, stackSize, spOffset); 00204 } 00205 00206 unsigned MipsRegisterInfo:: 00207 getFrameRegister(const MachineFunction &MF) const { 00208 const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 00209 bool IsN64 = Subtarget.isABI_N64(); 00210 00211 if (Subtarget.inMips16Mode()) 00212 return TFI->hasFP(MF) ? Mips::S0 : Mips::SP; 00213 else 00214 return TFI->hasFP(MF) ? (IsN64 ? Mips::FP_64 : Mips::FP) : 00215 (IsN64 ? Mips::SP_64 : Mips::SP); 00216 00217 } 00218 00219 unsigned MipsRegisterInfo:: 00220 getEHExceptionRegister() const { 00221 llvm_unreachable("What is the exception register"); 00222 } 00223 00224 unsigned MipsRegisterInfo:: 00225 getEHHandlerRegister() const { 00226 llvm_unreachable("What is the exception handler register"); 00227 }