blob: d890d0fa777e830f7b559f44b47cb78c82448846 [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//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Evan Cheng10043e22007-01-19 07:51:42 +00007//
8//===----------------------------------------------------------------------===//
9//
Evan Cheng0d639a22011-07-01 21:01:15 +000010// This file declares the ARM specific subclass of TargetSubtargetInfo.
Evan Cheng10043e22007-01-19 07:51:42 +000011//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H
15#define LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H
Evan Cheng10043e22007-01-19 07:51:42 +000016
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000017#include "ARMBaseInstrInfo.h"
18#include "ARMBaseRegisterInfo.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"
Diana Picus22274932016-11-11 08:27:37 +000023#include "llvm/CodeGen/GlobalISel/GISelAccessor.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000024#include "llvm/CodeGen/MachineFunction.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000025#include "llvm/MC/MCInstrItineraries.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000026#include "llvm/MC/MCSchedule.h"
27#include "llvm/Target/TargetOptions.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000028#include "llvm/Target/TargetSubtargetInfo.h"
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000029#include <memory>
Evan Cheng10043e22007-01-19 07:51:42 +000030#include <string>
31
Evan Cheng54b68e32011-07-01 20:45:01 +000032#define GET_SUBTARGETINFO_HEADER
Evan Chengc9c090d2011-07-01 22:36:09 +000033#include "ARMGenSubtargetInfo.inc"
Evan Cheng54b68e32011-07-01 20:45:01 +000034
Evan Cheng10043e22007-01-19 07:51:42 +000035namespace llvm {
Eugene Zelenkoe79c0772017-01-27 23:58:02 +000036
37class ARMBaseTargetMachine;
Evan Cheng43b9ca62009-08-28 23:18:09 +000038class GlobalValue;
Evan Cheng1a72add62011-07-07 07:07:08 +000039class StringRef;
Evan Cheng10043e22007-01-19 07:51:42 +000040
Evan Cheng54b68e32011-07-01 20:45:01 +000041class ARMSubtarget : public ARMGenSubtargetInfo {
Evan Cheng10043e22007-01-19 07:51:42 +000042protected:
Evan Chengbf407072010-09-10 01:29:16 +000043 enum ARMProcFamilyEnum {
Matthias Braun62e1e852017-02-10 00:06:44 +000044 Others,
45
46 CortexA12,
47 CortexA15,
48 CortexA17,
49 CortexA32,
50 CortexA35,
51 CortexA5,
52 CortexA53,
53 CortexA57,
54 CortexA7,
55 CortexA72,
56 CortexA73,
57 CortexA8,
58 CortexA9,
59 CortexM3,
60 CortexR4,
61 CortexR4F,
62 CortexR5,
63 CortexR52,
64 CortexR7,
Matthias Braun2bef2a02017-02-10 00:09:20 +000065 ExynosM1,
Matthias Braun62e1e852017-02-10 00:06:44 +000066 Krait,
Yi Kong60b5a1c2017-04-06 22:47:47 +000067 Kryo,
Matthias Braun2bef2a02017-02-10 00:09:20 +000068 Swift
Evan Chengbf407072010-09-10 01:29:16 +000069 };
Amara Emerson330afb52013-09-23 14:26:15 +000070 enum ARMProcClassEnum {
Matthias Braun62e1e852017-02-10 00:06:44 +000071 None,
72
73 AClass,
74 MClass,
75 RClass
Amara Emerson330afb52013-09-23 14:26:15 +000076 };
Bradley Smith323fee12015-11-16 11:10:19 +000077 enum ARMArchEnum {
Matthias Braun62e1e852017-02-10 00:06:44 +000078 ARMv2,
79 ARMv2a,
80 ARMv3,
81 ARMv3m,
82 ARMv4,
83 ARMv4t,
84 ARMv5,
85 ARMv5t,
86 ARMv5te,
87 ARMv5tej,
88 ARMv6,
89 ARMv6k,
90 ARMv6kz,
91 ARMv6m,
92 ARMv6sm,
93 ARMv6t2,
94 ARMv7a,
95 ARMv7em,
96 ARMv7m,
97 ARMv7r,
98 ARMv7ve,
99 ARMv81a,
100 ARMv82a,
101 ARMv8a,
102 ARMv8mBaseline,
103 ARMv8mMainline,
104 ARMv8r
Bradley Smith323fee12015-11-16 11:10:19 +0000105 };
Evan Chengbf407072010-09-10 01:29:16 +0000106
Diana Picus92423ce2016-06-27 09:08:23 +0000107public:
108 /// What kind of timing do load multiple/store multiple instructions have.
109 enum ARMLdStMultipleTiming {
110 /// Can load/store 2 registers/cycle.
111 DoubleIssue,
112 /// Can load/store 2 registers/cycle, but needs an extra cycle if the access
113 /// is not 64-bit aligned.
114 DoubleIssueCheckUnalignedAccess,
115 /// Can load/store 1 register/cycle.
116 SingleIssue,
117 /// Can load/store 1 register/cycle, but needs an extra cycle for address
118 /// computation and potentially also for register writeback.
119 SingleIssuePlusExtras,
120 };
121
122protected:
Evan Chengbf407072010-09-10 01:29:16 +0000123 /// ARMProcFamily - ARM processor family: Cortex-A8, Cortex-A9, and others.
Diana Picuseb1068a2016-06-27 13:06:10 +0000124 ARMProcFamilyEnum ARMProcFamily = Others;
Evan Chengbf407072010-09-10 01:29:16 +0000125
Amara Emerson330afb52013-09-23 14:26:15 +0000126 /// ARMProcClass - ARM processor class: None, AClass, RClass or MClass.
Diana Picuseb1068a2016-06-27 13:06:10 +0000127 ARMProcClassEnum ARMProcClass = None;
Amara Emerson330afb52013-09-23 14:26:15 +0000128
Bradley Smith323fee12015-11-16 11:10:19 +0000129 /// ARMArch - ARM architecture
Diana Picuseb1068a2016-06-27 13:06:10 +0000130 ARMArchEnum ARMArch = ARMv4t;
Bradley Smith323fee12015-11-16 11:10:19 +0000131
Joey Goulyb3f550e2013-06-26 16:58:26 +0000132 /// HasV4TOps, HasV5TOps, HasV5TEOps,
Renato Golin12350602015-03-17 11:55:28 +0000133 /// HasV6Ops, HasV6MOps, HasV6KOps, HasV6T2Ops, HasV7Ops, HasV8Ops -
Evan Cheng8b2bda02011-07-07 03:55:05 +0000134 /// Specify whether target support specific ARM ISA variants.
Diana Picuseb1068a2016-06-27 13:06:10 +0000135 bool HasV4TOps = false;
136 bool HasV5TOps = false;
137 bool HasV5TEOps = false;
138 bool HasV6Ops = false;
139 bool HasV6MOps = false;
140 bool HasV6KOps = false;
141 bool HasV6T2Ops = false;
142 bool HasV7Ops = false;
143 bool HasV8Ops = false;
144 bool HasV8_1aOps = false;
145 bool HasV8_2aOps = false;
146 bool HasV8MBaselineOps = false;
147 bool HasV8MMainlineOps = false;
Evan Cheng8b2bda02011-07-07 03:55:05 +0000148
Joey Goulyccd04892013-09-13 13:46:57 +0000149 /// HasVFPv2, HasVFPv3, HasVFPv4, HasFPARMv8, HasNEON - Specify what
Anton Korobeynikov5482b9f2012-01-22 12:07:33 +0000150 /// floating point ISAs are supported.
Diana Picuseb1068a2016-06-27 13:06:10 +0000151 bool HasVFPv2 = false;
152 bool HasVFPv3 = false;
153 bool HasVFPv4 = false;
154 bool HasFPARMv8 = false;
155 bool HasNEON = false;
Evan Cheng10043e22007-01-19 07:51:42 +0000156
David Goodwina307edb2009-08-05 16:01:19 +0000157 /// UseNEONForSinglePrecisionFP - if the NEONFP attribute has been
158 /// specified. Use the method useNEONForSinglePrecisionFP() to
159 /// determine if NEON should actually be used.
Diana Picuseb1068a2016-06-27 13:06:10 +0000160 bool UseNEONForSinglePrecisionFP = false;
David Goodwin3b9c52c2009-08-04 17:53:06 +0000161
Bob Wilsone8a549c2012-09-29 21:43:49 +0000162 /// UseMulOps - True if non-microcoded fused integer multiply-add and
163 /// multiply-subtract instructions should be used.
Diana Picuseb1068a2016-06-27 13:06:10 +0000164 bool UseMulOps = false;
Bob Wilsone8a549c2012-09-29 21:43:49 +0000165
Evan Cheng62c7b5b2010-12-05 22:04:16 +0000166 /// SlowFPVMLx - If the VFP2 / NEON instructions are available, indicates
167 /// whether the FP VML[AS] instructions are slow (if so, don't use them).
Diana Picuseb1068a2016-06-27 13:06:10 +0000168 bool SlowFPVMLx = false;
Jim Grosbach34de7762010-03-24 22:31:46 +0000169
Evan Cheng38bf5ad2011-03-31 19:38:48 +0000170 /// HasVMLxForwarding - If true, NEON has special multiplier accumulator
171 /// forwarding to allow mul + mla being issued back to back.
Diana Picuseb1068a2016-06-27 13:06:10 +0000172 bool HasVMLxForwarding = false;
Evan Cheng38bf5ad2011-03-31 19:38:48 +0000173
Evan Cheng58066e32010-07-13 19:21:50 +0000174 /// SlowFPBrcc - True if floating point compare + branch is slow.
Diana Picuseb1068a2016-06-27 13:06:10 +0000175 bool SlowFPBrcc = false;
Evan Cheng58066e32010-07-13 19:21:50 +0000176
Evan Cheng6dbe7132011-07-07 19:09:06 +0000177 /// InThumbMode - True if compiling for Thumb, false for ARM.
Diana Picuseb1068a2016-06-27 13:06:10 +0000178 bool InThumbMode = false;
Anton Korobeynikov12694bd2009-06-01 20:00:48 +0000179
Eric Christopher824f42f2015-05-12 01:26:05 +0000180 /// UseSoftFloat - True if we're using software floating point features.
Diana Picuseb1068a2016-06-27 13:06:10 +0000181 bool UseSoftFloat = false;
Eric Christopher824f42f2015-05-12 01:26:05 +0000182
Evan Cheng2bd65362011-07-07 00:08:19 +0000183 /// HasThumb2 - True if Thumb2 instructions are supported.
Diana Picuseb1068a2016-06-27 13:06:10 +0000184 bool HasThumb2 = false;
Evan Cheng10043e22007-01-19 07:51:42 +0000185
Evan Cheng5190f092010-08-11 07:17:46 +0000186 /// NoARM - True if subtarget does not support ARM mode execution.
Diana Picuseb1068a2016-06-27 13:06:10 +0000187 bool NoARM = false;
Evan Cheng5190f092010-08-11 07:17:46 +0000188
Akira Hatanaka28581522015-07-21 01:42:02 +0000189 /// ReserveR9 - True if R9 is not available as a general purpose register.
Diana Picuseb1068a2016-06-27 13:06:10 +0000190 bool ReserveR9 = false;
Lauro Ramos Venancio048e16ff2007-02-13 19:52:28 +0000191
Akira Hatanaka024d91a2015-07-16 00:58:23 +0000192 /// NoMovt - True if MOVT / MOVW pairs are not used for materialization of
193 /// 32-bit imms (including global addresses).
Diana Picuseb1068a2016-06-27 13:06:10 +0000194 bool NoMovt = false;
Anton Korobeynikov25229082009-11-24 00:44:37 +0000195
Bob Wilson8decdc42011-10-07 17:17:49 +0000196 /// SupportsTailCall - True if the OS supports tail call. The dynamic linker
197 /// must be able to synthesize call stubs for interworking between ARM and
198 /// Thumb.
Diana Picuseb1068a2016-06-27 13:06:10 +0000199 bool SupportsTailCall = false;
Bob Wilson8decdc42011-10-07 17:17:49 +0000200
Oliver Stannard8addbf42015-12-01 10:23:06 +0000201 /// HasFP16 - True if subtarget supports half-precision FP conversions
Diana Picuseb1068a2016-06-27 13:06:10 +0000202 bool HasFP16 = false;
Anton Korobeynikov0a65a372010-03-14 18:42:38 +0000203
Oliver Stannard8addbf42015-12-01 10:23:06 +0000204 /// HasFullFP16 - True if subtarget supports half-precision FP operations
Diana Picuseb1068a2016-06-27 13:06:10 +0000205 bool HasFullFP16 = false;
Oliver Stannard8addbf42015-12-01 10:23:06 +0000206
Bob Wilsondd6eb5b2010-10-12 16:22:47 +0000207 /// HasD16 - True if subtarget is limited to 16 double precision
208 /// FP registers for VFPv3.
Diana Picuseb1068a2016-06-27 13:06:10 +0000209 bool HasD16 = false;
Bob Wilsondd6eb5b2010-10-12 16:22:47 +0000210
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000211 /// HasHardwareDivide - True if subtarget supports [su]div in Thumb mode
212 bool HasHardwareDivideInThumb = false;
Jim Grosbach151cd8f2010-05-05 23:44:43 +0000213
Bob Wilsone8a549c2012-09-29 21:43:49 +0000214 /// HasHardwareDivideInARM - True if subtarget supports [su]div in ARM mode
Diana Picuseb1068a2016-06-27 13:06:10 +0000215 bool HasHardwareDivideInARM = false;
Bob Wilsone8a549c2012-09-29 21:43:49 +0000216
Evan Cheng6e809de2010-08-11 06:22:01 +0000217 /// HasDataBarrier - True if the subtarget supports DMB / DSB data barrier
218 /// instructions.
Diana Picuseb1068a2016-06-27 13:06:10 +0000219 bool HasDataBarrier = false;
Evan Cheng6e809de2010-08-11 06:22:01 +0000220
Bradley Smith4c21cba2016-01-15 10:23:46 +0000221 /// HasV7Clrex - True if the subtarget supports CLREX instructions
Diana Picuseb1068a2016-06-27 13:06:10 +0000222 bool HasV7Clrex = false;
Bradley Smith4c21cba2016-01-15 10:23:46 +0000223
224 /// HasAcquireRelease - True if the subtarget supports v8 atomics (LDA/LDAEX etc)
225 /// instructions
Diana Picuseb1068a2016-06-27 13:06:10 +0000226 bool HasAcquireRelease = false;
Bradley Smith4c21cba2016-01-15 10:23:46 +0000227
Evan Chengce8fb682010-08-09 18:35:19 +0000228 /// Pref32BitThumb - If true, codegen would prefer 32-bit Thumb instructions
229 /// over 16-bit ones.
Diana Picuseb1068a2016-06-27 13:06:10 +0000230 bool Pref32BitThumb = false;
Evan Chengce8fb682010-08-09 18:35:19 +0000231
Bob Wilsona2881ee2011-04-19 18:11:49 +0000232 /// AvoidCPSRPartialUpdate - If true, codegen would avoid using instructions
233 /// that partially update CPSR and add false dependency on the previous
234 /// CPSR setting instruction.
Diana Picuseb1068a2016-06-27 13:06:10 +0000235 bool AvoidCPSRPartialUpdate = false;
Bob Wilsona2881ee2011-04-19 18:11:49 +0000236
Javed Absar4ae7e8122017-06-02 08:53:19 +0000237 /// CheapPredicableCPSRDef - If true, disable +1 predication cost
238 /// for instructions updating CPSR. Enabled for Cortex-A57.
239 bool CheapPredicableCPSRDef = false;
240
Evan Chengddc0cb62012-12-20 19:59:30 +0000241 /// AvoidMOVsShifterOperand - If true, codegen should avoid using flag setting
242 /// movs with shifter operand (i.e. asr, lsl, lsr).
Diana Picuseb1068a2016-06-27 13:06:10 +0000243 bool AvoidMOVsShifterOperand = false;
Evan Chengddc0cb62012-12-20 19:59:30 +0000244
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000245 /// HasRetAddrStack - Some processors perform return stack prediction. CodeGen should
Evan Cheng65f9d192012-02-28 18:51:51 +0000246 /// avoid issue "normal" call instructions to callees which do not return.
Diana Picuseb1068a2016-06-27 13:06:10 +0000247 bool HasRetAddrStack = false;
Evan Cheng65f9d192012-02-28 18:51:51 +0000248
Evan Cheng8740ee32010-11-03 06:34:55 +0000249 /// HasMPExtension - True if the subtarget supports Multiprocessing
250 /// extension (ARMv7 only).
Diana Picuseb1068a2016-06-27 13:06:10 +0000251 bool HasMPExtension = false;
Evan Cheng8740ee32010-11-03 06:34:55 +0000252
Bradley Smith25219752013-11-01 13:27:35 +0000253 /// HasVirtualization - True if the subtarget supports the Virtualization
254 /// extension.
Diana Picuseb1068a2016-06-27 13:06:10 +0000255 bool HasVirtualization = false;
Bradley Smith25219752013-11-01 13:27:35 +0000256
Jim Grosbach4d5dc3e2010-08-11 15:44:15 +0000257 /// FPOnlySP - If true, the floating point unit only supports single
258 /// precision.
Diana Picuseb1068a2016-06-27 13:06:10 +0000259 bool FPOnlySP = false;
Jim Grosbach4d5dc3e2010-08-11 15:44:15 +0000260
Tim Northovercedd4812013-05-23 19:11:14 +0000261 /// If true, the processor supports the Performance Monitor Extensions. These
262 /// include a generic cycle-counter as well as more fine-grained (often
263 /// implementation-specific) events.
Diana Picuseb1068a2016-06-27 13:06:10 +0000264 bool HasPerfMon = false;
Tim Northovercedd4812013-05-23 19:11:14 +0000265
Tim Northoverc6047652013-04-10 12:08:35 +0000266 /// HasTrustZone - if true, processor supports TrustZone security extensions
Diana Picuseb1068a2016-06-27 13:06:10 +0000267 bool HasTrustZone = false;
Tim Northoverc6047652013-04-10 12:08:35 +0000268
Bradley Smithfed3e4a2016-01-25 11:24:47 +0000269 /// Has8MSecExt - if true, processor supports ARMv8-M Security Extensions
Diana Picuseb1068a2016-06-27 13:06:10 +0000270 bool Has8MSecExt = false;
Bradley Smithfed3e4a2016-01-25 11:24:47 +0000271
Amara Emerson33089092013-09-19 11:59:01 +0000272 /// HasCrypto - if true, processor supports Cryptography extensions
Diana Picuseb1068a2016-06-27 13:06:10 +0000273 bool HasCrypto = false;
Amara Emerson33089092013-09-19 11:59:01 +0000274
Bernard Ogdenee87e852013-10-29 09:47:35 +0000275 /// HasCRC - if true, processor supports CRC instructions
Diana Picuseb1068a2016-06-27 13:06:10 +0000276 bool HasCRC = false;
Bernard Ogdenee87e852013-10-29 09:47:35 +0000277
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000278 /// HasRAS - if true, the processor supports RAS extensions
Diana Picuseb1068a2016-06-27 13:06:10 +0000279 bool HasRAS = false;
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000280
Tim Northover13510302014-04-01 13:22:02 +0000281 /// If true, the instructions "vmov.i32 d0, #0" and "vmov.i32 q0, #0" are
282 /// particularly effective at zeroing a VFP register.
Diana Picuseb1068a2016-06-27 13:06:10 +0000283 bool HasZeroCycleZeroing = false;
Tim Northover13510302014-04-01 13:22:02 +0000284
Javed Absar85874a92016-10-13 14:57:43 +0000285 /// HasFPAO - if true, processor does positive address offset computation faster
286 bool HasFPAO = false;
287
Florian Hahnb489e562017-06-22 09:39:36 +0000288 /// HasFuseAES - if true, processor executes back to back AES instruction
289 /// pairs faster.
290 bool HasFuseAES = false;
291
Diana Picusc5baa432016-06-23 07:47:35 +0000292 /// If true, if conversion may decide to leave some instructions unpredicated.
Diana Picuseb1068a2016-06-27 13:06:10 +0000293 bool IsProfitableToUnpredicate = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000294
295 /// If true, VMOV will be favored over VGETLNi32.
Diana Picuseb1068a2016-06-27 13:06:10 +0000296 bool HasSlowVGETLNi32 = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000297
298 /// If true, VMOV will be favored over VDUP.
Diana Picuseb1068a2016-06-27 13:06:10 +0000299 bool HasSlowVDUP32 = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000300
301 /// If true, VMOVSR will be favored over VMOVDRR.
Diana Picuseb1068a2016-06-27 13:06:10 +0000302 bool PreferVMOVSR = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000303
304 /// If true, ISHST barriers will be used for Release semantics.
Diana Picuseb1068a2016-06-27 13:06:10 +0000305 bool PreferISHST = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000306
Diana Picus4879b052016-07-06 09:22:23 +0000307 /// If true, a VLDM/VSTM starting with an odd register number is considered to
308 /// take more microops than single VLDRS/VSTRS.
309 bool SlowOddRegister = false;
310
311 /// If true, loading into a D subregister will be penalized.
312 bool SlowLoadDSubregister = false;
313
314 /// If true, the AGU and NEON/FPU units are multiplexed.
315 bool HasMuxedUnits = false;
316
Diana Picusb772e402016-07-06 11:22:11 +0000317 /// If true, VMOVS will never be widened to VMOVD
318 bool DontWidenVMOVS = false;
319
Diana Picus575f2bb2016-07-07 09:11:39 +0000320 /// If true, run the MLx expansion pass.
321 bool ExpandMLx = false;
322
323 /// If true, VFP/NEON VMLA/VMLS have special RAW hazards.
324 bool HasVMLxHazards = false;
325
Diana Picusc5baa432016-06-23 07:47:35 +0000326 /// If true, VMOVRS, VMOVSR and VMOVS will be converted from VFP to NEON.
Diana Picuseb1068a2016-06-27 13:06:10 +0000327 bool UseNEONForFPMovs = false;
Diana Picusc5baa432016-06-23 07:47:35 +0000328
Diana Picus92423ce2016-06-27 09:08:23 +0000329 /// If true, VLDn instructions take an extra cycle for unaligned accesses.
Diana Picuseb1068a2016-06-27 13:06:10 +0000330 bool CheckVLDnAlign = false;
Diana Picus92423ce2016-06-27 09:08:23 +0000331
332 /// If true, VFP instructions are not pipelined.
Diana Picuseb1068a2016-06-27 13:06:10 +0000333 bool NonpipelinedVFP = false;
Diana Picus92423ce2016-06-27 09:08:23 +0000334
Akira Hatanaka2670f4a2015-07-28 22:44:28 +0000335 /// StrictAlign - If true, the subtarget disallows unaligned memory
Bob Wilson3dc97322010-09-28 04:09:35 +0000336 /// accesses for some types. For details, see
Matt Arsenault6f2a5262014-07-27 17:46:40 +0000337 /// ARMTargetLowering::allowsMisalignedMemoryAccesses().
Diana Picuseb1068a2016-06-27 13:06:10 +0000338 bool StrictAlign = false;
Bob Wilson3dc97322010-09-28 04:09:35 +0000339
Weiming Zhao0da5cc02013-11-13 18:29:49 +0000340 /// RestrictIT - If true, the subtarget disallows generation of deprecated IT
341 /// blocks to conform to ARMv8 rule.
Diana Picuseb1068a2016-06-27 13:06:10 +0000342 bool RestrictIT = false;
Weiming Zhao0da5cc02013-11-13 18:29:49 +0000343
Artyom Skrobovcf296442015-09-24 17:31:16 +0000344 /// HasDSP - If true, the subtarget supports the DSP (saturating arith
345 /// and such) instructions.
Diana Picuseb1068a2016-06-27 13:06:10 +0000346 bool HasDSP = false;
Jim Grosbachcf1464d2011-07-01 21:12:19 +0000347
Eli Bendersky2e2ce492013-01-30 16:30:19 +0000348 /// NaCl TRAP instruction is generated instead of the regular TRAP.
Diana Picuseb1068a2016-06-27 13:06:10 +0000349 bool UseNaClTrap = false;
Eli Bendersky2e2ce492013-01-30 16:30:19 +0000350
Akira Hatanaka1bc8af72015-07-07 06:54:42 +0000351 /// Generate calls via indirect call instructions.
Diana Picuseb1068a2016-06-27 13:06:10 +0000352 bool GenLongCalls = false;
Akira Hatanaka1bc8af72015-07-07 06:54:42 +0000353
Prakhar Bahuguna52a7dd72016-12-15 07:59:08 +0000354 /// Generate code that does not contain data access to code sections.
355 bool GenExecuteOnly = false;
356
Renato Golinb4dd6c52013-03-21 18:47:47 +0000357 /// Target machine allowed unsafe FP math (such as use of NEON fp)
Diana Picuseb1068a2016-06-27 13:06:10 +0000358 bool UnsafeFPMath = false;
Renato Golinb4dd6c52013-03-21 18:47:47 +0000359
Tim Northoverf8e47e42015-10-28 22:56:36 +0000360 /// UseSjLjEH - If true, the target uses SjLj exception handling (e.g. iOS).
Diana Picuseb1068a2016-06-27 13:06:10 +0000361 bool UseSjLjEH = false;
Tim Northoverf8e47e42015-10-28 22:56:36 +0000362
Sanne Wouda2409c642017-03-21 14:59:17 +0000363 /// Implicitly convert an instruction to a different one if its immediates
364 /// cannot be encoded. For example, ADD r0, r1, #FFFFFFFF -> SUB r0, r1, #1.
365 bool NegativeImmediates = true;
366
Evan Cheng10043e22007-01-19 07:51:42 +0000367 /// stackAlignment - The minimum alignment known to hold of the stack frame on
368 /// entry to the function and which must be maintained by every function.
Diana Picuseb1068a2016-06-27 13:06:10 +0000369 unsigned stackAlignment = 4;
Evan Cheng10043e22007-01-19 07:51:42 +0000370
Anton Korobeynikov08bf4c02009-05-23 19:50:50 +0000371 /// CPUString - String name of used CPU.
372 std::string CPUString;
373
Diana Picuseb1068a2016-06-27 13:06:10 +0000374 unsigned MaxInterleaveFactor = 1;
Diana Picus92423ce2016-06-27 09:08:23 +0000375
Diana Picusb772e402016-07-06 11:22:11 +0000376 /// Clearance before partial register updates (in number of instructions)
377 unsigned PartialUpdateClearance = 0;
378
Diana Picus92423ce2016-06-27 09:08:23 +0000379 /// What kind of timing do load multiple/store multiple have (double issue,
380 /// single issue etc).
Diana Picuseb1068a2016-06-27 13:06:10 +0000381 ARMLdStMultipleTiming LdStMultipleTiming = SingleIssue;
Diana Picus92423ce2016-06-27 09:08:23 +0000382
383 /// The adjustment that we need to apply to get the operand latency from the
384 /// operand cycle returned by the itinerary data for pre-ISel operands.
Diana Picuseb1068a2016-06-27 13:06:10 +0000385 int PreISelOperandLatencyAdjustment = 2;
Diana Picus92423ce2016-06-27 09:08:23 +0000386
Christian Pirker2a111602014-03-28 14:35:30 +0000387 /// IsLittle - The target is Little Endian
388 bool IsLittle;
389
Evan Chenge45d6852011-01-11 21:46:47 +0000390 /// TargetTriple - What processor and OS we're targeting.
391 Triple TargetTriple;
392
Andrew Trick352abc12012-08-08 02:44:16 +0000393 /// SchedModel - Processor specific instruction costs.
Pete Cooper11759452014-09-02 17:43:54 +0000394 MCSchedModel SchedModel;
Andrew Trick352abc12012-08-08 02:44:16 +0000395
Evan Cheng4e712de2009-06-19 01:51:50 +0000396 /// Selected instruction itineraries (one entry per itinerary class.)
397 InstrItineraryData InstrItins;
Jim Grosbachf24f9d92009-08-11 15:33:49 +0000398
Renato Golinb4dd6c52013-03-21 18:47:47 +0000399 /// Options passed via command line that could influence the target
400 const TargetOptions &Options;
401
Eric Christopher661f2d12014-12-18 02:20:58 +0000402 const ARMBaseTargetMachine &TM;
Lauro Ramos Venancio048e16ff2007-02-13 19:52:28 +0000403
Eric Christopher661f2d12014-12-18 02:20:58 +0000404public:
Evan Cheng10043e22007-01-19 07:51:42 +0000405 /// This constructor initializes the data members to match that
Daniel Dunbar31b44e82009-08-02 22:11:08 +0000406 /// of the specified triple.
Evan Cheng10043e22007-01-19 07:51:42 +0000407 ///
Daniel Sandersa73f1fd2015-06-10 12:11:26 +0000408 ARMSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
409 const ARMBaseTargetMachine &TM, bool IsLittle);
Evan Cheng10043e22007-01-19 07:51:42 +0000410
Diana Picus22274932016-11-11 08:27:37 +0000411 /// This object will take onwership of \p GISelAccessor.
412 void setGISelAccessor(GISelAccessor &GISel) { this->GISel.reset(&GISel); }
413
Dan Gohman544ab2c2008-04-12 04:36:06 +0000414 /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size
415 /// that still makes it profitable to inline the call.
Rafael Espindola419b6d72007-10-31 14:39:58 +0000416 unsigned getMaxInlineSizeThreshold() const {
James Molloya70697e2014-05-16 14:24:22 +0000417 return 64;
Rafael Espindola419b6d72007-10-31 14:39:58 +0000418 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000419
Anton Korobeynikov0b91cc42009-05-23 19:51:43 +0000420 /// ParseSubtargetFeatures - Parses features string setting specified
Evan Cheng10043e22007-01-19 07:51:42 +0000421 /// subtarget options. Definition of function is auto generated by tblgen.
Evan Cheng1a72add62011-07-07 07:07:08 +0000422 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
Evan Cheng10043e22007-01-19 07:51:42 +0000423
Eric Christophera47f6802014-06-13 00:20:35 +0000424 /// initializeSubtargetDependencies - Initializes using a CPU and feature string
425 /// so that we can use initializer lists for subtarget initialization.
426 ARMSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);
427
Eric Christopherd9134482014-08-04 21:25:23 +0000428 const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
429 return &TSInfo;
430 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000431
Eric Christopherd9134482014-08-04 21:25:23 +0000432 const ARMBaseInstrInfo *getInstrInfo() const override {
433 return InstrInfo.get();
434 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000435
Eric Christopherd9134482014-08-04 21:25:23 +0000436 const ARMTargetLowering *getTargetLowering() const override {
437 return &TLInfo;
438 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000439
Eric Christopherd9134482014-08-04 21:25:23 +0000440 const ARMFrameLowering *getFrameLowering() const override {
441 return FrameLowering.get();
442 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000443
Eric Christopherd9134482014-08-04 21:25:23 +0000444 const ARMBaseRegisterInfo *getRegisterInfo() const override {
Eric Christopher80b24ef2014-06-26 19:30:02 +0000445 return &InstrInfo->getRegisterInfo();
446 }
Eric Christophera47f6802014-06-13 00:20:35 +0000447
Diana Picus22274932016-11-11 08:27:37 +0000448 const CallLowering *getCallLowering() const override;
449 const InstructionSelector *getInstructionSelector() const override;
450 const LegalizerInfo *getLegalizerInfo() const override;
451 const RegisterBankInfo *getRegBankInfo() const override;
452
Bill Wendling61375d82013-02-16 01:36:26 +0000453private:
Eric Christopher030294e2014-06-13 00:20:39 +0000454 ARMSelectionDAGInfo TSInfo;
Eric Christopher8b770652015-01-26 19:03:15 +0000455 // Either Thumb1FrameLowering or ARMFrameLowering.
456 std::unique_ptr<ARMFrameLowering> FrameLowering;
Eric Christopher80b24ef2014-06-26 19:30:02 +0000457 // Either Thumb1InstrInfo or Thumb2InstrInfo.
458 std::unique_ptr<ARMBaseInstrInfo> InstrInfo;
459 ARMTargetLowering TLInfo;
Eric Christophera47f6802014-06-13 00:20:35 +0000460
Diana Picus22274932016-11-11 08:27:37 +0000461 /// Gather the accessor points to GlobalISel-related APIs.
462 /// This is used to avoid ifndefs spreading around while GISel is
463 /// an optional library.
464 std::unique_ptr<GISelAccessor> GISel;
465
Bill Wendling61375d82013-02-16 01:36:26 +0000466 void initializeEnvironment();
Eric Christopherb68e2532014-09-03 20:36:31 +0000467 void initSubtargetFeatures(StringRef CPU, StringRef FS);
Eric Christopher8b770652015-01-26 19:03:15 +0000468 ARMFrameLowering *initializeFrameLowering(StringRef CPU, StringRef FS);
469
Bill Wendling61375d82013-02-16 01:36:26 +0000470public:
Andrew Trick10ffc2b2010-12-24 05:03:26 +0000471 void computeIssueWidth();
472
Evan Cheng8b2bda02011-07-07 03:55:05 +0000473 bool hasV4TOps() const { return HasV4TOps; }
474 bool hasV5TOps() const { return HasV5TOps; }
475 bool hasV5TEOps() const { return HasV5TEOps; }
476 bool hasV6Ops() const { return HasV6Ops; }
Amara Emerson5035ee02013-10-07 16:55:23 +0000477 bool hasV6MOps() const { return HasV6MOps; }
Renato Golin12350602015-03-17 11:55:28 +0000478 bool hasV6KOps() const { return HasV6KOps; }
Evan Cheng8b2bda02011-07-07 03:55:05 +0000479 bool hasV6T2Ops() const { return HasV6T2Ops; }
480 bool hasV7Ops() const { return HasV7Ops; }
Joey Goulyb3f550e2013-06-26 16:58:26 +0000481 bool hasV8Ops() const { return HasV8Ops; }
Vladimir Sukharev2afdb322015-04-01 14:54:56 +0000482 bool hasV8_1aOps() const { return HasV8_1aOps; }
Oliver Stannard8addbf42015-12-01 10:23:06 +0000483 bool hasV8_2aOps() const { return HasV8_2aOps; }
Bradley Smithe26f7992016-01-15 10:24:39 +0000484 bool hasV8MBaselineOps() const { return HasV8MBaselineOps; }
485 bool hasV8MMainlineOps() const { return HasV8MMainlineOps; }
Evan Cheng10043e22007-01-19 07:51:42 +0000486
Diana Picus4879b052016-07-06 09:22:23 +0000487 /// @{
488 /// These functions are obsolete, please consider adding subtarget features
489 /// or properties instead of calling them.
Quentin Colombet13cd5212012-11-29 19:48:01 +0000490 bool isCortexA5() const { return ARMProcFamily == CortexA5; }
Tim Northover0feb91e2014-04-01 14:10:07 +0000491 bool isCortexA7() const { return ARMProcFamily == CortexA7; }
Evan Chengbf407072010-09-10 01:29:16 +0000492 bool isCortexA8() const { return ARMProcFamily == CortexA8; }
493 bool isCortexA9() const { return ARMProcFamily == CortexA9; }
Silviu Barangab47bb942012-09-13 15:05:10 +0000494 bool isCortexA15() const { return ARMProcFamily == CortexA15; }
Bob Wilsone8a549c2012-09-29 21:43:49 +0000495 bool isSwift() const { return ARMProcFamily == Swift; }
Artyom Skrobove6f1b7f2016-03-23 16:18:13 +0000496 bool isCortexM3() const { return ARMProcFamily == CortexM3; }
Ana Pazos93a07c22013-12-06 22:48:17 +0000497 bool isLikeA9() const { return isCortexA9() || isCortexA15() || isKrait(); }
Quentin Colombetb1b66e72012-12-21 04:35:05 +0000498 bool isCortexR5() const { return ARMProcFamily == CortexR5; }
Ana Pazos93a07c22013-12-06 22:48:17 +0000499 bool isKrait() const { return ARMProcFamily == Krait; }
Diana Picus4879b052016-07-06 09:22:23 +0000500 /// @}
Evan Chengbf407072010-09-10 01:29:16 +0000501
Evan Cheng5190f092010-08-11 07:17:46 +0000502 bool hasARMOps() const { return !NoARM; }
503
Evan Cheng8b2bda02011-07-07 03:55:05 +0000504 bool hasVFP2() const { return HasVFPv2; }
505 bool hasVFP3() const { return HasVFPv3; }
Anton Korobeynikov5482b9f2012-01-22 12:07:33 +0000506 bool hasVFP4() const { return HasVFPv4; }
Joey Goulyccd04892013-09-13 13:46:57 +0000507 bool hasFPARMv8() const { return HasFPARMv8; }
Evan Cheng8b2bda02011-07-07 03:55:05 +0000508 bool hasNEON() const { return HasNEON; }
Amara Emerson33089092013-09-19 11:59:01 +0000509 bool hasCrypto() const { return HasCrypto; }
Bernard Ogdenee87e852013-10-29 09:47:35 +0000510 bool hasCRC() const { return HasCRC; }
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000511 bool hasRAS() const { return HasRAS; }
Bradley Smith25219752013-11-01 13:27:35 +0000512 bool hasVirtualization() const { return HasVirtualization; }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000513
Jim Grosbachf24f9d92009-08-11 15:33:49 +0000514 bool useNEONForSinglePrecisionFP() const {
Cameron Esfahani17177d12015-02-05 02:09:33 +0000515 return hasNEON() && UseNEONForSinglePrecisionFP;
516 }
Evan Cheng8b2bda02011-07-07 03:55:05 +0000517
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000518 bool hasDivideInThumbMode() const { return HasHardwareDivideInThumb; }
Bob Wilsone8a549c2012-09-29 21:43:49 +0000519 bool hasDivideInARMMode() const { return HasHardwareDivideInARM; }
Evan Cheng6e809de2010-08-11 06:22:01 +0000520 bool hasDataBarrier() const { return HasDataBarrier; }
Bradley Smith4c21cba2016-01-15 10:23:46 +0000521 bool hasV7Clrex() const { return HasV7Clrex; }
522 bool hasAcquireRelease() const { return HasAcquireRelease; }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000523
Tim Northoverc7ea8042013-10-25 09:30:24 +0000524 bool hasAnyDataBarrier() const {
525 return HasDataBarrier || (hasV6Ops() && !isThumb());
526 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000527
Bob Wilsone8a549c2012-09-29 21:43:49 +0000528 bool useMulOps() const { return UseMulOps; }
Evan Cheng62c7b5b2010-12-05 22:04:16 +0000529 bool useFPVMLx() const { return !SlowFPVMLx; }
Evan Cheng38bf5ad2011-03-31 19:38:48 +0000530 bool hasVMLxForwarding() const { return HasVMLxForwarding; }
Evan Cheng58066e32010-07-13 19:21:50 +0000531 bool isFPBrccSlow() const { return SlowFPBrcc; }
Jim Grosbach4d5dc3e2010-08-11 15:44:15 +0000532 bool isFPOnlySP() const { return FPOnlySP; }
Tim Northovercedd4812013-05-23 19:11:14 +0000533 bool hasPerfMon() const { return HasPerfMon; }
Tim Northoverc6047652013-04-10 12:08:35 +0000534 bool hasTrustZone() const { return HasTrustZone; }
Bradley Smithfed3e4a2016-01-25 11:24:47 +0000535 bool has8MSecExt() const { return Has8MSecExt; }
Tim Northover13510302014-04-01 13:22:02 +0000536 bool hasZeroCycleZeroing() const { return HasZeroCycleZeroing; }
Javed Absar85874a92016-10-13 14:57:43 +0000537 bool hasFPAO() const { return HasFPAO; }
Diana Picusc5baa432016-06-23 07:47:35 +0000538 bool isProfitableToUnpredicate() const { return IsProfitableToUnpredicate; }
539 bool hasSlowVGETLNi32() const { return HasSlowVGETLNi32; }
540 bool hasSlowVDUP32() const { return HasSlowVDUP32; }
541 bool preferVMOVSR() const { return PreferVMOVSR; }
542 bool preferISHSTBarriers() const { return PreferISHST; }
Diana Picus575f2bb2016-07-07 09:11:39 +0000543 bool expandMLx() const { return ExpandMLx; }
544 bool hasVMLxHazards() const { return HasVMLxHazards; }
Diana Picus4879b052016-07-06 09:22:23 +0000545 bool hasSlowOddRegister() const { return SlowOddRegister; }
546 bool hasSlowLoadDSubregister() const { return SlowLoadDSubregister; }
547 bool hasMuxedUnits() const { return HasMuxedUnits; }
Diana Picusb772e402016-07-06 11:22:11 +0000548 bool dontWidenVMOVS() const { return DontWidenVMOVS; }
Diana Picusc5baa432016-06-23 07:47:35 +0000549 bool useNEONForFPMovs() const { return UseNEONForFPMovs; }
Diana Picus92423ce2016-06-27 09:08:23 +0000550 bool checkVLDnAccessAlignment() const { return CheckVLDnAlign; }
551 bool nonpipelinedVFP() const { return NonpipelinedVFP; }
Evan Chengce8fb682010-08-09 18:35:19 +0000552 bool prefers32BitThumb() const { return Pref32BitThumb; }
Bob Wilsona2881ee2011-04-19 18:11:49 +0000553 bool avoidCPSRPartialUpdate() const { return AvoidCPSRPartialUpdate; }
Javed Absar4ae7e8122017-06-02 08:53:19 +0000554 bool cheapPredicableCPSRDef() const { return CheapPredicableCPSRDef; }
Evan Chengddc0cb62012-12-20 19:59:30 +0000555 bool avoidMOVsShifterOperand() const { return AvoidMOVsShifterOperand; }
Sjoerd Meijerd906bf12016-06-03 14:03:27 +0000556 bool hasRetAddrStack() const { return HasRetAddrStack; }
Evan Cheng8740ee32010-11-03 06:34:55 +0000557 bool hasMPExtension() const { return HasMPExtension; }
Artyom Skrobovcf296442015-09-24 17:31:16 +0000558 bool hasDSP() const { return HasDSP; }
Eli Bendersky2e2ce492013-01-30 16:30:19 +0000559 bool useNaClTrap() const { return UseNaClTrap; }
Tim Northoverf8e47e42015-10-28 22:56:36 +0000560 bool useSjLjEH() const { return UseSjLjEH; }
Akira Hatanaka1bc8af72015-07-07 06:54:42 +0000561 bool genLongCalls() const { return GenLongCalls; }
Prakhar Bahuguna52a7dd72016-12-15 07:59:08 +0000562 bool genExecuteOnly() const { return GenExecuteOnly; }
Jim Grosbachf24f9d92009-08-11 15:33:49 +0000563
Anton Korobeynikov0a65a372010-03-14 18:42:38 +0000564 bool hasFP16() const { return HasFP16; }
Bob Wilsondd6eb5b2010-10-12 16:22:47 +0000565 bool hasD16() const { return HasD16; }
Oliver Stannard8addbf42015-12-01 10:23:06 +0000566 bool hasFullFP16() const { return HasFullFP16; }
Anton Korobeynikov0a65a372010-03-14 18:42:38 +0000567
Florian Hahnb489e562017-06-22 09:39:36 +0000568 bool hasFuseAES() const { return HasFuseAES; }
569 /// \brief Return true if the CPU supports any kind of instruction fusion.
570 bool hasFusion() const { return hasFuseAES(); }
571
Evan Cheng5f1ba4c2011-04-20 22:20:12 +0000572 const Triple &getTargetTriple() const { return TargetTriple; }
573
Daniel Dunbar2b9b0e32011-04-19 21:14:45 +0000574 bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000575 bool isTargetIOS() const { return TargetTriple.isiOS(); }
Tim Northovere0ccdc62015-10-28 22:46:43 +0000576 bool isTargetWatchOS() const { return TargetTriple.isWatchOS(); }
Tim Northover042a6c12016-01-27 19:32:29 +0000577 bool isTargetWatchABI() const { return TargetTriple.isWatchABI(); }
Cameron Esfahani943908b2013-08-29 20:23:14 +0000578 bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000579 bool isTargetNaCl() const { return TargetTriple.isOSNaCl(); }
Simon Pilgrima2794102014-11-22 19:12:10 +0000580 bool isTargetNetBSD() const { return TargetTriple.isOSNetBSD(); }
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000581 bool isTargetWindows() const { return TargetTriple.isOSWindows(); }
Tim Northoverd6a729b2014-01-06 14:28:05 +0000582
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000583 bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
Tim Northover9653eb52013-12-10 16:57:43 +0000584 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
Tim Northoverd6a729b2014-01-06 14:28:05 +0000585 bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); }
586
Renato Golin87610692013-07-16 09:32:17 +0000587 // ARM EABI is the bare-metal EABI described in ARM ABI documents and
588 // can be accessed via -target arm-none-eabi. This is NOT GNUEABI.
589 // FIXME: Add a flag for bare-metal for that target and set Triple::EABI
590 // even for GNUEABI, so we can make a distinction here and still conform to
591 // the EABI on GNU (and Android) mode. This requires change in Clang, too.
Tim Northover7649eba2014-01-06 12:00:44 +0000592 // FIXME: The Darwin exception is temporary, while we move users to
593 // "*-*-*-macho" triples as quickly as possible.
Renato Golin87610692013-07-16 09:32:17 +0000594 bool isTargetAEABI() const {
Tim Northover7649eba2014-01-06 12:00:44 +0000595 return (TargetTriple.getEnvironment() == Triple::EABI ||
596 TargetTriple.getEnvironment() == Triple::EABIHF) &&
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000597 !isTargetDarwin() && !isTargetWindows();
Renato Golin87610692013-07-16 09:32:17 +0000598 }
Renato Golin6d435f12015-11-09 12:40:30 +0000599 bool isTargetGNUAEABI() const {
600 return (TargetTriple.getEnvironment() == Triple::GNUEABI ||
601 TargetTriple.getEnvironment() == Triple::GNUEABIHF) &&
602 !isTargetDarwin() && !isTargetWindows();
603 }
Rafael Espindolaa895a0c2016-06-24 21:14:33 +0000604 bool isTargetMuslAEABI() const {
605 return (TargetTriple.getEnvironment() == Triple::MuslEABI ||
606 TargetTriple.getEnvironment() == Triple::MuslEABIHF) &&
607 !isTargetDarwin() && !isTargetWindows();
608 }
Evan Cheng181fe362007-01-19 19:22:40 +0000609
Renato Golin8cea6e82014-01-29 11:50:56 +0000610 // ARM Targets that support EHABI exception handling standard
611 // Darwin uses SjLj. Other targets might need more checks.
612 bool isTargetEHABICompatible() const {
613 return (TargetTriple.getEnvironment() == Triple::EABI ||
614 TargetTriple.getEnvironment() == Triple::GNUEABI ||
Rafael Espindolaa895a0c2016-06-24 21:14:33 +0000615 TargetTriple.getEnvironment() == Triple::MuslEABI ||
Renato Golin8cea6e82014-01-29 11:50:56 +0000616 TargetTriple.getEnvironment() == Triple::EABIHF ||
Evgeniy Stepanov02bc78b2014-01-30 14:18:25 +0000617 TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
Rafael Espindolaa895a0c2016-06-24 21:14:33 +0000618 TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
Evgeniy Stepanov5fe279e2015-10-08 21:21:24 +0000619 isTargetAndroid()) &&
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000620 !isTargetDarwin() && !isTargetWindows();
Renato Golin8cea6e82014-01-29 11:50:56 +0000621 }
622
Tim Northover44594ad2013-12-18 09:27:33 +0000623 bool isTargetHardFloat() const {
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000624 // FIXME: this is invalid for WindowsCE
Tim Northover44594ad2013-12-18 09:27:33 +0000625 return TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
Rafael Espindolaa895a0c2016-06-24 21:14:33 +0000626 TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000627 TargetTriple.getEnvironment() == Triple::EABIHF ||
Tim Northovere0ccdc62015-10-28 22:46:43 +0000628 isTargetWindows() || isAAPCS16_ABI();
Tim Northover44594ad2013-12-18 09:27:33 +0000629 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000630
Evgeniy Stepanov5fe279e2015-10-08 21:21:24 +0000631 bool isTargetAndroid() const { return TargetTriple.isAndroid(); }
Tim Northover44594ad2013-12-18 09:27:33 +0000632
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000633 bool isXRaySupported() const override;
Dean Michael Berris464015442016-09-19 00:54:35 +0000634
Eric Christopher661f2d12014-12-18 02:20:58 +0000635 bool isAPCS_ABI() const;
636 bool isAAPCS_ABI() const;
Tim Northovere0ccdc62015-10-28 22:46:43 +0000637 bool isAAPCS16_ABI() const;
Lauro Ramos Venancio048e16ff2007-02-13 19:52:28 +0000638
Oliver Stannard8331aae2016-08-08 15:28:31 +0000639 bool isROPI() const;
640 bool isRWPI() const;
641
Eric Christopher824f42f2015-05-12 01:26:05 +0000642 bool useSoftFloat() const { return UseSoftFloat; }
Evan Cheng1834f5d2011-07-07 19:05:12 +0000643 bool isThumb() const { return InThumbMode; }
644 bool isThumb1Only() const { return InThumbMode && !HasThumb2; }
645 bool isThumb2() const { return InThumbMode && HasThumb2; }
Evan Cheng2bd65362011-07-07 00:08:19 +0000646 bool hasThumb2() const { return HasThumb2; }
Amara Emerson330afb52013-09-23 14:26:15 +0000647 bool isMClass() const { return ARMProcClass == MClass; }
648 bool isRClass() const { return ARMProcClass == RClass; }
649 bool isAClass() const { return ARMProcClass == AClass; }
Evan Cheng10043e22007-01-19 07:51:42 +0000650
Akira Hatanaka28581522015-07-21 01:42:02 +0000651 bool isR9Reserved() const {
652 return isTargetMachO() ? (ReserveR9 || !HasV6Ops) : ReserveR9;
653 }
Evan Cheng10043e22007-01-19 07:51:42 +0000654
Oliver Stannard9aa6f012016-08-23 09:19:22 +0000655 bool useR7AsFramePointer() const {
656 return isTargetDarwin() || (!isTargetWindows() && isThumb());
657 }
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000658
Tim Northoverf8b0a7a2016-05-13 19:16:14 +0000659 /// Returns true if the frame setup is split into two separate pushes (first
660 /// r0-r7,lr then r8-r11), principally so that the frame pointer is adjacent
Reid Klecknerbdfc05f2016-10-11 21:14:03 +0000661 /// to lr. This is always required on Thumb1-only targets, as the push and
662 /// pop instructions can't access the high registers.
Oliver Stannard9aa6f012016-08-23 09:19:22 +0000663 bool splitFramePushPop(const MachineFunction &MF) const {
Reid Klecknerbdfc05f2016-10-11 21:14:03 +0000664 return (useR7AsFramePointer() &&
665 MF.getTarget().Options.DisableFramePointerElim(MF)) ||
666 isThumb1Only();
Tim Northoverf8b0a7a2016-05-13 19:16:14 +0000667 }
668
Tim Northover910dde72015-08-03 17:20:10 +0000669 bool useStride4VFPs(const MachineFunction &MF) const;
670
Eric Christopherc1058df2014-07-04 01:55:26 +0000671 bool useMovt(const MachineFunction &MF) const;
672
Bob Wilson8decdc42011-10-07 17:17:49 +0000673 bool supportsTailCall() const { return SupportsTailCall; }
Anton Korobeynikov25229082009-11-24 00:44:37 +0000674
Akira Hatanaka2670f4a2015-07-28 22:44:28 +0000675 bool allowsUnalignedMem() const { return !StrictAlign; }
Bob Wilson3dc97322010-09-28 04:09:35 +0000676
Weiming Zhao0da5cc02013-11-13 18:29:49 +0000677 bool restrictIT() const { return RestrictIT; }
678
Anton Korobeynikov08bf4c02009-05-23 19:50:50 +0000679 const std::string & getCPUString() const { return CPUString; }
Anton Korobeynikov25229082009-11-24 00:44:37 +0000680
Christian Pirker2a111602014-03-28 14:35:30 +0000681 bool isLittle() const { return IsLittle; }
682
Owen Andersona3181e22010-09-28 21:57:50 +0000683 unsigned getMispredictionPenalty() const;
Jim Grosbach1a597112014-04-03 23:43:18 +0000684
Bob Wilsone7dde0c2013-11-03 06:14:38 +0000685 /// This function returns true if the target has sincos() routine in its
686 /// compiler runtime or math libraries.
687 bool hasSinCos() const;
Andrew Trickc416ba62010-12-24 04:28:06 +0000688
Matthias Braun9e859802015-07-17 23:18:30 +0000689 /// Returns true if machine scheduler should be enabled.
690 bool enableMachineScheduler() const override;
691
Andrew Trick8d2ee372014-06-04 07:06:27 +0000692 /// True for some subtargets at > -O0.
Matthias Braun39a2afc2015-06-13 03:42:16 +0000693 bool enablePostRAScheduler() const override;
Anton Korobeynikov08bf4c02009-05-23 19:50:50 +0000694
Robin Morisset59c23cd2014-08-21 21:50:01 +0000695 // enableAtomicExpand- True if we need to expand our atomics.
696 bool enableAtomicExpand() const override;
Eric Christopherc40e5ed2014-06-19 21:03:04 +0000697
Robin Morissetd18cda62014-08-15 22:17:28 +0000698 /// getInstrItins - Return the instruction itineraries based on subtarget
Evan Cheng4e712de2009-06-19 01:51:50 +0000699 /// selection.
Benjamin Kramer8c90fd72014-09-03 11:41:21 +0000700 const InstrItineraryData *getInstrItineraryData() const override {
Eric Christopherd9134482014-08-04 21:25:23 +0000701 return &InstrItins;
702 }
Evan Cheng4e712de2009-06-19 01:51:50 +0000703
Evan Cheng10043e22007-01-19 07:51:42 +0000704 /// getStackAlignment - Returns the minimum alignment known to hold of the
705 /// stack frame on entry to the function and which must be maintained by every
706 /// function for this subtarget.
707 unsigned getStackAlignment() const { return stackAlignment; }
Evan Cheng43b9ca62009-08-28 23:18:09 +0000708
Diana Picus92423ce2016-06-27 09:08:23 +0000709 unsigned getMaxInterleaveFactor() const { return MaxInterleaveFactor; }
710
Diana Picusb772e402016-07-06 11:22:11 +0000711 unsigned getPartialUpdateClearance() const { return PartialUpdateClearance; }
712
Diana Picus92423ce2016-06-27 09:08:23 +0000713 ARMLdStMultipleTiming getLdStMultipleTiming() const {
714 return LdStMultipleTiming;
715 }
716
717 int getPreISelOperandLatencyAdjustment() const {
718 return PreISelOperandLatencyAdjustment;
719 }
720
Rafael Espindola5ac8f5c2016-06-28 15:38:13 +0000721 /// True if the GV will be accessed via an indirect symbol.
722 bool isGVIndirectSymbol(const GlobalValue *GV) const;
Chris Bieneman03695ab2014-07-15 17:18:41 +0000723
Akira Hatanakaddf76aa2015-05-23 01:14:08 +0000724 /// True if fast-isel is used.
725 bool useFastISel() const;
Evan Cheng10043e22007-01-19 07:51:42 +0000726};
Evan Cheng10043e22007-01-19 07:51:42 +0000727
Eugene Zelenkoe79c0772017-01-27 23:58:02 +0000728} // end namespace llvm
729
730#endif // LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H