xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VEFrameLowering.h (revision 480093f4440d54b30b3025afeac24b48f2ba7a2e)
1*480093f4SDimitry Andric //===-- VEFrameLowering.h - Define frame lowering for VE --*- C++ -*-===//
2*480093f4SDimitry Andric //
3*480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*480093f4SDimitry Andric //
7*480093f4SDimitry Andric //===----------------------------------------------------------------------===//
8*480093f4SDimitry Andric //
9*480093f4SDimitry Andric // This class implements VE-specific bits of TargetFrameLowering class.
10*480093f4SDimitry Andric //
11*480093f4SDimitry Andric //===----------------------------------------------------------------------===//
12*480093f4SDimitry Andric 
13*480093f4SDimitry Andric #ifndef LLVM_LIB_TARGET_VE_VEFRAMELOWERING_H
14*480093f4SDimitry Andric #define LLVM_LIB_TARGET_VE_VEFRAMELOWERING_H
15*480093f4SDimitry Andric 
16*480093f4SDimitry Andric #include "VE.h"
17*480093f4SDimitry Andric #include "llvm/CodeGen/TargetFrameLowering.h"
18*480093f4SDimitry Andric 
19*480093f4SDimitry Andric namespace llvm {
20*480093f4SDimitry Andric 
21*480093f4SDimitry Andric class VESubtarget;
22*480093f4SDimitry Andric class VEFrameLowering : public TargetFrameLowering {
23*480093f4SDimitry Andric public:
24*480093f4SDimitry Andric   explicit VEFrameLowering(const VESubtarget &ST);
25*480093f4SDimitry Andric 
26*480093f4SDimitry Andric   /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
27*480093f4SDimitry Andric   /// the function.
28*480093f4SDimitry Andric   void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
29*480093f4SDimitry Andric   void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
30*480093f4SDimitry Andric   void emitPrologueInsns(MachineFunction &MF, MachineBasicBlock &MBB,
31*480093f4SDimitry Andric                          MachineBasicBlock::iterator MBBI, int NumBytes,
32*480093f4SDimitry Andric                          bool RequireFPUpdate) const;
33*480093f4SDimitry Andric   void emitEpilogueInsns(MachineFunction &MF, MachineBasicBlock &MBB,
34*480093f4SDimitry Andric                          MachineBasicBlock::iterator MBBI, int NumBytes,
35*480093f4SDimitry Andric                          bool RequireFPUpdate) const;
36*480093f4SDimitry Andric 
37*480093f4SDimitry Andric   MachineBasicBlock::iterator
38*480093f4SDimitry Andric   eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
39*480093f4SDimitry Andric                                 MachineBasicBlock::iterator I) const override;
40*480093f4SDimitry Andric 
41*480093f4SDimitry Andric   bool hasReservedCallFrame(const MachineFunction &MF) const override;
42*480093f4SDimitry Andric   bool hasFP(const MachineFunction &MF) const override;
43*480093f4SDimitry Andric   void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
44*480093f4SDimitry Andric                             RegScavenger *RS = nullptr) const override;
45*480093f4SDimitry Andric 
46*480093f4SDimitry Andric   int getFrameIndexReference(const MachineFunction &MF, int FI,
47*480093f4SDimitry Andric                              unsigned &FrameReg) const override;
48*480093f4SDimitry Andric 
49*480093f4SDimitry Andric   const SpillSlot *
50*480093f4SDimitry Andric   getCalleeSavedSpillSlots(unsigned &NumEntries) const override {
51*480093f4SDimitry Andric     static const SpillSlot Offsets[] = {
52*480093f4SDimitry Andric         {VE::SX17, 40},  {VE::SX18, 48},  {VE::SX19, 56},  {VE::SX20, 64},
53*480093f4SDimitry Andric         {VE::SX21, 72},  {VE::SX22, 80},  {VE::SX23, 88},  {VE::SX24, 96},
54*480093f4SDimitry Andric         {VE::SX25, 104}, {VE::SX26, 112}, {VE::SX27, 120}, {VE::SX28, 128},
55*480093f4SDimitry Andric         {VE::SX29, 136}, {VE::SX30, 144}, {VE::SX31, 152}, {VE::SX32, 160},
56*480093f4SDimitry Andric         {VE::SX33, 168}};
57*480093f4SDimitry Andric     NumEntries = array_lengthof(Offsets);
58*480093f4SDimitry Andric     return Offsets;
59*480093f4SDimitry Andric   }
60*480093f4SDimitry Andric 
61*480093f4SDimitry Andric   /// targetHandlesStackFrameRounding - Returns true if the target is
62*480093f4SDimitry Andric   /// responsible for rounding up the stack frame (probably at emitPrologue
63*480093f4SDimitry Andric   /// time).
64*480093f4SDimitry Andric   bool targetHandlesStackFrameRounding() const override { return true; }
65*480093f4SDimitry Andric 
66*480093f4SDimitry Andric private:
67*480093f4SDimitry Andric   // Returns true if MF is a leaf procedure.
68*480093f4SDimitry Andric   bool isLeafProc(MachineFunction &MF) const;
69*480093f4SDimitry Andric 
70*480093f4SDimitry Andric   // Emits code for adjusting SP in function prologue/epilogue.
71*480093f4SDimitry Andric   void emitSPAdjustment(MachineFunction &MF, MachineBasicBlock &MBB,
72*480093f4SDimitry Andric                         MachineBasicBlock::iterator MBBI, int NumBytes) const;
73*480093f4SDimitry Andric 
74*480093f4SDimitry Andric   // Emits code for extending SP in function prologue/epilogue.
75*480093f4SDimitry Andric   void emitSPExtend(MachineFunction &MF, MachineBasicBlock &MBB,
76*480093f4SDimitry Andric                     MachineBasicBlock::iterator MBBI, int NumBytes) const;
77*480093f4SDimitry Andric };
78*480093f4SDimitry Andric 
79*480093f4SDimitry Andric } // namespace llvm
80*480093f4SDimitry Andric 
81*480093f4SDimitry Andric #endif
82