annotate clang/lib/Basic/Targets/AArch64.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- AArch64.cpp - Implement AArch64 target feature support -----------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file implements AArch64 TargetInfo objects.
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include "AArch64.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
14 #include "clang/Basic/LangOptions.h"
150
anatofuz
parents:
diff changeset
15 #include "clang/Basic/TargetBuiltins.h"
anatofuz
parents:
diff changeset
16 #include "clang/Basic/TargetInfo.h"
anatofuz
parents:
diff changeset
17 #include "llvm/ADT/ArrayRef.h"
anatofuz
parents:
diff changeset
18 #include "llvm/ADT/StringExtras.h"
anatofuz
parents:
diff changeset
19 #include "llvm/ADT/StringSwitch.h"
anatofuz
parents:
diff changeset
20 #include "llvm/Support/AArch64TargetParser.h"
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 using namespace clang;
anatofuz
parents:
diff changeset
23 using namespace clang::targets;
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
anatofuz
parents:
diff changeset
26 #define BUILTIN(ID, TYPE, ATTRS) \
anatofuz
parents:
diff changeset
27 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
anatofuz
parents:
diff changeset
28 #include "clang/Basic/BuiltinsNEON.def"
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 #define BUILTIN(ID, TYPE, ATTRS) \
anatofuz
parents:
diff changeset
31 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
32 #include "clang/Basic/BuiltinsSVE.def"
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
33
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
34 #define BUILTIN(ID, TYPE, ATTRS) \
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
35 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
150
anatofuz
parents:
diff changeset
36 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
anatofuz
parents:
diff changeset
37 {#ID, TYPE, ATTRS, nullptr, LANG, nullptr},
anatofuz
parents:
diff changeset
38 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
anatofuz
parents:
diff changeset
39 {#ID, TYPE, ATTRS, HEADER, LANGS, FEATURE},
anatofuz
parents:
diff changeset
40 #include "clang/Basic/BuiltinsAArch64.def"
anatofuz
parents:
diff changeset
41 };
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
44 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
45 : TargetInfo(Triple), ABI("aapcs") {
anatofuz
parents:
diff changeset
46 if (getTriple().isOSOpenBSD()) {
anatofuz
parents:
diff changeset
47 Int64Type = SignedLongLong;
anatofuz
parents:
diff changeset
48 IntMaxType = SignedLongLong;
anatofuz
parents:
diff changeset
49 } else {
anatofuz
parents:
diff changeset
50 if (!getTriple().isOSDarwin() && !getTriple().isOSNetBSD())
anatofuz
parents:
diff changeset
51 WCharType = UnsignedInt;
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 Int64Type = SignedLong;
anatofuz
parents:
diff changeset
54 IntMaxType = SignedLong;
anatofuz
parents:
diff changeset
55 }
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 // All AArch64 implementations support ARMv8 FP, which makes half a legal type.
anatofuz
parents:
diff changeset
58 HasLegalHalfType = true;
anatofuz
parents:
diff changeset
59 HasFloat16 = true;
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 if (Triple.isArch64Bit())
anatofuz
parents:
diff changeset
62 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
anatofuz
parents:
diff changeset
63 else
anatofuz
parents:
diff changeset
64 LongWidth = LongAlign = PointerWidth = PointerAlign = 32;
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 MaxVectorAlign = 128;
anatofuz
parents:
diff changeset
67 MaxAtomicInlineWidth = 128;
anatofuz
parents:
diff changeset
68 MaxAtomicPromoteWidth = 128;
anatofuz
parents:
diff changeset
69
anatofuz
parents:
diff changeset
70 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
anatofuz
parents:
diff changeset
71 LongDoubleFormat = &llvm::APFloat::IEEEquad();
anatofuz
parents:
diff changeset
72
anatofuz
parents:
diff changeset
73 // Make __builtin_ms_va_list available.
anatofuz
parents:
diff changeset
74 HasBuiltinMSVaList = true;
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 // Make the SVE types available. Note that this deliberately doesn't
anatofuz
parents:
diff changeset
77 // depend on SveMode, since in principle it should be possible to turn
anatofuz
parents:
diff changeset
78 // SVE on and off within a translation unit. It should also be possible
anatofuz
parents:
diff changeset
79 // to compile the global declaration:
anatofuz
parents:
diff changeset
80 //
anatofuz
parents:
diff changeset
81 // __SVInt8_t *ptr;
anatofuz
parents:
diff changeset
82 //
anatofuz
parents:
diff changeset
83 // even without SVE.
anatofuz
parents:
diff changeset
84 HasAArch64SVETypes = true;
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 // {} in inline assembly are neon specifiers, not assembly variant
anatofuz
parents:
diff changeset
87 // specifiers.
anatofuz
parents:
diff changeset
88 NoAsmVariants = true;
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
anatofuz
parents:
diff changeset
91 // contributes to the alignment of the containing aggregate in the same way
anatofuz
parents:
diff changeset
92 // a plain (non bit-field) member of that type would, without exception for
anatofuz
parents:
diff changeset
93 // zero-sized or anonymous bit-fields."
anatofuz
parents:
diff changeset
94 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
anatofuz
parents:
diff changeset
95 UseZeroLengthBitfieldAlignment = true;
anatofuz
parents:
diff changeset
96
anatofuz
parents:
diff changeset
97 // AArch64 targets default to using the ARM C++ ABI.
anatofuz
parents:
diff changeset
98 TheCXXABI.set(TargetCXXABI::GenericAArch64);
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 if (Triple.getOS() == llvm::Triple::Linux)
anatofuz
parents:
diff changeset
101 this->MCountName = "\01_mcount";
anatofuz
parents:
diff changeset
102 else if (Triple.getOS() == llvm::Triple::UnknownOS)
anatofuz
parents:
diff changeset
103 this->MCountName =
anatofuz
parents:
diff changeset
104 Opts.EABIVersion == llvm::EABI::GNU ? "\01_mcount" : "mcount";
anatofuz
parents:
diff changeset
105 }
anatofuz
parents:
diff changeset
106
anatofuz
parents:
diff changeset
107 StringRef AArch64TargetInfo::getABI() const { return ABI; }
anatofuz
parents:
diff changeset
108
anatofuz
parents:
diff changeset
109 bool AArch64TargetInfo::setABI(const std::string &Name) {
anatofuz
parents:
diff changeset
110 if (Name != "aapcs" && Name != "darwinpcs")
anatofuz
parents:
diff changeset
111 return false;
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 ABI = Name;
anatofuz
parents:
diff changeset
114 return true;
anatofuz
parents:
diff changeset
115 }
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 bool AArch64TargetInfo::validateBranchProtection(StringRef Spec,
anatofuz
parents:
diff changeset
118 BranchProtectionInfo &BPI,
anatofuz
parents:
diff changeset
119 StringRef &Err) const {
anatofuz
parents:
diff changeset
120 llvm::AArch64::ParsedBranchProtection PBP;
anatofuz
parents:
diff changeset
121 if (!llvm::AArch64::parseBranchProtection(Spec, PBP, Err))
anatofuz
parents:
diff changeset
122 return false;
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 BPI.SignReturnAddr =
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
125 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
126 .Case("non-leaf", LangOptions::SignReturnAddressScopeKind::NonLeaf)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
127 .Case("all", LangOptions::SignReturnAddressScopeKind::All)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
128 .Default(LangOptions::SignReturnAddressScopeKind::None);
150
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 if (PBP.Key == "a_key")
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
131 BPI.SignKey = LangOptions::SignReturnAddressKeyKind::AKey;
150
anatofuz
parents:
diff changeset
132 else
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
133 BPI.SignKey = LangOptions::SignReturnAddressKeyKind::BKey;
150
anatofuz
parents:
diff changeset
134
anatofuz
parents:
diff changeset
135 BPI.BranchTargetEnforcement = PBP.BranchTargetEnforcement;
anatofuz
parents:
diff changeset
136 return true;
anatofuz
parents:
diff changeset
137 }
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139 bool AArch64TargetInfo::isValidCPUName(StringRef Name) const {
anatofuz
parents:
diff changeset
140 return Name == "generic" ||
anatofuz
parents:
diff changeset
141 llvm::AArch64::parseCPUArch(Name) != llvm::AArch64::ArchKind::INVALID;
anatofuz
parents:
diff changeset
142 }
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 bool AArch64TargetInfo::setCPU(const std::string &Name) {
anatofuz
parents:
diff changeset
145 return isValidCPUName(Name);
anatofuz
parents:
diff changeset
146 }
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 void AArch64TargetInfo::fillValidCPUList(
anatofuz
parents:
diff changeset
149 SmallVectorImpl<StringRef> &Values) const {
anatofuz
parents:
diff changeset
150 llvm::AArch64::fillValidCPUArchList(Values);
anatofuz
parents:
diff changeset
151 }
anatofuz
parents:
diff changeset
152
anatofuz
parents:
diff changeset
153 void AArch64TargetInfo::getTargetDefinesARMV81A(const LangOptions &Opts,
anatofuz
parents:
diff changeset
154 MacroBuilder &Builder) const {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
155 // FIXME: Armv8.1 makes __ARM_FEATURE_CRC32 mandatory. Handle it here.
150
anatofuz
parents:
diff changeset
156 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
anatofuz
parents:
diff changeset
157 }
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 void AArch64TargetInfo::getTargetDefinesARMV82A(const LangOptions &Opts,
anatofuz
parents:
diff changeset
160 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
161 // Also include the ARMv8.1 defines
anatofuz
parents:
diff changeset
162 getTargetDefinesARMV81A(Opts, Builder);
anatofuz
parents:
diff changeset
163 }
anatofuz
parents:
diff changeset
164
anatofuz
parents:
diff changeset
165 void AArch64TargetInfo::getTargetDefinesARMV83A(const LangOptions &Opts,
anatofuz
parents:
diff changeset
166 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
167 Builder.defineMacro("__ARM_FEATURE_COMPLEX", "1");
anatofuz
parents:
diff changeset
168 Builder.defineMacro("__ARM_FEATURE_JCVT", "1");
anatofuz
parents:
diff changeset
169 // Also include the Armv8.2 defines
anatofuz
parents:
diff changeset
170 getTargetDefinesARMV82A(Opts, Builder);
anatofuz
parents:
diff changeset
171 }
anatofuz
parents:
diff changeset
172
anatofuz
parents:
diff changeset
173 void AArch64TargetInfo::getTargetDefinesARMV84A(const LangOptions &Opts,
anatofuz
parents:
diff changeset
174 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
175 // Also include the Armv8.3 defines
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
176 // FIXME: Armv8.4 makes __ARM_FEATURE_ATOMICS, defined in GCC, mandatory.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
177 // Add and handle it here.
150
anatofuz
parents:
diff changeset
178 getTargetDefinesARMV83A(Opts, Builder);
anatofuz
parents:
diff changeset
179 }
anatofuz
parents:
diff changeset
180
anatofuz
parents:
diff changeset
181 void AArch64TargetInfo::getTargetDefinesARMV85A(const LangOptions &Opts,
anatofuz
parents:
diff changeset
182 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
183 // Also include the Armv8.4 defines
anatofuz
parents:
diff changeset
184 getTargetDefinesARMV84A(Opts, Builder);
anatofuz
parents:
diff changeset
185 }
anatofuz
parents:
diff changeset
186
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
187 void AArch64TargetInfo::getTargetDefinesARMV86A(const LangOptions &Opts,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
188 MacroBuilder &Builder) const {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
189 // Also include the Armv8.5 defines
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
190 // FIXME: Armv8.6 makes the following extensions mandatory:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
191 // - __ARM_FEATURE_BF16
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
192 // - __ARM_FEATURE_MATMUL_INT8
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
193 // Handle them here.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
194 getTargetDefinesARMV85A(Opts, Builder);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
195 }
150
anatofuz
parents:
diff changeset
196
anatofuz
parents:
diff changeset
197 void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
anatofuz
parents:
diff changeset
198 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
199 // Target identification.
anatofuz
parents:
diff changeset
200 Builder.defineMacro("__aarch64__");
anatofuz
parents:
diff changeset
201 // For bare-metal.
anatofuz
parents:
diff changeset
202 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
anatofuz
parents:
diff changeset
203 getTriple().isOSBinFormatELF())
anatofuz
parents:
diff changeset
204 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
205
anatofuz
parents:
diff changeset
206 // Target properties.
anatofuz
parents:
diff changeset
207 if (!getTriple().isOSWindows() && getTriple().isArch64Bit()) {
anatofuz
parents:
diff changeset
208 Builder.defineMacro("_LP64");
anatofuz
parents:
diff changeset
209 Builder.defineMacro("__LP64__");
anatofuz
parents:
diff changeset
210 }
anatofuz
parents:
diff changeset
211
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
212 std::string CodeModel = getTargetOpts().CodeModel;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
213 if (CodeModel == "default")
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
214 CodeModel = "small";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
215 for (char &c : CodeModel)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
216 c = toupper(c);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
217 Builder.defineMacro("__AARCH64_CMODEL_" + CodeModel + "__");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
218
150
anatofuz
parents:
diff changeset
219 // ACLE predefines. Many can only have one possible value on v8 AArch64.
anatofuz
parents:
diff changeset
220 Builder.defineMacro("__ARM_ACLE", "200");
anatofuz
parents:
diff changeset
221 Builder.defineMacro("__ARM_ARCH", "8");
anatofuz
parents:
diff changeset
222 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
anatofuz
parents:
diff changeset
223
anatofuz
parents:
diff changeset
224 Builder.defineMacro("__ARM_64BIT_STATE", "1");
anatofuz
parents:
diff changeset
225 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
anatofuz
parents:
diff changeset
226 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
anatofuz
parents:
diff changeset
227
anatofuz
parents:
diff changeset
228 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
anatofuz
parents:
diff changeset
229 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
anatofuz
parents:
diff changeset
230 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
anatofuz
parents:
diff changeset
231 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
anatofuz
parents:
diff changeset
232 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
anatofuz
parents:
diff changeset
233 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
anatofuz
parents:
diff changeset
234 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
anatofuz
parents:
diff changeset
235
anatofuz
parents:
diff changeset
236 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
anatofuz
parents:
diff changeset
237
anatofuz
parents:
diff changeset
238 // 0xe implies support for half, single and double precision operations.
anatofuz
parents:
diff changeset
239 Builder.defineMacro("__ARM_FP", "0xE");
anatofuz
parents:
diff changeset
240
anatofuz
parents:
diff changeset
241 // PCS specifies this for SysV variants, which is all we support. Other ABIs
anatofuz
parents:
diff changeset
242 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
anatofuz
parents:
diff changeset
243 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
anatofuz
parents:
diff changeset
244 Builder.defineMacro("__ARM_FP16_ARGS", "1");
anatofuz
parents:
diff changeset
245
anatofuz
parents:
diff changeset
246 if (Opts.UnsafeFPMath)
anatofuz
parents:
diff changeset
247 Builder.defineMacro("__ARM_FP_FAST", "1");
anatofuz
parents:
diff changeset
248
anatofuz
parents:
diff changeset
249 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
anatofuz
parents:
diff changeset
250 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
anatofuz
parents:
diff changeset
251
anatofuz
parents:
diff changeset
252 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ? "1" : "4");
anatofuz
parents:
diff changeset
253
anatofuz
parents:
diff changeset
254 if (FPU & NeonMode) {
anatofuz
parents:
diff changeset
255 Builder.defineMacro("__ARM_NEON", "1");
anatofuz
parents:
diff changeset
256 // 64-bit NEON supports half, single and double precision operations.
anatofuz
parents:
diff changeset
257 Builder.defineMacro("__ARM_NEON_FP", "0xE");
anatofuz
parents:
diff changeset
258 }
anatofuz
parents:
diff changeset
259
anatofuz
parents:
diff changeset
260 if (HasCRC)
anatofuz
parents:
diff changeset
261 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
anatofuz
parents:
diff changeset
262
anatofuz
parents:
diff changeset
263 if (HasCrypto)
anatofuz
parents:
diff changeset
264 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
anatofuz
parents:
diff changeset
265
anatofuz
parents:
diff changeset
266 if (HasUnaligned)
anatofuz
parents:
diff changeset
267 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
anatofuz
parents:
diff changeset
268
anatofuz
parents:
diff changeset
269 if ((FPU & NeonMode) && HasFullFP16)
anatofuz
parents:
diff changeset
270 Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1");
anatofuz
parents:
diff changeset
271 if (HasFullFP16)
anatofuz
parents:
diff changeset
272 Builder.defineMacro("__ARM_FEATURE_FP16_SCALAR_ARITHMETIC", "1");
anatofuz
parents:
diff changeset
273
anatofuz
parents:
diff changeset
274 if (HasDotProd)
anatofuz
parents:
diff changeset
275 Builder.defineMacro("__ARM_FEATURE_DOTPROD", "1");
anatofuz
parents:
diff changeset
276
anatofuz
parents:
diff changeset
277 if (HasMTE)
anatofuz
parents:
diff changeset
278 Builder.defineMacro("__ARM_FEATURE_MEMORY_TAGGING", "1");
anatofuz
parents:
diff changeset
279
anatofuz
parents:
diff changeset
280 if (HasTME)
anatofuz
parents:
diff changeset
281 Builder.defineMacro("__ARM_FEATURE_TME", "1");
anatofuz
parents:
diff changeset
282
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
283 if (HasMatMul)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
284 Builder.defineMacro("__ARM_FEATURE_MATMUL_INT8", "1");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
285
150
anatofuz
parents:
diff changeset
286 if ((FPU & NeonMode) && HasFP16FML)
anatofuz
parents:
diff changeset
287 Builder.defineMacro("__ARM_FEATURE_FP16FML", "1");
anatofuz
parents:
diff changeset
288
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
289 if (Opts.hasSignReturnAddress()) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
290 // Bitmask:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
291 // 0: Protection using the A key
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
292 // 1: Protection using the B key
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
293 // 2: Protection including leaf functions
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
294 unsigned Value = 0;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
295
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
296 if (Opts.isSignReturnAddressWithAKey())
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
297 Value |= (1 << 0);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
298 else
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
299 Value |= (1 << 1);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
300
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
301 if (Opts.isSignReturnAddressScopeAll())
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
302 Value |= (1 << 2);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
303
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
304 Builder.defineMacro("__ARM_FEATURE_PAC_DEFAULT", std::to_string(Value));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
305 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
306
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
307 if (Opts.BranchTargetEnforcement)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
308 Builder.defineMacro("__ARM_FEATURE_BTI_DEFAULT", "1");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
309
150
anatofuz
parents:
diff changeset
310 switch (ArchKind) {
anatofuz
parents:
diff changeset
311 default:
anatofuz
parents:
diff changeset
312 break;
anatofuz
parents:
diff changeset
313 case llvm::AArch64::ArchKind::ARMV8_1A:
anatofuz
parents:
diff changeset
314 getTargetDefinesARMV81A(Opts, Builder);
anatofuz
parents:
diff changeset
315 break;
anatofuz
parents:
diff changeset
316 case llvm::AArch64::ArchKind::ARMV8_2A:
anatofuz
parents:
diff changeset
317 getTargetDefinesARMV82A(Opts, Builder);
anatofuz
parents:
diff changeset
318 break;
anatofuz
parents:
diff changeset
319 case llvm::AArch64::ArchKind::ARMV8_3A:
anatofuz
parents:
diff changeset
320 getTargetDefinesARMV83A(Opts, Builder);
anatofuz
parents:
diff changeset
321 break;
anatofuz
parents:
diff changeset
322 case llvm::AArch64::ArchKind::ARMV8_4A:
anatofuz
parents:
diff changeset
323 getTargetDefinesARMV84A(Opts, Builder);
anatofuz
parents:
diff changeset
324 break;
anatofuz
parents:
diff changeset
325 case llvm::AArch64::ArchKind::ARMV8_5A:
anatofuz
parents:
diff changeset
326 getTargetDefinesARMV85A(Opts, Builder);
anatofuz
parents:
diff changeset
327 break;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
328 case llvm::AArch64::ArchKind::ARMV8_6A:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
329 getTargetDefinesARMV86A(Opts, Builder);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
330 break;
150
anatofuz
parents:
diff changeset
331 }
anatofuz
parents:
diff changeset
332
anatofuz
parents:
diff changeset
333 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
anatofuz
parents:
diff changeset
334 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
anatofuz
parents:
diff changeset
335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
anatofuz
parents:
diff changeset
336 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
anatofuz
parents:
diff changeset
337 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
anatofuz
parents:
diff changeset
338 }
anatofuz
parents:
diff changeset
339
anatofuz
parents:
diff changeset
340 ArrayRef<Builtin::Info> AArch64TargetInfo::getTargetBuiltins() const {
anatofuz
parents:
diff changeset
341 return llvm::makeArrayRef(BuiltinInfo, clang::AArch64::LastTSBuiltin -
anatofuz
parents:
diff changeset
342 Builtin::FirstTSBuiltin);
anatofuz
parents:
diff changeset
343 }
anatofuz
parents:
diff changeset
344
anatofuz
parents:
diff changeset
345 bool AArch64TargetInfo::hasFeature(StringRef Feature) const {
anatofuz
parents:
diff changeset
346 return Feature == "aarch64" || Feature == "arm64" || Feature == "arm" ||
anatofuz
parents:
diff changeset
347 (Feature == "neon" && (FPU & NeonMode)) ||
anatofuz
parents:
diff changeset
348 (Feature == "sve" && (FPU & SveMode));
anatofuz
parents:
diff changeset
349 }
anatofuz
parents:
diff changeset
350
anatofuz
parents:
diff changeset
351 bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
anatofuz
parents:
diff changeset
352 DiagnosticsEngine &Diags) {
anatofuz
parents:
diff changeset
353 FPU = FPUMode;
anatofuz
parents:
diff changeset
354 HasCRC = false;
anatofuz
parents:
diff changeset
355 HasCrypto = false;
anatofuz
parents:
diff changeset
356 HasUnaligned = true;
anatofuz
parents:
diff changeset
357 HasFullFP16 = false;
anatofuz
parents:
diff changeset
358 HasDotProd = false;
anatofuz
parents:
diff changeset
359 HasFP16FML = false;
anatofuz
parents:
diff changeset
360 HasMTE = false;
anatofuz
parents:
diff changeset
361 HasTME = false;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
362 HasMatMul = false;
150
anatofuz
parents:
diff changeset
363 ArchKind = llvm::AArch64::ArchKind::ARMV8A;
anatofuz
parents:
diff changeset
364
anatofuz
parents:
diff changeset
365 for (const auto &Feature : Features) {
anatofuz
parents:
diff changeset
366 if (Feature == "+neon")
anatofuz
parents:
diff changeset
367 FPU |= NeonMode;
anatofuz
parents:
diff changeset
368 if (Feature == "+sve")
anatofuz
parents:
diff changeset
369 FPU |= SveMode;
anatofuz
parents:
diff changeset
370 if (Feature == "+crc")
anatofuz
parents:
diff changeset
371 HasCRC = true;
anatofuz
parents:
diff changeset
372 if (Feature == "+crypto")
anatofuz
parents:
diff changeset
373 HasCrypto = true;
anatofuz
parents:
diff changeset
374 if (Feature == "+strict-align")
anatofuz
parents:
diff changeset
375 HasUnaligned = false;
anatofuz
parents:
diff changeset
376 if (Feature == "+v8.1a")
anatofuz
parents:
diff changeset
377 ArchKind = llvm::AArch64::ArchKind::ARMV8_1A;
anatofuz
parents:
diff changeset
378 if (Feature == "+v8.2a")
anatofuz
parents:
diff changeset
379 ArchKind = llvm::AArch64::ArchKind::ARMV8_2A;
anatofuz
parents:
diff changeset
380 if (Feature == "+v8.3a")
anatofuz
parents:
diff changeset
381 ArchKind = llvm::AArch64::ArchKind::ARMV8_3A;
anatofuz
parents:
diff changeset
382 if (Feature == "+v8.4a")
anatofuz
parents:
diff changeset
383 ArchKind = llvm::AArch64::ArchKind::ARMV8_4A;
anatofuz
parents:
diff changeset
384 if (Feature == "+v8.5a")
anatofuz
parents:
diff changeset
385 ArchKind = llvm::AArch64::ArchKind::ARMV8_5A;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
386 if (Feature == "+v8.6a")
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
387 ArchKind = llvm::AArch64::ArchKind::ARMV8_6A;
150
anatofuz
parents:
diff changeset
388 if (Feature == "+fullfp16")
anatofuz
parents:
diff changeset
389 HasFullFP16 = true;
anatofuz
parents:
diff changeset
390 if (Feature == "+dotprod")
anatofuz
parents:
diff changeset
391 HasDotProd = true;
anatofuz
parents:
diff changeset
392 if (Feature == "+fp16fml")
anatofuz
parents:
diff changeset
393 HasFP16FML = true;
anatofuz
parents:
diff changeset
394 if (Feature == "+mte")
anatofuz
parents:
diff changeset
395 HasMTE = true;
anatofuz
parents:
diff changeset
396 if (Feature == "+tme")
anatofuz
parents:
diff changeset
397 HasTME = true;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
398 if (Feature == "+i8mm")
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
399 HasMatMul = true;
150
anatofuz
parents:
diff changeset
400 }
anatofuz
parents:
diff changeset
401
anatofuz
parents:
diff changeset
402 setDataLayout();
anatofuz
parents:
diff changeset
403
anatofuz
parents:
diff changeset
404 return true;
anatofuz
parents:
diff changeset
405 }
anatofuz
parents:
diff changeset
406
anatofuz
parents:
diff changeset
407 TargetInfo::CallingConvCheckResult
anatofuz
parents:
diff changeset
408 AArch64TargetInfo::checkCallingConvention(CallingConv CC) const {
anatofuz
parents:
diff changeset
409 switch (CC) {
anatofuz
parents:
diff changeset
410 case CC_C:
anatofuz
parents:
diff changeset
411 case CC_Swift:
anatofuz
parents:
diff changeset
412 case CC_PreserveMost:
anatofuz
parents:
diff changeset
413 case CC_PreserveAll:
anatofuz
parents:
diff changeset
414 case CC_OpenCLKernel:
anatofuz
parents:
diff changeset
415 case CC_AArch64VectorCall:
anatofuz
parents:
diff changeset
416 case CC_Win64:
anatofuz
parents:
diff changeset
417 return CCCR_OK;
anatofuz
parents:
diff changeset
418 default:
anatofuz
parents:
diff changeset
419 return CCCR_Warning;
anatofuz
parents:
diff changeset
420 }
anatofuz
parents:
diff changeset
421 }
anatofuz
parents:
diff changeset
422
anatofuz
parents:
diff changeset
423 bool AArch64TargetInfo::isCLZForZeroUndef() const { return false; }
anatofuz
parents:
diff changeset
424
anatofuz
parents:
diff changeset
425 TargetInfo::BuiltinVaListKind AArch64TargetInfo::getBuiltinVaListKind() const {
anatofuz
parents:
diff changeset
426 return TargetInfo::AArch64ABIBuiltinVaList;
anatofuz
parents:
diff changeset
427 }
anatofuz
parents:
diff changeset
428
anatofuz
parents:
diff changeset
429 const char *const AArch64TargetInfo::GCCRegNames[] = {
anatofuz
parents:
diff changeset
430 // 32-bit Integer registers
anatofuz
parents:
diff changeset
431 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10", "w11",
anatofuz
parents:
diff changeset
432 "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21", "w22",
anatofuz
parents:
diff changeset
433 "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
anatofuz
parents:
diff changeset
434
anatofuz
parents:
diff changeset
435 // 64-bit Integer registers
anatofuz
parents:
diff changeset
436 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11",
anatofuz
parents:
diff changeset
437 "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22",
anatofuz
parents:
diff changeset
438 "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
anatofuz
parents:
diff changeset
439
anatofuz
parents:
diff changeset
440 // 32-bit floating point regsisters
anatofuz
parents:
diff changeset
441 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11",
anatofuz
parents:
diff changeset
442 "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
anatofuz
parents:
diff changeset
443 "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
anatofuz
parents:
diff changeset
444
anatofuz
parents:
diff changeset
445 // 64-bit floating point regsisters
anatofuz
parents:
diff changeset
446 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11",
anatofuz
parents:
diff changeset
447 "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
anatofuz
parents:
diff changeset
448 "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
anatofuz
parents:
diff changeset
449
anatofuz
parents:
diff changeset
450 // Neon vector registers
anatofuz
parents:
diff changeset
451 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11",
anatofuz
parents:
diff changeset
452 "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22",
anatofuz
parents:
diff changeset
453 "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
anatofuz
parents:
diff changeset
454
anatofuz
parents:
diff changeset
455 // SVE vector registers
anatofuz
parents:
diff changeset
456 "z0", "z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8", "z9", "z10",
anatofuz
parents:
diff changeset
457 "z11", "z12", "z13", "z14", "z15", "z16", "z17", "z18", "z19", "z20", "z21",
anatofuz
parents:
diff changeset
458 "z22", "z23", "z24", "z25", "z26", "z27", "z28", "z29", "z30", "z31",
anatofuz
parents:
diff changeset
459
anatofuz
parents:
diff changeset
460 // SVE predicate registers
anatofuz
parents:
diff changeset
461 "p0", "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10",
anatofuz
parents:
diff changeset
462 "p11", "p12", "p13", "p14", "p15"
anatofuz
parents:
diff changeset
463 };
anatofuz
parents:
diff changeset
464
anatofuz
parents:
diff changeset
465 ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
anatofuz
parents:
diff changeset
466 return llvm::makeArrayRef(GCCRegNames);
anatofuz
parents:
diff changeset
467 }
anatofuz
parents:
diff changeset
468
anatofuz
parents:
diff changeset
469 const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
anatofuz
parents:
diff changeset
470 {{"w31"}, "wsp"},
anatofuz
parents:
diff changeset
471 {{"x31"}, "sp"},
anatofuz
parents:
diff changeset
472 // GCC rN registers are aliases of xN registers.
anatofuz
parents:
diff changeset
473 {{"r0"}, "x0"},
anatofuz
parents:
diff changeset
474 {{"r1"}, "x1"},
anatofuz
parents:
diff changeset
475 {{"r2"}, "x2"},
anatofuz
parents:
diff changeset
476 {{"r3"}, "x3"},
anatofuz
parents:
diff changeset
477 {{"r4"}, "x4"},
anatofuz
parents:
diff changeset
478 {{"r5"}, "x5"},
anatofuz
parents:
diff changeset
479 {{"r6"}, "x6"},
anatofuz
parents:
diff changeset
480 {{"r7"}, "x7"},
anatofuz
parents:
diff changeset
481 {{"r8"}, "x8"},
anatofuz
parents:
diff changeset
482 {{"r9"}, "x9"},
anatofuz
parents:
diff changeset
483 {{"r10"}, "x10"},
anatofuz
parents:
diff changeset
484 {{"r11"}, "x11"},
anatofuz
parents:
diff changeset
485 {{"r12"}, "x12"},
anatofuz
parents:
diff changeset
486 {{"r13"}, "x13"},
anatofuz
parents:
diff changeset
487 {{"r14"}, "x14"},
anatofuz
parents:
diff changeset
488 {{"r15"}, "x15"},
anatofuz
parents:
diff changeset
489 {{"r16"}, "x16"},
anatofuz
parents:
diff changeset
490 {{"r17"}, "x17"},
anatofuz
parents:
diff changeset
491 {{"r18"}, "x18"},
anatofuz
parents:
diff changeset
492 {{"r19"}, "x19"},
anatofuz
parents:
diff changeset
493 {{"r20"}, "x20"},
anatofuz
parents:
diff changeset
494 {{"r21"}, "x21"},
anatofuz
parents:
diff changeset
495 {{"r22"}, "x22"},
anatofuz
parents:
diff changeset
496 {{"r23"}, "x23"},
anatofuz
parents:
diff changeset
497 {{"r24"}, "x24"},
anatofuz
parents:
diff changeset
498 {{"r25"}, "x25"},
anatofuz
parents:
diff changeset
499 {{"r26"}, "x26"},
anatofuz
parents:
diff changeset
500 {{"r27"}, "x27"},
anatofuz
parents:
diff changeset
501 {{"r28"}, "x28"},
anatofuz
parents:
diff changeset
502 {{"r29", "x29"}, "fp"},
anatofuz
parents:
diff changeset
503 {{"r30", "x30"}, "lr"},
anatofuz
parents:
diff changeset
504 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
anatofuz
parents:
diff changeset
505 // don't want to substitute one of these for a different-sized one.
anatofuz
parents:
diff changeset
506 };
anatofuz
parents:
diff changeset
507
anatofuz
parents:
diff changeset
508 ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
anatofuz
parents:
diff changeset
509 return llvm::makeArrayRef(GCCRegAliases);
anatofuz
parents:
diff changeset
510 }
anatofuz
parents:
diff changeset
511
anatofuz
parents:
diff changeset
512 bool AArch64TargetInfo::validateAsmConstraint(
anatofuz
parents:
diff changeset
513 const char *&Name, TargetInfo::ConstraintInfo &Info) const {
anatofuz
parents:
diff changeset
514 switch (*Name) {
anatofuz
parents:
diff changeset
515 default:
anatofuz
parents:
diff changeset
516 return false;
anatofuz
parents:
diff changeset
517 case 'w': // Floating point and SIMD registers (V0-V31)
anatofuz
parents:
diff changeset
518 Info.setAllowsRegister();
anatofuz
parents:
diff changeset
519 return true;
anatofuz
parents:
diff changeset
520 case 'I': // Constant that can be used with an ADD instruction
anatofuz
parents:
diff changeset
521 case 'J': // Constant that can be used with a SUB instruction
anatofuz
parents:
diff changeset
522 case 'K': // Constant that can be used with a 32-bit logical instruction
anatofuz
parents:
diff changeset
523 case 'L': // Constant that can be used with a 64-bit logical instruction
anatofuz
parents:
diff changeset
524 case 'M': // Constant that can be used as a 32-bit MOV immediate
anatofuz
parents:
diff changeset
525 case 'N': // Constant that can be used as a 64-bit MOV immediate
anatofuz
parents:
diff changeset
526 case 'Y': // Floating point constant zero
anatofuz
parents:
diff changeset
527 case 'Z': // Integer constant zero
anatofuz
parents:
diff changeset
528 return true;
anatofuz
parents:
diff changeset
529 case 'Q': // A memory reference with base register and no offset
anatofuz
parents:
diff changeset
530 Info.setAllowsMemory();
anatofuz
parents:
diff changeset
531 return true;
anatofuz
parents:
diff changeset
532 case 'S': // A symbolic address
anatofuz
parents:
diff changeset
533 Info.setAllowsRegister();
anatofuz
parents:
diff changeset
534 return true;
anatofuz
parents:
diff changeset
535 case 'U':
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
536 if (Name[1] == 'p' && (Name[2] == 'l' || Name[2] == 'a')) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
537 // SVE predicate registers ("Upa"=P0-15, "Upl"=P0-P7)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
538 Info.setAllowsRegister();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
539 Name += 2;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
540 return true;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
541 }
150
anatofuz
parents:
diff changeset
542 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
anatofuz
parents:
diff changeset
543 // Utf: A memory address suitable for ldp/stp in TF mode.
anatofuz
parents:
diff changeset
544 // Usa: An absolute symbolic address.
anatofuz
parents:
diff changeset
545 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
546
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
547 // Better to return an error saying that it's an unrecognised constraint
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
548 // even if this is a valid constraint in gcc.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
549 return false;
150
anatofuz
parents:
diff changeset
550 case 'z': // Zero register, wzr or xzr
anatofuz
parents:
diff changeset
551 Info.setAllowsRegister();
anatofuz
parents:
diff changeset
552 return true;
anatofuz
parents:
diff changeset
553 case 'x': // Floating point and SIMD registers (V0-V15)
anatofuz
parents:
diff changeset
554 Info.setAllowsRegister();
anatofuz
parents:
diff changeset
555 return true;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
556 case 'y': // SVE registers (V0-V7)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
557 Info.setAllowsRegister();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
558 return true;
150
anatofuz
parents:
diff changeset
559 }
anatofuz
parents:
diff changeset
560 return false;
anatofuz
parents:
diff changeset
561 }
anatofuz
parents:
diff changeset
562
anatofuz
parents:
diff changeset
563 bool AArch64TargetInfo::validateConstraintModifier(
anatofuz
parents:
diff changeset
564 StringRef Constraint, char Modifier, unsigned Size,
anatofuz
parents:
diff changeset
565 std::string &SuggestedModifier) const {
anatofuz
parents:
diff changeset
566 // Strip off constraint modifiers.
anatofuz
parents:
diff changeset
567 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
anatofuz
parents:
diff changeset
568 Constraint = Constraint.substr(1);
anatofuz
parents:
diff changeset
569
anatofuz
parents:
diff changeset
570 switch (Constraint[0]) {
anatofuz
parents:
diff changeset
571 default:
anatofuz
parents:
diff changeset
572 return true;
anatofuz
parents:
diff changeset
573 case 'z':
anatofuz
parents:
diff changeset
574 case 'r': {
anatofuz
parents:
diff changeset
575 switch (Modifier) {
anatofuz
parents:
diff changeset
576 case 'x':
anatofuz
parents:
diff changeset
577 case 'w':
anatofuz
parents:
diff changeset
578 // For now assume that the person knows what they're
anatofuz
parents:
diff changeset
579 // doing with the modifier.
anatofuz
parents:
diff changeset
580 return true;
anatofuz
parents:
diff changeset
581 default:
anatofuz
parents:
diff changeset
582 // By default an 'r' constraint will be in the 'x'
anatofuz
parents:
diff changeset
583 // registers.
anatofuz
parents:
diff changeset
584 if (Size == 64)
anatofuz
parents:
diff changeset
585 return true;
anatofuz
parents:
diff changeset
586
anatofuz
parents:
diff changeset
587 SuggestedModifier = "w";
anatofuz
parents:
diff changeset
588 return false;
anatofuz
parents:
diff changeset
589 }
anatofuz
parents:
diff changeset
590 }
anatofuz
parents:
diff changeset
591 }
anatofuz
parents:
diff changeset
592 }
anatofuz
parents:
diff changeset
593
anatofuz
parents:
diff changeset
594 const char *AArch64TargetInfo::getClobbers() const { return ""; }
anatofuz
parents:
diff changeset
595
anatofuz
parents:
diff changeset
596 int AArch64TargetInfo::getEHDataRegisterNumber(unsigned RegNo) const {
anatofuz
parents:
diff changeset
597 if (RegNo == 0)
anatofuz
parents:
diff changeset
598 return 0;
anatofuz
parents:
diff changeset
599 if (RegNo == 1)
anatofuz
parents:
diff changeset
600 return 1;
anatofuz
parents:
diff changeset
601 return -1;
anatofuz
parents:
diff changeset
602 }
anatofuz
parents:
diff changeset
603
anatofuz
parents:
diff changeset
604 bool AArch64TargetInfo::hasInt128Type() const { return true; }
anatofuz
parents:
diff changeset
605
anatofuz
parents:
diff changeset
606 AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
607 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
608 : AArch64TargetInfo(Triple, Opts) {}
anatofuz
parents:
diff changeset
609
anatofuz
parents:
diff changeset
610 void AArch64leTargetInfo::setDataLayout() {
anatofuz
parents:
diff changeset
611 if (getTriple().isOSBinFormatMachO()) {
anatofuz
parents:
diff changeset
612 if(getTriple().isArch32Bit())
anatofuz
parents:
diff changeset
613 resetDataLayout("e-m:o-p:32:32-i64:64-i128:128-n32:64-S128");
anatofuz
parents:
diff changeset
614 else
anatofuz
parents:
diff changeset
615 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
anatofuz
parents:
diff changeset
616 } else
anatofuz
parents:
diff changeset
617 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
anatofuz
parents:
diff changeset
618 }
anatofuz
parents:
diff changeset
619
anatofuz
parents:
diff changeset
620 void AArch64leTargetInfo::getTargetDefines(const LangOptions &Opts,
anatofuz
parents:
diff changeset
621 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
622 Builder.defineMacro("__AARCH64EL__");
anatofuz
parents:
diff changeset
623 AArch64TargetInfo::getTargetDefines(Opts, Builder);
anatofuz
parents:
diff changeset
624 }
anatofuz
parents:
diff changeset
625
anatofuz
parents:
diff changeset
626 AArch64beTargetInfo::AArch64beTargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
627 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
628 : AArch64TargetInfo(Triple, Opts) {}
anatofuz
parents:
diff changeset
629
anatofuz
parents:
diff changeset
630 void AArch64beTargetInfo::getTargetDefines(const LangOptions &Opts,
anatofuz
parents:
diff changeset
631 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
632 Builder.defineMacro("__AARCH64EB__");
anatofuz
parents:
diff changeset
633 Builder.defineMacro("__AARCH_BIG_ENDIAN");
anatofuz
parents:
diff changeset
634 Builder.defineMacro("__ARM_BIG_ENDIAN");
anatofuz
parents:
diff changeset
635 AArch64TargetInfo::getTargetDefines(Opts, Builder);
anatofuz
parents:
diff changeset
636 }
anatofuz
parents:
diff changeset
637
anatofuz
parents:
diff changeset
638 void AArch64beTargetInfo::setDataLayout() {
anatofuz
parents:
diff changeset
639 assert(!getTriple().isOSBinFormatMachO());
anatofuz
parents:
diff changeset
640 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
anatofuz
parents:
diff changeset
641 }
anatofuz
parents:
diff changeset
642
anatofuz
parents:
diff changeset
643 WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
644 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
645 : WindowsTargetInfo<AArch64leTargetInfo>(Triple, Opts), Triple(Triple) {
anatofuz
parents:
diff changeset
646
anatofuz
parents:
diff changeset
647 // This is an LLP64 platform.
anatofuz
parents:
diff changeset
648 // int:4, long:4, long long:8, long double:8.
anatofuz
parents:
diff changeset
649 IntWidth = IntAlign = 32;
anatofuz
parents:
diff changeset
650 LongWidth = LongAlign = 32;
anatofuz
parents:
diff changeset
651 DoubleAlign = LongLongAlign = 64;
anatofuz
parents:
diff changeset
652 LongDoubleWidth = LongDoubleAlign = 64;
anatofuz
parents:
diff changeset
653 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
anatofuz
parents:
diff changeset
654 IntMaxType = SignedLongLong;
anatofuz
parents:
diff changeset
655 Int64Type = SignedLongLong;
anatofuz
parents:
diff changeset
656 SizeType = UnsignedLongLong;
anatofuz
parents:
diff changeset
657 PtrDiffType = SignedLongLong;
anatofuz
parents:
diff changeset
658 IntPtrType = SignedLongLong;
anatofuz
parents:
diff changeset
659 }
anatofuz
parents:
diff changeset
660
anatofuz
parents:
diff changeset
661 void WindowsARM64TargetInfo::setDataLayout() {
anatofuz
parents:
diff changeset
662 resetDataLayout("e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128");
anatofuz
parents:
diff changeset
663 }
anatofuz
parents:
diff changeset
664
anatofuz
parents:
diff changeset
665 TargetInfo::BuiltinVaListKind
anatofuz
parents:
diff changeset
666 WindowsARM64TargetInfo::getBuiltinVaListKind() const {
anatofuz
parents:
diff changeset
667 return TargetInfo::CharPtrBuiltinVaList;
anatofuz
parents:
diff changeset
668 }
anatofuz
parents:
diff changeset
669
anatofuz
parents:
diff changeset
670 TargetInfo::CallingConvCheckResult
anatofuz
parents:
diff changeset
671 WindowsARM64TargetInfo::checkCallingConvention(CallingConv CC) const {
anatofuz
parents:
diff changeset
672 switch (CC) {
anatofuz
parents:
diff changeset
673 case CC_X86StdCall:
anatofuz
parents:
diff changeset
674 case CC_X86ThisCall:
anatofuz
parents:
diff changeset
675 case CC_X86FastCall:
anatofuz
parents:
diff changeset
676 case CC_X86VectorCall:
anatofuz
parents:
diff changeset
677 return CCCR_Ignore;
anatofuz
parents:
diff changeset
678 case CC_C:
anatofuz
parents:
diff changeset
679 case CC_OpenCLKernel:
anatofuz
parents:
diff changeset
680 case CC_PreserveMost:
anatofuz
parents:
diff changeset
681 case CC_PreserveAll:
anatofuz
parents:
diff changeset
682 case CC_Swift:
anatofuz
parents:
diff changeset
683 case CC_Win64:
anatofuz
parents:
diff changeset
684 return CCCR_OK;
anatofuz
parents:
diff changeset
685 default:
anatofuz
parents:
diff changeset
686 return CCCR_Warning;
anatofuz
parents:
diff changeset
687 }
anatofuz
parents:
diff changeset
688 }
anatofuz
parents:
diff changeset
689
anatofuz
parents:
diff changeset
690 MicrosoftARM64TargetInfo::MicrosoftARM64TargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
691 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
692 : WindowsARM64TargetInfo(Triple, Opts) {
anatofuz
parents:
diff changeset
693 TheCXXABI.set(TargetCXXABI::Microsoft);
anatofuz
parents:
diff changeset
694 }
anatofuz
parents:
diff changeset
695
anatofuz
parents:
diff changeset
696 void MicrosoftARM64TargetInfo::getTargetDefines(const LangOptions &Opts,
anatofuz
parents:
diff changeset
697 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
698 WindowsARM64TargetInfo::getTargetDefines(Opts, Builder);
anatofuz
parents:
diff changeset
699 Builder.defineMacro("_M_ARM64", "1");
anatofuz
parents:
diff changeset
700 }
anatofuz
parents:
diff changeset
701
anatofuz
parents:
diff changeset
702 TargetInfo::CallingConvKind
anatofuz
parents:
diff changeset
703 MicrosoftARM64TargetInfo::getCallingConvKind(bool ClangABICompat4) const {
anatofuz
parents:
diff changeset
704 return CCK_MicrosoftWin64;
anatofuz
parents:
diff changeset
705 }
anatofuz
parents:
diff changeset
706
anatofuz
parents:
diff changeset
707 unsigned MicrosoftARM64TargetInfo::getMinGlobalAlign(uint64_t TypeSize) const {
anatofuz
parents:
diff changeset
708 unsigned Align = WindowsARM64TargetInfo::getMinGlobalAlign(TypeSize);
anatofuz
parents:
diff changeset
709
anatofuz
parents:
diff changeset
710 // MSVC does size based alignment for arm64 based on alignment section in
anatofuz
parents:
diff changeset
711 // below document, replicate that to keep alignment consistent with object
anatofuz
parents:
diff changeset
712 // files compiled by MSVC.
anatofuz
parents:
diff changeset
713 // https://docs.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions
anatofuz
parents:
diff changeset
714 if (TypeSize >= 512) { // TypeSize >= 64 bytes
anatofuz
parents:
diff changeset
715 Align = std::max(Align, 128u); // align type at least 16 bytes
anatofuz
parents:
diff changeset
716 } else if (TypeSize >= 64) { // TypeSize >= 8 bytes
anatofuz
parents:
diff changeset
717 Align = std::max(Align, 64u); // align type at least 8 butes
anatofuz
parents:
diff changeset
718 } else if (TypeSize >= 16) { // TypeSize >= 2 bytes
anatofuz
parents:
diff changeset
719 Align = std::max(Align, 32u); // align type at least 4 bytes
anatofuz
parents:
diff changeset
720 }
anatofuz
parents:
diff changeset
721 return Align;
anatofuz
parents:
diff changeset
722 }
anatofuz
parents:
diff changeset
723
anatofuz
parents:
diff changeset
724 MinGWARM64TargetInfo::MinGWARM64TargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
725 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
726 : WindowsARM64TargetInfo(Triple, Opts) {
anatofuz
parents:
diff changeset
727 TheCXXABI.set(TargetCXXABI::GenericAArch64);
anatofuz
parents:
diff changeset
728 }
anatofuz
parents:
diff changeset
729
anatofuz
parents:
diff changeset
730 DarwinAArch64TargetInfo::DarwinAArch64TargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
731 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
732 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
anatofuz
parents:
diff changeset
733 Int64Type = SignedLongLong;
anatofuz
parents:
diff changeset
734 if (getTriple().isArch32Bit())
anatofuz
parents:
diff changeset
735 IntMaxType = SignedLongLong;
anatofuz
parents:
diff changeset
736
anatofuz
parents:
diff changeset
737 WCharType = SignedInt;
anatofuz
parents:
diff changeset
738 UseSignedCharForObjCBool = false;
anatofuz
parents:
diff changeset
739
anatofuz
parents:
diff changeset
740 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
anatofuz
parents:
diff changeset
741 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
anatofuz
parents:
diff changeset
742
anatofuz
parents:
diff changeset
743 UseZeroLengthBitfieldAlignment = false;
anatofuz
parents:
diff changeset
744
anatofuz
parents:
diff changeset
745 if (getTriple().isArch32Bit()) {
anatofuz
parents:
diff changeset
746 UseBitFieldTypeAlignment = false;
anatofuz
parents:
diff changeset
747 ZeroLengthBitfieldBoundary = 32;
anatofuz
parents:
diff changeset
748 UseZeroLengthBitfieldAlignment = true;
anatofuz
parents:
diff changeset
749 TheCXXABI.set(TargetCXXABI::WatchOS);
anatofuz
parents:
diff changeset
750 } else
anatofuz
parents:
diff changeset
751 TheCXXABI.set(TargetCXXABI::iOS64);
anatofuz
parents:
diff changeset
752 }
anatofuz
parents:
diff changeset
753
anatofuz
parents:
diff changeset
754 void DarwinAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
anatofuz
parents:
diff changeset
755 const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
756 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
757 Builder.defineMacro("__AARCH64_SIMD__");
anatofuz
parents:
diff changeset
758 if (Triple.isArch32Bit())
anatofuz
parents:
diff changeset
759 Builder.defineMacro("__ARM64_ARCH_8_32__");
anatofuz
parents:
diff changeset
760 else
anatofuz
parents:
diff changeset
761 Builder.defineMacro("__ARM64_ARCH_8__");
anatofuz
parents:
diff changeset
762 Builder.defineMacro("__ARM_NEON__");
anatofuz
parents:
diff changeset
763 Builder.defineMacro("__LITTLE_ENDIAN__");
anatofuz
parents:
diff changeset
764 Builder.defineMacro("__REGISTER_PREFIX__", "");
anatofuz
parents:
diff changeset
765 Builder.defineMacro("__arm64", "1");
anatofuz
parents:
diff changeset
766 Builder.defineMacro("__arm64__", "1");
anatofuz
parents:
diff changeset
767
anatofuz
parents:
diff changeset
768 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
anatofuz
parents:
diff changeset
769 }
anatofuz
parents:
diff changeset
770
anatofuz
parents:
diff changeset
771 TargetInfo::BuiltinVaListKind
anatofuz
parents:
diff changeset
772 DarwinAArch64TargetInfo::getBuiltinVaListKind() const {
anatofuz
parents:
diff changeset
773 return TargetInfo::CharPtrBuiltinVaList;
anatofuz
parents:
diff changeset
774 }
anatofuz
parents:
diff changeset
775
anatofuz
parents:
diff changeset
776 // 64-bit RenderScript is aarch64
anatofuz
parents:
diff changeset
777 RenderScript64TargetInfo::RenderScript64TargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
778 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
779 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
anatofuz
parents:
diff changeset
780 Triple.getOSName(),
anatofuz
parents:
diff changeset
781 Triple.getEnvironmentName()),
anatofuz
parents:
diff changeset
782 Opts) {
anatofuz
parents:
diff changeset
783 IsRenderScriptTarget = true;
anatofuz
parents:
diff changeset
784 }
anatofuz
parents:
diff changeset
785
anatofuz
parents:
diff changeset
786 void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts,
anatofuz
parents:
diff changeset
787 MacroBuilder &Builder) const {
anatofuz
parents:
diff changeset
788 Builder.defineMacro("__RENDERSCRIPT__");
anatofuz
parents:
diff changeset
789 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
anatofuz
parents:
diff changeset
790 }