116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov//=- MBlazeFrameLowering.h - Define frame lowering for MicroBlaze -*- C++ -*-=//
233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//                     The LLVM Compiler Infrastructure
433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// This file is distributed under the University of Illinois Open Source
633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// License. See LICENSE.TXT for details.
733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//===----------------------------------------------------------------------===//
933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
1033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
1133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
1233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//===----------------------------------------------------------------------===//
1333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
148397be042766f1913ceaa2b3e6782de0322bbe6aWesley Peck#ifndef MBLAZE_FRAMEINFO_H
158397be042766f1913ceaa2b3e6782de0322bbe6aWesley Peck#define MBLAZE_FRAMEINFO_H
1633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
1733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "MBlaze.h"
1816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
1933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovnamespace llvm {
2179aa3417eb6f58d668aadfedf075240a41d35a26Craig Topperclass MBlazeSubtarget;
2233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2316c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovclass MBlazeFrameLowering : public TargetFrameLowering {
2433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovprotected:
2533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  const MBlazeSubtarget &STI;
2633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovpublic:
2816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  explicit MBlazeFrameLowering(const MBlazeSubtarget &sti)
2916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov    : TargetFrameLowering(TargetFrameLowering::StackGrowsUp, 4, 0), STI(sti) {
3033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  }
3133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
3233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// targetHandlesStackFrameRounding - Returns true if the target is
3333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// responsible for rounding up the stack frame (probably at emitPrologue
3433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// time).
3533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  bool targetHandlesStackFrameRounding() const { return true; }
3633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
3733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
3833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// the function.
3933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitPrologue(MachineFunction &MF) const;
4033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
41d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
42700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky  void eliminateCallFramePseudoInstr(MachineFunction &MF,
43700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky                                     MachineBasicBlock &MBB,
44700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky                                     MachineBasicBlock::iterator I) const;
45700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky
46d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool hasFP(const MachineFunction &MF) const;
478397be042766f1913ceaa2b3e6782de0322bbe6aWesley Peck
483d2148f5ace1292dcc12c37e9d0e13dee5220a5aWesley Peck  int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
493d2148f5ace1292dcc12c37e9d0e13dee5220a5aWesley Peck
508397be042766f1913ceaa2b3e6782de0322bbe6aWesley Peck  virtual void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
518397be042766f1913ceaa2b3e6782de0322bbe6aWesley Peck                                                    RegScavenger *RS) const;
5233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov};
5333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
5433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov} // End llvm namespace
5533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
5633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#endif
57