Home | History | Annotate | Download | only in Mips
      1 //===-- MipsSEFrameLowering.cpp - Mips32/64 Frame Information -------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains the Mips32/64 implementation of TargetFrameLowering class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "MipsSEFrameLowering.h"
     15 #include "MCTargetDesc/MipsBaseInfo.h"
     16 #include "MipsAnalyzeImmediate.h"
     17 #include "MipsMachineFunction.h"
     18 #include "MipsSEInstrInfo.h"
     19 #include "MipsSubtarget.h"
     20 #include "llvm/CodeGen/MachineFrameInfo.h"
     21 #include "llvm/CodeGen/MachineFunction.h"
     22 #include "llvm/CodeGen/MachineInstrBuilder.h"
     23 #include "llvm/CodeGen/MachineModuleInfo.h"
     24 #include "llvm/CodeGen/MachineRegisterInfo.h"
     25 #include "llvm/CodeGen/RegisterScavenging.h"
     26 #include "llvm/IR/DataLayout.h"
     27 #include "llvm/IR/Function.h"
     28 #include "llvm/Support/CommandLine.h"
     29 #include "llvm/Target/TargetOptions.h"
     30 
     31 using namespace llvm;
     32 
     33 namespace {
     34 typedef MachineBasicBlock::iterator Iter;
     35 
     36 static std::pair<unsigned, unsigned> getMFHiLoOpc(unsigned Src) {
     37   if (Mips::ACC64RegClass.contains(Src))
     38     return std::make_pair((unsigned)Mips::PseudoMFHI,
     39                           (unsigned)Mips::PseudoMFLO);
     40 
     41   if (Mips::ACC64DSPRegClass.contains(Src))
     42     return std::make_pair((unsigned)Mips::MFHI_DSP, (unsigned)Mips::MFLO_DSP);
     43 
     44   if (Mips::ACC128RegClass.contains(Src))
     45     return std::make_pair((unsigned)Mips::PseudoMFHI64,
     46                           (unsigned)Mips::PseudoMFLO64);
     47 
     48   return std::make_pair(0, 0);
     49 }
     50 
     51 /// Helper class to expand pseudos.
     52 class ExpandPseudo {
     53 public:
     54   ExpandPseudo(MachineFunction &MF);
     55   bool expand();
     56 
     57 private:
     58   bool expandInstr(MachineBasicBlock &MBB, Iter I);
     59   void expandLoadCCond(MachineBasicBlock &MBB, Iter I);
     60   void expandStoreCCond(MachineBasicBlock &MBB, Iter I);
     61   void expandLoadACC(MachineBasicBlock &MBB, Iter I, unsigned RegSize);
     62   void expandStoreACC(MachineBasicBlock &MBB, Iter I, unsigned MFHiOpc,
     63                       unsigned MFLoOpc, unsigned RegSize);
     64   bool expandCopy(MachineBasicBlock &MBB, Iter I);
     65   bool expandCopyACC(MachineBasicBlock &MBB, Iter I, unsigned MFHiOpc,
     66                      unsigned MFLoOpc);
     67 
     68   MachineFunction &MF;
     69   MachineRegisterInfo &MRI;
     70 };
     71 }
     72 
     73 ExpandPseudo::ExpandPseudo(MachineFunction &MF_)
     74   : MF(MF_), MRI(MF.getRegInfo()) {}
     75 
     76 bool ExpandPseudo::expand() {
     77   bool Expanded = false;
     78 
     79   for (MachineFunction::iterator BB = MF.begin(), BBEnd = MF.end();
     80        BB != BBEnd; ++BB)
     81     for (Iter I = BB->begin(), End = BB->end(); I != End;)
     82       Expanded |= expandInstr(*BB, I++);
     83 
     84   return Expanded;
     85 }
     86 
     87 bool ExpandPseudo::expandInstr(MachineBasicBlock &MBB, Iter I) {
     88   switch(I->getOpcode()) {
     89   case Mips::LOAD_CCOND_DSP:
     90     expandLoadCCond(MBB, I);
     91     break;
     92   case Mips::STORE_CCOND_DSP:
     93     expandStoreCCond(MBB, I);
     94     break;
     95   case Mips::LOAD_ACC64:
     96   case Mips::LOAD_ACC64DSP:
     97     expandLoadACC(MBB, I, 4);
     98     break;
     99   case Mips::LOAD_ACC128:
    100     expandLoadACC(MBB, I, 8);
    101     break;
    102   case Mips::STORE_ACC64:
    103     expandStoreACC(MBB, I, Mips::PseudoMFHI, Mips::PseudoMFLO, 4);
    104     break;
    105   case Mips::STORE_ACC64DSP:
    106     expandStoreACC(MBB, I, Mips::MFHI_DSP, Mips::MFLO_DSP, 4);
    107     break;
    108   case Mips::STORE_ACC128:
    109     expandStoreACC(MBB, I, Mips::PseudoMFHI64, Mips::PseudoMFLO64, 8);
    110     break;
    111   case TargetOpcode::COPY:
    112     if (!expandCopy(MBB, I))
    113       return false;
    114     break;
    115   default:
    116     return false;
    117   }
    118 
    119   MBB.erase(I);
    120   return true;
    121 }
    122 
    123 void ExpandPseudo::expandLoadCCond(MachineBasicBlock &MBB, Iter I) {
    124   //  load $vr, FI
    125   //  copy ccond, $vr
    126 
    127   assert(I->getOperand(0).isReg() && I->getOperand(1).isFI());
    128 
    129   const MipsSEInstrInfo &TII =
    130     *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
    131   const MipsRegisterInfo &RegInfo =
    132     *static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
    133 
    134   const TargetRegisterClass *RC = RegInfo.intRegClass(4);
    135   unsigned VR = MRI.createVirtualRegister(RC);
    136   unsigned Dst = I->getOperand(0).getReg(), FI = I->getOperand(1).getIndex();
    137 
    138   TII.loadRegFromStack(MBB, I, VR, FI, RC, &RegInfo, 0);
    139   BuildMI(MBB, I, I->getDebugLoc(), TII.get(TargetOpcode::COPY), Dst)
    140     .addReg(VR, RegState::Kill);
    141 }
    142 
    143 void ExpandPseudo::expandStoreCCond(MachineBasicBlock &MBB, Iter I) {
    144   //  copy $vr, ccond
    145   //  store $vr, FI
    146 
    147   assert(I->getOperand(0).isReg() && I->getOperand(1).isFI());
    148 
    149   const MipsSEInstrInfo &TII =
    150     *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
    151   const MipsRegisterInfo &RegInfo =
    152     *static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
    153 
    154   const TargetRegisterClass *RC = RegInfo.intRegClass(4);
    155   unsigned VR = MRI.createVirtualRegister(RC);
    156   unsigned Src = I->getOperand(0).getReg(), FI = I->getOperand(1).getIndex();
    157 
    158   BuildMI(MBB, I, I->getDebugLoc(), TII.get(TargetOpcode::COPY), VR)
    159     .addReg(Src, getKillRegState(I->getOperand(0).isKill()));
    160   TII.storeRegToStack(MBB, I, VR, true, FI, RC, &RegInfo, 0);
    161 }
    162 
    163 void ExpandPseudo::expandLoadACC(MachineBasicBlock &MBB, Iter I,
    164                                  unsigned RegSize) {
    165   //  load $vr0, FI
    166   //  copy lo, $vr0
    167   //  load $vr1, FI + 4
    168   //  copy hi, $vr1
    169 
    170   assert(I->getOperand(0).isReg() && I->getOperand(1).isFI());
    171 
    172   const MipsSEInstrInfo &TII =
    173     *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
    174   const MipsRegisterInfo &RegInfo =
    175     *static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
    176 
    177   const TargetRegisterClass *RC = RegInfo.intRegClass(RegSize);
    178   unsigned VR0 = MRI.createVirtualRegister(RC);
    179   unsigned VR1 = MRI.createVirtualRegister(RC);
    180   unsigned Dst = I->getOperand(0).getReg(), FI = I->getOperand(1).getIndex();
    181   unsigned Lo = RegInfo.getSubReg(Dst, Mips::sub_lo);
    182   unsigned Hi = RegInfo.getSubReg(Dst, Mips::sub_hi);
    183   DebugLoc DL = I->getDebugLoc();
    184   const MCInstrDesc &Desc = TII.get(TargetOpcode::COPY);
    185 
    186   TII.loadRegFromStack(MBB, I, VR0, FI, RC, &RegInfo, 0);
    187   BuildMI(MBB, I, DL, Desc, Lo).addReg(VR0, RegState::Kill);
    188   TII.loadRegFromStack(MBB, I, VR1, FI, RC, &RegInfo, RegSize);
    189   BuildMI(MBB, I, DL, Desc, Hi).addReg(VR1, RegState::Kill);
    190 }
    191 
    192 void ExpandPseudo::expandStoreACC(MachineBasicBlock &MBB, Iter I,
    193                                   unsigned MFHiOpc, unsigned MFLoOpc,
    194                                   unsigned RegSize) {
    195   //  mflo $vr0, src
    196   //  store $vr0, FI
    197   //  mfhi $vr1, src
    198   //  store $vr1, FI + 4
    199 
    200   assert(I->getOperand(0).isReg() && I->getOperand(1).isFI());
    201 
    202   const MipsSEInstrInfo &TII =
    203     *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
    204   const MipsRegisterInfo &RegInfo =
    205     *static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
    206 
    207   const TargetRegisterClass *RC = RegInfo.intRegClass(RegSize);
    208   unsigned VR0 = MRI.createVirtualRegister(RC);
    209   unsigned VR1 = MRI.createVirtualRegister(RC);
    210   unsigned Src = I->getOperand(0).getReg(), FI = I->getOperand(1).getIndex();
    211   unsigned SrcKill = getKillRegState(I->getOperand(0).isKill());
    212   DebugLoc DL = I->getDebugLoc();
    213 
    214   BuildMI(MBB, I, DL, TII.get(MFLoOpc), VR0).addReg(Src);
    215   TII.storeRegToStack(MBB, I, VR0, true, FI, RC, &RegInfo, 0);
    216   BuildMI(MBB, I, DL, TII.get(MFHiOpc), VR1).addReg(Src, SrcKill);
    217   TII.storeRegToStack(MBB, I, VR1, true, FI, RC, &RegInfo, RegSize);
    218 }
    219 
    220 bool ExpandPseudo::expandCopy(MachineBasicBlock &MBB, Iter I) {
    221   unsigned Src = I->getOperand(1).getReg();
    222   std::pair<unsigned, unsigned> Opcodes = getMFHiLoOpc(Src);
    223 
    224   if (!Opcodes.first)
    225     return false;
    226 
    227   return expandCopyACC(MBB, I, Opcodes.first, Opcodes.second);
    228 }
    229 
    230 bool ExpandPseudo::expandCopyACC(MachineBasicBlock &MBB, Iter I,
    231                                  unsigned MFHiOpc, unsigned MFLoOpc) {
    232   //  mflo $vr0, src
    233   //  copy dst_lo, $vr0
    234   //  mfhi $vr1, src
    235   //  copy dst_hi, $vr1
    236 
    237   const MipsSEInstrInfo &TII =
    238     *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
    239   const MipsRegisterInfo &RegInfo =
    240     *static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
    241 
    242   unsigned Dst = I->getOperand(0).getReg(), Src = I->getOperand(1).getReg();
    243   unsigned VRegSize = RegInfo.getMinimalPhysRegClass(Dst)->getSize() / 2;
    244   const TargetRegisterClass *RC = RegInfo.intRegClass(VRegSize);
    245   unsigned VR0 = MRI.createVirtualRegister(RC);
    246   unsigned VR1 = MRI.createVirtualRegister(RC);
    247   unsigned SrcKill = getKillRegState(I->getOperand(1).isKill());
    248   unsigned DstLo = RegInfo.getSubReg(Dst, Mips::sub_lo);
    249   unsigned DstHi = RegInfo.getSubReg(Dst, Mips::sub_hi);
    250   DebugLoc DL = I->getDebugLoc();
    251 
    252   BuildMI(MBB, I, DL, TII.get(MFLoOpc), VR0).addReg(Src);
    253   BuildMI(MBB, I, DL, TII.get(TargetOpcode::COPY), DstLo)
    254     .addReg(VR0, RegState::Kill);
    255   BuildMI(MBB, I, DL, TII.get(MFHiOpc), VR1).addReg(Src, SrcKill);
    256   BuildMI(MBB, I, DL, TII.get(TargetOpcode::COPY), DstHi)
    257     .addReg(VR1, RegState::Kill);
    258   return true;
    259 }
    260 
    261 MipsSEFrameLowering::MipsSEFrameLowering(const MipsSubtarget &STI)
    262     : MipsFrameLowering(STI, STI.stackAlignment()) {}
    263 
    264 unsigned MipsSEFrameLowering::ehDataReg(unsigned I) const {
    265   static const unsigned EhDataReg[] = {
    266     Mips::A0, Mips::A1, Mips::A2, Mips::A3
    267   };
    268   static const unsigned EhDataReg64[] = {
    269     Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64
    270   };
    271 
    272   return STI.isABI_N64() ? EhDataReg64[I] : EhDataReg[I];
    273 }
    274 
    275 void MipsSEFrameLowering::emitPrologue(MachineFunction &MF) const {
    276   MachineBasicBlock &MBB   = MF.front();
    277   MachineFrameInfo *MFI    = MF.getFrameInfo();
    278   MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
    279 
    280   const MipsSEInstrInfo &TII =
    281     *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
    282   const MipsRegisterInfo &RegInfo =
    283     *static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
    284 
    285   MachineBasicBlock::iterator MBBI = MBB.begin();
    286   DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
    287   unsigned SP = STI.isABI_N64() ? Mips::SP_64 : Mips::SP;
    288   unsigned FP = STI.isABI_N64() ? Mips::FP_64 : Mips::FP;
    289   unsigned ZERO = STI.isABI_N64() ? Mips::ZERO_64 : Mips::ZERO;
    290   unsigned ADDu = STI.isABI_N64() ? Mips::DADDu : Mips::ADDu;
    291 
    292   // First, compute final stack size.
    293   uint64_t StackSize = MFI->getStackSize();
    294 
    295   // No need to allocate space on the stack.
    296   if (StackSize == 0 && !MFI->adjustsStack()) return;
    297 
    298   MachineModuleInfo &MMI = MF.getMMI();
    299   const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
    300   MachineLocation DstML, SrcML;
    301 
    302   // Adjust stack.
    303   TII.adjustStackPtr(SP, -StackSize, MBB, MBBI);
    304 
    305   // emit ".cfi_def_cfa_offset StackSize"
    306   unsigned CFIIndex = MMI.addFrameInst(
    307       MCCFIInstruction::createDefCfaOffset(nullptr, -StackSize));
    308   BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
    309       .addCFIIndex(CFIIndex);
    310 
    311   const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
    312 
    313   if (CSI.size()) {
    314     // Find the instruction past the last instruction that saves a callee-saved
    315     // register to the stack.
    316     for (unsigned i = 0; i < CSI.size(); ++i)
    317       ++MBBI;
    318 
    319     // Iterate over list of callee-saved registers and emit .cfi_offset
    320     // directives.
    321     for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
    322            E = CSI.end(); I != E; ++I) {
    323       int64_t Offset = MFI->getObjectOffset(I->getFrameIdx());
    324       unsigned Reg = I->getReg();
    325 
    326       // If Reg is a double precision register, emit two cfa_offsets,
    327       // one for each of the paired single precision registers.
    328       if (Mips::AFGR64RegClass.contains(Reg)) {
    329         unsigned Reg0 =
    330             MRI->getDwarfRegNum(RegInfo.getSubReg(Reg, Mips::sub_lo), true);
    331         unsigned Reg1 =
    332             MRI->getDwarfRegNum(RegInfo.getSubReg(Reg, Mips::sub_hi), true);
    333 
    334         if (!STI.isLittle())
    335           std::swap(Reg0, Reg1);
    336 
    337         unsigned CFIIndex = MMI.addFrameInst(
    338             MCCFIInstruction::createOffset(nullptr, Reg0, Offset));
    339         BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
    340             .addCFIIndex(CFIIndex);
    341 
    342         CFIIndex = MMI.addFrameInst(
    343             MCCFIInstruction::createOffset(nullptr, Reg1, Offset + 4));
    344         BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
    345             .addCFIIndex(CFIIndex);
    346       } else {
    347         // Reg is either in GPR32 or FGR32.
    348         unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
    349             nullptr, MRI->getDwarfRegNum(Reg, 1), Offset));
    350         BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
    351             .addCFIIndex(CFIIndex);
    352       }
    353     }
    354   }
    355 
    356   if (MipsFI->callsEhReturn()) {
    357     const TargetRegisterClass *RC = STI.isABI_N64() ?
    358         &Mips::GPR64RegClass : &Mips::GPR32RegClass;
    359 
    360     // Insert instructions that spill eh data registers.
    361     for (int I = 0; I < 4; ++I) {
    362       if (!MBB.isLiveIn(ehDataReg(I)))
    363         MBB.addLiveIn(ehDataReg(I));
    364       TII.storeRegToStackSlot(MBB, MBBI, ehDataReg(I), false,
    365                               MipsFI->getEhDataRegFI(I), RC, &RegInfo);
    366     }
    367 
    368     // Emit .cfi_offset directives for eh data registers.
    369     for (int I = 0; I < 4; ++I) {
    370       int64_t Offset = MFI->getObjectOffset(MipsFI->getEhDataRegFI(I));
    371       unsigned Reg = MRI->getDwarfRegNum(ehDataReg(I), true);
    372       unsigned CFIIndex = MMI.addFrameInst(
    373           MCCFIInstruction::createOffset(nullptr, Reg, Offset));
    374       BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
    375           .addCFIIndex(CFIIndex);
    376     }
    377   }
    378 
    379   // if framepointer enabled, set it to point to the stack pointer.
    380   if (hasFP(MF)) {
    381     // Insert instruction "move $fp, $sp" at this location.
    382     BuildMI(MBB, MBBI, dl, TII.get(ADDu), FP).addReg(SP).addReg(ZERO)
    383       .setMIFlag(MachineInstr::FrameSetup);
    384 
    385     // emit ".cfi_def_cfa_register $fp"
    386     unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(
    387         nullptr, MRI->getDwarfRegNum(FP, true)));
    388     BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
    389         .addCFIIndex(CFIIndex);
    390   }
    391 }
    392 
    393 void MipsSEFrameLowering::emitEpilogue(MachineFunction &MF,
    394                                        MachineBasicBlock &MBB) const {
    395   MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
    396   MachineFrameInfo *MFI            = MF.getFrameInfo();
    397   MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
    398 
    399   const MipsSEInstrInfo &TII =
    400     *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
    401   const MipsRegisterInfo &RegInfo =
    402     *static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
    403 
    404   DebugLoc dl = MBBI->getDebugLoc();
    405   unsigned SP = STI.isABI_N64() ? Mips::SP_64 : Mips::SP;
    406   unsigned FP = STI.isABI_N64() ? Mips::FP_64 : Mips::FP;
    407   unsigned ZERO = STI.isABI_N64() ? Mips::ZERO_64 : Mips::ZERO;
    408   unsigned ADDu = STI.isABI_N64() ? Mips::DADDu : Mips::ADDu;
    409 
    410   // if framepointer enabled, restore the stack pointer.
    411   if (hasFP(MF)) {
    412     // Find the first instruction that restores a callee-saved register.
    413     MachineBasicBlock::iterator I = MBBI;
    414 
    415     for (unsigned i = 0; i < MFI->getCalleeSavedInfo().size(); ++i)
    416       --I;
    417 
    418     // Insert instruction "move $sp, $fp" at this location.
    419     BuildMI(MBB, I, dl, TII.get(ADDu), SP).addReg(FP).addReg(ZERO);
    420   }
    421 
    422   if (MipsFI->callsEhReturn()) {
    423     const TargetRegisterClass *RC = STI.isABI_N64() ?
    424         &Mips::GPR64RegClass : &Mips::GPR32RegClass;
    425 
    426     // Find first instruction that restores a callee-saved register.
    427     MachineBasicBlock::iterator I = MBBI;
    428     for (unsigned i = 0; i < MFI->getCalleeSavedInfo().size(); ++i)
    429       --I;
    430 
    431     // Insert instructions that restore eh data registers.
    432     for (int J = 0; J < 4; ++J) {
    433       TII.loadRegFromStackSlot(MBB, I, ehDataReg(J), MipsFI->getEhDataRegFI(J),
    434                                RC, &RegInfo);
    435     }
    436   }
    437 
    438   // Get the number of bytes from FrameInfo
    439   uint64_t StackSize = MFI->getStackSize();
    440 
    441   if (!StackSize)
    442     return;
    443 
    444   // Adjust stack.
    445   TII.adjustStackPtr(SP, StackSize, MBB, MBBI);
    446 }
    447 
    448 bool MipsSEFrameLowering::
    449 spillCalleeSavedRegisters(MachineBasicBlock &MBB,
    450                           MachineBasicBlock::iterator MI,
    451                           const std::vector<CalleeSavedInfo> &CSI,
    452                           const TargetRegisterInfo *TRI) const {
    453   MachineFunction *MF = MBB.getParent();
    454   MachineBasicBlock *EntryBlock = MF->begin();
    455   const TargetInstrInfo &TII = *MF->getTarget().getInstrInfo();
    456 
    457   for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
    458     // Add the callee-saved register as live-in. Do not add if the register is
    459     // RA and return address is taken, because it has already been added in
    460     // method MipsTargetLowering::LowerRETURNADDR.
    461     // It's killed at the spill, unless the register is RA and return address
    462     // is taken.
    463     unsigned Reg = CSI[i].getReg();
    464     bool IsRAAndRetAddrIsTaken = (Reg == Mips::RA || Reg == Mips::RA_64)
    465         && MF->getFrameInfo()->isReturnAddressTaken();
    466     if (!IsRAAndRetAddrIsTaken)
    467       EntryBlock->addLiveIn(Reg);
    468 
    469     // Insert the spill to the stack frame.
    470     bool IsKill = !IsRAAndRetAddrIsTaken;
    471     const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg);
    472     TII.storeRegToStackSlot(*EntryBlock, MI, Reg, IsKill,
    473                             CSI[i].getFrameIdx(), RC, TRI);
    474   }
    475 
    476   return true;
    477 }
    478 
    479 bool
    480 MipsSEFrameLowering::hasReservedCallFrame(const MachineFunction &MF) const {
    481   const MachineFrameInfo *MFI = MF.getFrameInfo();
    482 
    483   // Reserve call frame if the size of the maximum call frame fits into 16-bit
    484   // immediate field and there are no variable sized objects on the stack.
    485   // Make sure the second register scavenger spill slot can be accessed with one
    486   // instruction.
    487   return isInt<16>(MFI->getMaxCallFrameSize() + getStackAlignment()) &&
    488     !MFI->hasVarSizedObjects();
    489 }
    490 
    491 // Eliminate ADJCALLSTACKDOWN, ADJCALLSTACKUP pseudo instructions
    492 void MipsSEFrameLowering::
    493 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
    494                               MachineBasicBlock::iterator I) const {
    495   const MipsSEInstrInfo &TII =
    496     *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
    497 
    498   if (!hasReservedCallFrame(MF)) {
    499     int64_t Amount = I->getOperand(0).getImm();
    500 
    501     if (I->getOpcode() == Mips::ADJCALLSTACKDOWN)
    502       Amount = -Amount;
    503 
    504     unsigned SP = STI.isABI_N64() ? Mips::SP_64 : Mips::SP;
    505     TII.adjustStackPtr(SP, Amount, MBB, I);
    506   }
    507 
    508   MBB.erase(I);
    509 }
    510 
    511 void MipsSEFrameLowering::
    512 processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
    513                                      RegScavenger *RS) const {
    514   MachineRegisterInfo &MRI = MF.getRegInfo();
    515   MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
    516   unsigned FP = STI.isABI_N64() ? Mips::FP_64 : Mips::FP;
    517 
    518   // Mark $fp as used if function has dedicated frame pointer.
    519   if (hasFP(MF))
    520     MRI.setPhysRegUsed(FP);
    521 
    522   // Create spill slots for eh data registers if function calls eh_return.
    523   if (MipsFI->callsEhReturn())
    524     MipsFI->createEhDataRegsFI();
    525 
    526   // Expand pseudo instructions which load, store or copy accumulators.
    527   // Add an emergency spill slot if a pseudo was expanded.
    528   if (ExpandPseudo(MF).expand()) {
    529     // The spill slot should be half the size of the accumulator. If target is
    530     // mips64, it should be 64-bit, otherwise it should be 32-bt.
    531     const TargetRegisterClass *RC = STI.hasMips64() ?
    532       &Mips::GPR64RegClass : &Mips::GPR32RegClass;
    533     int FI = MF.getFrameInfo()->CreateStackObject(RC->getSize(),
    534                                                   RC->getAlignment(), false);
    535     RS->addScavengingFrameIndex(FI);
    536   }
    537 
    538   // Set scavenging frame index if necessary.
    539   uint64_t MaxSPOffset = MF.getInfo<MipsFunctionInfo>()->getIncomingArgSize() +
    540     estimateStackSize(MF);
    541 
    542   if (isInt<16>(MaxSPOffset))
    543     return;
    544 
    545   const TargetRegisterClass *RC = STI.isABI_N64() ?
    546     &Mips::GPR64RegClass : &Mips::GPR32RegClass;
    547   int FI = MF.getFrameInfo()->CreateStackObject(RC->getSize(),
    548                                                 RC->getAlignment(), false);
    549   RS->addScavengingFrameIndex(FI);
    550 }
    551 
    552 const MipsFrameLowering *
    553 llvm::createMipsSEFrameLowering(const MipsSubtarget &ST) {
    554   return new MipsSEFrameLowering(ST);
    555 }
    556