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