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) stackSlotSize()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 */ maxFrameOffset()62 static int maxFrameOffset() { 63 return ((1 << 9) - 1) * stackSlotSize(); 64 } 65 //! Minimum frame offset representable by a signed 10-bit integer minFrameOffset()66 static int minFrameOffset() { 67 return -(1 << 9) * stackSlotSize(); 68 } 69 //! Minimum frame size (enough to spill LR + SP) minStackSize()70 static int minStackSize() { 71 return (2 * stackSlotSize()); 72 } 73 //! Convert frame index to stack offset FItoStackOffset(int frame_index)74 static int FItoStackOffset(int frame_index) { 75 return frame_index * stackSlotSize(); 76 } 77 }; 78 } 79 80 #endif 81