X86RegisterInfo.h revision dc77540d9506dc151d79b94bae88bd841880ef37
1//===- X86RegisterInfo.h - X86 Register Information Impl --------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the X86 implementation of the MRegisterInfo class. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef X86REGISTERINFO_H 15#define X86REGISTERINFO_H 16 17#include "llvm/Target/MRegisterInfo.h" 18#include "X86GenRegisterInfo.h.inc" 19 20namespace llvm { 21 class Type; 22 class TargetInstrInfo; 23 class X86TargetMachine; 24 25class X86RegisterInfo : public X86GenRegisterInfo { 26public: 27 X86TargetMachine &TM; 28 const TargetInstrInfo &TII; 29 30private: 31 /// Is64Bit - Is the target 64-bits. 32 bool Is64Bit; 33 34 /// SlotSize - Stack slot size in bytes. 35 unsigned SlotSize; 36 37 /// StackPtr - X86 physical register used as stack ptr. 38 unsigned StackPtr; 39 40 /// FramePtr - X86 physical register used as frame ptr. 41 unsigned FramePtr; 42 43public: 44 X86RegisterInfo(X86TargetMachine &tm, const TargetInstrInfo &tii); 45 46 /// Code Generation virtual methods... 47 void storeRegToStackSlot(MachineBasicBlock &MBB, 48 MachineBasicBlock::iterator MI, 49 unsigned SrcReg, int FrameIndex, 50 const TargetRegisterClass *RC) const; 51 52 void loadRegFromStackSlot(MachineBasicBlock &MBB, 53 MachineBasicBlock::iterator MI, 54 unsigned DestReg, int FrameIndex, 55 const TargetRegisterClass *RC) const; 56 57 void copyRegToReg(MachineBasicBlock &MBB, 58 MachineBasicBlock::iterator MI, 59 unsigned DestReg, unsigned SrcReg, 60 const TargetRegisterClass *RC) const; 61 62 /// foldMemoryOperand - If this target supports it, fold a load or store of 63 /// the specified stack slot into the specified machine instruction for the 64 /// specified operand. If this is possible, the target should perform the 65 /// folding and return true, otherwise it should return false. If it folds 66 /// the instruction, it is likely that the MachineInstruction the iterator 67 /// references has been changed. 68 MachineInstr* foldMemoryOperand(MachineInstr* MI, 69 unsigned OpNum, 70 int FrameIndex) const; 71 72 /// getCalleeSavedRegs - Return a null-terminated list of all of the 73 /// callee-save registers on this target. 74 const unsigned *getCalleeSavedRegs() const; 75 76 /// getCalleeSavedRegClasses - Return a null-terminated list of the preferred 77 /// register classes to spill each callee-saved register with. The order and 78 /// length of this list match the getCalleeSavedRegs() list. 79 const TargetRegisterClass* const* getCalleeSavedRegClasses() const; 80 81 bool hasFP(const MachineFunction &MF) const; 82 83 void eliminateCallFramePseudoInstr(MachineFunction &MF, 84 MachineBasicBlock &MBB, 85 MachineBasicBlock::iterator MI) const; 86 87 void eliminateFrameIndex(MachineBasicBlock::iterator MI) const; 88 89 void processFunctionBeforeFrameFinalized(MachineFunction &MF) const; 90 91 void emitPrologue(MachineFunction &MF) const; 92 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; 93 94 // Debug information queries. 95 unsigned getRARegister() const; 96 unsigned getFrameRegister(MachineFunction &MF) const; 97}; 98 99// getX86SubSuperRegister - X86 utility function. It returns the sub or super 100// register of a specific X86 register. 101// e.g. getX86SubSuperRegister(X86::EAX, MVT::i16) return X86:AX 102unsigned getX86SubSuperRegister(unsigned, MVT::ValueType, bool High=false); 103 104} // End llvm namespace 105 106#endif 107