LLVM API Documentation

MipsRegisterInfo.cpp
Go to the documentation of this file.
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 }