blob: de591fcea4187b8a72c1a8ceed830c9f95053df4 [file] [log] [blame]
Erich Keaneebba5922017-07-21 22:37:03 +00001//===--- AArch64.cpp - Implement AArch64 target feature support -----------===//
2//
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
Erich Keaneebba5922017-07-21 22:37:03 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file implements AArch64 TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#include "AArch64.h"
14#include "clang/Basic/TargetBuiltins.h"
15#include "clang/Basic/TargetInfo.h"
16#include "llvm/ADT/ArrayRef.h"
Saleem Abdulrasool729379a2017-10-06 23:09:55 +000017#include "llvm/ADT/StringExtras.h"
Erich Keaneebba5922017-07-21 22:37:03 +000018
19using namespace clang;
20using namespace clang::targets;
21
Tim Northoverad4c5db2017-07-24 17:06:23 +000022const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
23#define BUILTIN(ID, TYPE, ATTRS) \
24 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
25#include "clang/Basic/BuiltinsNEON.def"
26
27#define BUILTIN(ID, TYPE, ATTRS) \
28 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
Martin Storsjod8a44ed2017-10-12 07:05:37 +000029#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
30 {#ID, TYPE, ATTRS, nullptr, LANG, nullptr},
Martin Storsjo17c0f722018-07-18 06:15:09 +000031#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
32 {#ID, TYPE, ATTRS, HEADER, LANGS, FEATURE},
Tim Northoverad4c5db2017-07-24 17:06:23 +000033#include "clang/Basic/BuiltinsAArch64.def"
34};
35
36AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
37 const TargetOptions &Opts)
38 : TargetInfo(Triple), ABI("aapcs") {
Michal Gorny5a409d02018-12-20 13:09:30 +000039 if (getTriple().isOSOpenBSD()) {
Tim Northoverad4c5db2017-07-24 17:06:23 +000040 Int64Type = SignedLongLong;
41 IntMaxType = SignedLongLong;
42 } else {
Michal Gorny5a409d02018-12-20 13:09:30 +000043 if (!getTriple().isOSDarwin() && !getTriple().isOSNetBSD())
Saleem Abdulrasool729379a2017-10-06 23:09:55 +000044 WCharType = UnsignedInt;
45
Tim Northoverad4c5db2017-07-24 17:06:23 +000046 Int64Type = SignedLong;
47 IntMaxType = SignedLong;
48 }
49
Sjoerd Meijer87793e72018-03-19 13:22:49 +000050 // All AArch64 implementations support ARMv8 FP, which makes half a legal type.
51 HasLegalHalfType = true;
Saleem Abdulrasool729379a2017-10-06 23:09:55 +000052
Tim Northoverad4c5db2017-07-24 17:06:23 +000053 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
54 MaxVectorAlign = 128;
55 MaxAtomicInlineWidth = 128;
56 MaxAtomicPromoteWidth = 128;
57
58 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
59 LongDoubleFormat = &llvm::APFloat::IEEEquad();
60
61 // Make __builtin_ms_va_list available.
62 HasBuiltinMSVaList = true;
63
64 // {} in inline assembly are neon specifiers, not assembly variant
65 // specifiers.
66 NoAsmVariants = true;
67
68 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
69 // contributes to the alignment of the containing aggregate in the same way
70 // a plain (non bit-field) member of that type would, without exception for
71 // zero-sized or anonymous bit-fields."
72 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
73 UseZeroLengthBitfieldAlignment = true;
74
75 // AArch64 targets default to using the ARM C++ ABI.
76 TheCXXABI.set(TargetCXXABI::GenericAArch64);
77
78 if (Triple.getOS() == llvm::Triple::Linux)
79 this->MCountName = "\01_mcount";
80 else if (Triple.getOS() == llvm::Triple::UnknownOS)
81 this->MCountName =
82 Opts.EABIVersion == llvm::EABI::GNU ? "\01_mcount" : "mcount";
83}
84
85StringRef AArch64TargetInfo::getABI() const { return ABI; }
86
87bool AArch64TargetInfo::setABI(const std::string &Name) {
88 if (Name != "aapcs" && Name != "darwinpcs")
89 return false;
90
91 ABI = Name;
92 return true;
93}
94
95bool AArch64TargetInfo::isValidCPUName(StringRef Name) const {
96 return Name == "generic" ||
Florian Hahnef5bbd62017-07-27 16:28:39 +000097 llvm::AArch64::parseCPUArch(Name) != llvm::AArch64::ArchKind::INVALID;
Tim Northoverad4c5db2017-07-24 17:06:23 +000098}
99
100bool AArch64TargetInfo::setCPU(const std::string &Name) {
101 return isValidCPUName(Name);
102}
103
Erich Keane3ec17432018-02-08 23:14:15 +0000104void AArch64TargetInfo::fillValidCPUList(
105 SmallVectorImpl<StringRef> &Values) const {
106 llvm::AArch64::fillValidCPUArchList(Values);
107}
108
Tim Northoverad4c5db2017-07-24 17:06:23 +0000109void AArch64TargetInfo::getTargetDefinesARMV81A(const LangOptions &Opts,
110 MacroBuilder &Builder) const {
111 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
112}
113
114void AArch64TargetInfo::getTargetDefinesARMV82A(const LangOptions &Opts,
115 MacroBuilder &Builder) const {
116 // Also include the ARMv8.1 defines
117 getTargetDefinesARMV81A(Opts, Builder);
118}
119
120void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
121 MacroBuilder &Builder) const {
122 // Target identification.
123 Builder.defineMacro("__aarch64__");
Eli Friedman39ceea32018-10-17 21:07:11 +0000124 // For bare-metal.
Tim Northoverad4c5db2017-07-24 17:06:23 +0000125 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
Eli Friedman39ceea32018-10-17 21:07:11 +0000126 getTriple().isOSBinFormatELF())
Tim Northoverad4c5db2017-07-24 17:06:23 +0000127 Builder.defineMacro("__ELF__");
128
129 // Target properties.
Martin Storsjo588a3e52017-07-31 20:40:53 +0000130 if (!getTriple().isOSWindows()) {
131 Builder.defineMacro("_LP64");
132 Builder.defineMacro("__LP64__");
133 }
Tim Northoverad4c5db2017-07-24 17:06:23 +0000134
135 // ACLE predefines. Many can only have one possible value on v8 AArch64.
136 Builder.defineMacro("__ARM_ACLE", "200");
137 Builder.defineMacro("__ARM_ARCH", "8");
138 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
139
140 Builder.defineMacro("__ARM_64BIT_STATE", "1");
141 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
142 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
143
144 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
145 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
146 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
147 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
148 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
149 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
150 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
151
152 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
153
154 // 0xe implies support for half, single and double precision operations.
155 Builder.defineMacro("__ARM_FP", "0xE");
156
157 // PCS specifies this for SysV variants, which is all we support. Other ABIs
158 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
159 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
160 Builder.defineMacro("__ARM_FP16_ARGS", "1");
161
162 if (Opts.UnsafeFPMath)
163 Builder.defineMacro("__ARM_FP_FAST", "1");
164
Saleem Abdulrasool729379a2017-10-06 23:09:55 +0000165 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Benjamin Kramer3a13ed62017-12-28 16:58:54 +0000166 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
Tim Northoverad4c5db2017-07-24 17:06:23 +0000167
168 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ? "1" : "4");
169
170 if (FPU & NeonMode) {
171 Builder.defineMacro("__ARM_NEON", "1");
172 // 64-bit NEON supports half, single and double precision operations.
173 Builder.defineMacro("__ARM_NEON_FP", "0xE");
174 }
175
176 if (FPU & SveMode)
177 Builder.defineMacro("__ARM_FEATURE_SVE", "1");
178
179 if (CRC)
180 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
181
182 if (Crypto)
183 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
184
185 if (Unaligned)
186 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
187
Abderrazek Zaafranif58a1322017-12-21 19:20:01 +0000188 if ((FPU & NeonMode) && HasFullFP16)
189 Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1");
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +0000190 if (HasFullFP16)
191 Builder.defineMacro("__ARM_FEATURE_FP16_SCALAR_ARITHMETIC", "1");
Abderrazek Zaafranif58a1322017-12-21 19:20:01 +0000192
Junmo Park4b9b9fb2018-04-17 22:38:40 +0000193 if (HasDotProd)
194 Builder.defineMacro("__ARM_FEATURE_DOTPROD", "1");
195
Bryan Chan223307b2018-10-25 23:47:00 +0000196 if ((FPU & NeonMode) && HasFP16FML)
197 Builder.defineMacro("__ARM_FEATURE_FP16FML", "1");
198
Tim Northoverad4c5db2017-07-24 17:06:23 +0000199 switch (ArchKind) {
200 default:
201 break;
Florian Hahnef5bbd62017-07-27 16:28:39 +0000202 case llvm::AArch64::ArchKind::ARMV8_1A:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000203 getTargetDefinesARMV81A(Opts, Builder);
204 break;
Florian Hahnef5bbd62017-07-27 16:28:39 +0000205 case llvm::AArch64::ArchKind::ARMV8_2A:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000206 getTargetDefinesARMV82A(Opts, Builder);
207 break;
208 }
209
210 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
211 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
212 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
213 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
214 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
215}
216
217ArrayRef<Builtin::Info> AArch64TargetInfo::getTargetBuiltins() const {
218 return llvm::makeArrayRef(BuiltinInfo, clang::AArch64::LastTSBuiltin -
219 Builtin::FirstTSBuiltin);
220}
221
222bool AArch64TargetInfo::hasFeature(StringRef Feature) const {
223 return Feature == "aarch64" || Feature == "arm64" || Feature == "arm" ||
224 (Feature == "neon" && (FPU & NeonMode)) ||
225 (Feature == "sve" && (FPU & SveMode));
226}
227
228bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
229 DiagnosticsEngine &Diags) {
230 FPU = FPUMode;
231 CRC = 0;
232 Crypto = 0;
233 Unaligned = 1;
234 HasFullFP16 = 0;
Junmo Park4b9b9fb2018-04-17 22:38:40 +0000235 HasDotProd = 0;
Bryan Chan223307b2018-10-25 23:47:00 +0000236 HasFP16FML = 0;
Florian Hahnef5bbd62017-07-27 16:28:39 +0000237 ArchKind = llvm::AArch64::ArchKind::ARMV8A;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000238
239 for (const auto &Feature : Features) {
240 if (Feature == "+neon")
241 FPU |= NeonMode;
242 if (Feature == "+sve")
243 FPU |= SveMode;
244 if (Feature == "+crc")
245 CRC = 1;
246 if (Feature == "+crypto")
247 Crypto = 1;
248 if (Feature == "+strict-align")
249 Unaligned = 0;
250 if (Feature == "+v8.1a")
Florian Hahnef5bbd62017-07-27 16:28:39 +0000251 ArchKind = llvm::AArch64::ArchKind::ARMV8_1A;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000252 if (Feature == "+v8.2a")
Florian Hahnef5bbd62017-07-27 16:28:39 +0000253 ArchKind = llvm::AArch64::ArchKind::ARMV8_2A;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000254 if (Feature == "+fullfp16")
255 HasFullFP16 = 1;
Junmo Park4b9b9fb2018-04-17 22:38:40 +0000256 if (Feature == "+dotprod")
257 HasDotProd = 1;
Bryan Chan223307b2018-10-25 23:47:00 +0000258 if (Feature == "+fp16fml")
259 HasFP16FML = 1;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000260 }
261
262 setDataLayout();
263
264 return true;
265}
266
267TargetInfo::CallingConvCheckResult
268AArch64TargetInfo::checkCallingConvention(CallingConv CC) const {
269 switch (CC) {
270 case CC_C:
271 case CC_Swift:
272 case CC_PreserveMost:
273 case CC_PreserveAll:
274 case CC_OpenCLKernel:
Sander de Smalen44a22532018-11-26 16:38:37 +0000275 case CC_AArch64VectorCall:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000276 case CC_Win64:
277 return CCCR_OK;
278 default:
279 return CCCR_Warning;
280 }
281}
282
283bool AArch64TargetInfo::isCLZForZeroUndef() const { return false; }
284
285TargetInfo::BuiltinVaListKind AArch64TargetInfo::getBuiltinVaListKind() const {
286 return TargetInfo::AArch64ABIBuiltinVaList;
287}
288
Erich Keaneebba5922017-07-21 22:37:03 +0000289const char *const AArch64TargetInfo::GCCRegNames[] = {
290 // 32-bit Integer registers
291 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10", "w11",
292 "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21", "w22",
293 "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
294
295 // 64-bit Integer registers
296 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11",
297 "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22",
298 "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
299
300 // 32-bit floating point regsisters
301 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11",
302 "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
303 "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
304
305 // 64-bit floating point regsisters
306 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11",
307 "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
308 "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
309
310 // Vector registers
311 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11",
312 "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22",
313 "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
314};
315
316ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
317 return llvm::makeArrayRef(GCCRegNames);
318}
319
320const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Manoj Guptacb668d82018-03-29 21:11:15 +0000321 {{"w31"}, "wsp"},
322 {{"x31"}, "sp"},
323 // GCC rN registers are aliases of xN registers.
324 {{"r0"}, "x0"},
325 {{"r1"}, "x1"},
326 {{"r2"}, "x2"},
327 {{"r3"}, "x3"},
328 {{"r4"}, "x4"},
329 {{"r5"}, "x5"},
330 {{"r6"}, "x6"},
331 {{"r7"}, "x7"},
332 {{"r8"}, "x8"},
333 {{"r9"}, "x9"},
334 {{"r10"}, "x10"},
335 {{"r11"}, "x11"},
336 {{"r12"}, "x12"},
337 {{"r13"}, "x13"},
338 {{"r14"}, "x14"},
339 {{"r15"}, "x15"},
340 {{"r16"}, "x16"},
341 {{"r17"}, "x17"},
342 {{"r18"}, "x18"},
343 {{"r19"}, "x19"},
344 {{"r20"}, "x20"},
345 {{"r21"}, "x21"},
346 {{"r22"}, "x22"},
347 {{"r23"}, "x23"},
348 {{"r24"}, "x24"},
349 {{"r25"}, "x25"},
350 {{"r26"}, "x26"},
351 {{"r27"}, "x27"},
352 {{"r28"}, "x28"},
353 {{"r29", "x29"}, "fp"},
354 {{"r30", "x30"}, "lr"},
Erich Keaneebba5922017-07-21 22:37:03 +0000355 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
356 // don't want to substitute one of these for a different-sized one.
357};
358
359ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
360 return llvm::makeArrayRef(GCCRegAliases);
361}
362
Tim Northoverad4c5db2017-07-24 17:06:23 +0000363bool AArch64TargetInfo::validateAsmConstraint(
364 const char *&Name, TargetInfo::ConstraintInfo &Info) const {
365 switch (*Name) {
366 default:
367 return false;
368 case 'w': // Floating point and SIMD registers (V0-V31)
369 Info.setAllowsRegister();
370 return true;
371 case 'I': // Constant that can be used with an ADD instruction
372 case 'J': // Constant that can be used with a SUB instruction
373 case 'K': // Constant that can be used with a 32-bit logical instruction
374 case 'L': // Constant that can be used with a 64-bit logical instruction
375 case 'M': // Constant that can be used as a 32-bit MOV immediate
376 case 'N': // Constant that can be used as a 64-bit MOV immediate
377 case 'Y': // Floating point constant zero
378 case 'Z': // Integer constant zero
379 return true;
380 case 'Q': // A memory reference with base register and no offset
381 Info.setAllowsMemory();
382 return true;
383 case 'S': // A symbolic address
384 Info.setAllowsRegister();
385 return true;
386 case 'U':
387 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
388 // Utf: A memory address suitable for ldp/stp in TF mode.
389 // Usa: An absolute symbolic address.
390 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
391 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
392 case 'z': // Zero register, wzr or xzr
393 Info.setAllowsRegister();
394 return true;
395 case 'x': // Floating point and SIMD registers (V0-V15)
396 Info.setAllowsRegister();
397 return true;
398 }
399 return false;
400}
Erich Keaneebba5922017-07-21 22:37:03 +0000401
Tim Northoverad4c5db2017-07-24 17:06:23 +0000402bool AArch64TargetInfo::validateConstraintModifier(
403 StringRef Constraint, char Modifier, unsigned Size,
404 std::string &SuggestedModifier) const {
405 // Strip off constraint modifiers.
406 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
407 Constraint = Constraint.substr(1);
408
409 switch (Constraint[0]) {
410 default:
411 return true;
412 case 'z':
413 case 'r': {
414 switch (Modifier) {
415 case 'x':
416 case 'w':
417 // For now assume that the person knows what they're
418 // doing with the modifier.
419 return true;
420 default:
421 // By default an 'r' constraint will be in the 'x'
422 // registers.
423 if (Size == 64)
424 return true;
425
426 SuggestedModifier = "w";
427 return false;
428 }
429 }
430 }
431}
432
433const char *AArch64TargetInfo::getClobbers() const { return ""; }
434
435int AArch64TargetInfo::getEHDataRegisterNumber(unsigned RegNo) const {
436 if (RegNo == 0)
437 return 0;
438 if (RegNo == 1)
439 return 1;
440 return -1;
441}
442
443AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple,
444 const TargetOptions &Opts)
445 : AArch64TargetInfo(Triple, Opts) {}
446
447void AArch64leTargetInfo::setDataLayout() {
448 if (getTriple().isOSBinFormatMachO())
449 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
450 else
451 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
452}
453
454void AArch64leTargetInfo::getTargetDefines(const LangOptions &Opts,
455 MacroBuilder &Builder) const {
456 Builder.defineMacro("__AARCH64EL__");
457 AArch64TargetInfo::getTargetDefines(Opts, Builder);
458}
459
460AArch64beTargetInfo::AArch64beTargetInfo(const llvm::Triple &Triple,
461 const TargetOptions &Opts)
462 : AArch64TargetInfo(Triple, Opts) {}
463
464void AArch64beTargetInfo::getTargetDefines(const LangOptions &Opts,
465 MacroBuilder &Builder) const {
466 Builder.defineMacro("__AARCH64EB__");
467 Builder.defineMacro("__AARCH_BIG_ENDIAN");
468 Builder.defineMacro("__ARM_BIG_ENDIAN");
469 AArch64TargetInfo::getTargetDefines(Opts, Builder);
470}
471
472void AArch64beTargetInfo::setDataLayout() {
473 assert(!getTriple().isOSBinFormatMachO());
474 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
475}
476
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000477WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple,
478 const TargetOptions &Opts)
Tim Northoverad4c5db2017-07-24 17:06:23 +0000479 : WindowsTargetInfo<AArch64leTargetInfo>(Triple, Opts), Triple(Triple) {
480
481 // This is an LLP64 platform.
482 // int:4, long:4, long long:8, long double:8.
Tim Northoverad4c5db2017-07-24 17:06:23 +0000483 IntWidth = IntAlign = 32;
484 LongWidth = LongAlign = 32;
485 DoubleAlign = LongLongAlign = 64;
486 LongDoubleWidth = LongDoubleAlign = 64;
487 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
488 IntMaxType = SignedLongLong;
489 Int64Type = SignedLongLong;
490 SizeType = UnsignedLongLong;
491 PtrDiffType = SignedLongLong;
492 IntPtrType = SignedLongLong;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000493}
494
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000495void WindowsARM64TargetInfo::setDataLayout() {
Tim Northoverad4c5db2017-07-24 17:06:23 +0000496 resetDataLayout("e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128");
497}
498
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000499TargetInfo::BuiltinVaListKind
500WindowsARM64TargetInfo::getBuiltinVaListKind() const {
501 return TargetInfo::CharPtrBuiltinVaList;
502}
503
504TargetInfo::CallingConvCheckResult
505WindowsARM64TargetInfo::checkCallingConvention(CallingConv CC) const {
506 switch (CC) {
507 case CC_X86StdCall:
508 case CC_X86ThisCall:
509 case CC_X86FastCall:
510 case CC_X86VectorCall:
511 return CCCR_Ignore;
512 case CC_C:
513 case CC_OpenCLKernel:
Saleem Abdulrasool4d321332017-09-26 19:26:01 +0000514 case CC_PreserveMost:
515 case CC_PreserveAll:
Saleem Abdulrasoolf5878572018-12-06 03:28:37 +0000516 case CC_Swift:
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000517 case CC_Win64:
518 return CCCR_OK;
519 default:
520 return CCCR_Warning;
521 }
522}
523
524MicrosoftARM64TargetInfo::MicrosoftARM64TargetInfo(const llvm::Triple &Triple,
525 const TargetOptions &Opts)
526 : WindowsARM64TargetInfo(Triple, Opts) {
527 TheCXXABI.set(TargetCXXABI::Microsoft);
528}
529
Tim Northoverad4c5db2017-07-24 17:06:23 +0000530void MicrosoftARM64TargetInfo::getVisualStudioDefines(
531 const LangOptions &Opts, MacroBuilder &Builder) const {
532 WindowsTargetInfo<AArch64leTargetInfo>::getVisualStudioDefines(Opts, Builder);
Tim Northoverad4c5db2017-07-24 17:06:23 +0000533 Builder.defineMacro("_M_ARM64", "1");
534}
535
536void MicrosoftARM64TargetInfo::getTargetDefines(const LangOptions &Opts,
537 MacroBuilder &Builder) const {
538 WindowsTargetInfo::getTargetDefines(Opts, Builder);
539 getVisualStudioDefines(Opts, Builder);
540}
541
Sanjin Sijaric56391d62018-07-26 22:18:28 +0000542TargetInfo::CallingConvKind
543MicrosoftARM64TargetInfo::getCallingConvKind(bool ClangABICompat4) const {
544 return CCK_MicrosoftWin64;
545}
546
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000547MinGWARM64TargetInfo::MinGWARM64TargetInfo(const llvm::Triple &Triple,
548 const TargetOptions &Opts)
549 : WindowsARM64TargetInfo(Triple, Opts) {
550 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Tim Northoverad4c5db2017-07-24 17:06:23 +0000551}
552
553DarwinAArch64TargetInfo::DarwinAArch64TargetInfo(const llvm::Triple &Triple,
554 const TargetOptions &Opts)
555 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
556 Int64Type = SignedLongLong;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000557 UseSignedCharForObjCBool = false;
558
559 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
560 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
561
562 TheCXXABI.set(TargetCXXABI::iOS64);
563}
564
565void DarwinAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
566 const llvm::Triple &Triple,
567 MacroBuilder &Builder) const {
568 Builder.defineMacro("__AARCH64_SIMD__");
569 Builder.defineMacro("__ARM64_ARCH_8__");
570 Builder.defineMacro("__ARM_NEON__");
571 Builder.defineMacro("__LITTLE_ENDIAN__");
572 Builder.defineMacro("__REGISTER_PREFIX__", "");
573 Builder.defineMacro("__arm64", "1");
574 Builder.defineMacro("__arm64__", "1");
575
576 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
577}
578
579TargetInfo::BuiltinVaListKind
580DarwinAArch64TargetInfo::getBuiltinVaListKind() const {
581 return TargetInfo::CharPtrBuiltinVaList;
582}
583
584// 64-bit RenderScript is aarch64
585RenderScript64TargetInfo::RenderScript64TargetInfo(const llvm::Triple &Triple,
586 const TargetOptions &Opts)
587 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
588 Triple.getOSName(),
589 Triple.getEnvironmentName()),
590 Opts) {
591 IsRenderScriptTarget = true;
592}
593
594void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts,
595 MacroBuilder &Builder) const {
596 Builder.defineMacro("__RENDERSCRIPT__");
597 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
598}