1 //===- SPURegisterInfo.h - Cell SPU Register Information Impl ----*- 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 the Cell SPU implementation of the TargetRegisterInfo 11 // class. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef SPU_REGISTERINFO_H 16 #define SPU_REGISTERINFO_H 17 18 #include "SPU.h" 19 20 #define GET_REGINFO_HEADER 21 #include "SPUGenRegisterInfo.inc" 22 23 namespace llvm { 24 class SPUSubtarget; 25 class TargetInstrInfo; 26 class Type; 27 28 class SPURegisterInfo : public SPUGenRegisterInfo { 29 private: 30 const SPUSubtarget &Subtarget; 31 const TargetInstrInfo &TII; 32 33 //! Predicate: Does the machine function use the link register? 34 bool usesLR(MachineFunction &MF) const; 35 36 public: 37 SPURegisterInfo(const SPUSubtarget &subtarget, const TargetInstrInfo &tii); 38 39 //! Translate a register's enum value to a register number 40 /*! 41 This method translates a register's enum value to it's regiser number, 42 e.g. SPU::R14 -> 14. 43 */ 44 static unsigned getRegisterNumbering(unsigned RegEnum); 45 46 /// getPointerRegClass - Return the register class to use to hold pointers. 47 /// This is used for addressing modes. 48 virtual const TargetRegisterClass * 49 getPointerRegClass(unsigned Kind = 0) const; 50 51 /// After allocating this many registers, the allocator should feel 52 /// register pressure. The value is a somewhat random guess, based on the 53 /// number of non callee saved registers in the C calling convention. 54 virtual unsigned getRegPressureLimit( const TargetRegisterClass *RC, 55 MachineFunction &MF) const{ 56 return 50; 57 } 58 59 //! Return the array of callee-saved registers 60 virtual const unsigned* getCalleeSavedRegs(const MachineFunction *MF) const; 61 62 //! Allow for scavenging, so we can get scratch registers when needed. 63 virtual bool requiresRegisterScavenging(const MachineFunction &MF) const 64 { return true; } 65 66 //! Return the reserved registers 67 BitVector getReservedRegs(const MachineFunction &MF) const; 68 69 //! Eliminate the call frame setup pseudo-instructions 70 void eliminateCallFramePseudoInstr(MachineFunction &MF, 71 MachineBasicBlock &MBB, 72 MachineBasicBlock::iterator I) const; 73 //! Convert frame indicies into machine operands 74 void eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, 75 RegScavenger *RS = NULL) const; 76 77 //! Get the stack frame register (SP, aka R1) 78 unsigned getFrameRegister(const MachineFunction &MF) const; 79 80 //------------------------------------------------------------------------ 81 // New methods added: 82 //------------------------------------------------------------------------ 83 84 //! Convert D-form load/store to X-form load/store 85 /*! 86 Converts a regiser displacement load/store into a register-indexed 87 load/store for large stack frames, when the stack frame exceeds the 88 range of a s10 displacement. 89 */ 90 int convertDFormToXForm(int dFormOpcode) const; 91 92 //! Acquire an unused register in an emergency. 93 unsigned findScratchRegister(MachineBasicBlock::iterator II, 94 RegScavenger *RS, 95 const TargetRegisterClass *RC, 96 int SPAdj) const; 97 98 }; 99 } // end namespace llvm 100 101 #endif 102