1 | //===-- X86RegisterInfo.h - X86 Register Information Impl -------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file contains the X86 implementation of the TargetRegisterInfo class. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_LIB_TARGET_X86_X86REGISTERINFO_H |
14 | #define LLVM_LIB_TARGET_X86_X86REGISTERINFO_H |
15 | |
16 | #include "llvm/CodeGen/TargetRegisterInfo.h" |
17 | |
18 | #define |
19 | #include "X86GenRegisterInfo.inc" |
20 | |
21 | namespace llvm { |
22 | class Triple; |
23 | |
24 | class X86RegisterInfo final : public X86GenRegisterInfo { |
25 | private: |
26 | /// Is64Bit - Is the target 64-bits. |
27 | /// |
28 | bool Is64Bit; |
29 | |
30 | /// IsWin64 - Is the target on of win64 flavours |
31 | /// |
32 | bool IsWin64; |
33 | |
34 | /// IsUEFI64 - Is UEFI 64 bit target. |
35 | /// |
36 | bool IsUEFI64; |
37 | |
38 | /// SlotSize - Stack slot size in bytes. |
39 | /// |
40 | unsigned SlotSize; |
41 | |
42 | /// StackPtr - X86 physical register used as stack ptr. |
43 | /// |
44 | unsigned StackPtr; |
45 | |
46 | /// FramePtr - X86 physical register used as frame ptr. |
47 | /// |
48 | unsigned FramePtr; |
49 | |
50 | /// BasePtr - X86 physical register used as a base ptr in complex stack |
51 | /// frames. I.e., when we need a 3rd base, not just SP and FP, due to |
52 | /// variable size stack objects. |
53 | unsigned BasePtr; |
54 | |
55 | public: |
56 | explicit X86RegisterInfo(const Triple &TT); |
57 | |
58 | /// Return the number of registers for the function. |
59 | unsigned getNumSupportedRegs(const MachineFunction &MF) const override; |
60 | |
61 | /// getMatchingSuperRegClass - Return a subclass of the specified register |
62 | /// class A so that each register in it has a sub-register of the |
63 | /// specified sub-register index which is in the specified register class B. |
64 | const TargetRegisterClass * |
65 | getMatchingSuperRegClass(const TargetRegisterClass *A, |
66 | const TargetRegisterClass *B, |
67 | unsigned Idx) const override; |
68 | |
69 | const TargetRegisterClass * |
70 | getSubClassWithSubReg(const TargetRegisterClass *RC, |
71 | unsigned Idx) const override; |
72 | |
73 | const TargetRegisterClass * |
74 | getLargestLegalSuperClass(const TargetRegisterClass *RC, |
75 | const MachineFunction &MF) const override; |
76 | |
77 | /// getPointerRegClass - Returns a TargetRegisterClass used for pointer |
78 | /// values. |
79 | const TargetRegisterClass * |
80 | getPointerRegClass(const MachineFunction &MF, |
81 | unsigned Kind = 0) const override; |
82 | |
83 | /// getCrossCopyRegClass - Returns a legal register class to copy a register |
84 | /// in the specified class to or from. Returns NULL if it is possible to copy |
85 | /// between a two registers of the specified class. |
86 | const TargetRegisterClass * |
87 | getCrossCopyRegClass(const TargetRegisterClass *RC) const override; |
88 | |
89 | /// getGPRsForTailCall - Returns a register class with registers that can be |
90 | /// used in forming tail calls. |
91 | const TargetRegisterClass * |
92 | getGPRsForTailCall(const MachineFunction &MF) const; |
93 | |
94 | unsigned getRegPressureLimit(const TargetRegisterClass *RC, |
95 | MachineFunction &MF) const override; |
96 | |
97 | /// getCalleeSavedRegs - Return a null-terminated list of all of the |
98 | /// callee-save registers on this target. |
99 | const MCPhysReg * |
100 | getCalleeSavedRegs(const MachineFunction* MF) const override; |
101 | /// getIPRACSRegs - This API can be removed when rbp is safe to optimized out |
102 | /// when IPRA is on. |
103 | const MCPhysReg *getIPRACSRegs(const MachineFunction *MF) const override; |
104 | const MCPhysReg * |
105 | getCalleeSavedRegsViaCopy(const MachineFunction *MF) const; |
106 | const uint32_t *getCallPreservedMask(const MachineFunction &MF, |
107 | CallingConv::ID) const override; |
108 | const uint32_t *getNoPreservedMask() const override; |
109 | |
110 | // Calls involved in thread-local variable lookup save more registers than |
111 | // normal calls, so they need a different mask to represent this. |
112 | const uint32_t *getDarwinTLSCallPreservedMask() const; |
113 | |
114 | /// getReservedRegs - Returns a bitset indexed by physical register number |
115 | /// indicating if a register is a special register that has particular uses and |
116 | /// should be considered unavailable at all times, e.g. SP, RA. This is used by |
117 | /// register scavenger to determine what registers are free. |
118 | BitVector getReservedRegs(const MachineFunction &MF) const override; |
119 | |
120 | /// isArgumentReg - Returns true if Reg can be used as an argument to a |
121 | /// function. |
122 | bool isArgumentRegister(const MachineFunction &MF, |
123 | MCRegister Reg) const override; |
124 | |
125 | /// Return true if it is tile register class. |
126 | bool isTileRegisterClass(const TargetRegisterClass *RC) const; |
127 | |
128 | /// Returns true if PhysReg is a fixed register. |
129 | bool isFixedRegister(const MachineFunction &MF, |
130 | MCRegister PhysReg) const override; |
131 | |
132 | void adjustStackMapLiveOutMask(uint32_t *Mask) const override; |
133 | |
134 | bool hasBasePointer(const MachineFunction &MF) const; |
135 | |
136 | bool canRealignStack(const MachineFunction &MF) const override; |
137 | |
138 | bool shouldRealignStack(const MachineFunction &MF) const override; |
139 | |
140 | void eliminateFrameIndex(MachineBasicBlock::iterator II, |
141 | unsigned FIOperandNum, Register BaseReg, |
142 | int FIOffset) const; |
143 | |
144 | bool eliminateFrameIndex(MachineBasicBlock::iterator MI, |
145 | int SPAdj, unsigned FIOperandNum, |
146 | RegScavenger *RS = nullptr) const override; |
147 | |
148 | /// Process frame indices in forwards block order because |
149 | /// X86InstrInfo::getSPAdjust relies on it when searching for the |
150 | /// ADJCALLSTACKUP pseudo following a call. |
151 | /// TODO: Fix this and return true like all other targets. |
152 | bool eliminateFrameIndicesBackwards() const override { return false; } |
153 | |
154 | /// findDeadCallerSavedReg - Return a caller-saved register that isn't live |
155 | /// when it reaches the "return" instruction. We can then pop a stack object |
156 | /// to this register without worry about clobbering it. |
157 | unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB, |
158 | MachineBasicBlock::iterator &MBBI) const; |
159 | |
160 | // Debug information queries. |
161 | Register getFrameRegister(const MachineFunction &MF) const override; |
162 | Register getPtrSizedFrameRegister(const MachineFunction &MF) const; |
163 | Register getPtrSizedStackRegister(const MachineFunction &MF) const; |
164 | Register getStackRegister() const { return StackPtr; } |
165 | Register getBaseRegister() const { return BasePtr; } |
166 | /// Returns physical register used as frame pointer. |
167 | /// This will always returns the frame pointer register, contrary to |
168 | /// getFrameRegister() which returns the "base pointer" in situations |
169 | /// involving a stack, frame and base pointer. |
170 | Register getFramePtr() const { return FramePtr; } |
171 | // FIXME: Move to FrameInfok |
172 | unsigned getSlotSize() const { return SlotSize; } |
173 | |
174 | bool getRegAllocationHints(Register VirtReg, ArrayRef<MCPhysReg> Order, |
175 | SmallVectorImpl<MCPhysReg> &Hints, |
176 | const MachineFunction &MF, const VirtRegMap *VRM, |
177 | const LiveRegMatrix *Matrix) const override; |
178 | |
179 | const TargetRegisterClass * |
180 | constrainRegClassToNonRex2(const TargetRegisterClass *RC) const; |
181 | |
182 | bool isNonRex2RegClass(const TargetRegisterClass *RC) const; |
183 | }; |
184 | |
185 | } // End llvm namespace |
186 | |
187 | #endif |
188 | |