1*9880d681SAndroid Build Coastguard Worker //===-- X86RegisterInfo.h - X86 Register Information Impl -------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file contains the X86 implementation of the TargetRegisterInfo class. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_X86_X86REGISTERINFO_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_X86_X86REGISTERINFO_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetRegisterInfo.h" 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_HEADER 20*9880d681SAndroid Build Coastguard Worker #include "X86GenRegisterInfo.inc" 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker namespace llvm { 23*9880d681SAndroid Build Coastguard Worker class Triple; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker class X86RegisterInfo final : public X86GenRegisterInfo { 26*9880d681SAndroid Build Coastguard Worker private: 27*9880d681SAndroid Build Coastguard Worker /// Is64Bit - Is the target 64-bits. 28*9880d681SAndroid Build Coastguard Worker /// 29*9880d681SAndroid Build Coastguard Worker bool Is64Bit; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker /// IsWin64 - Is the target on of win64 flavours 32*9880d681SAndroid Build Coastguard Worker /// 33*9880d681SAndroid Build Coastguard Worker bool IsWin64; 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker /// SlotSize - Stack slot size in bytes. 36*9880d681SAndroid Build Coastguard Worker /// 37*9880d681SAndroid Build Coastguard Worker unsigned SlotSize; 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker /// StackPtr - X86 physical register used as stack ptr. 40*9880d681SAndroid Build Coastguard Worker /// 41*9880d681SAndroid Build Coastguard Worker unsigned StackPtr; 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker /// FramePtr - X86 physical register used as frame ptr. 44*9880d681SAndroid Build Coastguard Worker /// 45*9880d681SAndroid Build Coastguard Worker unsigned FramePtr; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker /// BasePtr - X86 physical register used as a base ptr in complex stack 48*9880d681SAndroid Build Coastguard Worker /// frames. I.e., when we need a 3rd base, not just SP and FP, due to 49*9880d681SAndroid Build Coastguard Worker /// variable size stack objects. 50*9880d681SAndroid Build Coastguard Worker unsigned BasePtr; 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker public: 53*9880d681SAndroid Build Coastguard Worker X86RegisterInfo(const Triple &TT); 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker // FIXME: This should be tablegen'd like getDwarfRegNum is 56*9880d681SAndroid Build Coastguard Worker int getSEHRegNum(unsigned i) const; 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker /// Code Generation virtual methods... 59*9880d681SAndroid Build Coastguard Worker /// 60*9880d681SAndroid Build Coastguard Worker bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override; 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker /// getMatchingSuperRegClass - Return a subclass of the specified register 63*9880d681SAndroid Build Coastguard Worker /// class A so that each register in it has a sub-register of the 64*9880d681SAndroid Build Coastguard Worker /// specified sub-register index which is in the specified register class B. 65*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass * 66*9880d681SAndroid Build Coastguard Worker getMatchingSuperRegClass(const TargetRegisterClass *A, 67*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *B, 68*9880d681SAndroid Build Coastguard Worker unsigned Idx) const override; 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass * 71*9880d681SAndroid Build Coastguard Worker getSubClassWithSubReg(const TargetRegisterClass *RC, 72*9880d681SAndroid Build Coastguard Worker unsigned Idx) const override; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass * 75*9880d681SAndroid Build Coastguard Worker getLargestLegalSuperClass(const TargetRegisterClass *RC, 76*9880d681SAndroid Build Coastguard Worker const MachineFunction &MF) const override; 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker /// getPointerRegClass - Returns a TargetRegisterClass used for pointer 79*9880d681SAndroid Build Coastguard Worker /// values. 80*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass * 81*9880d681SAndroid Build Coastguard Worker getPointerRegClass(const MachineFunction &MF, 82*9880d681SAndroid Build Coastguard Worker unsigned Kind = 0) const override; 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker /// getCrossCopyRegClass - Returns a legal register class to copy a register 85*9880d681SAndroid Build Coastguard Worker /// in the specified class to or from. Returns NULL if it is possible to copy 86*9880d681SAndroid Build Coastguard Worker /// between a two registers of the specified class. 87*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass * 88*9880d681SAndroid Build Coastguard Worker getCrossCopyRegClass(const TargetRegisterClass *RC) const override; 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker /// getGPRsForTailCall - Returns a register class with registers that can be 91*9880d681SAndroid Build Coastguard Worker /// used in forming tail calls. 92*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass * 93*9880d681SAndroid Build Coastguard Worker getGPRsForTailCall(const MachineFunction &MF) const; 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker unsigned getRegPressureLimit(const TargetRegisterClass *RC, 96*9880d681SAndroid Build Coastguard Worker MachineFunction &MF) const override; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker /// getCalleeSavedRegs - Return a null-terminated list of all of the 99*9880d681SAndroid Build Coastguard Worker /// callee-save registers on this target. 100*9880d681SAndroid Build Coastguard Worker const MCPhysReg * 101*9880d681SAndroid Build Coastguard Worker getCalleeSavedRegs(const MachineFunction* MF) const override; 102*9880d681SAndroid Build Coastguard Worker const MCPhysReg * 103*9880d681SAndroid Build Coastguard Worker getCalleeSavedRegsViaCopy(const MachineFunction *MF) const override; 104*9880d681SAndroid Build Coastguard Worker const uint32_t *getCallPreservedMask(const MachineFunction &MF, 105*9880d681SAndroid Build Coastguard Worker CallingConv::ID) const override; 106*9880d681SAndroid Build Coastguard Worker const uint32_t *getNoPreservedMask() const override; 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker // Calls involved in thread-local variable lookup save more registers than 109*9880d681SAndroid Build Coastguard Worker // normal calls, so they need a different mask to represent this. 110*9880d681SAndroid Build Coastguard Worker const uint32_t *getDarwinTLSCallPreservedMask() const; 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker /// getReservedRegs - Returns a bitset indexed by physical register number 113*9880d681SAndroid Build Coastguard Worker /// indicating if a register is a special register that has particular uses and 114*9880d681SAndroid Build Coastguard Worker /// should be considered unavailable at all times, e.g. SP, RA. This is used by 115*9880d681SAndroid Build Coastguard Worker /// register scavenger to determine what registers are free. 116*9880d681SAndroid Build Coastguard Worker BitVector getReservedRegs(const MachineFunction &MF) const override; 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker void adjustStackMapLiveOutMask(uint32_t *Mask) const override; 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker bool hasBasePointer(const MachineFunction &MF) const; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker bool canRealignStack(const MachineFunction &MF) const override; 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker bool hasReservedSpillSlot(const MachineFunction &MF, unsigned Reg, 125*9880d681SAndroid Build Coastguard Worker int &FrameIdx) const override; 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker void eliminateFrameIndex(MachineBasicBlock::iterator MI, 128*9880d681SAndroid Build Coastguard Worker int SPAdj, unsigned FIOperandNum, 129*9880d681SAndroid Build Coastguard Worker RegScavenger *RS = nullptr) const override; 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker // Debug information queries. 132*9880d681SAndroid Build Coastguard Worker unsigned getFrameRegister(const MachineFunction &MF) const override; 133*9880d681SAndroid Build Coastguard Worker unsigned getPtrSizedFrameRegister(const MachineFunction &MF) const; getStackRegister()134*9880d681SAndroid Build Coastguard Worker unsigned getStackRegister() const { return StackPtr; } getBaseRegister()135*9880d681SAndroid Build Coastguard Worker unsigned getBaseRegister() const { return BasePtr; } 136*9880d681SAndroid Build Coastguard Worker // FIXME: Move to FrameInfok getSlotSize()137*9880d681SAndroid Build Coastguard Worker unsigned getSlotSize() const { return SlotSize; } 138*9880d681SAndroid Build Coastguard Worker }; 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker //get512BitRegister - X86 utility - returns 512-bit super register 141*9880d681SAndroid Build Coastguard Worker unsigned get512BitSuperRegister(unsigned Reg); 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker #endif 146