diff options
Diffstat (limited to 'lib/Target/Blackfin')
| -rw-r--r-- | lib/Target/Blackfin/BlackfinFrameInfo.cpp | 97 | ||||
| -rw-r--r-- | lib/Target/Blackfin/BlackfinFrameInfo.h | 41 | ||||
| -rw-r--r-- | lib/Target/Blackfin/BlackfinRegisterInfo.cpp | 67 | ||||
| -rw-r--r-- | lib/Target/Blackfin/BlackfinRegisterInfo.h | 3 | ||||
| -rw-r--r-- | lib/Target/Blackfin/BlackfinTargetMachine.cpp | 2 | ||||
| -rw-r--r-- | lib/Target/Blackfin/BlackfinTargetMachine.h | 13 | 
6 files changed, 146 insertions, 77 deletions
diff --git a/lib/Target/Blackfin/BlackfinFrameInfo.cpp b/lib/Target/Blackfin/BlackfinFrameInfo.cpp new file mode 100644 index 0000000..83f28b0 --- /dev/null +++ b/lib/Target/Blackfin/BlackfinFrameInfo.cpp @@ -0,0 +1,97 @@ +//====- BlackfinFrameInfo.cpp - Blackfin Frame Information ------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains the Blackfin implementation of TargetFrameInfo class. +// +//===----------------------------------------------------------------------===// + +#include "BlackfinFrameInfo.h" +#include "BlackfinInstrInfo.h" +#include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" + +using namespace llvm; + + +// Emit a prologue that sets up a stack frame. +// On function entry, R0-R2 and P0 may hold arguments. +// R3, P1, and P2 may be used as scratch registers +void BlackfinFrameInfo::emitPrologue(MachineFunction &MF) const { +  MachineBasicBlock &MBB = MF.front();   // Prolog goes in entry BB +  MachineBasicBlock::iterator MBBI = MBB.begin(); +  MachineFrameInfo *MFI = MF.getFrameInfo(); +  const BlackfinRegisterInfo *RegInfo = +    static_cast<const BlackfinRegisterInfo*>(MF.getTarget().getRegisterInfo()); +  const BlackfinInstrInfo &TII = +    *static_cast<const BlackfinInstrInfo*>(MF.getTarget().getInstrInfo()); + +  DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc(); + +  int FrameSize = MFI->getStackSize(); +  if (FrameSize%4) { +    FrameSize = (FrameSize+3) & ~3; +    MFI->setStackSize(FrameSize); +  } + +  if (!RegInfo->hasFP(MF)) { +    assert(!MFI->adjustsStack() && +           "FP elimination on a non-leaf function is not supported"); +    RegInfo->adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, -FrameSize); +    return; +  } + +  // emit a LINK instruction +  if (FrameSize <= 0x3ffff) { +    BuildMI(MBB, MBBI, dl, TII.get(BF::LINK)).addImm(FrameSize); +    return; +  } + +  // Frame is too big, do a manual LINK: +  // [--SP] = RETS; +  // [--SP] = FP; +  // FP = SP; +  // P1 = -FrameSize; +  // SP = SP + P1; +  BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH)) +    .addReg(BF::RETS, RegState::Kill); +  BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH)) +    .addReg(BF::FP, RegState::Kill); +  BuildMI(MBB, MBBI, dl, TII.get(BF::MOVE), BF::FP) +    .addReg(BF::SP); +  RegInfo->loadConstant(MBB, MBBI, dl, BF::P1, -FrameSize); +  BuildMI(MBB, MBBI, dl, TII.get(BF::ADDpp), BF::SP) +    .addReg(BF::SP, RegState::Kill) +    .addReg(BF::P1, RegState::Kill); + +} + +void BlackfinFrameInfo::emitEpilogue(MachineFunction &MF, +                                     MachineBasicBlock &MBB) const { +  MachineFrameInfo *MFI = MF.getFrameInfo(); +  const BlackfinRegisterInfo *RegInfo = +    static_cast<const BlackfinRegisterInfo*>(MF.getTarget().getRegisterInfo()); +  const BlackfinInstrInfo &TII = +    *static_cast<const BlackfinInstrInfo*>(MF.getTarget().getInstrInfo()); +  MachineBasicBlock::iterator MBBI = prior(MBB.end()); +  DebugLoc dl = MBBI->getDebugLoc(); + +  int FrameSize = MFI->getStackSize(); +  assert(FrameSize%4 == 0 && "Misaligned frame size"); + +  if (!RegInfo->hasFP(MF)) { +    assert(!MFI->adjustsStack() && +           "FP elimination on a non-leaf function is not supported"); +    RegInfo->adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, FrameSize); +    return; +  } + +  // emit an UNLINK instruction +  BuildMI(MBB, MBBI, dl, TII.get(BF::UNLINK)); +} diff --git a/lib/Target/Blackfin/BlackfinFrameInfo.h b/lib/Target/Blackfin/BlackfinFrameInfo.h new file mode 100644 index 0000000..ff8ba2d --- /dev/null +++ b/lib/Target/Blackfin/BlackfinFrameInfo.h @@ -0,0 +1,41 @@ +//=- BlackfinFrameInfo.h - Define TargetFrameInfo for Blackfin --*- C++ -*--==// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// +// +//===----------------------------------------------------------------------===// + +#ifndef ALPHA_FRAMEINFO_H +#define ALPHA_FRAMEINFO_H + +#include "Blackfin.h" +#include "BlackfinSubtarget.h" +#include "llvm/Target/TargetFrameInfo.h" + +namespace llvm { +  class BlackfinSubtarget; + +class BlackfinFrameInfo : public TargetFrameInfo { +protected: +  const BlackfinSubtarget &STI; + +public: +  explicit BlackfinFrameInfo(const BlackfinSubtarget &sti) +    : TargetFrameInfo(TargetFrameInfo::StackGrowsDown, 4, 0), STI(sti) { +  } + +  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into +  /// the function. +  void emitPrologue(MachineFunction &MF) const; +  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; +}; + +} // End llvm namespace + +#endif diff --git a/lib/Target/Blackfin/BlackfinRegisterInfo.cpp b/lib/Target/Blackfin/BlackfinRegisterInfo.cpp index a518312..4f827b7 100644 --- a/lib/Target/Blackfin/BlackfinRegisterInfo.cpp +++ b/lib/Target/Blackfin/BlackfinRegisterInfo.cpp @@ -342,73 +342,6 @@ processFunctionBeforeCalleeSavedScan(MachineFunction &MF,    }  } -// Emit a prologue that sets up a stack frame. -// On function entry, R0-R2 and P0 may hold arguments. -// R3, P1, and P2 may be used as scratch registers -void BlackfinRegisterInfo::emitPrologue(MachineFunction &MF) const { -  MachineBasicBlock &MBB = MF.front();   // Prolog goes in entry BB -  MachineBasicBlock::iterator MBBI = MBB.begin(); -  MachineFrameInfo *MFI = MF.getFrameInfo(); -  DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc(); - -  int FrameSize = MFI->getStackSize(); -  if (FrameSize%4) { -    FrameSize = (FrameSize+3) & ~3; -    MFI->setStackSize(FrameSize); -  } - -  if (!hasFP(MF)) { -    assert(!MFI->adjustsStack() && -           "FP elimination on a non-leaf function is not supported"); -    adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, -FrameSize); -    return; -  } - -  // emit a LINK instruction -  if (FrameSize <= 0x3ffff) { -    BuildMI(MBB, MBBI, dl, TII.get(BF::LINK)).addImm(FrameSize); -    return; -  } - -  // Frame is too big, do a manual LINK: -  // [--SP] = RETS; -  // [--SP] = FP; -  // FP = SP; -  // P1 = -FrameSize; -  // SP = SP + P1; -  BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH)) -    .addReg(BF::RETS, RegState::Kill); -  BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH)) -    .addReg(BF::FP, RegState::Kill); -  BuildMI(MBB, MBBI, dl, TII.get(BF::MOVE), BF::FP) -    .addReg(BF::SP); -  loadConstant(MBB, MBBI, dl, BF::P1, -FrameSize); -  BuildMI(MBB, MBBI, dl, TII.get(BF::ADDpp), BF::SP) -    .addReg(BF::SP, RegState::Kill) -    .addReg(BF::P1, RegState::Kill); - -} - -void BlackfinRegisterInfo::emitEpilogue(MachineFunction &MF, -                                        MachineBasicBlock &MBB) const { -  MachineFrameInfo *MFI = MF.getFrameInfo(); -  MachineBasicBlock::iterator MBBI = prior(MBB.end()); -  DebugLoc dl = MBBI->getDebugLoc(); - -  int FrameSize = MFI->getStackSize(); -  assert(FrameSize%4 == 0 && "Misaligned frame size"); - -  if (!hasFP(MF)) { -    assert(!MFI->adjustsStack() && -           "FP elimination on a non-leaf function is not supported"); -    adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, FrameSize); -    return; -  } - -  // emit an UNLINK instruction -  BuildMI(MBB, MBBI, dl, TII.get(BF::UNLINK)); -} -  unsigned BlackfinRegisterInfo::getRARegister() const {    return BF::RETS;  } diff --git a/lib/Target/Blackfin/BlackfinRegisterInfo.h b/lib/Target/Blackfin/BlackfinRegisterInfo.h index bb83c34..be08292 100644 --- a/lib/Target/Blackfin/BlackfinRegisterInfo.h +++ b/lib/Target/Blackfin/BlackfinRegisterInfo.h @@ -57,9 +57,6 @@ namespace llvm {      void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,                                                RegScavenger *RS) const; -    void emitPrologue(MachineFunction &MF) const; -    void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; -      unsigned getFrameRegister(const MachineFunction &MF) const;      unsigned getRARegister() const; diff --git a/lib/Target/Blackfin/BlackfinTargetMachine.cpp b/lib/Target/Blackfin/BlackfinTargetMachine.cpp index 66a2f68..da6490f 100644 --- a/lib/Target/Blackfin/BlackfinTargetMachine.cpp +++ b/lib/Target/Blackfin/BlackfinTargetMachine.cpp @@ -33,7 +33,7 @@ BlackfinTargetMachine::BlackfinTargetMachine(const Target &T,      TLInfo(*this),      TSInfo(*this),      InstrInfo(Subtarget), -    FrameInfo(TargetFrameInfo::StackGrowsDown, 4, 0) { +    FrameInfo(Subtarget) {  }  bool BlackfinTargetMachine::addInstSelector(PassManagerBase &PM, diff --git a/lib/Target/Blackfin/BlackfinTargetMachine.h b/lib/Target/Blackfin/BlackfinTargetMachine.h index a63aa54..19d3f5b 100644 --- a/lib/Target/Blackfin/BlackfinTargetMachine.h +++ b/lib/Target/Blackfin/BlackfinTargetMachine.h @@ -14,14 +14,15 @@  #ifndef BLACKFINTARGETMACHINE_H  #define BLACKFINTARGETMACHINE_H -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetFrameInfo.h"  #include "BlackfinInstrInfo.h" -#include "BlackfinSubtarget.h" +#include "BlackfinIntrinsicInfo.h"  #include "BlackfinISelLowering.h" +#include "BlackfinFrameInfo.h" +#include "BlackfinSubtarget.h"  #include "BlackfinSelectionDAGInfo.h" -#include "BlackfinIntrinsicInfo.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetData.h" +#include "llvm/Target/TargetFrameInfo.h"  namespace llvm { @@ -31,7 +32,7 @@ namespace llvm {      BlackfinTargetLowering TLInfo;      BlackfinSelectionDAGInfo TSInfo;      BlackfinInstrInfo InstrInfo; -    TargetFrameInfo FrameInfo; +    BlackfinFrameInfo FrameInfo;      BlackfinIntrinsicInfo IntrinsicInfo;    public:      BlackfinTargetMachine(const Target &T, const std::string &TT,  | 
