blob: 6be7f26220893177e6c73f38abdc3e8bdb86dec0 [file] [log] [blame]
Matt Arsenault0c90e952015-11-06 18:17:45 +00001//===--------------------- SIFrameLowering.h --------------------*- C++ -*-===//
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#ifndef LLVM_LIB_TARGET_AMDGPU_SIFRAMELOWERING_H
11#define LLVM_LIB_TARGET_AMDGPU_SIFRAMELOWERING_H
12
13#include "AMDGPUFrameLowering.h"
14
15namespace llvm {
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000016
Matt Arsenault57bc4322016-08-31 21:52:21 +000017class SIInstrInfo;
18class SIMachineFunctionInfo;
19class SIRegisterInfo;
20class SISubtarget;
Matt Arsenault0c90e952015-11-06 18:17:45 +000021
22class SIFrameLowering final : public AMDGPUFrameLowering {
23public:
24 SIFrameLowering(StackDirection D, unsigned StackAl, int LAO,
25 unsigned TransAl = 1) :
26 AMDGPUFrameLowering(D, StackAl, LAO, TransAl) {}
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000027 ~SIFrameLowering() override = default;
Matt Arsenault0c90e952015-11-06 18:17:45 +000028
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +000029 void emitEntryFunctionPrologue(MachineFunction &MF,
30 MachineBasicBlock &MBB) const;
Matt Arsenault0e3d3892015-11-30 21:15:53 +000031 void emitPrologue(MachineFunction &MF,
32 MachineBasicBlock &MBB) const override;
Matt Arsenault43e92fe2016-06-24 06:30:11 +000033 void emitEpilogue(MachineFunction &MF,
34 MachineBasicBlock &MBB) const override;
Konstantin Zhuravlyovffdb00e2017-03-10 19:39:07 +000035 int getFrameIndexReference(const MachineFunction &MF, int FI,
36 unsigned &FrameReg) const override;
Matt Arsenault0e3d3892015-11-30 21:15:53 +000037
Matt Arsenaultecb43ef2017-09-13 23:47:01 +000038 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
39 RegScavenger *RS = nullptr) const override;
40
Matt Arsenault0c90e952015-11-06 18:17:45 +000041 void processFunctionBeforeFrameFinalized(
42 MachineFunction &MF,
43 RegScavenger *RS = nullptr) const override;
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +000044
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000045 MachineBasicBlock::iterator
46 eliminateCallFramePseudoInstr(MachineFunction &MF,
47 MachineBasicBlock &MBB,
48 MachineBasicBlock::iterator MI) const override;
49
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +000050private:
Matt Arsenaulte823d922017-02-18 18:29:53 +000051 void emitFlatScratchInit(const SISubtarget &ST,
Matt Arsenault57bc4322016-08-31 21:52:21 +000052 MachineFunction &MF,
53 MachineBasicBlock &MBB) const;
54
55 unsigned getReservedPrivateSegmentBufferReg(
56 const SISubtarget &ST,
57 const SIInstrInfo *TII,
58 const SIRegisterInfo *TRI,
59 SIMachineFunctionInfo *MFI,
60 MachineFunction &MF) const;
61
Matt Arsenault36c31222017-04-25 23:40:57 +000062 std::pair<unsigned, unsigned> getReservedPrivateSegmentWaveByteOffsetReg(
Matt Arsenault57bc4322016-08-31 21:52:21 +000063 const SISubtarget &ST,
64 const SIInstrInfo *TII,
65 const SIRegisterInfo *TRI,
66 SIMachineFunctionInfo *MFI,
67 MachineFunction &MF) const;
68
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000069 /// Emits debugger prologue.
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +000070 void emitDebuggerPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const;
Matt Arsenaultf28683c2017-06-26 17:53:59 +000071
Tim Renouf13229152017-09-29 09:49:35 +000072 // Emit scratch setup code for AMDPAL or Mesa, assuming ResourceRegUsed is set.
73 void emitEntryFunctionScratchSetup(const SISubtarget &ST, MachineFunction &MF,
74 MachineBasicBlock &MBB, SIMachineFunctionInfo *MFI,
75 MachineBasicBlock::iterator I, unsigned PreloadedPrivateBufferReg,
76 unsigned ScratchRsrcReg) const;
77
Matt Arsenaultf28683c2017-06-26 17:53:59 +000078public:
79 bool hasFP(const MachineFunction &MF) const override;
80 bool hasSP(const MachineFunction &MF) const;
Matt Arsenault0c90e952015-11-06 18:17:45 +000081};
82
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000083} // end namespace llvm
Matt Arsenault0c90e952015-11-06 18:17:45 +000084
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000085#endif // LLVM_LIB_TARGET_AMDGPU_SIFRAMELOWERING_H