xref: /aosp_15_r20/external/llvm/lib/Target/X86/X86RegisterInfo.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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