LLVM 22.0.0git
PPCSubtarget.h
Go to the documentation of this file.
1//===-- PPCSubtarget.h - Define Subtarget for the PPC ----------*- 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 declares the PowerPC specific subclass of TargetSubtargetInfo.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_POWERPC_PPCSUBTARGET_H
14#define LLVM_LIB_TARGET_POWERPC_PPCSUBTARGET_H
15
16#include "PPCFrameLowering.h"
17#include "PPCISelLowering.h"
18#include "PPCInstrInfo.h"
23#include "llvm/IR/DataLayout.h"
26
27#define GET_SUBTARGETINFO_HEADER
28#include "PPCGenSubtargetInfo.inc"
29
30// GCC #defines PPC on Linux but we use it as our namespace name
31#undef PPC
32
33namespace llvm {
34class SelectionDAGTargetInfo;
35class StringRef;
36
37namespace PPC {
38 // -m directive values.
39enum {
66};
67}
68
69class GlobalValue;
70
72public:
78
79protected:
80 /// stackAlignment - The minimum alignment known to hold of the stack frame on
81 /// entry to the function and which must be maintained by every function.
83
84 /// Selected instruction itineraries (one entry per itinerary class.)
86
87// Bool members corresponding to the SubtargetFeatures defined in tablegen.
88#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
89 bool ATTRIBUTE = DEFAULT;
90#include "PPCGenSubtargetInfo.inc"
91
92 /// Which cpu directive was used.
93 unsigned CPUDirective;
94
96
98
103
104 // SelectionDAGISel related APIs.
105 std::unique_ptr<const SelectionDAGTargetInfo> TSInfo;
106
107 /// GlobalISel related APIs.
108 std::unique_ptr<CallLowering> CallLoweringInfo;
109 std::unique_ptr<LegalizerInfo> Legalizer;
110 std::unique_ptr<RegisterBankInfo> RegBankInfo;
111 std::unique_ptr<InstructionSelector> InstSelector;
112
113public:
114 /// This constructor initializes the data members to match that
115 /// of the specified triple.
116 ///
117 PPCSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS,
118 const PPCTargetMachine &TM);
119
120 ~PPCSubtarget() override;
121
122 /// ParseSubtargetFeatures - Parses features string setting specified
123 /// subtarget options. Definition of function is auto generated by tblgen.
125
126 /// getStackAlignment - Returns the minimum alignment known to hold of the
127 /// stack frame on entry to the function and which must be maintained by every
128 /// function for this subtarget.
130
131 /// getCPUDirective - Returns the -m directive specified for the cpu.
132 ///
133 unsigned getCPUDirective() const { return CPUDirective; }
134
135 /// getInstrItins - Return the instruction itineraries based on subtarget
136 /// selection.
138 return &InstrItins;
139 }
140
141 const PPCFrameLowering *getFrameLowering() const override {
142 return &FrameLowering;
143 }
144 const PPCInstrInfo *getInstrInfo() const override { return &InstrInfo; }
145 const PPCTargetLowering *getTargetLowering() const override {
146 return &TLInfo;
147 }
148
149 const SelectionDAGTargetInfo *getSelectionDAGInfo() const override;
150
151 const PPCRegisterInfo *getRegisterInfo() const override {
152 return &getInstrInfo()->getRegisterInfo();
153 }
154 const PPCTargetMachine &getTargetMachine() const { return TM; }
155
156 /// initializeSubtargetDependencies - Initializes using a CPU, a TuneCPU, and
157 /// feature string so that we can use initializer lists for subtarget
158 /// initialization.
160 StringRef TuneCPU,
161 StringRef FS);
162
163private:
164 void initializeEnvironment();
165 void initSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
166
167public:
168 // useSoftFloat - Return true if soft-float option is turned on.
169 bool useSoftFloat() const {
170 if (isAIXABI() && !HasHardFloat)
171 report_fatal_error("soft-float is not yet supported on AIX.");
172 return !HasHardFloat;
173 }
174
175 // isLittleEndian - True if generating little-endian code
176 bool isLittleEndian() const { return IsLittleEndian; }
177
178// Getters for SubtargetFeatures defined in tablegen.
179#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
180 bool GETTER() const { return ATTRIBUTE; }
181#include "PPCGenSubtargetInfo.inc"
182
184 return Align(16);
185 }
186
187 unsigned getRedZoneSize() const {
188 if (isPPC64())
189 // 288 bytes = 18*8 (FPRs) + 18*8 (GPRs, GPR13 reserved)
190 return 288;
191
192 // AIX PPC32: 220 bytes = 18*8 (FPRs) + 19*4 (GPRs);
193 // PPC32 SVR4ABI has no redzone.
194 return isAIXABI() ? 220 : 0;
195 }
196
198 return hasVSX() && isLittleEndian() && !hasP9Vector();
199 }
200
202
203 bool isTargetELF() const { return getTargetTriple().isOSBinFormatELF(); }
204 bool isTargetMachO() const { return getTargetTriple().isOSBinFormatMachO(); }
205 bool isTargetLinux() const { return getTargetTriple().isOSLinux(); }
206
207 bool isAIXABI() const { return getTargetTriple().isOSAIX(); }
208 bool isSVR4ABI() const { return !isAIXABI(); }
209 bool isELFv2ABI() const;
210
211 bool is64BitELFABI() const { return isSVR4ABI() && isPPC64(); }
212 bool is32BitELFABI() const { return isSVR4ABI() && !isPPC64(); }
213 bool isUsingPCRelativeCalls() const;
214
215 /// Originally, this function return hasISEL(). Now we always enable it,
216 /// but may expand the ISEL instruction later.
217 bool enableEarlyIfConversion() const override { return true; }
218
219 /// Scheduling customization.
220 bool enableMachineScheduler() const override;
221 /// Pipeliner customization.
222 bool enableMachinePipeliner() const override;
223 /// Machine Pipeliner customization
224 bool useDFAforSMS() const override;
225 /// This overrides the PostRAScheduler bit in the SchedModel for each CPU.
226 bool enablePostRAScheduler() const override;
227 AntiDepBreakMode getAntiDepBreakMode() const override;
228 void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override;
229
231 const SchedRegion &Region) const override;
232
233 bool useAA() const override;
234
235 bool enableSubRegLiveness() const override;
236
237 bool enableSpillageCopyElimination() const override { return true; }
238
239 /// True if the GV will be accessed via an indirect symbol.
240 bool isGVIndirectSymbol(const GlobalValue *GV) const;
241
242 MVT getScalarIntVT() const { return isPPC64() ? MVT::i64 : MVT::i32; }
243
244 /// Calculates the effective code model for argument GV.
246 const GlobalValue *GV) const;
247
248 /// True if the ABI is descriptor based.
250 // Both 32-bit and 64-bit AIX are descriptor based. For ELF only the 64-bit
251 // v1 ABI uses descriptors.
252 return isAIXABI() || (is64BitELFABI() && !isELFv2ABI());
253 }
254
255 unsigned descriptorTOCAnchorOffset() const {
257 "Should only be called when the target uses descriptors.");
258 return IsPPC64 ? 8 : 4;
259 }
260
263 "Should only be called when the target uses descriptors.");
264 return IsPPC64 ? 16 : 8;
265 }
266
269 "Should only be called when the target uses descriptors.");
270 return IsPPC64 ? PPC::X11 : PPC::R11;
271 }
272
274 assert((is64BitELFABI() || isAIXABI()) &&
275 "Should only be called when the target is a TOC based ABI.");
276 return IsPPC64 ? PPC::X2 : PPC::R2;
277 }
278
280 assert((is64BitELFABI() || isAIXABI()) &&
281 "Should only be called for targets with a thread pointer register.");
282 return IsPPC64 ? PPC::X13 : PPC::R13;
283 }
284
286 return IsPPC64 ? PPC::X1 : PPC::R1;
287 }
288
289 bool isXRaySupported() const override { return IsPPC64 && IsLittleEndian; }
290
292 return PredictableSelectIsExpensive;
293 }
294
295 // Select allocation orders of GPRC and G8RC. It should be strictly consistent
296 // with corresponding AltOrders in PPCRegisterInfo.td.
297 unsigned getGPRAllocationOrderIdx() const {
298 if (is64BitELFABI())
299 return 1;
300 if (isAIXABI())
301 return 2;
302 return 0;
303 }
304
305 // GlobalISEL
306 const CallLowering *getCallLowering() const override;
307 const RegisterBankInfo *getRegBankInfo() const override;
308 const LegalizerInfo *getLegalizerInfo() const override;
310};
311} // End llvm namespace
312
313#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file describes how to lower LLVM calls to machine code calls.
Interface for Targets to specify which operations they can successfully select and how the others sho...
Itinerary data supplied by a subtarget to be used by a target.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:33
Machine Value Type.
const PPCRegisterInfo & getRegisterInfo() const
getRegisterInfo - TargetInstrInfo is a superset of MRegister info.
std::unique_ptr< InstructionSelector > InstSelector
bool enableMachinePipeliner() const override
Pipeliner customization.
bool useDFAforSMS() const override
Machine Pipeliner customization.
bool is32BitELFABI() const
std::unique_ptr< LegalizerInfo > Legalizer
PPCTargetLowering TLInfo
unsigned descriptorTOCAnchorOffset() const
bool isTargetMachO() const
MVT getScalarIntVT() const
PPCFrameLowering FrameLowering
bool isAIXABI() const
const CallLowering * getCallLowering() const override
const LegalizerInfo * getLegalizerInfo() const override
unsigned getGPRAllocationOrderIdx() const
bool useSoftFloat() const
std::unique_ptr< RegisterBankInfo > RegBankInfo
~PPCSubtarget() override
bool isXRaySupported() const override
POPCNTDKind HasPOPCNTD
InstrItineraryData InstrItins
Selected instruction itineraries (one entry per itinerary class.)
Align StackAlignment
stackAlignment - The minimum alignment known to hold of the stack frame on entry to the function and ...
const PPCFrameLowering * getFrameLowering() const override
bool needsSwapsForVSXMemOps() const
PPCInstrInfo InstrInfo
void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override
bool isUsingPCRelativeCalls() const
bool enableSubRegLiveness() const override
bool usesFunctionDescriptors() const
True if the ABI is descriptor based.
const PPCTargetLowering * getTargetLowering() const override
const InstrItineraryData * getInstrItineraryData() const override
getInstrItins - Return the instruction itineraries based on subtarget selection.
InstructionSelector * getInstructionSelector() const override
bool enableEarlyIfConversion() const override
Originally, this function return hasISEL().
MCRegister getEnvironmentPointerRegister() const
unsigned CPUDirective
Which cpu directive was used.
const PPCInstrInfo * getInstrInfo() const override
unsigned getRedZoneSize() const
AntiDepBreakMode getAntiDepBreakMode() const override
MCRegister getThreadPointerRegister() const
bool isSVR4ABI() const
unsigned getCPUDirective() const
getCPUDirective - Returns the -m directive specified for the cpu.
bool enableSpillageCopyElimination() const override
POPCNTDKind hasPOPCNTD() const
bool isLittleEndian() const
bool isTargetLinux() const
MCRegister getTOCPointerRegister() const
bool isTargetELF() const
MCRegister getStackPointerRegister() const
const SelectionDAGTargetInfo * getSelectionDAGInfo() const override
bool useAA() const override
Align getStackAlignment() const
getStackAlignment - Returns the minimum alignment known to hold of the stack frame on entry to the fu...
PPCSubtarget & initializeSubtargetDependencies(StringRef CPU, StringRef TuneCPU, StringRef FS)
initializeSubtargetDependencies - Initializes using a CPU, a TuneCPU, and feature string so that we c...
bool is64BitELFABI() const
CodeModel::Model getCodeModel(const TargetMachine &TM, const GlobalValue *GV) const
Calculates the effective code model for argument GV.
PPCSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS, const PPCTargetMachine &TM)
This constructor initializes the data members to match that of the specified triple.
bool isELFv2ABI() const
Align getPlatformStackAlignment() const
const PPCTargetMachine & getTargetMachine() const
const PPCTargetMachine & TM
bool isPredictableSelectIsExpensive() const
std::unique_ptr< const SelectionDAGTargetInfo > TSInfo
bool enableMachineScheduler() const override
Scheduling customization.
void overrideSchedPolicy(MachineSchedPolicy &Policy, const SchedRegion &Region) const override
const RegisterBankInfo * getRegBankInfo() const override
const PPCRegisterInfo * getRegisterInfo() const override
bool isGVIndirectSymbol(const GlobalValue *GV) const
True if the GV will be accessed via an indirect symbol.
unsigned descriptorEnvironmentPointerOffset() const
std::unique_ptr< CallLowering > CallLoweringInfo
GlobalISel related APIs.
bool enablePostRAScheduler() const override
This overrides the PostRAScheduler bit in the SchedModel for each CPU.
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
ParseSubtargetFeatures - Parses features string setting specified subtarget options.
Common code between 32-bit and 64-bit PowerPC targets.
Holds all the information related to register banks.
Targets can subclass this to parameterize the SelectionDAG lowering and instruction selection process...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Primary interface to the complete machine description for the target machine.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Define a generic scheduling policy for targets that don't provide their own MachineSchedStrategy.
A region of an MBB for scheduling.