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