Home | History | Annotate | Download | only in CellSPU
      1 //=====-- SPUFrameLowering.h - SPU Frame Lowering stuff -*- C++ -*----========//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains CellSPU frame information that doesn't fit anywhere else
     11 // cleanly...
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef SPU_FRAMEINFO_H
     16 #define SPU_FRAMEINFO_H
     17 
     18 #include "SPURegisterInfo.h"
     19 #include "llvm/Target/TargetFrameLowering.h"
     20 #include "llvm/Target/TargetMachine.h"
     21 
     22 namespace llvm {
     23   class SPUSubtarget;
     24 
     25   class SPUFrameLowering: public TargetFrameLowering {
     26     const SPUSubtarget &Subtarget;
     27     std::pair<unsigned, int> LR[1];
     28 
     29   public:
     30     SPUFrameLowering(const SPUSubtarget &sti);
     31 
     32     //! Determine the frame's layour
     33     void determineFrameLayout(MachineFunction &MF) const;
     34 
     35     /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
     36     /// the function.
     37     void emitPrologue(MachineFunction &MF) const;
     38     void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
     39 
     40     //! Prediate: Target has dedicated frame pointer
     41     bool hasFP(const MachineFunction &MF) const;
     42 
     43     void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
     44                                               RegScavenger *RS = NULL) const;
     45 
     46     //! Return a function's saved spill slots
     47     /*!
     48       For CellSPU, a function's saved spill slots is just the link register.
     49      */
     50     const std::pair<unsigned, int> *
     51     getCalleeSaveSpillSlots(unsigned &NumEntries) const;
     52 
     53     //! Stack slot size (16 bytes)
     54     static int stackSlotSize() {
     55       return 16;
     56     }
     57     //! Maximum frame offset representable by a signed 10-bit integer
     58     /*!
     59       This is the maximum frame offset that can be expressed as a 10-bit
     60       integer, used in D-form addresses.
     61      */
     62     static int maxFrameOffset() {
     63       return ((1 << 9) - 1) * stackSlotSize();
     64     }
     65     //! Minimum frame offset representable by a signed 10-bit integer
     66     static int minFrameOffset() {
     67       return -(1 << 9) * stackSlotSize();
     68     }
     69     //! Minimum frame size (enough to spill LR + SP)
     70     static int minStackSize() {
     71       return (2 * stackSlotSize());
     72     }
     73     //! Convert frame index to stack offset
     74     static int FItoStackOffset(int frame_index) {
     75       return frame_index * stackSlotSize();
     76     }
     77   };
     78 }
     79 
     80 #endif
     81