xref: /llvm-project/llvm/lib/Target/LoongArch/LoongArchFrameLowering.h (revision ad4a582fd938c933e784f0052bd773676b37b690)
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