Home | History | Annotate | Download | only in AMDGPU
      1 //===--------------------- 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 
     15 namespace llvm {
     16 
     17 class SIInstrInfo;
     18 class SIMachineFunctionInfo;
     19 class SIRegisterInfo;
     20 class GCNSubtarget;
     21 
     22 class SIFrameLowering final : public AMDGPUFrameLowering {
     23 public:
     24   SIFrameLowering(StackDirection D, unsigned StackAl, int LAO,
     25                   unsigned TransAl = 1) :
     26     AMDGPUFrameLowering(D, StackAl, LAO, TransAl) {}
     27   ~SIFrameLowering() override = default;
     28 
     29   void emitEntryFunctionPrologue(MachineFunction &MF,
     30                                  MachineBasicBlock &MBB) const;
     31   void emitPrologue(MachineFunction &MF,
     32                     MachineBasicBlock &MBB) const override;
     33   void emitEpilogue(MachineFunction &MF,
     34                     MachineBasicBlock &MBB) const override;
     35   int getFrameIndexReference(const MachineFunction &MF, int FI,
     36                              unsigned &FrameReg) const override;
     37 
     38   void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
     39                             RegScavenger *RS = nullptr) const override;
     40 
     41   void processFunctionBeforeFrameFinalized(
     42     MachineFunction &MF,
     43     RegScavenger *RS = nullptr) const override;
     44 
     45   MachineBasicBlock::iterator
     46   eliminateCallFramePseudoInstr(MachineFunction &MF,
     47                                 MachineBasicBlock &MBB,
     48                                 MachineBasicBlock::iterator MI) const override;
     49 
     50 private:
     51   void emitFlatScratchInit(const GCNSubtarget &ST,
     52                            MachineFunction &MF,
     53                            MachineBasicBlock &MBB) const;
     54 
     55   unsigned getReservedPrivateSegmentBufferReg(
     56     const GCNSubtarget &ST,
     57     const SIInstrInfo *TII,
     58     const SIRegisterInfo *TRI,
     59     SIMachineFunctionInfo *MFI,
     60     MachineFunction &MF) const;
     61 
     62   std::pair<unsigned, unsigned> getReservedPrivateSegmentWaveByteOffsetReg(
     63     const GCNSubtarget &ST,
     64     const SIInstrInfo *TII,
     65     const SIRegisterInfo *TRI,
     66     SIMachineFunctionInfo *MFI,
     67     MachineFunction &MF) const;
     68 
     69   /// Emits debugger prologue.
     70   void emitDebuggerPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const;
     71 
     72   // Emit scratch setup code for AMDPAL or Mesa, assuming ResourceRegUsed is set.
     73   void emitEntryFunctionScratchSetup(const GCNSubtarget &ST, MachineFunction &MF,
     74       MachineBasicBlock &MBB, SIMachineFunctionInfo *MFI,
     75       MachineBasicBlock::iterator I, unsigned PreloadedPrivateBufferReg,
     76       unsigned ScratchRsrcReg) const;
     77 
     78 public:
     79   bool hasFP(const MachineFunction &MF) const override;
     80   bool hasSP(const MachineFunction &MF) const;
     81 };
     82 
     83 } // end namespace llvm
     84 
     85 #endif // LLVM_LIB_TARGET_AMDGPU_SIFRAMELOWERING_H
     86