xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VEFrameLowering.h (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1480093f4SDimitry Andric //===-- VEFrameLowering.h - Define frame lowering for VE --*- C++ -*-===//
2480093f4SDimitry Andric //
3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6480093f4SDimitry Andric //
7480093f4SDimitry Andric //===----------------------------------------------------------------------===//
8480093f4SDimitry Andric //
9480093f4SDimitry Andric // This class implements VE-specific bits of TargetFrameLowering class.
10480093f4SDimitry Andric //
11480093f4SDimitry Andric //===----------------------------------------------------------------------===//
12480093f4SDimitry Andric 
13480093f4SDimitry Andric #ifndef LLVM_LIB_TARGET_VE_VEFRAMELOWERING_H
14480093f4SDimitry Andric #define LLVM_LIB_TARGET_VE_VEFRAMELOWERING_H
15480093f4SDimitry Andric 
16480093f4SDimitry Andric #include "VE.h"
17480093f4SDimitry Andric #include "llvm/CodeGen/TargetFrameLowering.h"
18480093f4SDimitry Andric 
19480093f4SDimitry Andric namespace llvm {
20480093f4SDimitry Andric 
21480093f4SDimitry Andric class VESubtarget;
22480093f4SDimitry Andric class VEFrameLowering : public TargetFrameLowering {
23480093f4SDimitry Andric public:
24480093f4SDimitry Andric   explicit VEFrameLowering(const VESubtarget &ST);
25480093f4SDimitry Andric 
26480093f4SDimitry Andric   /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
27480093f4SDimitry Andric   /// the function.
28480093f4SDimitry Andric   void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
29480093f4SDimitry Andric   void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
30480093f4SDimitry Andric   void emitPrologueInsns(MachineFunction &MF, MachineBasicBlock &MBB,
31*5ffd83dbSDimitry Andric                          MachineBasicBlock::iterator MBBI, uint64_t NumBytes,
32480093f4SDimitry Andric                          bool RequireFPUpdate) const;
33480093f4SDimitry Andric   void emitEpilogueInsns(MachineFunction &MF, MachineBasicBlock &MBB,
34*5ffd83dbSDimitry Andric                          MachineBasicBlock::iterator MBBI, uint64_t NumBytes,
35480093f4SDimitry Andric                          bool RequireFPUpdate) const;
36480093f4SDimitry Andric 
37480093f4SDimitry Andric   MachineBasicBlock::iterator
38480093f4SDimitry Andric   eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
39480093f4SDimitry Andric                                 MachineBasicBlock::iterator I) const override;
40480093f4SDimitry Andric 
41*5ffd83dbSDimitry Andric   bool hasBP(const MachineFunction &MF) const;
42480093f4SDimitry Andric   bool hasFP(const MachineFunction &MF) const override;
43*5ffd83dbSDimitry Andric   // VE reserves argument space always for call sites in the function
44*5ffd83dbSDimitry Andric   // immediately on entry of the current function.
45*5ffd83dbSDimitry Andric   bool hasReservedCallFrame(const MachineFunction &MF) const override {
46*5ffd83dbSDimitry Andric     return true;
47*5ffd83dbSDimitry Andric   }
48480093f4SDimitry Andric   void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
49480093f4SDimitry Andric                             RegScavenger *RS = nullptr) const override;
50480093f4SDimitry Andric 
51480093f4SDimitry Andric   int getFrameIndexReference(const MachineFunction &MF, int FI,
52*5ffd83dbSDimitry Andric                              Register &FrameReg) const override;
53480093f4SDimitry Andric 
54480093f4SDimitry Andric   const SpillSlot *
55480093f4SDimitry Andric   getCalleeSavedSpillSlots(unsigned &NumEntries) const override {
56480093f4SDimitry Andric     static const SpillSlot Offsets[] = {
57480093f4SDimitry Andric         {VE::SX17, 40},  {VE::SX18, 48},  {VE::SX19, 56},  {VE::SX20, 64},
58480093f4SDimitry Andric         {VE::SX21, 72},  {VE::SX22, 80},  {VE::SX23, 88},  {VE::SX24, 96},
59480093f4SDimitry Andric         {VE::SX25, 104}, {VE::SX26, 112}, {VE::SX27, 120}, {VE::SX28, 128},
60480093f4SDimitry Andric         {VE::SX29, 136}, {VE::SX30, 144}, {VE::SX31, 152}, {VE::SX32, 160},
61480093f4SDimitry Andric         {VE::SX33, 168}};
62480093f4SDimitry Andric     NumEntries = array_lengthof(Offsets);
63480093f4SDimitry Andric     return Offsets;
64480093f4SDimitry Andric   }
65480093f4SDimitry Andric 
66*5ffd83dbSDimitry Andric protected:
67*5ffd83dbSDimitry Andric   const VESubtarget &STI;
68480093f4SDimitry Andric 
69480093f4SDimitry Andric private:
70480093f4SDimitry Andric   // Returns true if MF is a leaf procedure.
71480093f4SDimitry Andric   bool isLeafProc(MachineFunction &MF) const;
72480093f4SDimitry Andric 
73480093f4SDimitry Andric   // Emits code for adjusting SP in function prologue/epilogue.
74480093f4SDimitry Andric   void emitSPAdjustment(MachineFunction &MF, MachineBasicBlock &MBB,
75*5ffd83dbSDimitry Andric                         MachineBasicBlock::iterator MBBI, int64_t NumBytes,
76*5ffd83dbSDimitry Andric                         MaybeAlign MayAlign = MaybeAlign()) const;
77480093f4SDimitry Andric 
78480093f4SDimitry Andric   // Emits code for extending SP in function prologue/epilogue.
79480093f4SDimitry Andric   void emitSPExtend(MachineFunction &MF, MachineBasicBlock &MBB,
80*5ffd83dbSDimitry Andric                     MachineBasicBlock::iterator MBBI) const;
81480093f4SDimitry Andric };
82480093f4SDimitry Andric 
83480093f4SDimitry Andric } // namespace llvm
84480093f4SDimitry Andric 
85480093f4SDimitry Andric #endif
86