133388ae8SLu Weining //=- LoongArchFrameLowering.h - TargetFrameLowering for LoongArch -*- C++ -*--// 233388ae8SLu Weining // 333388ae8SLu Weining // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 433388ae8SLu Weining // See https://llvm.org/LICENSE.txt for license information. 533388ae8SLu Weining // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 633388ae8SLu Weining // 733388ae8SLu Weining //===----------------------------------------------------------------------===// 833388ae8SLu Weining // 933388ae8SLu Weining // This class implements LoongArch-specific bits of TargetFrameLowering class. 1033388ae8SLu Weining // 1133388ae8SLu Weining //===----------------------------------------------------------------------===// 1233388ae8SLu Weining 1333388ae8SLu Weining #ifndef LLVM_LIB_TARGET_LOONGARCH_LOONGARCHFRAMELOWERING_H 1433388ae8SLu Weining #define LLVM_LIB_TARGET_LOONGARCH_LOONGARCHFRAMELOWERING_H 1533388ae8SLu Weining 1633388ae8SLu Weining #include "llvm/CodeGen/TargetFrameLowering.h" 1733388ae8SLu Weining 1833388ae8SLu Weining namespace llvm { 1933388ae8SLu Weining class LoongArchSubtarget; 2033388ae8SLu Weining 2133388ae8SLu Weining class LoongArchFrameLowering : public TargetFrameLowering { 2233388ae8SLu Weining const LoongArchSubtarget &STI; 2333388ae8SLu Weining 2433388ae8SLu Weining public: 2533388ae8SLu Weining explicit LoongArchFrameLowering(const LoongArchSubtarget &STI) 2633388ae8SLu Weining : TargetFrameLowering(StackGrowsDown, 2733388ae8SLu Weining /*StackAlignment=*/Align(16), 2833388ae8SLu Weining /*LocalAreaOffset=*/0), 2933388ae8SLu Weining STI(STI) {} 3033388ae8SLu Weining 3133388ae8SLu Weining void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 3233388ae8SLu Weining void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 3333388ae8SLu Weining 34c2d1d9f9Swanglei void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, 35c2d1d9f9Swanglei RegScavenger *RS) const override; 36c2d1d9f9Swanglei 374e2364a2Swanglei void processFunctionBeforeFrameFinalized(MachineFunction &MF, 384e2364a2Swanglei RegScavenger *RS) const override; 394e2364a2Swanglei 400c2b738fSwanglei bool hasReservedCallFrame(const MachineFunction &MF) const override; 413610d5f5Swanglei MachineBasicBlock::iterator 423610d5f5Swanglei eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 430c2b738fSwanglei MachineBasicBlock::iterator MI) const override; 44d20c54cbSwanglei bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 45d20c54cbSwanglei MachineBasicBlock::iterator MI, 46d20c54cbSwanglei ArrayRef<CalleeSavedInfo> CSI, 47d20c54cbSwanglei const TargetRegisterInfo *TRI) const override; 483610d5f5Swanglei 495b1ec705Swanglei StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, 505b1ec705Swanglei Register &FrameReg) const override; 515b1ec705Swanglei 5233388ae8SLu Weining bool hasBP(const MachineFunction &MF) const; 53c2d1d9f9Swanglei 540d17e1f0Shev uint64_t getFirstSPAdjustAmount(const MachineFunction &MF) const; 55f589e506Swanglei 5625ecfbf8Swanglei bool enableShrinkWrapping(const MachineFunction &MF) const override; 5725ecfbf8Swanglei 58*ad4a582fSAlex Rønne Petersen protected: 59*ad4a582fSAlex Rønne Petersen bool hasFPImpl(const MachineFunction &MF) const override; 60*ad4a582fSAlex Rønne Petersen 61c2d1d9f9Swanglei private: 62c2d1d9f9Swanglei void determineFrameLayout(MachineFunction &MF) const; 63c2d1d9f9Swanglei void adjustReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, 64c2d1d9f9Swanglei const DebugLoc &DL, Register DestReg, Register SrcReg, 65c2d1d9f9Swanglei int64_t Val, MachineInstr::MIFlag Flag) const; 6633388ae8SLu Weining }; 67904a87acSWeining Lu } // end namespace llvm 6833388ae8SLu Weining #endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCHFRAMELOWERING_H 69