1cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//===-- MipsSEFrameLowering.cpp - Mips32/64 Frame Information -------------===//
2cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//
3cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//                     The LLVM Compiler Infrastructure
4cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//
5cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka// This file is distributed under the University of Illinois Open Source
6cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka// License. See LICENSE.TXT for details.
7cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//
8cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//===----------------------------------------------------------------------===//
9cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//
10cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka// This file contains the Mips32/64 implementation of TargetFrameLowering class.
11cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//
12cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka//===----------------------------------------------------------------------===//
13cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
14cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "MipsSEFrameLowering.h"
15cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "MipsAnalyzeImmediate.h"
1671746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka#include "MipsSEInstrInfo.h"
17cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "MipsMachineFunction.h"
18cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "MCTargetDesc/MipsBaseInfo.h"
19cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/Function.h"
20cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/CodeGen/MachineFrameInfo.h"
21cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/CodeGen/MachineFunction.h"
22cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/CodeGen/MachineInstrBuilder.h"
23cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/CodeGen/MachineModuleInfo.h"
24cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/CodeGen/MachineRegisterInfo.h"
25cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/Target/TargetData.h"
26cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/Target/TargetOptions.h"
27cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka#include "llvm/Support/CommandLine.h"
28cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
29cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanakausing namespace llvm;
30cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
31cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanakavoid MipsSEFrameLowering::emitPrologue(MachineFunction &MF) const {
32cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineBasicBlock &MBB   = MF.front();
33cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineFrameInfo *MFI    = MF.getFrameInfo();
34cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  const MipsRegisterInfo *RegInfo =
35cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    static_cast<const MipsRegisterInfo*>(MF.getTarget().getRegisterInfo());
3671746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka  const MipsSEInstrInfo &TII =
3771746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka    *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
38cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineBasicBlock::iterator MBBI = MBB.begin();
39cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
40cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned SP = STI.isABI_N64() ? Mips::SP_64 : Mips::SP;
41cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned FP = STI.isABI_N64() ? Mips::FP_64 : Mips::FP;
42cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned ZERO = STI.isABI_N64() ? Mips::ZERO_64 : Mips::ZERO;
43cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned ADDu = STI.isABI_N64() ? Mips::DADDu : Mips::ADDu;
44cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
45cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // First, compute final stack size.
46cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  uint64_t StackSize = MFI->getStackSize();
47cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
48cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // No need to allocate space on the stack.
49cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  if (StackSize == 0 && !MFI->adjustsStack()) return;
50cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
51cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineModuleInfo &MMI = MF.getMMI();
52cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  std::vector<MachineMove> &Moves = MMI.getFrameMoves();
53cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineLocation DstML, SrcML;
54cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
55cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // Adjust stack.
5671746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka  TII.adjustStackPtr(SP, -StackSize, MBB, MBBI);
57cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
58cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // emit ".cfi_def_cfa_offset StackSize"
59cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MCSymbol *AdjustSPLabel = MMI.getContext().CreateTempSymbol();
60cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  BuildMI(MBB, MBBI, dl,
61cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka          TII.get(TargetOpcode::PROLOG_LABEL)).addSym(AdjustSPLabel);
62cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  DstML = MachineLocation(MachineLocation::VirtualFP);
63cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  SrcML = MachineLocation(MachineLocation::VirtualFP, -StackSize);
64cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  Moves.push_back(MachineMove(AdjustSPLabel, DstML, SrcML));
65cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
66cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
67cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
68cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  if (CSI.size()) {
69cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // Find the instruction past the last instruction that saves a callee-saved
70cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // register to the stack.
71cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    for (unsigned i = 0; i < CSI.size(); ++i)
72cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      ++MBBI;
73cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
74cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // Iterate over list of callee-saved registers and emit .cfi_offset
75cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // directives.
76cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    MCSymbol *CSLabel = MMI.getContext().CreateTempSymbol();
77cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    BuildMI(MBB, MBBI, dl,
78cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka            TII.get(TargetOpcode::PROLOG_LABEL)).addSym(CSLabel);
79cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
80cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
81cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka           E = CSI.end(); I != E; ++I) {
82cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      int64_t Offset = MFI->getObjectOffset(I->getFrameIdx());
83cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      unsigned Reg = I->getReg();
84cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
85cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      // If Reg is a double precision register, emit two cfa_offsets,
86cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      // one for each of the paired single precision registers.
87cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      if (Mips::AFGR64RegClass.contains(Reg)) {
88cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        MachineLocation DstML0(MachineLocation::VirtualFP, Offset);
89cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        MachineLocation DstML1(MachineLocation::VirtualFP, Offset + 4);
90cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        MachineLocation SrcML0(RegInfo->getSubReg(Reg, Mips::sub_fpeven));
91cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        MachineLocation SrcML1(RegInfo->getSubReg(Reg, Mips::sub_fpodd));
92cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
93cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        if (!STI.isLittle())
94cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka          std::swap(SrcML0, SrcML1);
95cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
96cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        Moves.push_back(MachineMove(CSLabel, DstML0, SrcML0));
97cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        Moves.push_back(MachineMove(CSLabel, DstML1, SrcML1));
98cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      } else {
99cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        // Reg is either in CPURegs or FGR32.
100cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        DstML = MachineLocation(MachineLocation::VirtualFP, Offset);
101cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        SrcML = MachineLocation(Reg);
102cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        Moves.push_back(MachineMove(CSLabel, DstML, SrcML));
103cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      }
104cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    }
105cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  }
106cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
107cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // if framepointer enabled, set it to point to the stack pointer.
108cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  if (hasFP(MF)) {
109cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // Insert instruction "move $fp, $sp" at this location.
110cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    BuildMI(MBB, MBBI, dl, TII.get(ADDu), FP).addReg(SP).addReg(ZERO);
111cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
112cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // emit ".cfi_def_cfa_register $fp"
113cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    MCSymbol *SetFPLabel = MMI.getContext().CreateTempSymbol();
114cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    BuildMI(MBB, MBBI, dl,
115cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka            TII.get(TargetOpcode::PROLOG_LABEL)).addSym(SetFPLabel);
116cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    DstML = MachineLocation(FP);
117cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    SrcML = MachineLocation(MachineLocation::VirtualFP);
118cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    Moves.push_back(MachineMove(SetFPLabel, DstML, SrcML));
119cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  }
120cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka}
121cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
122cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanakavoid MipsSEFrameLowering::emitEpilogue(MachineFunction &MF,
123cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka                                       MachineBasicBlock &MBB) const {
124cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
125cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineFrameInfo *MFI            = MF.getFrameInfo();
12671746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka  const MipsSEInstrInfo &TII =
12771746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka    *static_cast<const MipsSEInstrInfo*>(MF.getTarget().getInstrInfo());
128cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  DebugLoc dl = MBBI->getDebugLoc();
129cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned SP = STI.isABI_N64() ? Mips::SP_64 : Mips::SP;
130cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned FP = STI.isABI_N64() ? Mips::FP_64 : Mips::FP;
131cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned ZERO = STI.isABI_N64() ? Mips::ZERO_64 : Mips::ZERO;
132cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned ADDu = STI.isABI_N64() ? Mips::DADDu : Mips::ADDu;
133cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
134cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // if framepointer enabled, restore the stack pointer.
135cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  if (hasFP(MF)) {
136cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // Find the first instruction that restores a callee-saved register.
137cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    MachineBasicBlock::iterator I = MBBI;
138cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
139cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    for (unsigned i = 0; i < MFI->getCalleeSavedInfo().size(); ++i)
140cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      --I;
141cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
142cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // Insert instruction "move $sp, $fp" at this location.
143cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    BuildMI(MBB, I, dl, TII.get(ADDu), SP).addReg(FP).addReg(ZERO);
144cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  }
145cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
146cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // Get the number of bytes from FrameInfo
147cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  uint64_t StackSize = MFI->getStackSize();
148cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
149cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  if (!StackSize)
150cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    return;
151cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
152cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // Adjust stack.
15371746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka  TII.adjustStackPtr(SP, StackSize, MBB, MBBI);
154cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka}
155cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
156cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanakabool MipsSEFrameLowering::
157cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira HatanakaspillCalleeSavedRegisters(MachineBasicBlock &MBB,
158cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka                          MachineBasicBlock::iterator MI,
159cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka                          const std::vector<CalleeSavedInfo> &CSI,
160cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka                          const TargetRegisterInfo *TRI) const {
161cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineFunction *MF = MBB.getParent();
162cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineBasicBlock *EntryBlock = MF->begin();
163cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  const TargetInstrInfo &TII = *MF->getTarget().getInstrInfo();
164cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
165cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
166cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // Add the callee-saved register as live-in. Do not add if the register is
167cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // RA and return address is taken, because it has already been added in
168cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // method MipsTargetLowering::LowerRETURNADDR.
169cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // It's killed at the spill, unless the register is RA and return address
170cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // is taken.
171cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    unsigned Reg = CSI[i].getReg();
172cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    bool IsRAAndRetAddrIsTaken = (Reg == Mips::RA || Reg == Mips::RA_64)
173cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka        && MF->getFrameInfo()->isReturnAddressTaken();
174cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    if (!IsRAAndRetAddrIsTaken)
175cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka      EntryBlock->addLiveIn(Reg);
176cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
177cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    // Insert the spill to the stack frame.
178cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    bool IsKill = !IsRAAndRetAddrIsTaken;
179cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg);
180cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    TII.storeRegToStackSlot(*EntryBlock, MI, Reg, IsKill,
181cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka                            CSI[i].getFrameIdx(), RC, TRI);
182cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  }
183cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
184cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  return true;
185cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka}
186cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
187cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanakabool
188cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira HatanakaMipsSEFrameLowering::hasReservedCallFrame(const MachineFunction &MF) const {
189cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  const MachineFrameInfo *MFI = MF.getFrameInfo();
190cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
191cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // Reserve call frame if the size of the maximum call frame fits into 16-bit
192cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // immediate field and there are no variable sized objects on the stack.
193cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  return isInt<16>(MFI->getMaxCallFrameSize()) && !MFI->hasVarSizedObjects();
194cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka}
195cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
196cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanakavoid MipsSEFrameLowering::
197cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira HatanakaprocessFunctionBeforeCalleeSavedScan(MachineFunction &MF,
198cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka                                     RegScavenger *RS) const {
199cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  MachineRegisterInfo &MRI = MF.getRegInfo();
200cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  unsigned FP = STI.isABI_N64() ? Mips::FP_64 : Mips::FP;
201cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka
202cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  // Mark $fp as used if function has dedicated frame pointer.
203cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka  if (hasFP(MF))
204cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka    MRI.setPhysRegUsed(FP);
205cdb3ba71ce550c5a41c84c3678225a39d6f0a414Akira Hatanaka}
206af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka
207af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanakaconst MipsFrameLowering *
208af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanakallvm::createMipsSEFrameLowering(const MipsSubtarget &ST) {
209af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka  return new MipsSEFrameLowering(ST);
210af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka}
211