1 //===-- PPCRegisterInfo.h - PowerPC Register Information Impl ---*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains the PowerPC implementation of the TargetRegisterInfo
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TARGET_POWERPC_PPCREGISTERINFO_H
15 #define LLVM_LIB_TARGET_POWERPC_PPCREGISTERINFO_H
17 #include "MCTargetDesc/PPCMCTargetDesc.h"
18 #include "llvm/ADT/DenseMap.h"
20 #define GET_REGINFO_HEADER
21 #include "PPCGenRegisterInfo.inc"
24 class PPCTargetMachine
;
26 inline static unsigned getCRFromCRBit(unsigned SrcReg
) {
28 if (SrcReg
== PPC::CR0LT
|| SrcReg
== PPC::CR0GT
||
29 SrcReg
== PPC::CR0EQ
|| SrcReg
== PPC::CR0UN
)
31 else if (SrcReg
== PPC::CR1LT
|| SrcReg
== PPC::CR1GT
||
32 SrcReg
== PPC::CR1EQ
|| SrcReg
== PPC::CR1UN
)
34 else if (SrcReg
== PPC::CR2LT
|| SrcReg
== PPC::CR2GT
||
35 SrcReg
== PPC::CR2EQ
|| SrcReg
== PPC::CR2UN
)
37 else if (SrcReg
== PPC::CR3LT
|| SrcReg
== PPC::CR3GT
||
38 SrcReg
== PPC::CR3EQ
|| SrcReg
== PPC::CR3UN
)
40 else if (SrcReg
== PPC::CR4LT
|| SrcReg
== PPC::CR4GT
||
41 SrcReg
== PPC::CR4EQ
|| SrcReg
== PPC::CR4UN
)
43 else if (SrcReg
== PPC::CR5LT
|| SrcReg
== PPC::CR5GT
||
44 SrcReg
== PPC::CR5EQ
|| SrcReg
== PPC::CR5UN
)
46 else if (SrcReg
== PPC::CR6LT
|| SrcReg
== PPC::CR6GT
||
47 SrcReg
== PPC::CR6EQ
|| SrcReg
== PPC::CR6UN
)
49 else if (SrcReg
== PPC::CR7LT
|| SrcReg
== PPC::CR7GT
||
50 SrcReg
== PPC::CR7EQ
|| SrcReg
== PPC::CR7UN
)
53 assert(Reg
!= 0 && "Invalid CR bit register");
57 class PPCRegisterInfo
: public PPCGenRegisterInfo
{
58 DenseMap
<unsigned, unsigned> ImmToIdxMap
;
59 const PPCTargetMachine
&TM
;
62 PPCRegisterInfo(const PPCTargetMachine
&TM
);
64 /// getPointerRegClass - Return the register class to use to hold pointers.
65 /// This is used for addressing modes.
66 const TargetRegisterClass
*
67 getPointerRegClass(const MachineFunction
&MF
, unsigned Kind
=0) const override
;
69 unsigned getRegPressureLimit(const TargetRegisterClass
*RC
,
70 MachineFunction
&MF
) const override
;
72 const TargetRegisterClass
*
73 getLargestLegalSuperClass(const TargetRegisterClass
*RC
,
74 const MachineFunction
&MF
) const override
;
76 /// Code Generation virtual methods...
77 const MCPhysReg
*getCalleeSavedRegs(const MachineFunction
*MF
) const override
;
78 const MCPhysReg
*getCalleeSavedRegsViaCopy(const MachineFunction
*MF
) const;
79 const uint32_t *getCallPreservedMask(const MachineFunction
&MF
,
80 CallingConv::ID CC
) const override
;
81 const uint32_t *getNoPreservedMask() const override
;
83 void adjustStackMapLiveOutMask(uint32_t *Mask
) const override
;
85 BitVector
getReservedRegs(const MachineFunction
&MF
) const override
;
86 bool isCallerPreservedPhysReg(unsigned PhysReg
, const MachineFunction
&MF
) const override
;
88 /// We require the register scavenger.
89 bool requiresRegisterScavenging(const MachineFunction
&MF
) const override
{
93 bool requiresFrameIndexScavenging(const MachineFunction
&MF
) const override
;
95 bool trackLivenessAfterRegAlloc(const MachineFunction
&MF
) const override
{
99 bool requiresVirtualBaseRegisters(const MachineFunction
&MF
) const override
{
103 void lowerDynamicAlloc(MachineBasicBlock::iterator II
) const;
104 void lowerDynamicAreaOffset(MachineBasicBlock::iterator II
) const;
105 void lowerCRSpilling(MachineBasicBlock::iterator II
,
106 unsigned FrameIndex
) const;
107 void lowerCRRestore(MachineBasicBlock::iterator II
,
108 unsigned FrameIndex
) const;
109 void lowerCRBitSpilling(MachineBasicBlock::iterator II
,
110 unsigned FrameIndex
) const;
111 void lowerCRBitRestore(MachineBasicBlock::iterator II
,
112 unsigned FrameIndex
) const;
113 void lowerVRSAVESpilling(MachineBasicBlock::iterator II
,
114 unsigned FrameIndex
) const;
115 void lowerVRSAVERestore(MachineBasicBlock::iterator II
,
116 unsigned FrameIndex
) const;
118 bool hasReservedSpillSlot(const MachineFunction
&MF
, unsigned Reg
,
119 int &FrameIdx
) const override
;
120 void eliminateFrameIndex(MachineBasicBlock::iterator II
, int SPAdj
,
121 unsigned FIOperandNum
,
122 RegScavenger
*RS
= nullptr) const override
;
124 // Support for virtual base registers.
125 bool needsFrameBaseReg(MachineInstr
*MI
, int64_t Offset
) const override
;
126 void materializeFrameBaseRegister(MachineBasicBlock
*MBB
,
127 unsigned BaseReg
, int FrameIdx
,
128 int64_t Offset
) const override
;
129 void resolveFrameIndex(MachineInstr
&MI
, unsigned BaseReg
,
130 int64_t Offset
) const override
;
131 bool isFrameOffsetLegal(const MachineInstr
*MI
, unsigned BaseReg
,
132 int64_t Offset
) const override
;
134 // Debug information queries.
135 Register
getFrameRegister(const MachineFunction
&MF
) const override
;
137 // Base pointer (stack realignment) support.
138 Register
getBaseRegister(const MachineFunction
&MF
) const;
139 bool hasBasePointer(const MachineFunction
&MF
) const;
141 /// stripRegisterPrefix - This method strips the character prefix from a
142 /// register name so that only the number is left. Used by for linux asm.
143 static const char *stripRegisterPrefix(const char *RegName
) {
144 switch (RegName
[0]) {
149 if (RegName
[1] == 's')
152 case 'c': if (RegName
[1] == 'r') return RegName
+ 2;
159 } // end namespace llvm