LLVM 24.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
209 /// The floating-point ABI in effect for this subtarget.
211
212public:
213 /// This constructor initializes the data members to match that
214 /// of the specified triple.
215 ///
216 ARMSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
217 const ARMBaseTargetMachine &TM, bool IsLittle,
218 FloatABI::ABIType FloatABI, bool MinSize = false,
220
221 /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size
222 /// that still makes it profitable to inline the call.
223 unsigned getMaxInlineSizeThreshold() const {
224 return 64;
225 }
226
227 /// getMaxMemcpyTPInlineSizeThreshold - Returns the maximum size
228 /// that still makes it profitable to inline a llvm.memcpy as a Tail
229 /// Predicated loop.
230 /// This threshold should only be used for constant size inputs.
231 unsigned getMaxMemcpyTPInlineSizeThreshold() const { return 128; }
232
233 /// ParseSubtargetFeatures - Parses features string setting specified
234 /// subtarget options. Definition of function is auto generated by tblgen.
236
237 /// initializeSubtargetDependencies - Initializes using a CPU and feature string
238 /// so that we can use initializer lists for subtarget initialization.
240
241 const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
242 return &TSInfo;
243 }
244
245 const ARMBaseInstrInfo *getInstrInfo() const override {
246 return InstrInfo.get();
247 }
248
249 const ARMTargetLowering *getTargetLowering() const override {
250 return &TLInfo;
251 }
252
253 const ARMFrameLowering *getFrameLowering() const override {
254 return FrameLowering.get();
255 }
256
257 const ARMBaseRegisterInfo *getRegisterInfo() const override {
258 return &InstrInfo->getRegisterInfo();
259 }
260
261 const CallLowering *getCallLowering() const override;
263 const LegalizerInfo *getLegalizerInfo() const override;
264 const RegisterBankInfo *getRegBankInfo() const override;
265 void initLibcallLoweringInfo(LibcallLoweringInfo &Info) const override;
266
267private:
268 ARMSelectionDAGInfo TSInfo;
269 // Either Thumb1FrameLowering or ARMFrameLowering.
270 std::unique_ptr<ARMFrameLowering> FrameLowering;
271 // Either Thumb1InstrInfo or Thumb2InstrInfo.
272 std::unique_ptr<ARMBaseInstrInfo> InstrInfo;
273 ARMTargetLowering TLInfo;
274
275 /// GlobalISel related APIs.
276 std::unique_ptr<CallLowering> CallLoweringInfo;
277 std::unique_ptr<InstructionSelector> InstSelector;
278 std::unique_ptr<LegalizerInfo> Legalizer;
279 std::unique_ptr<RegisterBankInfo> RegBankInfo;
280
281 void initSubtargetFeatures(StringRef CPU, StringRef FS);
282 ARMFrameLowering *initializeFrameLowering(StringRef CPU, StringRef FS);
283
284 std::bitset<8> CoprocCDE = {};
285public:
286// Getters for SubtargetFeatures defined in tablegen
287#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
288 bool GETTER() const { return ATTRIBUTE; }
289#include "ARMGenSubtargetInfo.inc"
290
291 /// @{
292 /// These functions are obsolete, please consider adding subtarget features
293 /// or properties instead of calling them.
294 bool isCortexA5() const { return ARMProcFamily == CortexA5; }
295 bool isCortexA7() const { return ARMProcFamily == CortexA7; }
296 bool isCortexA8() const { return ARMProcFamily == CortexA8; }
297 bool isCortexA9() const { return ARMProcFamily == CortexA9; }
298 bool isCortexA15() const { return ARMProcFamily == CortexA15; }
299 bool isSwift() const { return ARMProcFamily == Swift; }
300 bool isCortexM3() const { return ARMProcFamily == CortexM3; }
301 bool isCortexM55() const { return ARMProcFamily == CortexM55; }
302 bool isCortexM7() const { return ARMProcFamily == CortexM7; }
303 bool isCortexM85() const { return ARMProcFamily == CortexM85; }
304 bool isLikeA9() const { return isCortexA9() || isCortexA15() || isKrait(); }
305 bool isCortexR5() const { return ARMProcFamily == CortexR5; }
306 bool isKrait() const { return ARMProcFamily == Krait; }
307 /// @}
308
309 bool hasARMOps() const { return !NoARM; }
310
312 return hasNEON() && hasNEONForFP();
313 }
314
315 bool hasVFP2Base() const { return hasVFPv2SP(); }
316 bool hasVFP3Base() const { return hasVFPv3D16SP(); }
317 bool hasVFP4Base() const { return hasVFPv4D16SP(); }
318 bool hasFPARMv8Base() const { return hasFPARMv8D16SP(); }
319
320 bool hasAnyDataBarrier() const {
321 return HasDataBarrier || (hasV6Ops() && !isThumb());
322 }
323
324 bool useMulOps() const { return UseMulOps; }
325 bool useFPVMLx() const { return !SlowFPVMLx; }
326 bool useFPVFMx() const {
327 return !isTargetDarwin() && hasVFP4Base() && !SlowFPVFMx;
328 }
329 bool useFPVFMx16() const { return useFPVFMx() && hasFullFP16(); }
330 bool useFPVFMx64() const { return useFPVFMx() && hasFP64(); }
331 bool hasBaseDSP() const {
332 if (isThumb())
333 return hasThumb2() && hasDSP();
334 else
335 return hasV5TEOps();
336 }
337
338 /// Return true if the CPU supports any kind of instruction fusion.
339 bool hasFusion() const { return hasFuseAES() || hasFuseLiterals(); }
340
341 const Triple &getTargetTriple() const { return TargetTriple; }
342
343 /// @{
344 /// These properties are per-module, please use the TargetMachine
345 /// TargetTriple.
346 bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
347 bool isTargetIOS() const { return TargetTriple.isiOS(); }
348 bool isTargetWatchOS() const { return TargetTriple.isWatchOS(); }
349 bool isTargetWatchABI() const { return TargetTriple.isWatchABI(); }
350 bool isTargetDriverKit() const { return TargetTriple.isDriverKit(); }
351 bool isTargetFuchsia() const { return TargetTriple.isOSFuchsia(); }
352 bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
353 bool isTargetNetBSD() const { return TargetTriple.isOSNetBSD(); }
354 bool isTargetWindows() const { return TargetTriple.isOSWindows(); }
355
356 bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
357 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
358 bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); }
359
360 bool isTargetAEABI() const { return TargetTriple.isTargetAEABI(); }
361
362 bool isTargetGNUAEABI() const { return TargetTriple.isTargetGNUAEABI(); }
363
364 bool isTargetMuslAEABI() const { return TargetTriple.isTargetMuslAEABI(); }
365
366 // ARM Targets that support EHABI exception handling standard
367 // Darwin uses SjLj. Other targets might need more checks.
369 return TargetTriple.isTargetEHABICompatible();
370 }
371 /// @}
372
373 /// Returns the floating-point ABI in effect for this subtarget.
375
376 /// Returns true if the subtarget uses the hard floating-point ABI.
378
379 bool isReadTPSoft() const {
380 return !(isReadTPTPIDRURW() || isReadTPTPIDRURO() || isReadTPTPIDRPRW());
381 }
382
383 bool isTargetAndroid() const { return TargetTriple.isAndroid(); }
384
385 bool isXRaySupported() const override;
386
387 bool isROPI() const;
388 bool isRWPI() const;
389
390 bool useMachineScheduler() const { return UseMISched; }
391 bool useMachinePipeliner() const { return UseMIPipeliner; }
392 bool hasMinSize() const { return OptMinSize; }
393 bool isThumb1Only() const { return isThumb() && !hasThumb2(); }
394 bool isThumb2() const { return isThumb() && hasThumb2(); }
395 bool isMClass() const { return ARMProcClass == MClass; }
396 bool isRClass() const { return ARMProcClass == RClass; }
397 bool isAClass() const { return ARMProcClass == AClass; }
398
399 bool isR9Reserved() const {
400 return isTargetMachO() ? (ReserveR9 || !HasV6Ops) : ReserveR9;
401 }
402
404 if (isTargetDarwin() ||
405 (!isTargetWindows() && isThumb() && !createAAPCSFrameChain()))
406 return ARM::R7;
407 return ARM::R11;
408 }
409
412
413 bool useStride4VFPs() const;
414
415 bool useMovt() const;
416
417 bool supportsTailCall() const { return SupportsTailCall; }
418
419 bool allowsUnalignedMem() const { return !StrictAlign; }
420
421 bool restrictIT() const { return RestrictIT; }
422
423 const std::string & getCPUString() const { return CPUString; }
424
425 bool isLittle() const { return IsLittle; }
426
427 /// Returns true if machine scheduler should be enabled.
428 bool enableMachineScheduler() const override;
429
430 /// Returns true if machine pipeliner should be enabled.
431 bool enableMachinePipeliner() const override;
432 bool useDFAforSMS() const override;
433
434 /// True for some subtargets at > -O0.
435 bool enablePostRAScheduler() const override;
436
437 /// True for some subtargets at > -O0.
438 bool enablePostRAMachineScheduler() const override;
439
440 /// Check whether this subtarget wants to use subregister liveness.
441 bool enableSubRegLiveness() const override;
442
443 /// Enable use of alias analysis during code generation (during MI
444 /// scheduling, DAGCombine, etc.).
445 bool useAA() const override { return true; }
446
447 /// getInstrItins - Return the instruction itineraries based on subtarget
448 /// selection.
450 return &InstrItins;
451 }
452
453 /// getStackAlignment - Returns the minimum alignment known to hold of the
454 /// stack frame on entry to the function and which must be maintained by every
455 /// function for this subtarget.
457
458 // Returns the required alignment for LDRD/STRD instructions
460 return Align(hasV7Ops() || allowsUnalignedMem() ? 4 : 8);
461 }
462
463 unsigned getMaxInterleaveFactor() const { return MaxInterleaveFactor; }
464
466
470
474
475 /// True if the GV will be accessed via an indirect symbol.
476 bool isGVIndirectSymbol(const GlobalValue *GV) const;
477
478 /// Returns the constant pool modifier needed to access the GV.
479 bool isGVInGOT(const GlobalValue *GV) const;
480
481 /// True if fast-isel is used.
482 bool useFastISel() const;
483
484 /// Returns the correct return opcode for the current feature set.
485 /// Use BX if available to allow mixing thumb/arm code, but fall back
486 /// to plain mov pc,lr on ARMv4.
487 unsigned getReturnOpcode() const {
488 if (isThumb())
489 return ARM::tBX_RET;
490 if (hasV4TOps())
491 return ARM::BX_RET;
492 return ARM::MOVPCLR;
493 }
494
495 /// Allow movt+movw for PIC global address calculation.
496 /// ELF does not have GOT relocations for movt+movw.
497 /// ROPI does not use GOT.
499 return isROPI() || !isTargetELF();
500 }
501
504 }
505
506 unsigned
512
514 MCRegister PhysReg) const override;
515 unsigned getGPRAllocationOrder(const MachineFunction &MF) const;
516};
517
518} // end namespace llvm
519
520#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.
FloatABI::ABIType FloatABIType
The floating-point ABI in effect for this subtarget.
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
FloatABI::ABIType getFloatABI() const
Returns the floating-point ABI in effect for this subtarget.
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
MCSchedModel SchedModel
SchedModel - Processor specific instruction costs.
std::string CPUString
CPUString - String name of used CPU.
unsigned PreferBranchLogAlignment
What alignment is preferred for loop bodies and functions, in log2(bytes).
void initLibcallLoweringInfo(LibcallLoweringInfo &Info) const override
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
ARMSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, const ARMBaseTargetMachine &TM, bool IsLittle, FloatABI::ABIType FloatABI, bool MinSize=false, DenormalMode DM=DenormalMode::getIEEE())
This constructor initializes the data members to match that of the specified triple.
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 isTargetHardFloat() const
Returns true if the subtarget uses the hard floating-point ABI.
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 isTargetFuchsia() 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.
Tracks which library functions to use for a particular subtarget.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
Holds all the information related to register banks.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
TargetCostKind
The kind of cost model.
@ TCK_CodeSize
Instruction code size.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
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:273