Home | History | Annotate | Download | only in ARM
      1 //===-- ARMBaseRegisterInfo.h - ARM 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 base ARM implementation of TargetRegisterInfo class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef ARMBASEREGISTERINFO_H
     15 #define ARMBASEREGISTERINFO_H
     16 
     17 #include "ARM.h"
     18 #include "llvm/Target/TargetRegisterInfo.h"
     19 
     20 #define GET_REGINFO_HEADER
     21 #include "ARMGenRegisterInfo.inc"
     22 
     23 namespace llvm {
     24   class ARMSubtarget;
     25   class ARMBaseInstrInfo;
     26   class Type;
     27 
     28 /// Register allocation hints.
     29 namespace ARMRI {
     30   enum {
     31     RegPairOdd  = 1,
     32     RegPairEven = 2
     33   };
     34 }
     35 
     36 /// isARMArea1Register - Returns true if the register is a low register (r0-r7)
     37 /// or a stack/pc register that we should push/pop.
     38 static inline bool isARMArea1Register(unsigned Reg, bool isIOS) {
     39   using namespace ARM;
     40   switch (Reg) {
     41     case R0:  case R1:  case R2:  case R3:
     42     case R4:  case R5:  case R6:  case R7:
     43     case LR:  case SP:  case PC:
     44       return true;
     45     case R8:  case R9:  case R10: case R11:
     46       // For iOS we want r7 and lr to be next to each other.
     47       return !isIOS;
     48     default:
     49       return false;
     50   }
     51 }
     52 
     53 static inline bool isARMArea2Register(unsigned Reg, bool isIOS) {
     54   using namespace ARM;
     55   switch (Reg) {
     56     case R8: case R9: case R10: case R11:
     57       // iOS has this second area.
     58       return isIOS;
     59     default:
     60       return false;
     61   }
     62 }
     63 
     64 static inline bool isARMArea3Register(unsigned Reg, bool isIOS) {
     65   using namespace ARM;
     66   switch (Reg) {
     67     case D15: case D14: case D13: case D12:
     68     case D11: case D10: case D9:  case D8:
     69       return true;
     70     default:
     71       return false;
     72   }
     73 }
     74 
     75 class ARMBaseRegisterInfo : public ARMGenRegisterInfo {
     76 protected:
     77   const ARMSubtarget &STI;
     78 
     79   /// FramePtr - ARM physical register used as frame ptr.
     80   unsigned FramePtr;
     81 
     82   /// BasePtr - ARM physical register used as a base ptr in complex stack
     83   /// frames. I.e., when we need a 3rd base, not just SP and FP, due to
     84   /// variable size stack objects.
     85   unsigned BasePtr;
     86 
     87   // Can be only subclassed.
     88   explicit ARMBaseRegisterInfo(const ARMSubtarget &STI);
     89 
     90   // Return the opcode that implements 'Op', or 0 if no opcode
     91   unsigned getOpcode(int Op) const;
     92 
     93 public:
     94   /// Code Generation virtual methods...
     95   const uint16_t *getCalleeSavedRegs(const MachineFunction *MF = 0) const;
     96   const uint32_t *getCallPreservedMask(CallingConv::ID) const;
     97   const uint32_t *getNoPreservedMask() const;
     98 
     99   /// getThisReturnPreservedMask - Returns a call preserved mask specific to the
    100   /// case that 'returned' is on an i32 first argument if the calling convention
    101   /// is one that can (partially) model this attribute with a preserved mask
    102   /// (i.e. it is a calling convention that uses the same register for the first
    103   /// i32 argument and an i32 return value)
    104   ///
    105   /// Should return NULL in the case that the calling convention does not have
    106   /// this property
    107   const uint32_t *getThisReturnPreservedMask(CallingConv::ID) const;
    108 
    109   BitVector getReservedRegs(const MachineFunction &MF) const;
    110 
    111   const TargetRegisterClass*
    112   getPointerRegClass(const MachineFunction &MF, unsigned Kind = 0) const;
    113   const TargetRegisterClass*
    114   getCrossCopyRegClass(const TargetRegisterClass *RC) const;
    115 
    116   const TargetRegisterClass*
    117   getLargestLegalSuperClass(const TargetRegisterClass *RC) const;
    118 
    119   unsigned getRegPressureLimit(const TargetRegisterClass *RC,
    120                                MachineFunction &MF) const;
    121 
    122   void getRegAllocationHints(unsigned VirtReg,
    123                              ArrayRef<MCPhysReg> Order,
    124                              SmallVectorImpl<MCPhysReg> &Hints,
    125                              const MachineFunction &MF,
    126                              const VirtRegMap *VRM) const;
    127 
    128   void UpdateRegAllocHint(unsigned Reg, unsigned NewReg,
    129                           MachineFunction &MF) const;
    130 
    131   virtual bool avoidWriteAfterWrite(const TargetRegisterClass *RC) const;
    132 
    133   bool hasBasePointer(const MachineFunction &MF) const;
    134 
    135   bool canRealignStack(const MachineFunction &MF) const;
    136   bool needsStackRealignment(const MachineFunction &MF) const;
    137   int64_t getFrameIndexInstrOffset(const MachineInstr *MI, int Idx) const;
    138   bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const;
    139   void materializeFrameBaseRegister(MachineBasicBlock *MBB,
    140                                     unsigned BaseReg, int FrameIdx,
    141                                     int64_t Offset) const;
    142   void resolveFrameIndex(MachineBasicBlock::iterator I,
    143                          unsigned BaseReg, int64_t Offset) const;
    144   bool isFrameOffsetLegal(const MachineInstr *MI, int64_t Offset) const;
    145 
    146   bool cannotEliminateFrame(const MachineFunction &MF) const;
    147 
    148   // Debug information queries.
    149   unsigned getFrameRegister(const MachineFunction &MF) const;
    150   unsigned getBaseRegister() const { return BasePtr; }
    151 
    152   // Exception handling queries.
    153   unsigned getEHExceptionRegister() const;
    154   unsigned getEHHandlerRegister() const;
    155 
    156   bool isLowRegister(unsigned Reg) const;
    157 
    158 
    159   /// emitLoadConstPool - Emits a load from constpool to materialize the
    160   /// specified immediate.
    161   virtual void emitLoadConstPool(MachineBasicBlock &MBB,
    162                                  MachineBasicBlock::iterator &MBBI,
    163                                  DebugLoc dl,
    164                                  unsigned DestReg, unsigned SubIdx,
    165                                  int Val,
    166                                  ARMCC::CondCodes Pred = ARMCC::AL,
    167                                  unsigned PredReg = 0,
    168                                  unsigned MIFlags = MachineInstr::NoFlags)const;
    169 
    170   /// Code Generation virtual methods...
    171   virtual bool requiresRegisterScavenging(const MachineFunction &MF) const;
    172 
    173   virtual bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const;
    174 
    175   virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const;
    176 
    177   virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const;
    178 
    179   virtual void eliminateFrameIndex(MachineBasicBlock::iterator II,
    180                                    int SPAdj, unsigned FIOperandNum,
    181                                    RegScavenger *RS = NULL) const;
    182 };
    183 
    184 } // end namespace llvm
    185 
    186 #endif
    187