119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//==- MSP430FrameLowering.h - Define frame lowering for MSP430 --*- C++ -*--==//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#ifndef MSP430_FRAMEINFO_H
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define MSP430_FRAMEINFO_H
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MSP430.h"
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MSP430Subtarget.h"
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetFrameLowering.h"
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm {
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  class MSP430Subtarget;
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass MSP430FrameLowering : public TargetFrameLowering {
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanprotected:
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MSP430Subtarget &STI;
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic:
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  explicit MSP430FrameLowering(const MSP430Subtarget &sti)
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, 2, -2), STI(sti) {
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// the function.
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void emitPrologue(MachineFunction &MF) const;
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                 MachineBasicBlock::iterator MI,
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                 const std::vector<CalleeSavedInfo> &CSI,
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                 const TargetRegisterInfo *TRI) const;
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                   MachineBasicBlock::iterator MI,
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                   const std::vector<CalleeSavedInfo> &CSI,
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                   const TargetRegisterInfo *TRI) const;
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool hasFP(const MachineFunction &MF) const;
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool hasReservedCallFrame(const MachineFunction &MF) const;
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // End llvm namespace
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#endif
54