116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov//==-- ARMTargetFrameLowering.h - Define frame lowering for ARM --*- C++ -*-==//
2ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//
3ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//                     The LLVM Compiler Infrastructure
4ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
6ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// License. See LICENSE.TXT for details.
7ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//
8ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//===----------------------------------------------------------------------===//
9ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//
10ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//
11ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//
12ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//===----------------------------------------------------------------------===//
13ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola
14ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola#ifndef ARM_FRAMEINFO_H
15ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola#define ARM_FRAMEINFO_H
16ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola
1716c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
18ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola
19ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindolanamespace llvm {
2033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  class ARMSubtarget;
21ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola
2216c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovclass ARMFrameLowering : public TargetFrameLowering {
2333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovprotected:
2433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  const ARMSubtarget &STI;
2533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
26ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindolapublic:
27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  explicit ARMFrameLowering(const ARMSubtarget &sti);
2833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
3033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// the function.
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void emitPrologue(MachineFunction &MF) const override;
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
33d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
34cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
35cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 MachineBasicBlock::iterator MI,
36cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 const std::vector<CalleeSavedInfo> &CSI,
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                 const TargetRegisterInfo *TRI) const override;
38cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov
39cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  MachineBasicBlock::iterator MI,
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  const std::vector<CalleeSavedInfo> &CSI,
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  const TargetRegisterInfo *TRI) const override;
43cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasFP(const MachineFunction &MF) const override;
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasReservedCallFrame(const MachineFunction &MF) const override;
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override;
4782f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  int getFrameIndexReference(const MachineFunction &MF, int FI,
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                             unsigned &FrameReg) const override;
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
5082f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov                                 unsigned &FrameReg, int SPAdj) const;
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  int getFrameIndexOffset(const MachineFunction &MF, int FI) const override;
5282f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov
5394c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                            RegScavenger *RS) const override;
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void adjustForSegmentedStacks(MachineFunction &MF) const override;
5794c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov
58cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov private:
59cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov  void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
60c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach                    const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc,
61c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach                    unsigned StrOpc, bool NoGap,
62f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen                    bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs,
6357caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov                    unsigned MIFlags = 0) const;
6406d65f515638dc996a4ecaf2a9692475aa4b46e3Evan Cheng  void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
65c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach                   const std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc,
66c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach                   unsigned LdrOpc, bool isVarArg, bool NoGap,
67f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen                   bool(*Func)(unsigned, bool),
68f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen                   unsigned NumAlignedDPRCS2Regs) const;
69700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  eliminateCallFramePseudoInstr(MachineFunction &MF,
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                MachineBasicBlock &MBB,
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                MachineBasicBlock::iterator MI) const override;
74ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola};
75ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola
76ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola} // End llvm namespace
77ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola
78ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola#endif
79