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#include <string>
27
28#define GET_SUBTARGETINFO_HEADER
29#include "PPCGenSubtargetInfo.inc"
30
31// GCC #defines PPC on Linux but we use it as our namespace name
32#undef PPC
33
34namespace llvm {
35class SelectionDAGTargetInfo;
36class StringRef;
37
38namespace PPC {
39 // -m directive values.
40enum {
67};
68}
69
70class GlobalValue;
71
73public:
79
80protected:
81 /// stackAlignment - The minimum alignment known to hold of the stack frame on
82 /// entry to the function and which must be maintained by every function.
84
85 /// Selected instruction itineraries (one entry per itinerary class.)
87
88// Bool members corresponding to the SubtargetFeatures defined in tablegen.
89#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
90 bool ATTRIBUTE = DEFAULT;
91#include "PPCGenSubtargetInfo.inc"
92
93 /// Which cpu directive was used.
94 unsigned CPUDirective;
95
97
99
104
105 // SelectionDAGISel related APIs.
106 std::unique_ptr<const SelectionDAGTargetInfo> TSInfo;
107
108 /// GlobalISel related APIs.
109 std::unique_ptr<CallLowering> CallLoweringInfo;
110 std::unique_ptr<LegalizerInfo> Legalizer;
111 std::unique_ptr<RegisterBankInfo> RegBankInfo;
112 std::unique_ptr<InstructionSelector> InstSelector;
113
114public:
115 /// This constructor initializes the data members to match that
116 /// of the specified triple.
117 ///
118 PPCSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS,
119 const PPCTargetMachine &TM);
120
121 ~PPCSubtarget() override;
122
123 /// ParseSubtargetFeatures - Parses features string setting specified
124 /// subtarget options. Definition of function is auto generated by tblgen.
126
127 /// getStackAlignment - Returns the minimum alignment known to hold of the
128 /// stack frame on entry to the function and which must be maintained by every
129 /// function for this subtarget.
131
132 /// getCPUDirective - Returns the -m directive specified for the cpu.
133 ///
134 unsigned getCPUDirective() const { return CPUDirective; }
135
136 /// getInstrItins - Return the instruction itineraries based on subtarget
137 /// selection.
139 return &InstrItins;
140 }
141
142 const PPCFrameLowering *getFrameLowering() const override {
143 return &FrameLowering;
144 }
145 const PPCInstrInfo *getInstrInfo() const override { return &InstrInfo; }
146 const PPCTargetLowering *getTargetLowering() const override {
147 return &TLInfo;
148 }
149
150 const SelectionDAGTargetInfo *getSelectionDAGInfo() const override;
151
152 const PPCRegisterInfo *getRegisterInfo() const override {
153 return &getInstrInfo()->getRegisterInfo();
154 }
155 const PPCTargetMachine &getTargetMachine() const { return TM; }
156
157 /// initializeSubtargetDependencies - Initializes using a CPU, a TuneCPU, and
158 /// feature string so that we can use initializer lists for subtarget
159 /// initialization.
161 StringRef TuneCPU,
162 StringRef FS);
163
164private:
165 void initializeEnvironment();
166 void initSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
167
168public:
169 // useSoftFloat - Return true if soft-float option is turned on.
170 bool useSoftFloat() const {
171 if (isAIXABI() && !HasHardFloat)
172 report_fatal_error("soft-float is not yet supported on AIX.");
173 return !HasHardFloat;
174 }
175
176 // isLittleEndian - True if generating little-endian code
177 bool isLittleEndian() const { return IsLittleEndian; }
178
179// Getters for SubtargetFeatures defined in tablegen.
180#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
181 bool GETTER() const { return ATTRIBUTE; }
182#include "PPCGenSubtargetInfo.inc"
183
185 return Align(16);
186 }
187
188 unsigned getRedZoneSize() const {
189 if (isPPC64())
190 // 288 bytes = 18*8 (FPRs) + 18*8 (GPRs, GPR13 reserved)
191 return 288;
192
193 // AIX PPC32: 220 bytes = 18*8 (FPRs) + 19*4 (GPRs);
194 // PPC32 SVR4ABI has no redzone.
195 return isAIXABI() ? 220 : 0;
196 }
197
199 return hasVSX() && isLittleEndian() && !hasP9Vector();
200 }
201
203
204 bool isTargetELF() const { return getTargetTriple().isOSBinFormatELF(); }
205 bool isTargetMachO() const { return getTargetTriple().isOSBinFormatMachO(); }
206 bool isTargetLinux() const { return getTargetTriple().isOSLinux(); }
207
208 bool isAIXABI() const { return getTargetTriple().isOSAIX(); }
209 bool isSVR4ABI() const { return !isAIXABI(); }
210 bool isELFv2ABI() const;
211
212 bool is64BitELFABI() const { return isSVR4ABI() && isPPC64(); }
213 bool is32BitELFABI() const { return isSVR4ABI() && !isPPC64(); }
214 bool isUsingPCRelativeCalls() const;
215
216 /// Originally, this function return hasISEL(). Now we always enable it,
217 /// but may expand the ISEL instruction later.
218 bool enableEarlyIfConversion() const override { return true; }
219
220 /// Scheduling customization.
221 bool enableMachineScheduler() const override;
222 /// Pipeliner customization.
223 bool enableMachinePipeliner() const override;
224 /// Machine Pipeliner customization
225 bool useDFAforSMS() const override;
226 /// This overrides the PostRAScheduler bit in the SchedModel for each CPU.
227 bool enablePostRAScheduler() const override;
228 AntiDepBreakMode getAntiDepBreakMode() const override;
229 void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override;
230
232 const SchedRegion &Region) const override;
233
234 bool useAA() const override;
235
236 bool enableSubRegLiveness() const override;
237
238 bool enableSpillageCopyElimination() const override { return true; }
239
240 /// True if the GV will be accessed via an indirect symbol.
241 bool isGVIndirectSymbol(const GlobalValue *GV) const;
242
243 MVT getScalarIntVT() const { return isPPC64() ? MVT::i64 : MVT::i32; }
244
245 /// Calculates the effective code model for argument GV.
247 const GlobalValue *GV) const;
248
249 /// True if the ABI is descriptor based.
251 // Both 32-bit and 64-bit AIX are descriptor based. For ELF only the 64-bit
252 // v1 ABI uses descriptors.
253 return isAIXABI() || (is64BitELFABI() && !isELFv2ABI());
254 }
255
256 unsigned descriptorTOCAnchorOffset() const {
258 "Should only be called when the target uses descriptors.");
259 return IsPPC64 ? 8 : 4;
260 }
261
264 "Should only be called when the target uses descriptors.");
265 return IsPPC64 ? 16 : 8;
266 }
267
270 "Should only be called when the target uses descriptors.");
271 return IsPPC64 ? PPC::X11 : PPC::R11;
272 }
273
275 assert((is64BitELFABI() || isAIXABI()) &&
276 "Should only be called when the target is a TOC based ABI.");
277 return IsPPC64 ? PPC::X2 : PPC::R2;
278 }
279
281 assert((is64BitELFABI() || isAIXABI()) &&
282 "Should only be called for targets with a thread pointer register.");
283 return IsPPC64 ? PPC::X13 : PPC::R13;
284 }
285
287 return IsPPC64 ? PPC::X1 : PPC::R1;
288 }
289
290 bool isXRaySupported() const override { return IsPPC64 && IsLittleEndian; }
291
293 return PredictableSelectIsExpensive;
294 }
295
296 // Select allocation orders of GPRC and G8RC. It should be strictly consistent
297 // with corresponding AltOrders in PPCRegisterInfo.td.
298 unsigned getGPRAllocationOrderIdx() const {
299 if (is64BitELFABI())
300 return 1;
301 if (isAIXABI())
302 return 2;
303 return 0;
304 }
305
306 // GlobalISEL
307 const CallLowering *getCallLowering() const override;
308 const RegisterBankInfo *getRegBankInfo() const override;
309 const LegalizerInfo *getLegalizerInfo() const override;
311};
312} // End llvm namespace
313
314#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.