]>
git.proxmox.com Git - rustc.git/blob - src/llvm/lib/Target/NVPTX/NVPTXFrameLowering.cpp
1 //=======- NVPTXFrameLowering.cpp - NVPTX Frame Information ---*- C++ -*-=====//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the NVPTX implementation of TargetFrameLowering class.
12 //===----------------------------------------------------------------------===//
14 #include "NVPTXFrameLowering.h"
16 #include "NVPTXRegisterInfo.h"
17 #include "NVPTXSubtarget.h"
18 #include "NVPTXTargetMachine.h"
19 #include "llvm/ADT/BitVector.h"
20 #include "llvm/CodeGen/MachineFrameInfo.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineInstrBuilder.h"
23 #include "llvm/CodeGen/MachineRegisterInfo.h"
24 #include "llvm/MC/MachineLocation.h"
25 #include "llvm/Target/TargetInstrInfo.h"
29 NVPTXFrameLowering::NVPTXFrameLowering(NVPTXSubtarget
&STI
)
30 : TargetFrameLowering(TargetFrameLowering::StackGrowsUp
, 8, 0),
31 is64bit(STI
.is64Bit()) {}
33 bool NVPTXFrameLowering::hasFP(const MachineFunction
&MF
) const { return true; }
35 void NVPTXFrameLowering::emitPrologue(MachineFunction
&MF
) const {
36 if (MF
.getFrameInfo()->hasStackObjects()) {
37 MachineBasicBlock
&MBB
= MF
.front();
38 // Insert "mov.u32 %SP, %Depot"
39 MachineBasicBlock::iterator MBBI
= MBB
.begin();
40 // This instruction really occurs before first instruction
41 // in the BB, so giving it no debug location.
42 DebugLoc dl
= DebugLoc();
44 MachineRegisterInfo
&MRI
= MF
.getRegInfo();
47 // cvta.local %SP, %SPL;
49 unsigned LocalReg
= MRI
.createVirtualRegister(&NVPTX::Int64RegsRegClass
);
51 BuildMI(MBB
, MBBI
, dl
, MF
.getSubtarget().getInstrInfo()->get(
52 NVPTX::cvta_local_yes_64
),
53 NVPTX::VRFrame
).addReg(LocalReg
);
55 MF
.getSubtarget().getInstrInfo()->get(NVPTX::MOV_DEPOT_ADDR_64
),
56 LocalReg
).addImm(MF
.getFunctionNumber());
58 unsigned LocalReg
= MRI
.createVirtualRegister(&NVPTX::Int32RegsRegClass
);
60 BuildMI(MBB
, MBBI
, dl
,
61 MF
.getSubtarget().getInstrInfo()->get(NVPTX::cvta_local_yes
),
62 NVPTX::VRFrame
).addReg(LocalReg
);
64 MF
.getSubtarget().getInstrInfo()->get(NVPTX::MOV_DEPOT_ADDR
),
65 LocalReg
).addImm(MF
.getFunctionNumber());
70 void NVPTXFrameLowering::emitEpilogue(MachineFunction
&MF
,
71 MachineBasicBlock
&MBB
) const {}
73 // This function eliminates ADJCALLSTACKDOWN,
74 // ADJCALLSTACKUP pseudo instructions
75 void NVPTXFrameLowering::eliminateCallFramePseudoInstr(
76 MachineFunction
&MF
, MachineBasicBlock
&MBB
,
77 MachineBasicBlock::iterator I
) const {
78 // Simply discard ADJCALLSTACKDOWN,
79 // ADJCALLSTACKUP instructions.