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