]>
git.proxmox.com Git - rustc.git/blob - src/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h
1 //===-- ARMBaseRegisterInfo.h - ARM Register Information Impl ---*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the base ARM implementation of TargetRegisterInfo class.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TARGET_ARM_ARMBASEREGISTERINFO_H
15 #define LLVM_LIB_TARGET_ARM_ARMBASEREGISTERINFO_H
17 #include "MCTargetDesc/ARMBaseInfo.h"
18 #include "llvm/Target/TargetRegisterInfo.h"
20 #define GET_REGINFO_HEADER
21 #include "ARMGenRegisterInfo.inc"
25 class ARMBaseInstrInfo
;
28 /// Register allocation hints.
36 /// isARMArea1Register - Returns true if the register is a low register (r0-r7)
37 /// or a stack/pc register that we should push/pop.
38 static inline bool isARMArea1Register(unsigned Reg
, bool isIOS
) {
41 case R0
: case R1
: case R2
: case R3
:
42 case R4
: case R5
: case R6
: case R7
:
43 case LR
: case SP
: case PC
:
45 case R8
: case R9
: case R10
: case R11
: case R12
:
46 // For iOS we want r7 and lr to be next to each other.
53 static inline bool isARMArea2Register(unsigned Reg
, bool isIOS
) {
56 case R8
: case R9
: case R10
: case R11
: case R12
:
57 // iOS has this second area.
64 static inline bool isARMArea3Register(unsigned Reg
, bool isIOS
) {
67 case D15
: case D14
: case D13
: case D12
:
68 case D11
: case D10
: case D9
: case D8
:
75 static inline bool isCalleeSavedRegister(unsigned Reg
,
76 const MCPhysReg
*CSRegs
) {
77 for (unsigned i
= 0; CSRegs
[i
]; ++i
)
83 class ARMBaseRegisterInfo
: public ARMGenRegisterInfo
{
85 const ARMSubtarget
&STI
;
87 /// FramePtr - ARM physical register used as frame ptr.
90 /// BasePtr - ARM physical register used as a base ptr in complex stack
91 /// frames. I.e., when we need a 3rd base, not just SP and FP, due to
92 /// variable size stack objects.
95 // Can be only subclassed.
96 explicit ARMBaseRegisterInfo(const ARMSubtarget
&STI
);
98 // Return the opcode that implements 'Op', or 0 if no opcode
99 unsigned getOpcode(int Op
) const;
102 /// Code Generation virtual methods...
104 getCalleeSavedRegs(const MachineFunction
*MF
= nullptr) const override
;
105 const uint32_t *getCallPreservedMask(CallingConv::ID
) const override
;
106 const uint32_t *getNoPreservedMask() const;
108 /// getThisReturnPreservedMask - Returns a call preserved mask specific to the
109 /// case that 'returned' is on an i32 first argument if the calling convention
110 /// is one that can (partially) model this attribute with a preserved mask
111 /// (i.e. it is a calling convention that uses the same register for the first
112 /// i32 argument and an i32 return value)
114 /// Should return NULL in the case that the calling convention does not have
116 const uint32_t *getThisReturnPreservedMask(CallingConv::ID
) const;
118 BitVector
getReservedRegs(const MachineFunction
&MF
) const override
;
120 const TargetRegisterClass
*
121 getPointerRegClass(const MachineFunction
&MF
,
122 unsigned Kind
= 0) const override
;
123 const TargetRegisterClass
*
124 getCrossCopyRegClass(const TargetRegisterClass
*RC
) const override
;
126 const TargetRegisterClass
*
127 getLargestLegalSuperClass(const TargetRegisterClass
*RC
) const override
;
129 unsigned getRegPressureLimit(const TargetRegisterClass
*RC
,
130 MachineFunction
&MF
) const override
;
132 void getRegAllocationHints(unsigned VirtReg
,
133 ArrayRef
<MCPhysReg
> Order
,
134 SmallVectorImpl
<MCPhysReg
> &Hints
,
135 const MachineFunction
&MF
,
136 const VirtRegMap
*VRM
) const override
;
138 void UpdateRegAllocHint(unsigned Reg
, unsigned NewReg
,
139 MachineFunction
&MF
) const override
;
141 bool avoidWriteAfterWrite(const TargetRegisterClass
*RC
) const override
;
143 bool hasBasePointer(const MachineFunction
&MF
) const;
145 bool canRealignStack(const MachineFunction
&MF
) const;
146 bool needsStackRealignment(const MachineFunction
&MF
) const override
;
147 int64_t getFrameIndexInstrOffset(const MachineInstr
*MI
,
148 int Idx
) const override
;
149 bool needsFrameBaseReg(MachineInstr
*MI
, int64_t Offset
) const override
;
150 void materializeFrameBaseRegister(MachineBasicBlock
*MBB
,
151 unsigned BaseReg
, int FrameIdx
,
152 int64_t Offset
) const override
;
153 void resolveFrameIndex(MachineInstr
&MI
, unsigned BaseReg
,
154 int64_t Offset
) const override
;
155 bool isFrameOffsetLegal(const MachineInstr
*MI
,
156 int64_t Offset
) const override
;
158 bool cannotEliminateFrame(const MachineFunction
&MF
) const;
160 // Debug information queries.
161 unsigned getFrameRegister(const MachineFunction
&MF
) const override
;
162 unsigned getBaseRegister() const { return BasePtr
; }
164 bool isLowRegister(unsigned Reg
) const;
167 /// emitLoadConstPool - Emits a load from constpool to materialize the
168 /// specified immediate.
169 virtual void emitLoadConstPool(MachineBasicBlock
&MBB
,
170 MachineBasicBlock::iterator
&MBBI
,
171 DebugLoc dl
, unsigned DestReg
, unsigned SubIdx
,
172 int Val
, ARMCC::CondCodes Pred
= ARMCC::AL
,
173 unsigned PredReg
= 0,
174 unsigned MIFlags
= MachineInstr::NoFlags
)const;
176 /// Code Generation virtual methods...
177 bool requiresRegisterScavenging(const MachineFunction
&MF
) const override
;
179 bool trackLivenessAfterRegAlloc(const MachineFunction
&MF
) const override
;
181 bool requiresFrameIndexScavenging(const MachineFunction
&MF
) const override
;
183 bool requiresVirtualBaseRegisters(const MachineFunction
&MF
) const override
;
185 void eliminateFrameIndex(MachineBasicBlock::iterator II
,
186 int SPAdj
, unsigned FIOperandNum
,
187 RegScavenger
*RS
= nullptr) const override
;
189 /// \brief SrcRC and DstRC will be morphed into NewRC if this returns true
190 bool shouldCoalesce(MachineInstr
*MI
,
191 const TargetRegisterClass
*SrcRC
,
193 const TargetRegisterClass
*DstRC
,
195 const TargetRegisterClass
*NewRC
) const override
;
198 } // end namespace llvm