X86RegisterInfo.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//===-- X86RegisterInfo.h - X86 Register Information Impl -------*- C++ -*-===// 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The LLVM Compiler Infrastructure 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This file is distributed under the University of Illinois Open Source 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// License. See LICENSE.TXT for details. 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//===----------------------------------------------------------------------===// 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This file contains the X86 implementation of the TargetRegisterInfo class. 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//===----------------------------------------------------------------------===// 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef X86REGISTERINFO_H 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define X86REGISTERINFO_H 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "llvm/Target/TargetRegisterInfo.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define GET_REGINFO_HEADER 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "X86GenRegisterInfo.inc" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace llvm { 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class Type; 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class TargetInstrInfo; 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class X86TargetMachine; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass X86RegisterInfo final : public X86GenRegisterInfo { 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic: 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch X86TargetMachine &TM; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochprivate: 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// Is64Bit - Is the target 64-bits. 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool Is64Bit; 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// IsWin64 - Is the target on of win64 flavours 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool IsWin64; 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// SlotSize - Stack slot size in bytes. 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned SlotSize; 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// StackPtr - X86 physical register used as stack ptr. 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned StackPtr; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// FramePtr - X86 physical register used as frame ptr. 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned FramePtr; 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// BasePtr - X86 physical register used as a base ptr in complex stack 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// frames. I.e., when we need a 3rd base, not just SP and FP, due to 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// variable size stack objects. 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned BasePtr; 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdochpublic: 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch X86RegisterInfo(X86TargetMachine &tm); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // FIXME: This should be tablegen'd like getDwarfRegNum is 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int getSEHRegNum(unsigned i) const; 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// getCompactUnwindRegNum - This function maps the register to the number for 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// compact unwind encoding. Return -1 if the register isn't valid. 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int getCompactUnwindRegNum(unsigned RegNum, bool isEH) const override; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// Code Generation virtual methods... 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override; 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// getMatchingSuperRegClass - Return a subclass of the specified register 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// class A so that each register in it has a sub-register of the 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// specified sub-register index which is in the specified register class B. 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TargetRegisterClass * 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch getMatchingSuperRegClass(const TargetRegisterClass *A, 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TargetRegisterClass *B, 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned Idx) const override; 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TargetRegisterClass * 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch getSubClassWithSubReg(const TargetRegisterClass *RC, 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned Idx) const override; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TargetRegisterClass* 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) getLargestLegalSuperClass(const TargetRegisterClass *RC) const override; 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// getPointerRegClass - Returns a TargetRegisterClass used for pointer 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// values. 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TargetRegisterClass * 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch getPointerRegClass(const MachineFunction &MF, 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned Kind = 0) const override; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// getCrossCopyRegClass - Returns a legal register class to copy a register 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// in the specified class to or from. Returns NULL if it is possible to copy 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// between a two registers of the specified class. 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TargetRegisterClass * 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch getCrossCopyRegClass(const TargetRegisterClass *RC) const override; 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned getRegPressureLimit(const TargetRegisterClass *RC, 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MachineFunction &MF) const override; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// getCalleeSavedRegs - Return a null-terminated list of all of the 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// callee-save registers on this target. 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const uint16_t * 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch getCalleeSavedRegs(const MachineFunction* MF) const override; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const uint32_t *getCallPreservedMask(CallingConv::ID) const override; 106 const uint32_t *getNoPreservedMask() const; 107 108 /// getReservedRegs - Returns a bitset indexed by physical register number 109 /// indicating if a register is a special register that has particular uses and 110 /// should be considered unavailable at all times, e.g. SP, RA. This is used by 111 /// register scavenger to determine what registers are free. 112 BitVector getReservedRegs(const MachineFunction &MF) const override; 113 114 bool hasBasePointer(const MachineFunction &MF) const; 115 116 bool canRealignStack(const MachineFunction &MF) const; 117 118 bool needsStackRealignment(const MachineFunction &MF) const override; 119 120 bool hasReservedSpillSlot(const MachineFunction &MF, unsigned Reg, 121 int &FrameIdx) const override; 122 123 void eliminateFrameIndex(MachineBasicBlock::iterator MI, 124 int SPAdj, unsigned FIOperandNum, 125 RegScavenger *RS = NULL) const override; 126 127 // Debug information queries. 128 unsigned getFrameRegister(const MachineFunction &MF) const override; 129 unsigned getStackRegister() const { return StackPtr; } 130 unsigned getBaseRegister() const { return BasePtr; } 131 // FIXME: Move to FrameInfok 132 unsigned getSlotSize() const { return SlotSize; } 133}; 134 135// getX86SubSuperRegister - X86 utility function. It returns the sub or super 136// register of a specific X86 register. 137// e.g. getX86SubSuperRegister(X86::EAX, MVT::i16) return X86:AX 138unsigned getX86SubSuperRegister(unsigned, MVT::SimpleValueType, bool High=false); 139 140//get512BitRegister - X86 utility - returns 512-bit super register 141unsigned get512BitSuperRegister(unsigned Reg); 142 143} // End llvm namespace 144 145#endif 146