| //=======- NVPTXFrameLowering.cpp - NVPTX Frame Information ---*- C++ -*-=====// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains the NVPTX implementation of TargetFrameLowering class. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "NVPTXFrameLowering.h" |
| #include "NVPTX.h" |
| #include "NVPTXRegisterInfo.h" |
| #include "NVPTXSubtarget.h" |
| #include "NVPTXTargetMachine.h" |
| #include "llvm/ADT/BitVector.h" |
| #include "llvm/CodeGen/MachineFrameInfo.h" |
| #include "llvm/CodeGen/MachineFunction.h" |
| #include "llvm/CodeGen/MachineInstrBuilder.h" |
| #include "llvm/MC/MachineLocation.h" |
| #include "llvm/Target/TargetInstrInfo.h" |
| |
| using namespace llvm; |
| |
| bool NVPTXFrameLowering::hasFP(const MachineFunction &MF) const { |
| return true; |
| } |
| |
| void NVPTXFrameLowering::emitPrologue(MachineFunction &MF) const { |
| if (MF.getFrameInfo()->hasStackObjects()) { |
| MachineBasicBlock &MBB = MF.front(); |
| // Insert "mov.u32 %SP, %Depot" |
| MachineBasicBlock::iterator MBBI = MBB.begin(); |
| // This instruction really occurs before first instruction |
| // in the BB, so giving it no debug location. |
| DebugLoc dl = DebugLoc(); |
| |
| if (tm.getSubtargetImpl()->hasGenericLdSt()) { |
| // mov %SPL, %depot; |
| // cvta.local %SP, %SPL; |
| if (is64bit) { |
| MachineInstr *MI = BuildMI(MBB, MBBI, dl, |
| tm.getInstrInfo()->get(NVPTX::cvta_local_yes_64), |
| NVPTX::VRFrame).addReg(NVPTX::VRFrameLocal); |
| BuildMI(MBB, MI, dl, |
| tm.getInstrInfo()->get(NVPTX::IMOV64rr), NVPTX::VRFrameLocal) |
| .addReg(NVPTX::VRDepot); |
| } else { |
| MachineInstr *MI = BuildMI(MBB, MBBI, dl, |
| tm.getInstrInfo()->get(NVPTX::cvta_local_yes), |
| NVPTX::VRFrame).addReg(NVPTX::VRFrameLocal); |
| BuildMI(MBB, MI, dl, |
| tm.getInstrInfo()->get(NVPTX::IMOV32rr), NVPTX::VRFrameLocal) |
| .addReg(NVPTX::VRDepot); |
| } |
| } |
| else { |
| // mov %SP, %depot; |
| if (is64bit) |
| BuildMI(MBB, MBBI, dl, |
| tm.getInstrInfo()->get(NVPTX::IMOV64rr), NVPTX::VRFrame) |
| .addReg(NVPTX::VRDepot); |
| else |
| BuildMI(MBB, MBBI, dl, |
| tm.getInstrInfo()->get(NVPTX::IMOV32rr), NVPTX::VRFrame) |
| .addReg(NVPTX::VRDepot); |
| } |
| } |
| } |
| |
| void NVPTXFrameLowering::emitEpilogue(MachineFunction &MF, |
| MachineBasicBlock &MBB) const { |
| } |
| |
| // This function eliminates ADJCALLSTACKDOWN, |
| // ADJCALLSTACKUP pseudo instructions |
| void NVPTXFrameLowering:: |
| eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, |
| MachineBasicBlock::iterator I) const { |
| // Simply discard ADJCALLSTACKDOWN, |
| // ADJCALLSTACKUP instructions. |
| MBB.erase(I); |
| } |
| |