blob: 131cd63b803f0f54bf5bb34fe2ce6e1c37ce16b3 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- ARMSubtarget.h - Define Subtarget for the ARM ----------*- C++ -*--===//
Evan Cheng10043e22007-01-19 07:51:42 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Evan Cheng10043e22007-01-19 07:51:42 +00006//
7//===----------------------------------------------------------------------===//
8//
Evan Cheng0d639a22011-07-01 21:01:15 +00009// This file declares the ARM specific subclass of TargetSubtargetInfo.
Evan Cheng10043e22007-01-19 07:51:42 +000010//
11//===----------------------------------------------------------------------===//
12
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000013#ifndef LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H
14#define LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H
Evan Cheng10043e22007-01-19 07:51:42 +000015
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000016#include "ARMBaseInstrInfo.h"
17#include "ARMBaseRegisterInfo.h"
Diana Picusc9f29c62017-08-29 09:47:55 +000018#include "ARMConstantPoolValue.h"
Eric Christopher80b24ef2014-06-26 19:30:02 +000019#include "ARMFrameLowering.h"
20#include "ARMISelLowering.h"
Eric Christopher030294e2014-06-13 00:20:39 +000021#include "ARMSelectionDAGInfo.h"
Evan Chenge45d6852011-01-11 21:46:47 +000022#include "llvm/ADT/Triple.h"
Quentin Colombet61d71a12017-08-15 22:31:51 +000023#include "llvm/CodeGen/GlobalISel/CallLowering.h"
24#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
25#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
26#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000027#include "llvm/CodeGen/MachineFunction.h"
David Blaikieb3bde2e2017-11-17 01:07:10 +000028#include "llvm/CodeGen/TargetSubtargetInfo.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000029#include "llvm/MC/MCInstrItineraries.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000030#include "llvm/MC/MCSchedule.h"
31#include "llvm/Target/TargetOptions.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000032#include <memory>
Evan Cheng10043e22007-01-19 07:51:42 +000033#include <string>
34
Evan Cheng54b68e32011-07-01 20:45:01 +000035#define GET_SUBTARGETINFO_HEADER
Evan Chengc9c090d2011-07-01 22:36:09 +000036#include "ARMGenSubtargetInfo.inc"
Evan Cheng54b68e32011-07-01 20:45:01 +000037
Evan Cheng10043e22007-01-19 07:51:42 +000038namespace llvm {
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000039
40class ARMBaseTargetMachine;
Evan Cheng43b9ca62009-08-28 23:18:09 +000041class GlobalValue;
Evan Cheng1a72add62011-07-07 07:07:08 +000042class StringRef;
Evan Cheng10043e22007-01-19 07:51:42 +000043
Evan Cheng54b68e32011-07-01 20:45:01 +000044class ARMSubtarget : public ARMGenSubtargetInfo {
Evan Cheng10043e22007-01-19 07:51:42 +000045protected:
Evan Chengbf407072010-09-10 01:29:16 +000046 enum ARMProcFamilyEnum {
Matthias Braun62e1e852017-02-10 00:06:44 +000047 Others,
48
49 CortexA12,
50 CortexA15,
51 CortexA17,
52 CortexA32,
53 CortexA35,
54 CortexA5,
55 CortexA53,
Sam Parkerb252ffd2017-08-21 08:43:06 +000056 CortexA55,
Matthias Braun62e1e852017-02-10 00:06:44 +000057 CortexA57,
58 CortexA7,
59 CortexA72,
60 CortexA73,
Sam Parkerb252ffd2017-08-21 08:43:06 +000061 CortexA75,
Luke Cheeseman59f77e72019-02-25 15:08:27 +000062 CortexA76,
Matthias Braun62e1e852017-02-10 00:06:44 +000063 CortexA8,
64 CortexA9,
65 CortexM3,
66 CortexR4,
67 CortexR4F,
68 CortexR5,
69 CortexR52,
70 CortexR7,
Evandro Menezesc62ab612018-09-19 19:43:23 +000071 Exynos,
Matthias Braun62e1e852017-02-10 00:06:44 +000072 Krait,
Yi Kong60b5a1c2017-04-06 22:47:47 +000073 Kryo,
Matthias Braun2bef2a02017-02-10 00:09:20 +000074 Swift
Evan Chengbf407072010-09-10 01:29:16 +000075 };
Amara Emerson330afb52013-09-23 14:26:15 +000076 enum ARMProcClassEnum {
Matthias Braun62e1e852017-02-10 00:06:44 +000077 None,
78
79 AClass,
80 MClass,
81 RClass
Amara Emerson330afb52013-09-23 14:26:15 +000082 };
Bradley Smith323fee12015-11-16 11:10:19 +000083 enum ARMArchEnum {
Matthias Braun62e1e852017-02-10 00:06:44 +000084 ARMv2,
85 ARMv2a,
86 ARMv3,
87 ARMv3m,
88 ARMv4,
89 ARMv4t,
90 ARMv5,
91 ARMv5t,
92 ARMv5te,
93 ARMv5tej,
94 ARMv6,
95 ARMv6k,
96 ARMv6kz,
97 ARMv6m,
98 ARMv6sm,
99 ARMv6t2,
100 ARMv7a,
101 ARMv7em,
102 ARMv7m,
103 ARMv7r,
104 ARMv7ve,
105 ARMv81a,
106 ARMv82a,
Sam Parker9d957642017-08-10 09:41:00 +0000107 ARMv83a,
Sjoerd Meijer195e9042018-06-29 08:43:19 +0000108 ARMv84a,
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +0000109 ARMv85a,
Matthias Braun62e1e852017-02-10 00:06:44 +0000110 ARMv8a,
111 ARMv8mBaseline,
112 ARMv8mMainline,
113 ARMv8r
Bradley Smith323fee12015-11-16 11:10:19 +0000114 };
Evan Chengbf407072010-09-10 01:29:16 +0000115
Diana Picus92423ce2016-06-27 09:08:23 +0000116public:
117 /// What kind of timing do load multiple/store multiple instructions have.
118 enum ARMLdStMultipleTiming {
119 /// Can load/store 2 registers/cycle.
120 DoubleIssue,
121 /// Can load/store 2 registers/cycle, but needs an extra cycle if the access
122 /// is not 64-bit aligned.
123 DoubleIssueCheckUnalignedAccess,
124 /// Can load/store 1 register/cycle.
125 SingleIssue,
126 /// Can load/store 1 register/cycle, but needs an extra cycle for address
127 /// computation and potentially also for register writeback.
128 SingleIssuePlusExtras,
129 };
130
131protected:
Evan Chengbf407072010-09-10 01:29:16 +0000132 /// ARMProcFamily - ARM processor family: Cortex-A8, Cortex-A9, and others.
Diana Picuseb1068a2016-06-27 13:06:10 +0000133 ARMProcFamilyEnum ARMProcFamily = Others;
Evan Chengbf407072010-09-10 01:29:16 +0000134
Amara Emerson330afb52013-09-23 14:26:15 +0000135 /// ARMProcClass - ARM processor class: None, AClass, RClass or MClass.
Diana Picuseb1068a2016-06-27 13:06:10 +0000136 ARMProcClassEnum ARMProcClass = None;
Amara Emerson330afb52013-09-23 14:26:15 +0000137
Bradley Smith323fee12015-11-16 11:10:19 +0000138 /// ARMArch - ARM architecture
Diana Picuseb1068a2016-06-27 13:06:10 +0000139 ARMArchEnum ARMArch = ARMv4t;
Bradley Smith323fee12015-11-16 11:10:19 +0000140
Joey Goulyb3f550e2013-06-26 16:58:26 +0000141 /// HasV4TOps, HasV5TOps, HasV5TEOps,
Renato Golin12350602015-03-17 11:55:28 +0000142 /// HasV6Ops, HasV6MOps, HasV6KOps, HasV6T2Ops, HasV7Ops, HasV8Ops -
Evan Cheng8b2bda02011-07-07 03:55:05 +0000143 /// Specify whether target support specific ARM ISA variants.
Diana Picuseb1068a2016-06-27 13:06:10 +0000144 bool HasV4TOps = false;
145 bool HasV5TOps = false;
146 bool HasV5TEOps = false;
147 bool HasV6Ops = false;
148 bool HasV6MOps = false;
149 bool HasV6KOps = false;
150 bool HasV6T2Ops = false;
151 bool HasV7Ops = false;
152 bool HasV8Ops = false;
153 bool HasV8_1aOps = false;
154 bool HasV8_2aOps = false;
Sam Parker9d957642017-08-10 09:41:00 +0000155 bool HasV8_3aOps = false;
Sjoerd Meijer195e9042018-06-29 08:43:19 +0000156 bool HasV8_4aOps = false;
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +0000157 bool HasV8_5aOps = false;
Diana Picuseb1068a2016-06-27 13:06:10 +0000158 bool HasV8MBaselineOps = false;
159 bool HasV8MMainlineOps = false;
Evan Cheng8b2bda02011-07-07 03:55:05 +0000160
Joey Goulyccd04892013-09-13 13:46:57 +0000161 /// HasVFPv2, HasVFPv3, HasVFPv4, HasFPARMv8, HasNEON - Specify what
Anton Korobeynikov5482b9f2012-01-22 12:07:33 +0000162 /// floating point ISAs are supported.
Diana Picuseb1068a2016-06-27 13:06:10 +0000163 bool HasVFPv2 = false;
164 bool HasVFPv3 = false;
165 bool HasVFPv4 = false;
166 bool HasFPARMv8 = false;
167 bool HasNEON = false;
Evan Cheng10043e22007-01-19 07:51:42 +0000168
Sjoerd Meijer7426c972017-08-11 09:52:30 +0000169 /// HasDotProd - True if the ARMv8.2A dot product instructions are supported.
170 bool HasDotProd = false;
171
David Goodwina307edb2009-08-05 16:01:19 +0000172 /// UseNEONForSinglePrecisionFP - if the NEONFP attribute has been
173 /// specified. Use the method useNEONForSinglePrecisionFP() to
174 /// determine if NEON should actually be used.
Diana Picuseb1068a2016-06-27 13:06:10 +0000175 bool UseNEONForSinglePrecisionFP = false;
David Goodwin3b9c52c2009-08-04 17:53:06 +0000176
Bob Wilsone8a549c2012-09-29 21:43:49 +0000177 /// UseMulOps - True if non-microcoded fused integer multiply-add and
178 /// multiply-subtract instructions should be used.
Diana Picuseb1068a2016-06-27 13:06:10 +0000179 bool UseMulOps = false;
Bob Wilsone8a549c2012-09-29 21:43:49 +0000180
Evan Cheng62c7b5b2010-12-05 22:04:16 +0000181 /// SlowFPVMLx - If the VFP2 / NEON instructions are available, indicates
182 /// whether the FP VML[AS] instructions are slow (if so, don't use them).
Diana Picuseb1068a2016-06-27 13:06:10 +0000183 bool SlowFPVMLx = false;
Jim Grosbach34de7762010-03-24 22:31:46 +0000184
Evan Cheng38bf5ad2011-03-31 19:38:48 +0000185 /// HasVMLxForwarding - If true, NEON has special multiplier accumulator
186 /// forwarding to allow mul + mla being issued back to back.
Diana Picuseb1068a2016-06-27 13:06:10 +0000187 bool HasVMLxForwarding = false;
Evan Cheng38bf5ad2011-03-31 19:38:48 +0000188
Evan Cheng58066e32010-07-13 19:21:50 +0000189 /// SlowFPBrcc - True if floating point compare + branch is slow.
Diana Picuseb1068a2016-06-27 13:06:10 +0000190 bool SlowFPBrcc = false;
Evan Cheng58066e32010-07-13 19:21:50 +0000191
Evan Cheng6dbe7132011-07-07 19:09:06 +0000192 /// InThumbMode - True if compiling for Thumb, false for ARM.
Diana Picuseb1068a2016-06-27 13:06:10 +0000193 bool InThumbMode = false;
Anton Korobeynikov12694bd2009-06-01 20:00:48 +0000194
Eric Christopher824f42f2015-05-12 01:26:05 +0000195 /// UseSoftFloat - True if we're using software floating point features.
Diana Picuseb1068a2016-06-27 13:06:10 +0000196 bool UseSoftFloat = false;
Eric Christopher824f42f2015-05-12 01:26:05 +0000197
Florian Hahne3583bd2017-07-27 19:56:44 +0000198 /// UseMISched - True if MachineScheduler should be used for this subtarget.
199 bool UseMISched = false;
200
Sam Parkerb0367572017-08-31 08:57:51 +0000201 /// DisablePostRAScheduler - False if scheduling should happen again after
Sam Parker04a7db52017-08-18 14:27:51 +0000202 /// register allocation.
Sam Parkerb0367572017-08-31 08:57:51 +0000203 bool DisablePostRAScheduler = false;
Sam Parker04a7db52017-08-18 14:27:51 +0000204
David Green21a29732018-06-21 15:48:29 +0000205 /// UseAA - True if using AA during codegen (DAGCombine, MISched, etc)
206 bool UseAA = false;
207
Evan Cheng2bd65362011-07-07 00:08:19 +0000208 /// HasThumb2 - True if Thumb2 instructions are supported.
Diana Picuseb1068a2016-06-27 13:06:10 +0000209 bool HasThumb2 = false;
Evan Cheng10043e22007-01-19 07:51:42 +0000210
Evan Cheng5190f092010-08-11 07:17:46 +0000211 /// NoARM - True if subtarget does not support ARM mode execution.
Diana Picuseb1068a2016-06-27 13:06:10 +0000212 bool NoARM = false;
Evan Cheng5190f092010-08-11 07:17:46 +0000213
Akira Hatanaka28581522015-07-21 01:42:02 +0000214 /// ReserveR9 - True if R9 is not available as a general purpose register.
Diana Picuseb1068a2016-06-27 13:06:10 +0000215 bool ReserveR9 = false;
Lauro Ramos Venancio048e16ff2007-02-13 19:52:28 +0000216
Akira Hatanaka024d91a2015-07-16 00:58:23 +0000217 /// NoMovt - True if MOVT / MOVW pairs are not used for materialization of
218 /// 32-bit imms (including global addresses).
Diana Picuseb1068a2016-06-27 13:06:10 +0000219 bool NoMovt = false;
Anton Korobeynikov25229082009-11-24 00:44:37 +0000220
Bob Wilson8decdc42011-10-07 17:17:49 +0000221 /// SupportsTailCall - True if the OS supports tail call. The dynamic linker
222 /// must be able to synthesize call stubs for interworking between ARM and
223 /// Thumb.
Diana Picuseb1068a2016-06-27 13:06:10 +0000224 bool SupportsTailCall = false;
Bob Wilson8decdc42011-10-07 17:17:49 +0000225
Oliver Stannard8addbf42015-12-01 10:23:06 +0000226 /// HasFP16 - True if subtarget supports half-precision FP conversions
Diana Picuseb1068a2016-06-27 13:06:10 +0000227 bool HasFP16 = false;
Anton Korobeynikov0a65a372010-03-14 18:42:38 +0000228
Oliver Stannard8addbf42015-12-01 10:23:06 +0000229 /// HasFullFP16 - True if subtarget supports half-precision FP operations
Diana Picuseb1068a2016-06-27 13:06:10 +0000230 bool HasFullFP16 = false;
Oliver Stannard8addbf42015-12-01 10:23:06 +0000231
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000232 /// HasFP16FML - True if subtarget supports half-precision FP fml operations
233 bool HasFP16FML = false;
234
Bob Wilsondd6eb5b2010-10-12 16:22:47 +0000235 /// HasD16 - True if subtarget is limited to 16 double precision
236 /// FP registers for VFPv3.
Diana Picuseb1068a2016-06-27 13:06:10 +0000237 bool HasD16 = false;
Bob Wilsondd6eb5b2010-10-12 16:22:47 +0000238
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000239 /// HasHardwareDivide - True if subtarget supports [su]div in Thumb mode
240 bool HasHardwareDivideInThumb = false;
Jim Grosbach151cd8f2010-05-05 23:44:43 +0000241
Bob Wilsone8a549c2012-09-29 21:43:49 +0000242 /// HasHardwareDivideInARM - True if subtarget supports [su]div in ARM mode
Diana Picuseb1068a2016-06-27 13:06:10 +0000243 bool HasHardwareDivideInARM = false;
Bob Wilsone8a549c2012-09-29 21:43:49 +0000244
Evan Cheng6e809de2010-08-11 06:22:01 +0000245 /// HasDataBarrier - True if the subtarget supports DMB / DSB data barrier
246 /// instructions.
Diana Picuseb1068a2016-06-27 13:06:10 +0000247 bool HasDataBarrier = false;
Evan Cheng6e809de2010-08-11 06:22:01 +0000248
Sam Parker98727bc2017-12-21 11:17:49 +0000249 /// HasFullDataBarrier - True if the subtarget supports DFB data barrier
250 /// instruction.
251 bool HasFullDataBarrier = false;
252
Bradley Smith4c21cba2016-01-15 10:23:46 +0000253 /// HasV7Clrex - True if the subtarget supports CLREX instructions
Diana Picuseb1068a2016-06-27 13:06:10 +0000254 bool HasV7Clrex = false;
Bradley Smith4c21cba2016-01-15 10:23:46 +0000255
256 /// HasAcquireRelease - True if the subtarget supports v8 atomics (LDA/LDAEX etc)
257 /// instructions
Diana Picuseb1068a2016-06-27 13:06:10 +0000258 bool HasAcquireRelease = false;
Bradley Smith4c21cba2016-01-15 10:23:46 +0000259
Evan Chengce8fb682010-08-09 18:35:19 +0000260 /// Pref32BitThumb - If true, codegen would prefer 32-bit Thumb instructions
261 /// over 16-bit ones.
Diana Picuseb1068a2016-06-27 13:06:10 +0000262 bool Pref32BitThumb = false;
Evan Chengce8fb682010-08-09 18:35:19 +0000263
Bob Wilsona2881ee2011-04-19 18:11:49 +0000264 /// AvoidCPSRPartialUpdate - If true, codegen would avoid using instructions
265 /// that partially update CPSR and add false dependency on the previous
266 /// CPSR setting instruction.
Diana Picuseb1068a2016-06-27 13:06:10 +0000267 bool AvoidCPSRPartialUpdate = false;
Bob Wilsona2881ee2011-04-19 18:11:49 +0000268
Javed Absar4ae7e8122017-06-02 08:53:19 +0000269 /// CheapPredicableCPSRDef - If true, disable +1 predication cost
270 /// for instructions updating CPSR. Enabled for Cortex-A57.
271 bool CheapPredicableCPSRDef = false;
272
Evan Chengddc0cb62012-12-20 19:59:30 +0000273 /// AvoidMOVsShifterOperand - If true, codegen should avoid using flag setting
274 /// movs with shifter operand (i.e. asr, lsl, lsr).
Diana Picuseb1068a2016-06-27 13:06:10 +0000275 bool AvoidMOVsShifterOperand = false;
Evan Chengddc0cb62012-12-20 19:59:30 +0000276
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000277 /// HasRetAddrStack - Some processors perform return stack prediction. CodeGen should
Evan Cheng65f9d192012-02-28 18:51:51 +0000278 /// avoid issue "normal" call instructions to callees which do not return.
Diana Picuseb1068a2016-06-27 13:06:10 +0000279 bool HasRetAddrStack = false;
Evan Cheng65f9d192012-02-28 18:51:51 +0000280
John Brawn75d76e52017-06-28 14:11:15 +0000281 /// HasBranchPredictor - True if the subtarget has a branch predictor. Having
282 /// a branch predictor or not changes the expected cost of taking a branch
283 /// which affects the choice of whether to use predicated instructions.
284 bool HasBranchPredictor = true;
285
Evan Cheng8740ee32010-11-03 06:34:55 +0000286 /// HasMPExtension - True if the subtarget supports Multiprocessing
287 /// extension (ARMv7 only).
Diana Picuseb1068a2016-06-27 13:06:10 +0000288 bool HasMPExtension = false;
Evan Cheng8740ee32010-11-03 06:34:55 +0000289
Bradley Smith25219752013-11-01 13:27:35 +0000290 /// HasVirtualization - True if the subtarget supports the Virtualization
291 /// extension.
Diana Picuseb1068a2016-06-27 13:06:10 +0000292 bool HasVirtualization = false;
Bradley Smith25219752013-11-01 13:27:35 +0000293
Jim Grosbach4d5dc3e2010-08-11 15:44:15 +0000294 /// FPOnlySP - If true, the floating point unit only supports single
295 /// precision.
Diana Picuseb1068a2016-06-27 13:06:10 +0000296 bool FPOnlySP = false;
Jim Grosbach4d5dc3e2010-08-11 15:44:15 +0000297
Tim Northovercedd4812013-05-23 19:11:14 +0000298 /// If true, the processor supports the Performance Monitor Extensions. These
299 /// include a generic cycle-counter as well as more fine-grained (often
300 /// implementation-specific) events.
Diana Picuseb1068a2016-06-27 13:06:10 +0000301 bool HasPerfMon = false;
Tim Northovercedd4812013-05-23 19:11:14 +0000302
Tim Northoverc6047652013-04-10 12:08:35 +0000303 /// HasTrustZone - if true, processor supports TrustZone security extensions
Diana Picuseb1068a2016-06-27 13:06:10 +0000304 bool HasTrustZone = false;
Tim Northoverc6047652013-04-10 12:08:35 +0000305
Bradley Smithfed3e4a2016-01-25 11:24:47 +0000306 /// Has8MSecExt - if true, processor supports ARMv8-M Security Extensions
Diana Picuseb1068a2016-06-27 13:06:10 +0000307 bool Has8MSecExt = false;
Bradley Smithfed3e4a2016-01-25 11:24:47 +0000308
Sjoerd Meijer195e9042018-06-29 08:43:19 +0000309 /// HasSHA2 - if true, processor supports SHA1 and SHA256
310 bool HasSHA2 = false;
311
312 /// HasAES - if true, processor supports AES
313 bool HasAES = false;
314
Amara Emerson33089092013-09-19 11:59:01 +0000315 /// HasCrypto - if true, processor supports Cryptography extensions
Diana Picuseb1068a2016-06-27 13:06:10 +0000316 bool HasCrypto = false;
Amara Emerson33089092013-09-19 11:59:01 +0000317
Bernard Ogdenee87e852013-10-29 09:47:35 +0000318 /// HasCRC - if true, processor supports CRC instructions
Diana Picuseb1068a2016-06-27 13:06:10 +0000319 bool HasCRC = false;
Bernard Ogdenee87e852013-10-29 09:47:35 +0000320
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000321 /// HasRAS - if true, the processor supports RAS extensions
Diana Picuseb1068a2016-06-27 13:06:10 +0000322 bool HasRAS = false;
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000323
Tim Northover13510302014-04-01 13:22:02 +0000324 /// If true, the instructions "vmov.i32 d0, #0" and "vmov.i32 q0, #0" are
325 /// particularly effective at zeroing a VFP register.
Diana Picuseb1068a2016-06-27 13:06:10 +0000326 bool HasZeroCycleZeroing = false;
Tim Northover13510302014-04-01 13:22:02 +0000327
Javed Absar85874a92016-10-13 14:57:43 +0000328 /// HasFPAO - if true, processor does positive address offset computation faster
329 bool HasFPAO = false;
330
Florian Hahnb489e562017-06-22 09:39:36 +0000331 /// HasFuseAES - if true, processor executes back to back AES instruction
332 /// pairs faster.
333 bool HasFuseAES = false;
334
Evandro Menezesfcca45f2018-07-27 18:16:47 +0000335 /// HasFuseLiterals - if true, processor executes back to back
336 /// bottom and top halves of literal generation faster.
337 bool HasFuseLiterals = false;
338
Diana Picusc5baa432016-06-23 07:47:35 +0000339 /// If true, if conversion may decide to leave some instructions unpredicated.
Diana Picuseb1068a2016-06-27 13:06:10 +0000340 bool IsProfitableToUnpredicate = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000341
342 /// If true, VMOV will be favored over VGETLNi32.
Diana Picuseb1068a2016-06-27 13:06:10 +0000343 bool HasSlowVGETLNi32 = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000344
345 /// If true, VMOV will be favored over VDUP.
Diana Picuseb1068a2016-06-27 13:06:10 +0000346 bool HasSlowVDUP32 = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000347
348 /// If true, VMOVSR will be favored over VMOVDRR.
Diana Picuseb1068a2016-06-27 13:06:10 +0000349 bool PreferVMOVSR = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000350
351 /// If true, ISHST barriers will be used for Release semantics.
Diana Picuseb1068a2016-06-27 13:06:10 +0000352 bool PreferISHST = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000353
Diana Picus4879b052016-07-06 09:22:23 +0000354 /// If true, a VLDM/VSTM starting with an odd register number is considered to
355 /// take more microops than single VLDRS/VSTRS.
356 bool SlowOddRegister = false;
357
358 /// If true, loading into a D subregister will be penalized.
359 bool SlowLoadDSubregister = false;
360
Evandro Menezes9a92fe02018-08-09 16:13:24 +0000361 /// If true, use a wider stride when allocating VFP registers.
362 bool UseWideStrideVFP = false;
363
Diana Picus4879b052016-07-06 09:22:23 +0000364 /// If true, the AGU and NEON/FPU units are multiplexed.
365 bool HasMuxedUnits = false;
366
Evandro Menezesfffa9b52018-07-20 16:49:28 +0000367 /// If true, VMOVS will never be widened to VMOVD.
Diana Picusb772e402016-07-06 11:22:11 +0000368 bool DontWidenVMOVS = false;
369
Evandro Menezesfffa9b52018-07-20 16:49:28 +0000370 /// If true, splat a register between VFP and NEON instructions.
371 bool SplatVFPToNeon = false;
372
Diana Picus575f2bb2016-07-07 09:11:39 +0000373 /// If true, run the MLx expansion pass.
374 bool ExpandMLx = false;
375
376 /// If true, VFP/NEON VMLA/VMLS have special RAW hazards.
377 bool HasVMLxHazards = false;
378
Strahinja Petrovic25e9e1b2017-07-28 12:54:57 +0000379 // If true, read thread pointer from coprocessor register.
380 bool ReadTPHard = false;
381
Diana Picusc5baa432016-06-23 07:47:35 +0000382 /// If true, VMOVRS, VMOVSR and VMOVS will be converted from VFP to NEON.
Diana Picuseb1068a2016-06-27 13:06:10 +0000383 bool UseNEONForFPMovs = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000384
Diana Picus92423ce2016-06-27 09:08:23 +0000385 /// If true, VLDn instructions take an extra cycle for unaligned accesses.
Diana Picuseb1068a2016-06-27 13:06:10 +0000386 bool CheckVLDnAlign = false;
Diana Picus92423ce2016-06-27 09:08:23 +0000387
388 /// If true, VFP instructions are not pipelined.
Diana Picuseb1068a2016-06-27 13:06:10 +0000389 bool NonpipelinedVFP = false;
Diana Picus92423ce2016-06-27 09:08:23 +0000390
Akira Hatanaka2670f4a2015-07-28 22:44:28 +0000391 /// StrictAlign - If true, the subtarget disallows unaligned memory
Bob Wilson3dc97322010-09-28 04:09:35 +0000392 /// accesses for some types. For details, see
Matt Arsenault6f2a5262014-07-27 17:46:40 +0000393 /// ARMTargetLowering::allowsMisalignedMemoryAccesses().
Diana Picuseb1068a2016-06-27 13:06:10 +0000394 bool StrictAlign = false;
Bob Wilson3dc97322010-09-28 04:09:35 +0000395
Weiming Zhao0da5cc02013-11-13 18:29:49 +0000396 /// RestrictIT - If true, the subtarget disallows generation of deprecated IT
397 /// blocks to conform to ARMv8 rule.
Diana Picuseb1068a2016-06-27 13:06:10 +0000398 bool RestrictIT = false;
Weiming Zhao0da5cc02013-11-13 18:29:49 +0000399
Artyom Skrobovcf296442015-09-24 17:31:16 +0000400 /// HasDSP - If true, the subtarget supports the DSP (saturating arith
401 /// and such) instructions.
Diana Picuseb1068a2016-06-27 13:06:10 +0000402 bool HasDSP = false;
Jim Grosbachcf1464d2011-07-01 21:12:19 +0000403
Eli Bendersky2e2ce492013-01-30 16:30:19 +0000404 /// NaCl TRAP instruction is generated instead of the regular TRAP.
Diana Picuseb1068a2016-06-27 13:06:10 +0000405 bool UseNaClTrap = false;
Eli Bendersky2e2ce492013-01-30 16:30:19 +0000406
Akira Hatanaka1bc8af72015-07-07 06:54:42 +0000407 /// Generate calls via indirect call instructions.
Diana Picuseb1068a2016-06-27 13:06:10 +0000408 bool GenLongCalls = false;
Akira Hatanaka1bc8af72015-07-07 06:54:42 +0000409
Prakhar Bahuguna52a7dd72016-12-15 07:59:08 +0000410 /// Generate code that does not contain data access to code sections.
411 bool GenExecuteOnly = false;
412
Renato Golinb4dd6c52013-03-21 18:47:47 +0000413 /// Target machine allowed unsafe FP math (such as use of NEON fp)
Diana Picuseb1068a2016-06-27 13:06:10 +0000414 bool UnsafeFPMath = false;
Renato Golinb4dd6c52013-03-21 18:47:47 +0000415
Tim Northoverf8e47e42015-10-28 22:56:36 +0000416 /// UseSjLjEH - If true, the target uses SjLj exception handling (e.g. iOS).
Diana Picuseb1068a2016-06-27 13:06:10 +0000417 bool UseSjLjEH = false;
Tim Northoverf8e47e42015-10-28 22:56:36 +0000418
Oliver Stannard382c9352018-09-27 13:41:14 +0000419 /// Has speculation barrier
Diogo N. Sampaio8786a942019-01-03 12:09:12 +0000420 bool HasSB = false;
Oliver Stannard382c9352018-09-27 13:41:14 +0000421
Sanne Wouda2409c642017-03-21 14:59:17 +0000422 /// Implicitly convert an instruction to a different one if its immediates
423 /// cannot be encoded. For example, ADD r0, r1, #FFFFFFFF -> SUB r0, r1, #1.
424 bool NegativeImmediates = true;
425
Evan Cheng10043e22007-01-19 07:51:42 +0000426 /// stackAlignment - The minimum alignment known to hold of the stack frame on
427 /// entry to the function and which must be maintained by every function.
Diana Picuseb1068a2016-06-27 13:06:10 +0000428 unsigned stackAlignment = 4;
Evan Cheng10043e22007-01-19 07:51:42 +0000429
Anton Korobeynikov08bf4c02009-05-23 19:50:50 +0000430 /// CPUString - String name of used CPU.
431 std::string CPUString;
432
Diana Picuseb1068a2016-06-27 13:06:10 +0000433 unsigned MaxInterleaveFactor = 1;
Diana Picus92423ce2016-06-27 09:08:23 +0000434
Diana Picusb772e402016-07-06 11:22:11 +0000435 /// Clearance before partial register updates (in number of instructions)
436 unsigned PartialUpdateClearance = 0;
437
Diana Picus92423ce2016-06-27 09:08:23 +0000438 /// What kind of timing do load multiple/store multiple have (double issue,
439 /// single issue etc).
Diana Picuseb1068a2016-06-27 13:06:10 +0000440 ARMLdStMultipleTiming LdStMultipleTiming = SingleIssue;
Diana Picus92423ce2016-06-27 09:08:23 +0000441
442 /// The adjustment that we need to apply to get the operand latency from the
443 /// operand cycle returned by the itinerary data for pre-ISel operands.
Diana Picuseb1068a2016-06-27 13:06:10 +0000444 int PreISelOperandLatencyAdjustment = 2;
Diana Picus92423ce2016-06-27 09:08:23 +0000445
Tim Northoverc15d47b2018-09-13 10:28:05 +0000446 /// What alignment is preferred for loop bodies, in log2(bytes).
447 unsigned PrefLoopAlignment = 0;
448
Sam Parker5b098342019-02-08 07:57:42 +0000449 /// OptMinSize - True if we're optimising for minimum code size, equal to
450 /// the function attribute.
451 bool OptMinSize = false;
452
Christian Pirker2a111602014-03-28 14:35:30 +0000453 /// IsLittle - The target is Little Endian
454 bool IsLittle;
455
Evan Chenge45d6852011-01-11 21:46:47 +0000456 /// TargetTriple - What processor and OS we're targeting.
457 Triple TargetTriple;
458
Andrew Trick352abc12012-08-08 02:44:16 +0000459 /// SchedModel - Processor specific instruction costs.
Pete Cooper11759452014-09-02 17:43:54 +0000460 MCSchedModel SchedModel;
Andrew Trick352abc12012-08-08 02:44:16 +0000461
Evan Cheng4e712de2009-06-19 01:51:50 +0000462 /// Selected instruction itineraries (one entry per itinerary class.)
463 InstrItineraryData InstrItins;
Jim Grosbachf24f9d92009-08-11 15:33:49 +0000464
Renato Golinb4dd6c52013-03-21 18:47:47 +0000465 /// Options passed via command line that could influence the target
466 const TargetOptions &Options;
467
Eric Christopher661f2d12014-12-18 02:20:58 +0000468 const ARMBaseTargetMachine &TM;
Lauro Ramos Venancio048e16ff2007-02-13 19:52:28 +0000469
Eric Christopher661f2d12014-12-18 02:20:58 +0000470public:
Evan Cheng10043e22007-01-19 07:51:42 +0000471 /// This constructor initializes the data members to match that
Daniel Dunbar31b44e82009-08-02 22:11:08 +0000472 /// of the specified triple.
Evan Cheng10043e22007-01-19 07:51:42 +0000473 ///
Daniel Sandersa73f1fd2015-06-10 12:11:26 +0000474 ARMSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
Sam Parker5b098342019-02-08 07:57:42 +0000475 const ARMBaseTargetMachine &TM, bool IsLittle,
476 bool MinSize = false);
Evan Cheng10043e22007-01-19 07:51:42 +0000477
Dan Gohman544ab2c2008-04-12 04:36:06 +0000478 /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size
479 /// that still makes it profitable to inline the call.
Rafael Espindola419b6d72007-10-31 14:39:58 +0000480 unsigned getMaxInlineSizeThreshold() const {
James Molloya70697e2014-05-16 14:24:22 +0000481 return 64;
Rafael Espindola419b6d72007-10-31 14:39:58 +0000482 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000483
Anton Korobeynikov0b91cc42009-05-23 19:51:43 +0000484 /// ParseSubtargetFeatures - Parses features string setting specified
Evan Cheng10043e22007-01-19 07:51:42 +0000485 /// subtarget options. Definition of function is auto generated by tblgen.
Evan Cheng1a72add62011-07-07 07:07:08 +0000486 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
Evan Cheng10043e22007-01-19 07:51:42 +0000487
Eric Christophera47f6802014-06-13 00:20:35 +0000488 /// initializeSubtargetDependencies - Initializes using a CPU and feature string
489 /// so that we can use initializer lists for subtarget initialization.
490 ARMSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);
491
Eric Christopherd9134482014-08-04 21:25:23 +0000492 const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
493 return &TSInfo;
494 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000495
Eric Christopherd9134482014-08-04 21:25:23 +0000496 const ARMBaseInstrInfo *getInstrInfo() const override {
497 return InstrInfo.get();
498 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000499
Eric Christopherd9134482014-08-04 21:25:23 +0000500 const ARMTargetLowering *getTargetLowering() const override {
501 return &TLInfo;
502 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000503
Eric Christopherd9134482014-08-04 21:25:23 +0000504 const ARMFrameLowering *getFrameLowering() const override {
505 return FrameLowering.get();
506 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000507
Eric Christopherd9134482014-08-04 21:25:23 +0000508 const ARMBaseRegisterInfo *getRegisterInfo() const override {
Eric Christopher80b24ef2014-06-26 19:30:02 +0000509 return &InstrInfo->getRegisterInfo();
510 }
Eric Christophera47f6802014-06-13 00:20:35 +0000511
Diana Picus22274932016-11-11 08:27:37 +0000512 const CallLowering *getCallLowering() const override;
513 const InstructionSelector *getInstructionSelector() const override;
514 const LegalizerInfo *getLegalizerInfo() const override;
515 const RegisterBankInfo *getRegBankInfo() const override;
516
Bill Wendling61375d82013-02-16 01:36:26 +0000517private:
Eric Christopher030294e2014-06-13 00:20:39 +0000518 ARMSelectionDAGInfo TSInfo;
Eric Christopher8b770652015-01-26 19:03:15 +0000519 // Either Thumb1FrameLowering or ARMFrameLowering.
520 std::unique_ptr<ARMFrameLowering> FrameLowering;
Eric Christopher80b24ef2014-06-26 19:30:02 +0000521 // Either Thumb1InstrInfo or Thumb2InstrInfo.
522 std::unique_ptr<ARMBaseInstrInfo> InstrInfo;
523 ARMTargetLowering TLInfo;
Eric Christophera47f6802014-06-13 00:20:35 +0000524
Quentin Colombet61d71a12017-08-15 22:31:51 +0000525 /// GlobalISel related APIs.
526 std::unique_ptr<CallLowering> CallLoweringInfo;
527 std::unique_ptr<InstructionSelector> InstSelector;
528 std::unique_ptr<LegalizerInfo> Legalizer;
529 std::unique_ptr<RegisterBankInfo> RegBankInfo;
Diana Picus22274932016-11-11 08:27:37 +0000530
Bill Wendling61375d82013-02-16 01:36:26 +0000531 void initializeEnvironment();
Eric Christopherb68e2532014-09-03 20:36:31 +0000532 void initSubtargetFeatures(StringRef CPU, StringRef FS);
Eric Christopher8b770652015-01-26 19:03:15 +0000533 ARMFrameLowering *initializeFrameLowering(StringRef CPU, StringRef FS);
534
Bill Wendling61375d82013-02-16 01:36:26 +0000535public:
Andrew Trick10ffc2b2010-12-24 05:03:26 +0000536 void computeIssueWidth();
537
Evan Cheng8b2bda02011-07-07 03:55:05 +0000538 bool hasV4TOps() const { return HasV4TOps; }
539 bool hasV5TOps() const { return HasV5TOps; }
540 bool hasV5TEOps() const { return HasV5TEOps; }
541 bool hasV6Ops() const { return HasV6Ops; }
Amara Emerson5035ee02013-10-07 16:55:23 +0000542 bool hasV6MOps() const { return HasV6MOps; }
Renato Golin12350602015-03-17 11:55:28 +0000543 bool hasV6KOps() const { return HasV6KOps; }
Evan Cheng8b2bda02011-07-07 03:55:05 +0000544 bool hasV6T2Ops() const { return HasV6T2Ops; }
545 bool hasV7Ops() const { return HasV7Ops; }
Joey Goulyb3f550e2013-06-26 16:58:26 +0000546 bool hasV8Ops() const { return HasV8Ops; }
Vladimir Sukharev2afdb322015-04-01 14:54:56 +0000547 bool hasV8_1aOps() const { return HasV8_1aOps; }
Oliver Stannard8addbf42015-12-01 10:23:06 +0000548 bool hasV8_2aOps() const { return HasV8_2aOps; }
Sam Parker9d957642017-08-10 09:41:00 +0000549 bool hasV8_3aOps() const { return HasV8_3aOps; }
Sjoerd Meijer195e9042018-06-29 08:43:19 +0000550 bool hasV8_4aOps() const { return HasV8_4aOps; }
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +0000551 bool hasV8_5aOps() const { return HasV8_5aOps; }
Bradley Smithe26f7992016-01-15 10:24:39 +0000552 bool hasV8MBaselineOps() const { return HasV8MBaselineOps; }
553 bool hasV8MMainlineOps() const { return HasV8MMainlineOps; }
Evan Cheng10043e22007-01-19 07:51:42 +0000554
Diana Picus4879b052016-07-06 09:22:23 +0000555 /// @{
556 /// These functions are obsolete, please consider adding subtarget features
557 /// or properties instead of calling them.
Quentin Colombet13cd5212012-11-29 19:48:01 +0000558 bool isCortexA5() const { return ARMProcFamily == CortexA5; }
Tim Northover0feb91e2014-04-01 14:10:07 +0000559 bool isCortexA7() const { return ARMProcFamily == CortexA7; }
Evan Chengbf407072010-09-10 01:29:16 +0000560 bool isCortexA8() const { return ARMProcFamily == CortexA8; }
561 bool isCortexA9() const { return ARMProcFamily == CortexA9; }
Silviu Barangab47bb942012-09-13 15:05:10 +0000562 bool isCortexA15() const { return ARMProcFamily == CortexA15; }
Bob Wilsone8a549c2012-09-29 21:43:49 +0000563 bool isSwift() const { return ARMProcFamily == Swift; }
Artyom Skrobove6f1b7f2016-03-23 16:18:13 +0000564 bool isCortexM3() const { return ARMProcFamily == CortexM3; }
Ana Pazos93a07c22013-12-06 22:48:17 +0000565 bool isLikeA9() const { return isCortexA9() || isCortexA15() || isKrait(); }
Quentin Colombetb1b66e72012-12-21 04:35:05 +0000566 bool isCortexR5() const { return ARMProcFamily == CortexR5; }
Ana Pazos93a07c22013-12-06 22:48:17 +0000567 bool isKrait() const { return ARMProcFamily == Krait; }
Diana Picus4879b052016-07-06 09:22:23 +0000568 /// @}
Evan Chengbf407072010-09-10 01:29:16 +0000569
Evan Cheng5190f092010-08-11 07:17:46 +0000570 bool hasARMOps() const { return !NoARM; }
571
Evan Cheng8b2bda02011-07-07 03:55:05 +0000572 bool hasVFP2() const { return HasVFPv2; }
573 bool hasVFP3() const { return HasVFPv3; }
Anton Korobeynikov5482b9f2012-01-22 12:07:33 +0000574 bool hasVFP4() const { return HasVFPv4; }
Joey Goulyccd04892013-09-13 13:46:57 +0000575 bool hasFPARMv8() const { return HasFPARMv8; }
Evan Cheng8b2bda02011-07-07 03:55:05 +0000576 bool hasNEON() const { return HasNEON; }
Sjoerd Meijer195e9042018-06-29 08:43:19 +0000577 bool hasSHA2() const { return HasSHA2; }
578 bool hasAES() const { return HasAES; }
Amara Emerson33089092013-09-19 11:59:01 +0000579 bool hasCrypto() const { return HasCrypto; }
Sjoerd Meijer7426c972017-08-11 09:52:30 +0000580 bool hasDotProd() const { return HasDotProd; }
Bernard Ogdenee87e852013-10-29 09:47:35 +0000581 bool hasCRC() const { return HasCRC; }
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000582 bool hasRAS() const { return HasRAS; }
Bradley Smith25219752013-11-01 13:27:35 +0000583 bool hasVirtualization() const { return HasVirtualization; }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000584
Jim Grosbachf24f9d92009-08-11 15:33:49 +0000585 bool useNEONForSinglePrecisionFP() const {
Cameron Esfahani17177d12015-02-05 02:09:33 +0000586 return hasNEON() && UseNEONForSinglePrecisionFP;
587 }
Evan Cheng8b2bda02011-07-07 03:55:05 +0000588
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000589 bool hasDivideInThumbMode() const { return HasHardwareDivideInThumb; }
Bob Wilsone8a549c2012-09-29 21:43:49 +0000590 bool hasDivideInARMMode() const { return HasHardwareDivideInARM; }
Evan Cheng6e809de2010-08-11 06:22:01 +0000591 bool hasDataBarrier() const { return HasDataBarrier; }
Sam Parker98727bc2017-12-21 11:17:49 +0000592 bool hasFullDataBarrier() const { return HasFullDataBarrier; }
Bradley Smith4c21cba2016-01-15 10:23:46 +0000593 bool hasV7Clrex() const { return HasV7Clrex; }
594 bool hasAcquireRelease() const { return HasAcquireRelease; }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000595
Tim Northoverc7ea8042013-10-25 09:30:24 +0000596 bool hasAnyDataBarrier() const {
597 return HasDataBarrier || (hasV6Ops() && !isThumb());
598 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000599
Bob Wilsone8a549c2012-09-29 21:43:49 +0000600 bool useMulOps() const { return UseMulOps; }
Evan Cheng62c7b5b2010-12-05 22:04:16 +0000601 bool useFPVMLx() const { return !SlowFPVMLx; }
Evan Cheng38bf5ad2011-03-31 19:38:48 +0000602 bool hasVMLxForwarding() const { return HasVMLxForwarding; }
Evan Cheng58066e32010-07-13 19:21:50 +0000603 bool isFPBrccSlow() const { return SlowFPBrcc; }
Jim Grosbach4d5dc3e2010-08-11 15:44:15 +0000604 bool isFPOnlySP() const { return FPOnlySP; }
Tim Northovercedd4812013-05-23 19:11:14 +0000605 bool hasPerfMon() const { return HasPerfMon; }
Tim Northoverc6047652013-04-10 12:08:35 +0000606 bool hasTrustZone() const { return HasTrustZone; }
Bradley Smithfed3e4a2016-01-25 11:24:47 +0000607 bool has8MSecExt() const { return Has8MSecExt; }
Tim Northover13510302014-04-01 13:22:02 +0000608 bool hasZeroCycleZeroing() const { return HasZeroCycleZeroing; }
Javed Absar85874a92016-10-13 14:57:43 +0000609 bool hasFPAO() const { return HasFPAO; }
Diana Picusc5baa432016-06-23 07:47:35 +0000610 bool isProfitableToUnpredicate() const { return IsProfitableToUnpredicate; }
611 bool hasSlowVGETLNi32() const { return HasSlowVGETLNi32; }
612 bool hasSlowVDUP32() const { return HasSlowVDUP32; }
613 bool preferVMOVSR() const { return PreferVMOVSR; }
614 bool preferISHSTBarriers() const { return PreferISHST; }
Diana Picus575f2bb2016-07-07 09:11:39 +0000615 bool expandMLx() const { return ExpandMLx; }
616 bool hasVMLxHazards() const { return HasVMLxHazards; }
Diana Picus4879b052016-07-06 09:22:23 +0000617 bool hasSlowOddRegister() const { return SlowOddRegister; }
618 bool hasSlowLoadDSubregister() const { return SlowLoadDSubregister; }
Evandro Menezes9a92fe02018-08-09 16:13:24 +0000619 bool useWideStrideVFP() const { return UseWideStrideVFP; }
Diana Picus4879b052016-07-06 09:22:23 +0000620 bool hasMuxedUnits() const { return HasMuxedUnits; }
Diana Picusb772e402016-07-06 11:22:11 +0000621 bool dontWidenVMOVS() const { return DontWidenVMOVS; }
Evandro Menezesfffa9b52018-07-20 16:49:28 +0000622 bool useSplatVFPToNeon() const { return SplatVFPToNeon; }
Diana Picusc5baa432016-06-23 07:47:35 +0000623 bool useNEONForFPMovs() const { return UseNEONForFPMovs; }
Diana Picus92423ce2016-06-27 09:08:23 +0000624 bool checkVLDnAccessAlignment() const { return CheckVLDnAlign; }
625 bool nonpipelinedVFP() const { return NonpipelinedVFP; }
Evan Chengce8fb682010-08-09 18:35:19 +0000626 bool prefers32BitThumb() const { return Pref32BitThumb; }
Bob Wilsona2881ee2011-04-19 18:11:49 +0000627 bool avoidCPSRPartialUpdate() const { return AvoidCPSRPartialUpdate; }
Javed Absar4ae7e8122017-06-02 08:53:19 +0000628 bool cheapPredicableCPSRDef() const { return CheapPredicableCPSRDef; }
Evan Chengddc0cb62012-12-20 19:59:30 +0000629 bool avoidMOVsShifterOperand() const { return AvoidMOVsShifterOperand; }
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000630 bool hasRetAddrStack() const { return HasRetAddrStack; }
John Brawn75d76e52017-06-28 14:11:15 +0000631 bool hasBranchPredictor() const { return HasBranchPredictor; }
Evan Cheng8740ee32010-11-03 06:34:55 +0000632 bool hasMPExtension() const { return HasMPExtension; }
Artyom Skrobovcf296442015-09-24 17:31:16 +0000633 bool hasDSP() const { return HasDSP; }
Eli Bendersky2e2ce492013-01-30 16:30:19 +0000634 bool useNaClTrap() const { return UseNaClTrap; }
Tim Northoverf8e47e42015-10-28 22:56:36 +0000635 bool useSjLjEH() const { return UseSjLjEH; }
Diogo N. Sampaio8786a942019-01-03 12:09:12 +0000636 bool hasSB() const { return HasSB; }
Akira Hatanaka1bc8af72015-07-07 06:54:42 +0000637 bool genLongCalls() const { return GenLongCalls; }
Prakhar Bahuguna52a7dd72016-12-15 07:59:08 +0000638 bool genExecuteOnly() const { return GenExecuteOnly; }
Jim Grosbachf24f9d92009-08-11 15:33:49 +0000639
Anton Korobeynikov0a65a372010-03-14 18:42:38 +0000640 bool hasFP16() const { return HasFP16; }
Bob Wilsondd6eb5b2010-10-12 16:22:47 +0000641 bool hasD16() const { return HasD16; }
Oliver Stannard8addbf42015-12-01 10:23:06 +0000642 bool hasFullFP16() const { return HasFullFP16; }
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000643 bool hasFP16FML() const { return HasFP16FML; }
Anton Korobeynikov0a65a372010-03-14 18:42:38 +0000644
Florian Hahnb489e562017-06-22 09:39:36 +0000645 bool hasFuseAES() const { return HasFuseAES; }
Evandro Menezesfcca45f2018-07-27 18:16:47 +0000646 bool hasFuseLiterals() const { return HasFuseLiterals; }
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000647 /// Return true if the CPU supports any kind of instruction fusion.
Evandro Menezesfcca45f2018-07-27 18:16:47 +0000648 bool hasFusion() const { return hasFuseAES() || hasFuseLiterals(); }
Florian Hahnb489e562017-06-22 09:39:36 +0000649
Evan Cheng5f1ba4c2011-04-20 22:20:12 +0000650 const Triple &getTargetTriple() const { return TargetTriple; }
651
Daniel Dunbar2b9b0e32011-04-19 21:14:45 +0000652 bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000653 bool isTargetIOS() const { return TargetTriple.isiOS(); }
Tim Northovere0ccdc62015-10-28 22:46:43 +0000654 bool isTargetWatchOS() const { return TargetTriple.isWatchOS(); }
Tim Northover042a6c12016-01-27 19:32:29 +0000655 bool isTargetWatchABI() const { return TargetTriple.isWatchABI(); }
Cameron Esfahani943908b2013-08-29 20:23:14 +0000656 bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000657 bool isTargetNaCl() const { return TargetTriple.isOSNaCl(); }
Simon Pilgrima2794102014-11-22 19:12:10 +0000658 bool isTargetNetBSD() const { return TargetTriple.isOSNetBSD(); }
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000659 bool isTargetWindows() const { return TargetTriple.isOSWindows(); }
Tim Northoverd6a729b2014-01-06 14:28:05 +0000660
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000661 bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
Tim Northover9653eb52013-12-10 16:57:43 +0000662 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
Tim Northoverd6a729b2014-01-06 14:28:05 +0000663 bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); }
664
Renato Golin87610692013-07-16 09:32:17 +0000665 // ARM EABI is the bare-metal EABI described in ARM ABI documents and
666 // can be accessed via -target arm-none-eabi. This is NOT GNUEABI.
667 // FIXME: Add a flag for bare-metal for that target and set Triple::EABI
668 // even for GNUEABI, so we can make a distinction here and still conform to
669 // the EABI on GNU (and Android) mode. This requires change in Clang, too.
Tim Northover7649eba2014-01-06 12:00:44 +0000670 // FIXME: The Darwin exception is temporary, while we move users to
671 // "*-*-*-macho" triples as quickly as possible.
Renato Golin87610692013-07-16 09:32:17 +0000672 bool isTargetAEABI() const {
Tim Northover7649eba2014-01-06 12:00:44 +0000673 return (TargetTriple.getEnvironment() == Triple::EABI ||
674 TargetTriple.getEnvironment() == Triple::EABIHF) &&
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000675 !isTargetDarwin() && !isTargetWindows();
Renato Golin87610692013-07-16 09:32:17 +0000676 }
Renato Golin6d435f12015-11-09 12:40:30 +0000677 bool isTargetGNUAEABI() const {
678 return (TargetTriple.getEnvironment() == Triple::GNUEABI ||
679 TargetTriple.getEnvironment() == Triple::GNUEABIHF) &&
680 !isTargetDarwin() && !isTargetWindows();
681 }
Rafael Espindolaa895a0c2016-06-24 21:14:33 +0000682 bool isTargetMuslAEABI() const {
683 return (TargetTriple.getEnvironment() == Triple::MuslEABI ||
684 TargetTriple.getEnvironment() == Triple::MuslEABIHF) &&
685 !isTargetDarwin() && !isTargetWindows();
686 }
Evan Cheng181fe362007-01-19 19:22:40 +0000687
Renato Golin8cea6e82014-01-29 11:50:56 +0000688 // ARM Targets that support EHABI exception handling standard
689 // Darwin uses SjLj. Other targets might need more checks.
690 bool isTargetEHABICompatible() const {
691 return (TargetTriple.getEnvironment() == Triple::EABI ||
692 TargetTriple.getEnvironment() == Triple::GNUEABI ||
Rafael Espindolaa895a0c2016-06-24 21:14:33 +0000693 TargetTriple.getEnvironment() == Triple::MuslEABI ||
Renato Golin8cea6e82014-01-29 11:50:56 +0000694 TargetTriple.getEnvironment() == Triple::EABIHF ||
Evgeniy Stepanov02bc78b2014-01-30 14:18:25 +0000695 TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
Rafael Espindolaa895a0c2016-06-24 21:14:33 +0000696 TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
Evgeniy Stepanov5fe279e2015-10-08 21:21:24 +0000697 isTargetAndroid()) &&
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000698 !isTargetDarwin() && !isTargetWindows();
Renato Golin8cea6e82014-01-29 11:50:56 +0000699 }
700
Tim Northover097a3e32018-07-18 12:36:25 +0000701 bool isTargetHardFloat() const;
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000702
Evgeniy Stepanov5fe279e2015-10-08 21:21:24 +0000703 bool isTargetAndroid() const { return TargetTriple.isAndroid(); }
Tim Northover44594ad2013-12-18 09:27:33 +0000704
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000705 bool isXRaySupported() const override;
Dean Michael Berris464015442016-09-19 00:54:35 +0000706
Eric Christopher661f2d12014-12-18 02:20:58 +0000707 bool isAPCS_ABI() const;
708 bool isAAPCS_ABI() const;
Tim Northovere0ccdc62015-10-28 22:46:43 +0000709 bool isAAPCS16_ABI() const;
Lauro Ramos Venancio048e16ff2007-02-13 19:52:28 +0000710
Oliver Stannard8331aae2016-08-08 15:28:31 +0000711 bool isROPI() const;
712 bool isRWPI() const;
713
Florian Hahne3583bd2017-07-27 19:56:44 +0000714 bool useMachineScheduler() const { return UseMISched; }
Sam Parkerb0367572017-08-31 08:57:51 +0000715 bool disablePostRAScheduler() const { return DisablePostRAScheduler; }
Eric Christopher824f42f2015-05-12 01:26:05 +0000716 bool useSoftFloat() const { return UseSoftFloat; }
Evan Cheng1834f5d2011-07-07 19:05:12 +0000717 bool isThumb() const { return InThumbMode; }
Sam Parker5b098342019-02-08 07:57:42 +0000718 bool optForMinSize() const { return OptMinSize; }
Evan Cheng1834f5d2011-07-07 19:05:12 +0000719 bool isThumb1Only() const { return InThumbMode && !HasThumb2; }
720 bool isThumb2() const { return InThumbMode && HasThumb2; }
Evan Cheng2bd65362011-07-07 00:08:19 +0000721 bool hasThumb2() const { return HasThumb2; }
Amara Emerson330afb52013-09-23 14:26:15 +0000722 bool isMClass() const { return ARMProcClass == MClass; }
723 bool isRClass() const { return ARMProcClass == RClass; }
724 bool isAClass() const { return ARMProcClass == AClass; }
Strahinja Petrovic25e9e1b2017-07-28 12:54:57 +0000725 bool isReadTPHard() const { return ReadTPHard; }
Evan Cheng10043e22007-01-19 07:51:42 +0000726
Akira Hatanaka28581522015-07-21 01:42:02 +0000727 bool isR9Reserved() const {
728 return isTargetMachO() ? (ReserveR9 || !HasV6Ops) : ReserveR9;
729 }
Evan Cheng10043e22007-01-19 07:51:42 +0000730
Oliver Stannard9aa6f012016-08-23 09:19:22 +0000731 bool useR7AsFramePointer() const {
732 return isTargetDarwin() || (!isTargetWindows() && isThumb());
733 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000734
Tim Northoverf8b0a7a2016-05-13 19:16:14 +0000735 /// Returns true if the frame setup is split into two separate pushes (first
736 /// r0-r7,lr then r8-r11), principally so that the frame pointer is adjacent
Reid Klecknerbdfc05f2016-10-11 21:14:03 +0000737 /// to lr. This is always required on Thumb1-only targets, as the push and
738 /// pop instructions can't access the high registers.
Oliver Stannard9aa6f012016-08-23 09:19:22 +0000739 bool splitFramePushPop(const MachineFunction &MF) const {
Reid Klecknerbdfc05f2016-10-11 21:14:03 +0000740 return (useR7AsFramePointer() &&
741 MF.getTarget().Options.DisableFramePointerElim(MF)) ||
742 isThumb1Only();
Tim Northoverf8b0a7a2016-05-13 19:16:14 +0000743 }
744
Sam Parker5b098342019-02-08 07:57:42 +0000745 bool useStride4VFPs() const;
Tim Northover910dde72015-08-03 17:20:10 +0000746
Sam Parker5b098342019-02-08 07:57:42 +0000747 bool useMovt() const;
Eric Christopherc1058df2014-07-04 01:55:26 +0000748
Bob Wilson8decdc42011-10-07 17:17:49 +0000749 bool supportsTailCall() const { return SupportsTailCall; }
Anton Korobeynikov25229082009-11-24 00:44:37 +0000750
Akira Hatanaka2670f4a2015-07-28 22:44:28 +0000751 bool allowsUnalignedMem() const { return !StrictAlign; }
Bob Wilson3dc97322010-09-28 04:09:35 +0000752
Weiming Zhao0da5cc02013-11-13 18:29:49 +0000753 bool restrictIT() const { return RestrictIT; }
754
Anton Korobeynikov08bf4c02009-05-23 19:50:50 +0000755 const std::string & getCPUString() const { return CPUString; }
Anton Korobeynikov25229082009-11-24 00:44:37 +0000756
Christian Pirker2a111602014-03-28 14:35:30 +0000757 bool isLittle() const { return IsLittle; }
758
Owen Andersona3181e22010-09-28 21:57:50 +0000759 unsigned getMispredictionPenalty() const;
Jim Grosbach1a597112014-04-03 23:43:18 +0000760
Matthias Braun9e859802015-07-17 23:18:30 +0000761 /// Returns true if machine scheduler should be enabled.
762 bool enableMachineScheduler() const override;
763
Andrew Trick8d2ee372014-06-04 07:06:27 +0000764 /// True for some subtargets at > -O0.
Matthias Braun39a2afc2015-06-13 03:42:16 +0000765 bool enablePostRAScheduler() const override;
Anton Korobeynikov08bf4c02009-05-23 19:50:50 +0000766
David Green21a29732018-06-21 15:48:29 +0000767 /// Enable use of alias analysis during code generation (during MI
768 /// scheduling, DAGCombine, etc.).
769 bool useAA() const override { return UseAA; }
770
Robin Morisset59c23cd2014-08-21 21:50:01 +0000771 // enableAtomicExpand- True if we need to expand our atomics.
772 bool enableAtomicExpand() const override;
Eric Christopherc40e5ed2014-06-19 21:03:04 +0000773
Robin Morissetd18cda62014-08-15 22:17:28 +0000774 /// getInstrItins - Return the instruction itineraries based on subtarget
Evan Cheng4e712de2009-06-19 01:51:50 +0000775 /// selection.
Benjamin Kramer8c90fd72014-09-03 11:41:21 +0000776 const InstrItineraryData *getInstrItineraryData() const override {
Eric Christopherd9134482014-08-04 21:25:23 +0000777 return &InstrItins;
778 }
Evan Cheng4e712de2009-06-19 01:51:50 +0000779
Evan Cheng10043e22007-01-19 07:51:42 +0000780 /// getStackAlignment - Returns the minimum alignment known to hold of the
781 /// stack frame on entry to the function and which must be maintained by every
782 /// function for this subtarget.
783 unsigned getStackAlignment() const { return stackAlignment; }
Evan Cheng43b9ca62009-08-28 23:18:09 +0000784
Diana Picus92423ce2016-06-27 09:08:23 +0000785 unsigned getMaxInterleaveFactor() const { return MaxInterleaveFactor; }
786
Diana Picusb772e402016-07-06 11:22:11 +0000787 unsigned getPartialUpdateClearance() const { return PartialUpdateClearance; }
788
Diana Picus92423ce2016-06-27 09:08:23 +0000789 ARMLdStMultipleTiming getLdStMultipleTiming() const {
790 return LdStMultipleTiming;
791 }
792
793 int getPreISelOperandLatencyAdjustment() const {
794 return PreISelOperandLatencyAdjustment;
795 }
796
Rafael Espindola5ac8f5c2016-06-28 15:38:13 +0000797 /// True if the GV will be accessed via an indirect symbol.
798 bool isGVIndirectSymbol(const GlobalValue *GV) const;
Chris Bieneman03695ab2014-07-15 17:18:41 +0000799
Diana Picusc9f29c62017-08-29 09:47:55 +0000800 /// Returns the constant pool modifier needed to access the GV.
Evgeniy Stepanov76d5ac42017-11-13 20:45:38 +0000801 bool isGVInGOT(const GlobalValue *GV) const;
Diana Picusc9f29c62017-08-29 09:47:55 +0000802
Akira Hatanakaddf76aa2015-05-23 01:14:08 +0000803 /// True if fast-isel is used.
804 bool useFastISel() const;
Joerg Sonnenberger0f76a352017-08-28 20:20:47 +0000805
806 /// Returns the correct return opcode for the current feature set.
807 /// Use BX if available to allow mixing thumb/arm code, but fall back
808 /// to plain mov pc,lr on ARMv4.
809 unsigned getReturnOpcode() const {
810 if (isThumb())
811 return ARM::tBX_RET;
812 if (hasV4TOps())
813 return ARM::BX_RET;
814 return ARM::MOVPCLR;
815 }
Evgeniy Stepanov76d5ac42017-11-13 20:45:38 +0000816
817 /// Allow movt+movw for PIC global address calculation.
818 /// ELF does not have GOT relocations for movt+movw.
819 /// ROPI does not use GOT.
820 bool allowPositionIndependentMovt() const {
821 return isROPI() || !isTargetELF();
822 }
Tim Northoverc15d47b2018-09-13 10:28:05 +0000823
824 unsigned getPrefLoopAlignment() const {
825 return PrefLoopAlignment;
826 }
Evan Cheng10043e22007-01-19 07:51:42 +0000827};
Evan Cheng10043e22007-01-19 07:51:42 +0000828
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000829} // end namespace llvm
830
831#endif // LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H