Home | History | Annotate | Download | only in CellSPU
      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