LLVM 22.0.0git
ARMSubtarget.h
Go to the documentation of this file.
1//===-- ARMSubtarget.h - Define Subtarget for the ARM ----------*- 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 ARM specific subclass of TargetSubtargetInfo.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H
14#define LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H
15
16#include "ARMBaseInstrInfo.h"
17#include "ARMBaseRegisterInfo.h"
19#include "ARMFrameLowering.h"
20#include "ARMISelLowering.h"
22#include "ARMSelectionDAGInfo.h"
31#include "llvm/MC/MCSchedule.h"
35#include <bitset>
36#include <memory>
37#include <string>
38
39#define GET_SUBTARGETINFO_HEADER
40#include "ARMGenSubtargetInfo.inc"
41
42namespace llvm {
43
44class ARMBaseTargetMachine;
45class GlobalValue;
46class StringRef;
47
49protected:
52#define ARM_PROCESSOR_FAMILY(ENUM) ENUM,
53#include "llvm/TargetParser/ARMTargetParserDef.inc"
54#undef ARM_PROCESSOR_FAMILY
55 };
64#define ARM_ARCHITECTURE(ENUM) ENUM,
65#include "llvm/TargetParser/ARMTargetParserDef.inc"
66#undef ARM_ARCHITECTURE
67 };
68
69public:
70 /// What kind of timing do load multiple/store multiple instructions have.
72 /// Can load/store 2 registers/cycle.
74 /// Can load/store 2 registers/cycle, but needs an extra cycle if the access
75 /// is not 64-bit aligned.
77 /// Can load/store 1 register/cycle.
79 /// Can load/store 1 register/cycle, but needs an extra cycle for address
80 /// computation and potentially also for register writeback.
82 };
83
84 /// How the push and pop instructions of callee saved general-purpose
85 /// registers should be split.
87 /// All GPRs can be pushed in a single instruction.
88 /// push {r0-r12, lr}
89 /// vpush {d8-d15}
91
92 /// R7 and LR must be adjacent, because R7 is the frame pointer, and must
93 /// point to a frame record consisting of the previous frame pointer and the
94 /// return address.
95 /// push {r0-r7, lr}
96 /// push {r8-r12}
97 /// vpush {d8-d15}
98 /// Note that Thumb1 changes this layout when the frame pointer is R11,
99 /// using a longer sequence of instructions because R11 can't be used by a
100 /// Thumb1 push instruction. This doesn't currently have a separate enum
101 /// value, and is handled entriely within Thumb1FrameLowering::emitPrologue.
103
104 /// When the stack frame size is not known (because of variable-sized
105 /// objects or realignment), Windows SEH requires the callee-saved registers
106 /// to be stored in three regions, with R11 and LR below the floating-point
107 /// registers.
108 /// push {r0-r10, r12}
109 /// vpush {d8-d15}
110 /// push {r11, lr}
112
113 /// When generating AAPCS-compilant frame chains, R11 is the frame pointer,
114 /// and must be pushed adjacent to the return address (LR). Normally this
115 /// isn't a problem, because the only register between them is r12, which is
116 /// the intra-procedure-call scratch register, so doesn't need to be saved.
117 /// However, when PACBTI is in use, r12 contains the authentication code, so
118 /// does need to be saved. This means that we need a separate push for R11
119 /// and LR.
120 /// push {r0-r10, r12}
121 /// push {r11, lr}
122 /// vpush {d8-d15}
124 };
125
126protected:
127// Bool members corresponding to the SubtargetFeatures defined in tablegen
128#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
129 bool ATTRIBUTE = DEFAULT;
130#include "ARMGenSubtargetInfo.inc"
131
132 /// ARMProcFamily - ARM processor family: Cortex-A8, Cortex-A9, and others.
134
135 /// ARMProcClass - ARM processor class: None, AClass, RClass or MClass.
137
138 /// ARMArch - ARM architecture
140
141 /// UseMulOps - True if non-microcoded fused integer multiply-add and
142 /// multiply-subtract instructions should be used.
143 bool UseMulOps = false;
144
145 /// SupportsTailCall - True if the OS supports tail call. The dynamic linker
146 /// must be able to synthesize call stubs for interworking between ARM and
147 /// Thumb.
148 bool SupportsTailCall = false;
149
150 /// RestrictIT - If true, the subtarget disallows generation of complex IT
151 /// blocks.
152 bool RestrictIT = false;
153
154 /// stackAlignment - The minimum alignment known to hold of the stack frame on
155 /// entry to the function and which must be maintained by every function.
157
158 /// CPUString - String name of used CPU.
159 std::string CPUString;
160
162
163 /// Clearance before partial register updates (in number of instructions)
165
166 /// What kind of timing do load multiple/store multiple have (double issue,
167 /// single issue etc).
169
170 /// The adjustment that we need to apply to get the operand latency from the
171 /// operand cycle returned by the itinerary data for pre-ISel operands.
173
174 /// What alignment is preferred for loop bodies and functions, in log2(bytes).
176
177 /// The cost factor for MVE instructions, representing the multiple beats an
178 // instruction can take. The default is 2, (set in initSubtargetFeatures so
179 // that we can use subtarget features less than 2).
181
182 /// OptMinSize - True if we're optimising for minimum code size, equal to
183 /// the function attribute.
184 bool OptMinSize = false;
185
186 /// IsLittle - The target is Little Endian
188
189 /// DM - Denormal mode
190 /// NEON and VFP RunFast mode are not IEEE 754 compliant,
191 /// use this field to determine whether to generate NEON/VFP
192 /// instructions in related function.
194
195 /// TargetTriple - What processor and OS we're targeting.
197
198 /// SchedModel - Processor specific instruction costs.
200
201 /// Selected instruction itineraries (one entry per itinerary class.)
203
204 /// Options passed via command line that could influence the target
206
208
209public:
210 /// This constructor initializes the data members to match that
211 /// of the specified triple.
212 ///
213 ARMSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
214 const ARMBaseTargetMachine &TM, bool IsLittle,
215 bool MinSize = false, DenormalMode DM = DenormalMode::getIEEE());
216
217 /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size
218 /// that still makes it profitable to inline the call.
219 unsigned getMaxInlineSizeThreshold() const {
220 return 64;
221 }
222
223 /// getMaxMemcpyTPInlineSizeThreshold - Returns the maximum size
224 /// that still makes it profitable to inline a llvm.memcpy as a Tail
225 /// Predicated loop.
226 /// This threshold should only be used for constant size inputs.
227 unsigned getMaxMemcpyTPInlineSizeThreshold() const { return 128; }
228
229 /// ParseSubtargetFeatures - Parses features string setting specified
230 /// subtarget options. Definition of function is auto generated by tblgen.
232
233 /// initializeSubtargetDependencies - Initializes using a CPU and feature string
234 /// so that we can use initializer lists for subtarget initialization.
236
237 const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
238 return &TSInfo;
239 }
240
241 const ARMBaseInstrInfo *getInstrInfo() const override {
242 return InstrInfo.get();
243 }
244
245 const ARMTargetLowering *getTargetLowering() const override {
246 return &TLInfo;
247 }
248
249 const ARMFrameLowering *getFrameLowering() const override {
250 return FrameLowering.get();
251 }
252
253 const ARMBaseRegisterInfo *getRegisterInfo() const override {
254 return &InstrInfo->getRegisterInfo();
255 }
256
257 const CallLowering *getCallLowering() const override;
259 const LegalizerInfo *getLegalizerInfo() const override;
260 const RegisterBankInfo *getRegBankInfo() const override;
261
262private:
263 ARMSelectionDAGInfo TSInfo;
264 // Either Thumb1FrameLowering or ARMFrameLowering.
265 std::unique_ptr<ARMFrameLowering> FrameLowering;
266 // Either Thumb1InstrInfo or Thumb2InstrInfo.
267 std::unique_ptr<ARMBaseInstrInfo> InstrInfo;
268 ARMTargetLowering TLInfo;
269
270 /// GlobalISel related APIs.
271 std::unique_ptr<CallLowering> CallLoweringInfo;
272 std::unique_ptr<InstructionSelector> InstSelector;
273 std::unique_ptr<LegalizerInfo> Legalizer;
274 std::unique_ptr<RegisterBankInfo> RegBankInfo;
275
276 void initSubtargetFeatures(StringRef CPU, StringRef FS);
277 ARMFrameLowering *initializeFrameLowering(StringRef CPU, StringRef FS);
278
279 std::bitset<8> CoprocCDE = {};
280public:
281// Getters for SubtargetFeatures defined in tablegen
282#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
283 bool GETTER() const { return ATTRIBUTE; }
284#include "ARMGenSubtargetInfo.inc"
285
286 /// @{
287 /// These functions are obsolete, please consider adding subtarget features
288 /// or properties instead of calling them.
289 bool isCortexA5() const { return ARMProcFamily == CortexA5; }
290 bool isCortexA7() const { return ARMProcFamily == CortexA7; }
291 bool isCortexA8() const { return ARMProcFamily == CortexA8; }
292 bool isCortexA9() const { return ARMProcFamily == CortexA9; }
293 bool isCortexA15() const { return ARMProcFamily == CortexA15; }
294 bool isSwift() const { return ARMProcFamily == Swift; }
295 bool isCortexM3() const { return ARMProcFamily == CortexM3; }
296 bool isCortexM55() const { return ARMProcFamily == CortexM55; }
297 bool isCortexM7() const { return ARMProcFamily == CortexM7; }
298 bool isCortexM85() const { return ARMProcFamily == CortexM85; }
299 bool isLikeA9() const { return isCortexA9() || isCortexA15() || isKrait(); }
300 bool isCortexR5() const { return ARMProcFamily == CortexR5; }
301 bool isKrait() const { return ARMProcFamily == Krait; }
302 /// @}
303
304 bool hasARMOps() const { return !NoARM; }
305
307 return hasNEON() && hasNEONForFP();
308 }
309
310 bool hasVFP2Base() const { return hasVFPv2SP(); }
311 bool hasVFP3Base() const { return hasVFPv3D16SP(); }
312 bool hasVFP4Base() const { return hasVFPv4D16SP(); }
313 bool hasFPARMv8Base() const { return hasFPARMv8D16SP(); }
314
315 bool hasAnyDataBarrier() const {
316 return HasDataBarrier || (hasV6Ops() && !isThumb());
317 }
318
319 bool useMulOps() const { return UseMulOps; }
320 bool useFPVMLx() const { return !SlowFPVMLx; }
321 bool useFPVFMx() const {
322 return !isTargetDarwin() && hasVFP4Base() && !SlowFPVFMx;
323 }
324 bool useFPVFMx16() const { return useFPVFMx() && hasFullFP16(); }
325 bool useFPVFMx64() const { return useFPVFMx() && hasFP64(); }
326 bool hasBaseDSP() const {
327 if (isThumb())
328 return hasThumb2() && hasDSP();
329 else
330 return hasV5TEOps();
331 }
332
333 /// Return true if the CPU supports any kind of instruction fusion.
334 bool hasFusion() const { return hasFuseAES() || hasFuseLiterals(); }
335
336 const Triple &getTargetTriple() const { return TargetTriple; }
337
338 /// @{
339 /// These properties are per-module, please use the TargetMachine
340 /// TargetTriple.
341 bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
342 bool isTargetIOS() const { return TargetTriple.isiOS(); }
343 bool isTargetWatchOS() const { return TargetTriple.isWatchOS(); }
344 bool isTargetWatchABI() const { return TargetTriple.isWatchABI(); }
345 bool isTargetDriverKit() const { return TargetTriple.isDriverKit(); }
346 bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
347 bool isTargetNetBSD() const { return TargetTriple.isOSNetBSD(); }
348 bool isTargetWindows() const { return TargetTriple.isOSWindows(); }
349
350 bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
351 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
352 bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); }
353
354 bool isTargetAEABI() const { return TargetTriple.isTargetAEABI(); }
355
356 bool isTargetGNUAEABI() const { return TargetTriple.isTargetGNUAEABI(); }
357
358 bool isTargetMuslAEABI() const { return TargetTriple.isTargetMuslAEABI(); }
359
360 // ARM Targets that support EHABI exception handling standard
361 // Darwin uses SjLj. Other targets might need more checks.
363 return TargetTriple.isTargetEHABICompatible();
364 }
365 /// @}
366
367 bool isReadTPSoft() const {
368 return !(isReadTPTPIDRURW() || isReadTPTPIDRURO() || isReadTPTPIDRPRW());
369 }
370
371 bool isTargetAndroid() const { return TargetTriple.isAndroid(); }
372
373 bool isXRaySupported() const override;
374
375 bool isROPI() const;
376 bool isRWPI() const;
377
378 bool useMachineScheduler() const { return UseMISched; }
379 bool useMachinePipeliner() const { return UseMIPipeliner; }
380 bool hasMinSize() const { return OptMinSize; }
381 bool isThumb1Only() const { return isThumb() && !hasThumb2(); }
382 bool isThumb2() const { return isThumb() && hasThumb2(); }
383 bool isMClass() const { return ARMProcClass == MClass; }
384 bool isRClass() const { return ARMProcClass == RClass; }
385 bool isAClass() const { return ARMProcClass == AClass; }
386
387 bool isR9Reserved() const {
388 return isTargetMachO() ? (ReserveR9 || !HasV6Ops) : ReserveR9;
389 }
390
392 if (isTargetDarwin() ||
393 (!isTargetWindows() && isThumb() && !createAAPCSFrameChain()))
394 return ARM::R7;
395 return ARM::R11;
396 }
397
400
401 bool useStride4VFPs() const;
402
403 bool useMovt() const;
404
405 bool supportsTailCall() const { return SupportsTailCall; }
406
407 bool allowsUnalignedMem() const { return !StrictAlign; }
408
409 bool restrictIT() const { return RestrictIT; }
410
411 const std::string & getCPUString() const { return CPUString; }
412
413 bool isLittle() const { return IsLittle; }
414
415 unsigned getMispredictionPenalty() const;
416
417 /// Returns true if machine scheduler should be enabled.
418 bool enableMachineScheduler() const override;
419
420 /// Returns true if machine pipeliner should be enabled.
421 bool enableMachinePipeliner() const override;
422 bool useDFAforSMS() const override;
423
424 /// True for some subtargets at > -O0.
425 bool enablePostRAScheduler() const override;
426
427 /// True for some subtargets at > -O0.
428 bool enablePostRAMachineScheduler() const override;
429
430 /// Check whether this subtarget wants to use subregister liveness.
431 bool enableSubRegLiveness() const override;
432
433 /// Enable use of alias analysis during code generation (during MI
434 /// scheduling, DAGCombine, etc.).
435 bool useAA() const override { return true; }
436
437 /// getInstrItins - Return the instruction itineraries based on subtarget
438 /// selection.
440 return &InstrItins;
441 }
442
443 /// getStackAlignment - Returns the minimum alignment known to hold of the
444 /// stack frame on entry to the function and which must be maintained by every
445 /// function for this subtarget.
447
448 // Returns the required alignment for LDRD/STRD instructions
450 return Align(hasV7Ops() || allowsUnalignedMem() ? 4 : 8);
451 }
452
453 unsigned getMaxInterleaveFactor() const { return MaxInterleaveFactor; }
454
456
460
464
465 /// True if the GV will be accessed via an indirect symbol.
466 bool isGVIndirectSymbol(const GlobalValue *GV) const;
467
468 /// Returns the constant pool modifier needed to access the GV.
469 bool isGVInGOT(const GlobalValue *GV) const;
470
471 /// True if fast-isel is used.
472 bool useFastISel() const;
473
474 /// Returns the correct return opcode for the current feature set.
475 /// Use BX if available to allow mixing thumb/arm code, but fall back
476 /// to plain mov pc,lr on ARMv4.
477 unsigned getReturnOpcode() const {
478 if (isThumb())
479 return ARM::tBX_RET;
480 if (hasV4TOps())
481 return ARM::BX_RET;
482 return ARM::MOVPCLR;
483 }
484
485 /// Allow movt+movw for PIC global address calculation.
486 /// ELF does not have GOT relocations for movt+movw.
487 /// ROPI does not use GOT.
489 return isROPI() || !isTargetELF();
490 }
491
494 }
495
496 unsigned
502
504 MCRegister PhysReg) const override;
505 unsigned getGPRAllocationOrder(const MachineFunction &MF) const;
506};
507
508} // end namespace llvm
509
510#endif // LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H
static bool isThumb(const MCSubtargetInfo &STI)
This file describes how to lower LLVM calls to machine code calls.
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
Interface for Targets to specify which operations they can successfully select and how the others sho...
This pass exposes codegen information to IR-level passes.
bool useFastISel() const
True if fast-isel is used.
bool isTargetMachO() const
bool hasFusion() const
Return true if the CPU supports any kind of instruction fusion.
bool isCortexA7() const
bool IsLittle
IsLittle - The target is Little Endian.
bool isSwift() const
bool isTargetAEABI() const
bool enablePostRAScheduler() const override
True for some subtargets at > -O0.
ARMLdStMultipleTiming LdStMultipleTiming
What kind of timing do load multiple/store multiple have (double issue, single issue etc).
bool hasARMOps() const
bool supportsTailCall() const
const Triple & getTargetTriple() const
bool hasVFP4Base() const
unsigned getGPRAllocationOrder(const MachineFunction &MF) const
const RegisterBankInfo * getRegBankInfo() const override
unsigned MaxInterleaveFactor
const ARMBaseTargetMachine & TM
bool isRClass() const
ARMLdStMultipleTiming getLdStMultipleTiming() const
const ARMBaseInstrInfo * getInstrInfo() const override
bool useFPVMLx() const
bool isCortexM85() const
bool isThumb1Only() const
ARMProcFamilyEnum ARMProcFamily
ARMProcFamily - ARM processor family: Cortex-A8, Cortex-A9, and others.
bool useFPVFMx() const
ARMArchEnum ARMArch
ARMArch - ARM architecture.
bool isCortexM7() const
bool hasFPARMv8Base() const
bool isAClass() const
bool isThumb2() const
bool useDFAforSMS() const override
bool isReadTPSoft() const
ARMProcClassEnum ARMProcClass
ARMProcClass - ARM processor class: None, AClass, RClass or MClass.
MCPhysReg getFramePointerReg() const
DenormalMode DM
DM - Denormal mode NEON and VFP RunFast mode are not IEEE 754 compliant, use this field to determine ...
bool isTargetWindows() const
bool isTargetEHABICompatible() const
bool isCortexR5() const
bool enableSubRegLiveness() const override
Check whether this subtarget wants to use subregister liveness.
bool isGVIndirectSymbol(const GlobalValue *GV) const
True if the GV will be accessed via an indirect symbol.
unsigned MVEVectorCostFactor
The cost factor for MVE instructions, representing the multiple beats an.
bool hasBaseDSP() const
const ARMTargetLowering * getTargetLowering() const override
ARMSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, const ARMBaseTargetMachine &TM, bool IsLittle, bool MinSize=false, DenormalMode DM=DenormalMode::getIEEE())
This constructor initializes the data members to match that of the specified triple.
MCSchedModel SchedModel
SchedModel - Processor specific instruction costs.
std::string CPUString
CPUString - String name of used CPU.
unsigned getMispredictionPenalty() const
unsigned PreferBranchLogAlignment
What alignment is preferred for loop bodies and functions, in log2(bytes).
Triple TargetTriple
TargetTriple - What processor and OS we're targeting.
bool enableMachineScheduler() const override
Returns true if machine scheduler should be enabled.
bool isCortexM55() const
bool isLikeA9() const
bool isTargetDarwin() const
const ARMBaseRegisterInfo * getRegisterInfo() const override
InstrItineraryData InstrItins
Selected instruction itineraries (one entry per itinerary class.)
bool useStride4VFPs() const
bool OptMinSize
OptMinSize - True if we're optimising for minimum code size, equal to the function attribute.
unsigned getReturnOpcode() const
Returns the correct return opcode for the current feature set.
bool RestrictIT
RestrictIT - If true, the subtarget disallows generation of complex IT blocks.
Align getStackAlignment() const
getStackAlignment - Returns the minimum alignment known to hold of the stack frame on entry to the fu...
bool isKrait() const
bool isCortexA5() const
bool ignoreCSRForAllocationOrder(const MachineFunction &MF, MCRegister PhysReg) const override
bool hasVFP2Base() const
bool useAA() const override
Enable use of alias analysis during code generation (during MI scheduling, DAGCombine,...
bool isTargetAndroid() const
Align stackAlignment
stackAlignment - The minimum alignment known to hold of the stack frame on entry to the function and ...
unsigned getMaxMemcpyTPInlineSizeThreshold() const
getMaxMemcpyTPInlineSizeThreshold - Returns the maximum size that still makes it profitable to inline...
unsigned PartialUpdateClearance
Clearance before partial register updates (in number of instructions)
bool enableMachinePipeliner() const override
Returns true if machine pipeliner should be enabled.
bool enablePostRAMachineScheduler() const override
True for some subtargets at > -O0.
bool isTargetCOFF() const
unsigned getMaxInlineSizeThreshold() const
getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size that still makes it profitable t...
bool isTargetGNUAEABI() const
const ARMSelectionDAGInfo * getSelectionDAGInfo() const override
const std::string & getCPUString() const
InstructionSelector * getInstructionSelector() const override
unsigned getMaxInterleaveFactor() const
bool hasVFP3Base() const
bool isR9Reserved() const
bool useFPVFMx64() const
unsigned getPartialUpdateClearance() const
bool isTargetNetBSD() const
bool isTargetWatchOS() const
bool isXRaySupported() const override
unsigned getPreferBranchLogAlignment() const
const CallLowering * getCallLowering() const override
enum PushPopSplitVariation getPushPopSplitVariation(const MachineFunction &MF) const
bool hasMinSize() const
ARMSubtarget & initializeSubtargetDependencies(StringRef CPU, StringRef FS)
initializeSubtargetDependencies - Initializes using a CPU and feature string so that we can use initi...
PushPopSplitVariation
How the push and pop instructions of callee saved general-purpose registers should be split.
@ SplitR11WindowsSEH
When the stack frame size is not known (because of variable-sized objects or realignment),...
@ SplitR7
R7 and LR must be adjacent, because R7 is the frame pointer, and must point to a frame record consist...
@ SplitR11AAPCSSignRA
When generating AAPCS-compilant frame chains, R11 is the frame pointer, and must be pushed adjacent t...
@ NoSplit
All GPRs can be pushed in a single instruction.
bool isTargetIOS() const
bool isGVInGOT(const GlobalValue *GV) const
Returns the constant pool modifier needed to access the GV.
bool useNEONForSinglePrecisionFP() const
const InstrItineraryData * getInstrItineraryData() const override
getInstrItins - Return the instruction itineraries based on subtarget selection.
bool isCortexM3() const
bool isTargetWatchABI() const
bool allowPositionIndependentMovt() const
Allow movt+movw for PIC global address calculation.
bool isCortexA8() const
bool UseMulOps
UseMulOps - True if non-microcoded fused integer multiply-add and multiply-subtract instructions shou...
const TargetOptions & Options
Options passed via command line that could influence the target.
ARMLdStMultipleTiming
What kind of timing do load multiple/store multiple instructions have.
@ DoubleIssueCheckUnalignedAccess
Can load/store 2 registers/cycle, but needs an extra cycle if the access is not 64-bit aligned.
@ SingleIssue
Can load/store 1 register/cycle.
@ DoubleIssue
Can load/store 2 registers/cycle.
@ SingleIssuePlusExtras
Can load/store 1 register/cycle, but needs an extra cycle for address computation and potentially als...
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
ParseSubtargetFeatures - Parses features string setting specified subtarget options.
bool hasAnyDataBarrier() const
bool useMachinePipeliner() const
bool isTargetDriverKit() const
int getPreISelOperandLatencyAdjustment() const
bool useMachineScheduler() const
bool isCortexA15() const
bool isLittle() const
bool allowsUnalignedMem() const
bool isTargetMuslAEABI() const
const LegalizerInfo * getLegalizerInfo() const override
bool isTargetLinux() const
bool isCortexA9() const
bool useFPVFMx16() const
bool isMClass() const
bool SupportsTailCall
SupportsTailCall - True if the OS supports tail call.
int PreISelOperandLatencyAdjustment
The adjustment that we need to apply to get the operand latency from the operand cycle returned by th...
bool useMulOps() const
bool isTargetELF() const
bool restrictIT() const
unsigned getMVEVectorCostFactor(TargetTransformInfo::TargetCostKind CostKind) const
const ARMFrameLowering * getFrameLowering() const override
Align getDualLoadStoreAlignment() const
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
Holds all the information related to register banks.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
TargetCostKind
The kind of cost model.
@ TCK_CodeSize
Instruction code size.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
@ Swift
Calling convention for Swift.
Definition CallingConv.h:69
This is an optimization pass for GlobalISel generic memory operations.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Represent subnormal handling kind for floating point instruction inputs and outputs.
static constexpr DenormalMode getIEEE()
Machine model for scheduling, bundling, and heuristics.
Definition MCSchedule.h:258