blob: 5d64aa8fecce4516de45d87b4349cc517dc3d806 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068//===----------------------------------------------------------------------===//
69// Defines specific to certain operating systems.
70//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000071
Torok Edwinb2b37c62009-06-30 17:10:35 +000072namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000073template<typename TgtInfo>
74class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000075protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000076 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000077 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000079 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000080 void getTargetDefines(const LangOptions &Opts,
81 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 TgtInfo::getTargetDefines(Opts, Builder);
83 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000084 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000085
86};
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Eric Christopher7d0c7252015-09-24 21:17:04 +000088// CloudABI Target
89template <typename Target>
90class CloudABITargetInfo : public OSTargetInfo<Target> {
91protected:
92 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
93 MacroBuilder &Builder) const override {
94 Builder.defineMacro("__CloudABI__");
95 Builder.defineMacro("__ELF__");
96
97 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
98 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
99 Builder.defineMacro("__STDC_UTF_16__");
100 Builder.defineMacro("__STDC_UTF_32__");
101 }
102
103public:
104 CloudABITargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000105 : OSTargetInfo<Target>(Triple) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000106};
107
Daniel Dunbard86666f2010-01-26 01:44:04 +0000108static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000109 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000110 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000111 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000112 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000115 // AddressSanitizer doesn't play well with source fortification, which is on
116 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000117 if (Opts.Sanitize.has(SanitizerKind::Address))
118 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000119
John McCall460ce582015-10-22 18:38:17 +0000120 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
121 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000124 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000125 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000126 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000127
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000128 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000129 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000130 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000131 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000132
133 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000134 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000135
Daniel Dunbarecf13562011-04-19 21:40:34 +0000136 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000138 if (Triple.isMacOSX()) {
139 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 Triple.getOSVersion(Maj, Min, Rev);
143 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000145
Sebastian Pop422377c2012-01-20 22:01:23 +0000146 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000147 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000148 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
149 if (PlatformName == "win32") {
150 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
151 return;
152 }
153
Evan Cheng31dd9a62014-01-26 23:12:43 +0000154 // Set the appropriate OS version define.
155 if (Triple.isiOS()) {
156 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
157 char Str[6];
158 Str[0] = '0' + Maj;
159 Str[1] = '0' + (Min / 10);
160 Str[2] = '0' + (Min % 10);
161 Str[3] = '0' + (Rev / 10);
162 Str[4] = '0' + (Rev % 10);
163 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000164 if (Triple.isTvOS())
165 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
166 else
167 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
168 Str);
169
170 } else if (Triple.isWatchOS()) {
171 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
172 char Str[6];
173 Str[0] = '0' + Maj;
174 Str[1] = '0' + (Min / 10);
175 Str[2] = '0' + (Min % 10);
176 Str[3] = '0' + (Rev / 10);
177 Str[4] = '0' + (Rev % 10);
178 Str[5] = '\0';
179 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000180 } else if (Triple.isMacOSX()) {
181 // Note that the Driver allows versions which aren't representable in the
182 // define (because we only get a single digit for the minor and micro
183 // revision numbers). So, we limit them to the maximum representable
184 // version.
185 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000186 char Str[7];
187 if (Maj < 10 || (Maj == 10 && Min < 10)) {
188 Str[0] = '0' + (Maj / 10);
189 Str[1] = '0' + (Maj % 10);
190 Str[2] = '0' + std::min(Min, 9U);
191 Str[3] = '0' + std::min(Rev, 9U);
192 Str[4] = '\0';
193 } else {
194 // Handle versions > 10.9.
195 Str[0] = '0' + (Maj / 10);
196 Str[1] = '0' + (Maj % 10);
197 Str[2] = '0' + (Min / 10);
198 Str[3] = '0' + (Min % 10);
199 Str[4] = '0' + (Rev / 10);
200 Str[5] = '0' + (Rev % 10);
201 Str[6] = '\0';
202 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000203 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000204 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000205
Tim Northover157d9112014-01-16 08:48:16 +0000206 // Tell users about the kernel if there is one.
207 if (Triple.isOSDarwin())
208 Builder.defineMacro("__MACH__");
209
Daniel Dunbarecf13562011-04-19 21:40:34 +0000210 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000211}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213template<typename Target>
214class DarwinTargetInfo : public OSTargetInfo<Target> {
215protected:
Craig Topper3164f332014-03-11 03:39:26 +0000216 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
217 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000218 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000219 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220 }
Mike Stump11289f42009-09-09 15:08:12 +0000221
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000223 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000224 // By default, no TLS, and we whitelist permitted architecture/OS
225 // combinations.
226 this->TLSSupported = false;
227
228 if (Triple.isMacOSX())
229 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
230 else if (Triple.isiOS()) {
231 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
232 if (Triple.getArch() == llvm::Triple::x86_64 ||
233 Triple.getArch() == llvm::Triple::aarch64)
234 this->TLSSupported = !Triple.isOSVersionLT(8);
235 else if (Triple.getArch() == llvm::Triple::x86 ||
236 Triple.getArch() == llvm::Triple::arm ||
237 Triple.getArch() == llvm::Triple::thumb)
238 this->TLSSupported = !Triple.isOSVersionLT(9);
239 } else if (Triple.isWatchOS())
240 this->TLSSupported = !Triple.isOSVersionLT(2);
241
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000242 this->MCountName = "\01mcount";
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244
Craig Topper3164f332014-03-11 03:39:26 +0000245 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000246 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000247 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000248 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000249 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000250 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000251 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000255 // FIXME: We should return 0 when building kexts.
256 return "__TEXT,__StaticInit,regular,pure_instructions";
257 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000258
John McCalleed64c72012-01-29 01:20:30 +0000259 /// Darwin does not support protected visibility. Darwin's "default"
260 /// is very similar to ELF's "protected"; Darwin requires a "weak"
261 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000262 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000263 return false;
264 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000265};
266
Chris Lattner30ba6742009-08-10 19:03:04 +0000267
Torok Edwinb2b37c62009-06-30 17:10:35 +0000268// DragonFlyBSD Target
269template<typename Target>
270class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
271protected:
Craig Topper3164f332014-03-11 03:39:26 +0000272 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
273 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000275 Builder.defineMacro("__DragonFly__");
276 Builder.defineMacro("__DragonFly_cc_version", "100001");
277 Builder.defineMacro("__ELF__");
278 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
279 Builder.defineMacro("__tune_i386__");
280 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281 }
282public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000283 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
284 : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 switch (Triple.getArch()) {
286 default:
287 case llvm::Triple::x86:
288 case llvm::Triple::x86_64:
289 this->MCountName = ".mcount";
290 break;
291 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000292 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000293};
294
295// FreeBSD Target
296template<typename Target>
297class FreeBSDTargetInfo : public OSTargetInfo<Target> {
298protected:
Craig Topper3164f332014-03-11 03:39:26 +0000299 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
300 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000301 // FreeBSD defines; list based off of gcc output
302
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000303 unsigned Release = Triple.getOSMajorVersion();
304 if (Release == 0U)
305 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000307 Builder.defineMacro("__FreeBSD__", Twine(Release));
308 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000309 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
310 DefineStd(Builder, "unix", Opts);
311 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000312
313 // On FreeBSD, wchar_t contains the number of the code point as
314 // used by the character set of the locale. These character sets are
315 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000316 //
317 // FIXME: This is wrong; the macro refers to the numerical values
318 // of wchar_t *literals*, which are not locale-dependent. However,
319 // FreeBSD systems apparently depend on us getting this wrong, and
320 // setting this to 1 is conforming even if all the basic source
321 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000322 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000323 }
324public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000325 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 switch (Triple.getArch()) {
327 default:
328 case llvm::Triple::x86:
329 case llvm::Triple::x86_64:
330 this->MCountName = ".mcount";
331 break;
332 case llvm::Triple::mips:
333 case llvm::Triple::mipsel:
334 case llvm::Triple::ppc:
335 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000336 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000337 this->MCountName = "_mcount";
338 break;
339 case llvm::Triple::arm:
340 this->MCountName = "__mcount";
341 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000342 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000344};
345
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000346// GNU/kFreeBSD Target
347template<typename Target>
348class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
349protected:
Craig Topper3164f332014-03-11 03:39:26 +0000350 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
351 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000352 // GNU/kFreeBSD defines; list based off of gcc output
353
354 DefineStd(Builder, "unix", Opts);
355 Builder.defineMacro("__FreeBSD_kernel__");
356 Builder.defineMacro("__GLIBC__");
357 Builder.defineMacro("__ELF__");
358 if (Opts.POSIXThreads)
359 Builder.defineMacro("_REENTRANT");
360 if (Opts.CPlusPlus)
361 Builder.defineMacro("_GNU_SOURCE");
362 }
363public:
Eric Christopher917e9522014-11-18 22:36:15 +0000364 KFreeBSDTargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000365 : OSTargetInfo<Target>(Triple) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000366};
367
Chris Lattner3e2ee142010-07-07 16:01:42 +0000368// Minix Target
369template<typename Target>
370class MinixTargetInfo : public OSTargetInfo<Target> {
371protected:
Craig Topper3164f332014-03-11 03:39:26 +0000372 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
373 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000374 // Minix defines
375
376 Builder.defineMacro("__minix", "3");
377 Builder.defineMacro("_EM_WSIZE", "4");
378 Builder.defineMacro("_EM_PSIZE", "4");
379 Builder.defineMacro("_EM_SSIZE", "2");
380 Builder.defineMacro("_EM_LSIZE", "4");
381 Builder.defineMacro("_EM_FSIZE", "4");
382 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000383 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000384 DefineStd(Builder, "unix", Opts);
385 }
386public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000387 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000388};
389
Torok Edwinb2b37c62009-06-30 17:10:35 +0000390// Linux target
391template<typename Target>
392class LinuxTargetInfo : public OSTargetInfo<Target> {
393protected:
Craig Topper3164f332014-03-11 03:39:26 +0000394 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
395 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000396 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000397 DefineStd(Builder, "unix", Opts);
398 DefineStd(Builder, "linux", Opts);
399 Builder.defineMacro("__gnu_linux__");
400 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000401 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000402 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000403 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000404 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000405 this->PlatformName = "android";
406 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
407 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000408 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000409 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000410 if (Opts.CPlusPlus)
411 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000412 }
413public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000414 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000415 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000416
417 switch (Triple.getArch()) {
418 default:
419 break;
420 case llvm::Triple::ppc:
421 case llvm::Triple::ppc64:
422 case llvm::Triple::ppc64le:
423 this->MCountName = "_mcount";
424 break;
425 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000426 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000427
Craig Topper3164f332014-03-11 03:39:26 +0000428 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000429 return ".text.startup";
430 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431};
432
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000433// NetBSD Target
434template<typename Target>
435class NetBSDTargetInfo : public OSTargetInfo<Target> {
436protected:
Craig Topper3164f332014-03-11 03:39:26 +0000437 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
438 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000439 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000440 Builder.defineMacro("__NetBSD__");
441 Builder.defineMacro("__unix__");
442 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000443 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000444 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000445
446 switch (Triple.getArch()) {
447 default:
448 break;
449 case llvm::Triple::arm:
450 case llvm::Triple::armeb:
451 case llvm::Triple::thumb:
452 case llvm::Triple::thumbeb:
453 Builder.defineMacro("__ARM_DWARF_EH__");
454 break;
455 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000456 }
457public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000458 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000459 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000460 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000461};
462
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463// OpenBSD Target
464template<typename Target>
465class OpenBSDTargetInfo : public OSTargetInfo<Target> {
466protected:
Craig Topper3164f332014-03-11 03:39:26 +0000467 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
468 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000469 // OpenBSD defines; list based off of gcc output
470
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000471 Builder.defineMacro("__OpenBSD__");
472 DefineStd(Builder, "unix", Opts);
473 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000474 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000475 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000476 }
477public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000478 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000479 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000480
Eli Friedman3715d1f2011-12-15 02:15:56 +0000481 switch (Triple.getArch()) {
482 default:
483 case llvm::Triple::x86:
484 case llvm::Triple::x86_64:
485 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000486 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000487 this->MCountName = "__mcount";
488 break;
489 case llvm::Triple::mips64:
490 case llvm::Triple::mips64el:
491 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000492 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000493 this->MCountName = "_mcount";
494 break;
495 }
496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497};
498
Eli Friedman9fa28852012-08-08 23:57:20 +0000499// Bitrig Target
500template<typename Target>
501class BitrigTargetInfo : public OSTargetInfo<Target> {
502protected:
Craig Topper3164f332014-03-11 03:39:26 +0000503 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
504 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000505 // Bitrig defines; list based off of gcc output
506
507 Builder.defineMacro("__Bitrig__");
508 DefineStd(Builder, "unix", Opts);
509 Builder.defineMacro("__ELF__");
510 if (Opts.POSIXThreads)
511 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000512
513 switch (Triple.getArch()) {
514 default:
515 break;
516 case llvm::Triple::arm:
517 case llvm::Triple::armeb:
518 case llvm::Triple::thumb:
519 case llvm::Triple::thumbeb:
520 Builder.defineMacro("__ARM_DWARF_EH__");
521 break;
522 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000523 }
524public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000525 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000526 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000527 }
528};
529
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000530// PSP Target
531template<typename Target>
532class PSPTargetInfo : public OSTargetInfo<Target> {
533protected:
Craig Topper3164f332014-03-11 03:39:26 +0000534 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
535 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000536 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000537 Builder.defineMacro("PSP");
538 Builder.defineMacro("_PSP");
539 Builder.defineMacro("__psp__");
540 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000541 }
542public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000543 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000544};
545
John Thompsone467e192009-11-19 17:18:50 +0000546// PS3 PPU Target
547template<typename Target>
548class PS3PPUTargetInfo : public OSTargetInfo<Target> {
549protected:
Craig Topper3164f332014-03-11 03:39:26 +0000550 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
551 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000552 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000553 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000554 Builder.defineMacro("__PPU__");
555 Builder.defineMacro("__CELLOS_LV2__");
556 Builder.defineMacro("__ELF__");
557 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000558 Builder.defineMacro("_ARCH_PPC64");
559 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000560 }
561public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000562 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000563 this->LongWidth = this->LongAlign = 32;
564 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000565 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000566 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000567 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000568 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000569 }
570};
571
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000572template <typename Target>
573class PS4OSTargetInfo : public OSTargetInfo<Target> {
574protected:
575 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
576 MacroBuilder &Builder) const override {
577 Builder.defineMacro("__FreeBSD__", "9");
578 Builder.defineMacro("__FreeBSD_cc_version", "900001");
579 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
580 DefineStd(Builder, "unix", Opts);
581 Builder.defineMacro("__ELF__");
582 Builder.defineMacro("__PS4__");
583 }
584public:
585 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
586 this->WCharType = this->UnsignedShort;
587
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000588 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
589 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000590
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000591 // On PS4, do not honor explicit bit field alignment,
592 // as in "__attribute__((aligned(2))) int b : 1;".
593 this->UseExplicitBitFieldAlignment = false;
594
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000595 switch (Triple.getArch()) {
596 default:
597 case llvm::Triple::x86_64:
598 this->MCountName = ".mcount";
599 break;
600 }
601 }
602};
603
Torok Edwinb2b37c62009-06-30 17:10:35 +0000604// Solaris target
605template<typename Target>
606class SolarisTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000610 DefineStd(Builder, "sun", Opts);
611 DefineStd(Builder, "unix", Opts);
612 Builder.defineMacro("__ELF__");
613 Builder.defineMacro("__svr4__");
614 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000615 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
616 // newer, but to 500 for everything else. feature_test.h has a check to
617 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000618 // with a new version.
619 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000620 Builder.defineMacro("_XOPEN_SOURCE", "600");
621 else
622 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000623 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000624 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000625 Builder.defineMacro("_LARGEFILE_SOURCE");
626 Builder.defineMacro("_LARGEFILE64_SOURCE");
627 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000628 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000629 }
630public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000631 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
David Chisnallb526e932012-03-28 18:04:14 +0000632 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000633 // FIXME: WIntType should be SignedLong
634 }
635};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636
637// Windows target
638template<typename Target>
639class WindowsTargetInfo : public OSTargetInfo<Target> {
640protected:
Craig Topper3164f332014-03-11 03:39:26 +0000641 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
642 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000643 Builder.defineMacro("_WIN32");
644 }
645 void getVisualStudioDefines(const LangOptions &Opts,
646 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000647 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000648 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000649 Builder.defineMacro("_CPPRTTI");
650
Reid Kleckner16514352015-01-30 21:42:55 +0000651 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000652 Builder.defineMacro("_CPPUNWIND");
653 }
654
David Majnemer6a658902015-07-22 22:36:26 +0000655 if (Opts.Bool)
656 Builder.defineMacro("__BOOL_DEFINED");
657
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000658 if (!Opts.CharIsSigned)
659 Builder.defineMacro("_CHAR_UNSIGNED");
660
661 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
662 // but it works for now.
663 if (Opts.POSIXThreads)
664 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000665
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000666 if (Opts.MSCompatibilityVersion) {
667 Builder.defineMacro("_MSC_VER",
668 Twine(Opts.MSCompatibilityVersion / 100000));
669 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000670 // FIXME We cannot encode the revision information into 32-bits
671 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000672
David Majnemerb710a932015-05-11 03:57:49 +0000673 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000674 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000675 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000676
677 if (Opts.MicrosoftExt) {
678 Builder.defineMacro("_MSC_EXTENSIONS");
679
680 if (Opts.CPlusPlus11) {
681 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
682 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
683 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
684 }
685 }
686
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000687 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000688 }
689
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000690public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000691 WindowsTargetInfo(const llvm::Triple &Triple)
692 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000693};
694
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000695template <typename Target>
696class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000697protected:
Craig Topper3164f332014-03-11 03:39:26 +0000698 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
699 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000700 if (Opts.POSIXThreads)
701 Builder.defineMacro("_REENTRANT");
702 if (Opts.CPlusPlus)
703 Builder.defineMacro("_GNU_SOURCE");
704
705 DefineStd(Builder, "unix", Opts);
706 Builder.defineMacro("__ELF__");
707 Builder.defineMacro("__native_client__");
708 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000709
710public:
711 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000712 this->LongAlign = 32;
713 this->LongWidth = 32;
714 this->PointerAlign = 32;
715 this->PointerWidth = 32;
716 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000717 this->Int64Type = TargetInfo::SignedLongLong;
718 this->DoubleAlign = 64;
719 this->LongDoubleWidth = 64;
720 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000721 this->LongLongWidth = 64;
722 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000723 this->SizeType = TargetInfo::UnsignedInt;
724 this->PtrDiffType = TargetInfo::SignedInt;
725 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000726 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000727 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000728 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000729 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000731 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000732 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000733 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000734 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000735 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000736 } else {
737 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000738 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000739 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000740 }
741};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000742
Dan Gohmanc2853072015-09-03 22:51:53 +0000743// WebAssembly target
744template <typename Target>
745class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
746 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000747 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000748 // A common platform macro.
749 if (Opts.POSIXThreads)
750 Builder.defineMacro("_REENTRANT");
751 // Follow g++ convention and predefine _GNU_SOURCE for C++.
752 if (Opts.CPlusPlus)
753 Builder.defineMacro("_GNU_SOURCE");
754 }
755
756 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000757 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000758 return ".text.__startup";
759 }
760
761public:
762 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
763 : OSTargetInfo<Target>(Triple) {
764 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000765 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
766 }
767};
Dan Gohmanc2853072015-09-03 22:51:53 +0000768
Chris Lattner09d98f52008-10-05 21:50:58 +0000769//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000770// Specific target implementations.
771//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000772
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000773// PPC abstract base class
774class PPCTargetInfo : public TargetInfo {
775 static const Builtin::Info BuiltinInfo[];
776 static const char * const GCCRegNames[];
777 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000778 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000779
780 // Target cpu features.
781 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000782 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000783 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000784 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000785 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000786 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000787 bool HasBPERMD;
788 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000789
Ulrich Weigand8afad612014-07-28 13:17:52 +0000790protected:
791 std::string ABI;
792
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000793public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000794 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000795 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000796 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000797 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000798 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000799 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000800 LongDoubleWidth = LongDoubleAlign = 128;
801 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
802 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000803
Hal Finkel6b984f02012-07-03 16:51:04 +0000804 /// \brief Flags for architecture specific defines.
805 typedef enum {
806 ArchDefineNone = 0,
807 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
808 ArchDefinePpcgr = 1 << 1,
809 ArchDefinePpcsq = 1 << 2,
810 ArchDefine440 = 1 << 3,
811 ArchDefine603 = 1 << 4,
812 ArchDefine604 = 1 << 5,
813 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000814 ArchDefinePwr5 = 1 << 7,
815 ArchDefinePwr5x = 1 << 8,
816 ArchDefinePwr6 = 1 << 9,
817 ArchDefinePwr6x = 1 << 10,
818 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000819 ArchDefinePwr8 = 1 << 12,
820 ArchDefineA2 = 1 << 13,
821 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000822 } ArchDefineTypes;
823
Bill Schmidt38378a02013-02-01 20:23:10 +0000824 // Note: GCC recognizes the following additional cpus:
825 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
826 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
827 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000828 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000829 bool CPUKnown = llvm::StringSwitch<bool>(Name)
830 .Case("generic", true)
831 .Case("440", true)
832 .Case("450", true)
833 .Case("601", true)
834 .Case("602", true)
835 .Case("603", true)
836 .Case("603e", true)
837 .Case("603ev", true)
838 .Case("604", true)
839 .Case("604e", true)
840 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000841 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000842 .Case("g3", true)
843 .Case("7400", true)
844 .Case("g4", true)
845 .Case("7450", true)
846 .Case("g4+", true)
847 .Case("750", true)
848 .Case("970", true)
849 .Case("g5", true)
850 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000851 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000852 .Case("e500mc", true)
853 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000854 .Case("power3", true)
855 .Case("pwr3", true)
856 .Case("power4", true)
857 .Case("pwr4", true)
858 .Case("power5", true)
859 .Case("pwr5", true)
860 .Case("power5x", true)
861 .Case("pwr5x", true)
862 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("power6x", true)
865 .Case("pwr6x", true)
866 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000867 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000868 .Case("power8", true)
869 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000870 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000871 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000872 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000873 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000874 .Case("powerpc64le", true)
875 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000876 .Default(false);
877
878 if (CPUKnown)
879 CPU = Name;
880
881 return CPUKnown;
882 }
883
Ulrich Weigand8afad612014-07-28 13:17:52 +0000884
885 StringRef getABI() const override { return ABI; }
886
Craig Topper6c03a542015-10-19 04:51:35 +0000887 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
888 return llvm::makeArrayRef(BuiltinInfo,
889 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000890 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000891
Craig Topper3164f332014-03-11 03:39:26 +0000892 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000893
Craig Topper3164f332014-03-11 03:39:26 +0000894 void getTargetDefines(const LangOptions &Opts,
895 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000896
Eric Christopher8c47b422015-10-09 18:39:55 +0000897 bool
898 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
899 StringRef CPU,
900 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000901
Craig Topper3164f332014-03-11 03:39:26 +0000902 bool handleTargetFeatures(std::vector<std::string> &Features,
903 DiagnosticsEngine &Diags) override;
904 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000905 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
906 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000907
Craig Topperf054e3a2015-10-19 03:52:27 +0000908 ArrayRef<const char *> getGCCRegNames() const override;
909 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000910 bool validateAsmConstraint(const char *&Name,
911 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000912 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000913 default: return false;
914 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000915 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000916 case 'b': // Base register
917 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000918 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000919 break;
920 // FIXME: The following are added to allow parsing.
921 // I just took a guess at what the actions should be.
922 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000924 case 'v': // Altivec vector register
925 Info.setAllowsRegister();
926 break;
927 case 'w':
928 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 case 'd':// VSX vector register to hold vector double data
930 case 'f':// VSX vector register to hold vector float data
931 case 's':// VSX vector register to hold scalar float data
932 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000933 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000934 break;
935 default:
936 return false;
937 }
938 Info.setAllowsRegister();
939 Name++; // Skip over 'w'.
940 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 case 'h': // `MQ', `CTR', or `LINK' register
942 case 'q': // `MQ' register
943 case 'c': // `CTR' register
944 case 'l': // `LINK' register
945 case 'x': // `CR' register (condition register) number 0
946 case 'y': // `CR' register (condition register)
947 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000948 Info.setAllowsRegister();
949 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000951 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000952 // (use `L' instead for SImode constants)
953 case 'K': // Unsigned 16-bit constant
954 case 'L': // Signed 16-bit constant shifted left 16 bits
955 case 'M': // Constant larger than 31
956 case 'N': // Exact power of 2
957 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000960 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000962 break;
963 case 'm': // Memory operand. Note that on PowerPC targets, m can
964 // include addresses that update the base register. It
965 // is therefore only safe to use `m' in an asm statement
966 // if that asm statement accesses the operand exactly once.
967 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000968 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000970 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000972 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
973 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 // register to be updated.
975 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000976 if (Name[1] != 's')
977 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000978 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000979 // include any automodification of the base register. Unlike
980 // `m', this constraint can be used in asm statements that
981 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000982 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000983 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000984 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000985 break;
986 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000987 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000988 case 'Z': // Memory operand that is an indexed or indirect from a
989 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000991 Info.setAllowsMemory();
992 Info.setAllowsRegister();
993 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // register (`p' is preferable for asm statements)
997 case 'S': // Constant suitable as a 64-bit mask operand
998 case 'T': // Constant suitable as a 32-bit mask operand
999 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001000 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 // instructions
1002 case 'W': // Vector constant that does not require memory
1003 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001004 break;
1005 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001006 }
John Thompson07a61a42010-06-24 22:44:13 +00001007 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001008 }
Craig Topper3164f332014-03-11 03:39:26 +00001009 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001010 std::string R;
1011 switch (*Constraint) {
1012 case 'e':
1013 case 'w':
1014 // Two-character constraint; add "^" hint for later parsing.
1015 R = std::string("^") + std::string(Constraint, 2);
1016 Constraint++;
1017 break;
1018 default:
1019 return TargetInfo::convertConstraint(Constraint);
1020 }
1021 return R;
1022 }
Craig Topper3164f332014-03-11 03:39:26 +00001023 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001024 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 }
Craig Topper3164f332014-03-11 03:39:26 +00001026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001027 if (RegNo == 0) return 3;
1028 if (RegNo == 1) return 4;
1029 return -1;
1030 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001031
1032 bool hasSjLjLowering() const override {
1033 return true;
1034 }
David Majnemer2617ea62015-06-09 18:05:33 +00001035
1036 bool useFloat128ManglingForLongDouble() const override {
1037 return LongDoubleWidth == 128 &&
1038 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1039 getTriple().isOSBinFormatELF();
1040 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001041};
Anders Carlssonf511f642007-11-27 04:11:28 +00001042
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001043const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001044#define BUILTIN(ID, TYPE, ATTRS) \
1045 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1046#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1047 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001048#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001049};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001050
Eric Christopher917e9522014-11-18 22:36:15 +00001051/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001053bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001055 for (const auto &Feature : Features) {
1056 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001059 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001061 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001063 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001064 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001065 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001066 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001067 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001068 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001069 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001070 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001071 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001072 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001073 // TODO: Finish this list and add an assert that we've handled them
1074 // all.
1075 }
Eric Christopher02c33352015-08-25 00:59:11 +00001076
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001077 return true;
1078}
1079
Chris Lattnerecd49032009-03-02 22:27:17 +00001080/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1081/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001082void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001084 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001086 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001088 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001089 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001091 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001092 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001093 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001094 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001095 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001098 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1099 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001100 } else {
1101 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1102 getTriple().getOS() != llvm::Triple::OpenBSD)
1103 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001104 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001105
Ulrich Weigand8afad612014-07-28 13:17:52 +00001106 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001107 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001108 Builder.defineMacro("_CALL_ELF", "1");
1109 if (ABI == "elfv2")
1110 Builder.defineMacro("_CALL_ELF", "2");
1111
Chris Lattnerecd49032009-03-02 22:27:17 +00001112 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1114 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001115
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001117 if (LongDoubleWidth == 128)
1118 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001119
John Thompsone467e192009-11-19 17:18:50 +00001120 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001121 Builder.defineMacro("__VEC__", "10206");
1122 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001123 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001124
1125 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001126 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1127 .Case("440", ArchDefineName)
1128 .Case("450", ArchDefineName | ArchDefine440)
1129 .Case("601", ArchDefineName)
1130 .Case("602", ArchDefineName | ArchDefinePpcgr)
1131 .Case("603", ArchDefineName | ArchDefinePpcgr)
1132 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1133 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1134 .Case("604", ArchDefineName | ArchDefinePpcgr)
1135 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1136 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001137 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001138 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1139 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1140 .Case("750", ArchDefineName | ArchDefinePpcgr)
1141 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001143 .Case("a2", ArchDefineA2)
1144 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001145 .Case("pwr3", ArchDefinePpcgr)
1146 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1147 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1148 | ArchDefinePpcsq)
1149 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1150 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1152 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1154 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1157 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001158 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1160 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1161 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 .Case("power3", ArchDefinePpcgr)
1163 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1165 | ArchDefinePpcsq)
1166 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1167 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1169 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1171 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1174 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001175 | ArchDefinePpcgr | ArchDefinePpcsq)
1176 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1177 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1178 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001179 .Default(ArchDefineNone);
1180
1181 if (defs & ArchDefineName)
1182 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1183 if (defs & ArchDefinePpcgr)
1184 Builder.defineMacro("_ARCH_PPCGR");
1185 if (defs & ArchDefinePpcsq)
1186 Builder.defineMacro("_ARCH_PPCSQ");
1187 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001188 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 if (defs & ArchDefine603)
1190 Builder.defineMacro("_ARCH_603");
1191 if (defs & ArchDefine604)
1192 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001193 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001194 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001195 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 if (defs & ArchDefinePwr5x)
1198 Builder.defineMacro("_ARCH_PWR5X");
1199 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001200 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001201 if (defs & ArchDefinePwr6x)
1202 Builder.defineMacro("_ARCH_PWR6X");
1203 if (defs & ArchDefinePwr7)
1204 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001205 if (defs & ArchDefinePwr8)
1206 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001207 if (defs & ArchDefineA2)
1208 Builder.defineMacro("_ARCH_A2");
1209 if (defs & ArchDefineA2q) {
1210 Builder.defineMacro("_ARCH_A2Q");
1211 Builder.defineMacro("_ARCH_QP");
1212 }
1213
1214 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1215 Builder.defineMacro("__bg__");
1216 Builder.defineMacro("__THW_BLUEGENE__");
1217 Builder.defineMacro("__bgq__");
1218 Builder.defineMacro("__TOS_BGQ__");
1219 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001220
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001221 if (HasVSX)
1222 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001223 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001224 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001225 if (HasP8Crypto)
1226 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001227 if (HasHTM)
1228 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001229
1230 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1231 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1232 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1233 if (PointerWidth == 64)
1234 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001235
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 // FIXME: The following are not yet generated here by Clang, but are
1237 // generated by GCC:
1238 //
1239 // _SOFT_FLOAT_
1240 // __RECIP_PRECISION__
1241 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 // __RECIP__
1243 // __RECIPF__
1244 // __RSQRTE__
1245 // __RSQRTEF__
1246 // _SOFT_DOUBLE_
1247 // __NO_LWSYNC__
1248 // __HAVE_BSWAP__
1249 // __LONGDOUBLE128
1250 // __CMODEL_MEDIUM__
1251 // __CMODEL_LARGE__
1252 // _CALL_SYSV
1253 // _CALL_DARWIN
1254 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001255}
1256
Eric Christophera8a14c32015-08-31 18:39:16 +00001257// Handle explicit options being passed to the compiler here: if we've
1258// explicitly turned off vsx and turned on power8-vector or direct-move then
1259// go ahead and error since the customer has expressed a somewhat incompatible
1260// set of options.
1261static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001262 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001263
1264 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1265 FeaturesVec.end()) {
1266 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1267 FeaturesVec.end()) {
1268 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1269 << "-mno-vsx";
1270 return false;
1271 }
1272
1273 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1274 FeaturesVec.end()) {
1275 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1276 << "-mno-vsx";
1277 return false;
1278 }
1279 }
1280
1281 return true;
1282}
1283
Eric Christopher8c47b422015-10-09 18:39:55 +00001284bool PPCTargetInfo::initFeatureMap(
1285 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1286 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001287 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1288 .Case("7400", true)
1289 .Case("g4", true)
1290 .Case("7450", true)
1291 .Case("g4+", true)
1292 .Case("970", true)
1293 .Case("g5", true)
1294 .Case("pwr6", true)
1295 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001296 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001297 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001298 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001299 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001300
1301 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001302 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1303 .Case("ppc64le", true)
1304 .Case("pwr8", true)
1305 .Default(false);
1306 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1307 .Case("ppc64le", true)
1308 .Case("pwr8", true)
1309 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001310 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1311 .Case("ppc64le", true)
1312 .Case("pwr8", true)
1313 .Case("pwr7", true)
1314 .Default(false);
1315 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1316 .Case("ppc64le", true)
1317 .Case("pwr8", true)
1318 .Case("pwr7", true)
1319 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001320 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1321 .Case("ppc64le", true)
1322 .Case("pwr8", true)
1323 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001324 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1325 .Case("ppc64le", true)
1326 .Case("pwr8", true)
1327 .Case("pwr7", true)
1328 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001329
Eric Christophera8a14c32015-08-31 18:39:16 +00001330 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1331 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001332
Eric Christopher007b0a02015-08-28 22:32:01 +00001333 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001334}
1335
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001336bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001337 return llvm::StringSwitch<bool>(Feature)
1338 .Case("powerpc", true)
1339 .Case("vsx", HasVSX)
1340 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001341 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001342 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001343 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001344 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001345 .Case("bpermd", HasBPERMD)
1346 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001347 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001348}
Chris Lattner17df24e2008-04-21 18:56:49 +00001349
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001350void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1351 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001352 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1353 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1354 // incompatible options.
1355 if (Enabled) {
1356 if (Name == "vsx") {
1357 Features[Name] = true;
1358 } else if (Name == "direct-move") {
1359 Features[Name] = Features["vsx"] = true;
1360 } else if (Name == "power8-vector") {
1361 Features[Name] = Features["vsx"] = true;
1362 } else {
1363 Features[Name] = true;
1364 }
1365 } else {
1366 if (Name == "vsx") {
1367 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1368 false;
1369 } else {
1370 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001371 }
1372 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001373}
1374
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001375const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001376 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1378 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1379 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1380 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1381 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1382 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1383 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001385 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001387 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1388 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1389 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1390 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001391 "vrsave", "vscr",
1392 "spe_acc", "spefscr",
1393 "sfp"
1394};
Chris Lattner10a5b382007-01-29 05:24:35 +00001395
Craig Topperf054e3a2015-10-19 03:52:27 +00001396ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1397 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001398}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001399
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001400const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1401 // While some of these aliases do map to different registers
1402 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001403 { { "0" }, "r0" },
1404 { { "1"}, "r1" },
1405 { { "2" }, "r2" },
1406 { { "3" }, "r3" },
1407 { { "4" }, "r4" },
1408 { { "5" }, "r5" },
1409 { { "6" }, "r6" },
1410 { { "7" }, "r7" },
1411 { { "8" }, "r8" },
1412 { { "9" }, "r9" },
1413 { { "10" }, "r10" },
1414 { { "11" }, "r11" },
1415 { { "12" }, "r12" },
1416 { { "13" }, "r13" },
1417 { { "14" }, "r14" },
1418 { { "15" }, "r15" },
1419 { { "16" }, "r16" },
1420 { { "17" }, "r17" },
1421 { { "18" }, "r18" },
1422 { { "19" }, "r19" },
1423 { { "20" }, "r20" },
1424 { { "21" }, "r21" },
1425 { { "22" }, "r22" },
1426 { { "23" }, "r23" },
1427 { { "24" }, "r24" },
1428 { { "25" }, "r25" },
1429 { { "26" }, "r26" },
1430 { { "27" }, "r27" },
1431 { { "28" }, "r28" },
1432 { { "29" }, "r29" },
1433 { { "30" }, "r30" },
1434 { { "31" }, "r31" },
1435 { { "fr0" }, "f0" },
1436 { { "fr1" }, "f1" },
1437 { { "fr2" }, "f2" },
1438 { { "fr3" }, "f3" },
1439 { { "fr4" }, "f4" },
1440 { { "fr5" }, "f5" },
1441 { { "fr6" }, "f6" },
1442 { { "fr7" }, "f7" },
1443 { { "fr8" }, "f8" },
1444 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001445 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001446 { { "fr11" }, "f11" },
1447 { { "fr12" }, "f12" },
1448 { { "fr13" }, "f13" },
1449 { { "fr14" }, "f14" },
1450 { { "fr15" }, "f15" },
1451 { { "fr16" }, "f16" },
1452 { { "fr17" }, "f17" },
1453 { { "fr18" }, "f18" },
1454 { { "fr19" }, "f19" },
1455 { { "fr20" }, "f20" },
1456 { { "fr21" }, "f21" },
1457 { { "fr22" }, "f22" },
1458 { { "fr23" }, "f23" },
1459 { { "fr24" }, "f24" },
1460 { { "fr25" }, "f25" },
1461 { { "fr26" }, "f26" },
1462 { { "fr27" }, "f27" },
1463 { { "fr28" }, "f28" },
1464 { { "fr29" }, "f29" },
1465 { { "fr30" }, "f30" },
1466 { { "fr31" }, "f31" },
1467 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001468};
1469
Craig Topperf054e3a2015-10-19 03:52:27 +00001470ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1471 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001472}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001473
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001474class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001476 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001477 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001478
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001479 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001480 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001481 case llvm::Triple::FreeBSD:
1482 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001483 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001484 PtrDiffType = SignedInt;
1485 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001486 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001487 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001488 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001489 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001490
Roman Divacky3ffe7462012-03-13 19:20:17 +00001491 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1492 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001493 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001494 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001495
1496 // PPC32 supports atomics up to 4 bytes.
1497 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001498 }
1499
Craig Topper3164f332014-03-11 03:39:26 +00001500 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001501 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001502 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001503 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001504};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001505
Bill Schmidt778d3872013-07-26 01:36:11 +00001506// Note: ABI differences may eventually require us to have a separate
1507// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001508class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001510 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001511 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001512 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001513 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001514
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001515 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001516 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001517 ABI = "elfv2";
1518 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001519 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001520 ABI = "elfv1";
1521 }
1522
1523 switch (getTriple().getOS()) {
1524 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001525 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001526 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001527 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001528 case llvm::Triple::NetBSD:
1529 IntMaxType = SignedLongLong;
1530 Int64Type = SignedLongLong;
1531 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001532 default:
1533 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001534 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001535
1536 // PPC64 supports atomics up to 8 bytes.
1537 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001538 }
Craig Topper3164f332014-03-11 03:39:26 +00001539 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001540 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001541 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001542 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001543 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001544 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001545 ABI = Name;
1546 return true;
1547 }
1548 return false;
1549 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001551
Roman Divacky965b0b72011-01-06 08:27:10 +00001552class DarwinPPC32TargetInfo :
1553 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001555 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1556 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001557 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001558 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001559 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001560 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001561 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001562 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001563 }
Craig Topper3164f332014-03-11 03:39:26 +00001564 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001565 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001566 }
1567};
1568
1569class DarwinPPC64TargetInfo :
1570 public DarwinTargetInfo<PPC64TargetInfo> {
1571public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001572 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1573 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001574 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001575 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001576 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001577 }
1578};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001579
Eric Christopherc48497a2015-09-18 21:26:24 +00001580static const unsigned NVPTXAddrSpaceMap[] = {
1581 1, // opencl_global
1582 3, // opencl_local
1583 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001584 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001585 0, // opencl_generic
1586 1, // cuda_device
1587 4, // cuda_constant
1588 3, // cuda_shared
1589};
1590
1591class NVPTXTargetInfo : public TargetInfo {
1592 static const char *const GCCRegNames[];
1593 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001594
1595 // The GPU profiles supported by the NVPTX backend
1596 enum GPUKind {
1597 GK_NONE,
1598 GK_SM20,
1599 GK_SM21,
1600 GK_SM30,
1601 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001602 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001603 } GPU;
1604
Eric Christopherc48497a2015-09-18 21:26:24 +00001605public:
1606 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1607 BigEndian = false;
1608 TLSSupported = false;
1609 LongWidth = LongAlign = 64;
1610 AddrSpaceMap = &NVPTXAddrSpaceMap;
1611 UseAddrSpaceMapMangling = true;
1612 // Define available target features
1613 // These must be defined in sorted order!
1614 NoAsmVariants = true;
1615 // Set the default GPU to sm20
1616 GPU = GK_SM20;
1617 }
1618 void getTargetDefines(const LangOptions &Opts,
1619 MacroBuilder &Builder) const override {
1620 Builder.defineMacro("__PTX__");
1621 Builder.defineMacro("__NVPTX__");
1622 if (Opts.CUDAIsDevice) {
1623 // Set __CUDA_ARCH__ for the GPU specified.
1624 std::string CUDAArchCode;
1625 switch (GPU) {
1626 case GK_SM20:
1627 CUDAArchCode = "200";
1628 break;
1629 case GK_SM21:
1630 CUDAArchCode = "210";
1631 break;
1632 case GK_SM30:
1633 CUDAArchCode = "300";
1634 break;
1635 case GK_SM35:
1636 CUDAArchCode = "350";
1637 break;
1638 case GK_SM37:
1639 CUDAArchCode = "370";
1640 break;
1641 default:
1642 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001643 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001644 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001646 }
Craig Topper6c03a542015-10-19 04:51:35 +00001647 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1648 return llvm::makeArrayRef(BuiltinInfo,
1649 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001650 }
1651 bool hasFeature(StringRef Feature) const override {
1652 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001653 }
1654
Craig Topperf054e3a2015-10-19 03:52:27 +00001655 ArrayRef<const char *> getGCCRegNames() const override;
1656 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001657 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001658 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001659 }
1660 bool validateAsmConstraint(const char *&Name,
1661 TargetInfo::ConstraintInfo &Info) const override {
1662 switch (*Name) {
1663 default:
1664 return false;
1665 case 'c':
1666 case 'h':
1667 case 'r':
1668 case 'l':
1669 case 'f':
1670 case 'd':
1671 Info.setAllowsRegister();
1672 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001673 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 }
1675 const char *getClobbers() const override {
1676 // FIXME: Is this really right?
1677 return "";
1678 }
1679 BuiltinVaListKind getBuiltinVaListKind() const override {
1680 // FIXME: implement
1681 return TargetInfo::CharPtrBuiltinVaList;
1682 }
1683 bool setCPU(const std::string &Name) override {
1684 GPU = llvm::StringSwitch<GPUKind>(Name)
1685 .Case("sm_20", GK_SM20)
1686 .Case("sm_21", GK_SM21)
1687 .Case("sm_30", GK_SM30)
1688 .Case("sm_35", GK_SM35)
1689 .Case("sm_37", GK_SM37)
1690 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001691
Eric Christopherc48497a2015-09-18 21:26:24 +00001692 return GPU != GK_NONE;
1693 }
1694};
1695
1696const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1697#define BUILTIN(ID, TYPE, ATTRS) \
1698 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1699#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1700 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1701#include "clang/Basic/BuiltinsNVPTX.def"
1702};
1703
1704const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1705
Craig Topperf054e3a2015-10-19 03:52:27 +00001706ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1707 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001708}
1709
1710class NVPTX32TargetInfo : public NVPTXTargetInfo {
1711public:
1712 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001713 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 PointerWidth = PointerAlign = 32;
1715 SizeType = TargetInfo::UnsignedInt;
1716 PtrDiffType = TargetInfo::SignedInt;
1717 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001718 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001719 }
1720};
1721
1722class NVPTX64TargetInfo : public NVPTXTargetInfo {
1723public:
1724 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1725 PointerWidth = PointerAlign = 64;
1726 SizeType = TargetInfo::UnsignedLong;
1727 PtrDiffType = TargetInfo::SignedLong;
1728 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001729 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001730 }
1731};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001733static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001734 1, // opencl_global
1735 3, // opencl_local
1736 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001737 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001738 1, // cuda_device
1739 2, // cuda_constant
1740 3 // cuda_shared
1741};
1742
Tom Stellarda96344b2014-08-21 13:58:40 +00001743// If you edit the description strings, make sure you update
1744// getPointerWidthV().
1745
Craig Topper273dbc62015-10-18 05:29:26 +00001746static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001747 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1748 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001749
Craig Topper273dbc62015-10-18 05:29:26 +00001750static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001751 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1752 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001753
Craig Topper273dbc62015-10-18 05:29:26 +00001754static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001755 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001756 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1757 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001759class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001760 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001761 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001762
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001763 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001764 enum GPUKind {
1765 GK_NONE,
1766 GK_R600,
1767 GK_R600_DOUBLE_OPS,
1768 GK_R700,
1769 GK_R700_DOUBLE_OPS,
1770 GK_EVERGREEN,
1771 GK_EVERGREEN_DOUBLE_OPS,
1772 GK_NORTHERN_ISLANDS,
1773 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001774 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001775 GK_SEA_ISLANDS,
1776 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001777 } GPU;
1778
Jan Veselyeebeaea2015-05-04 19:53:36 +00001779 bool hasFP64:1;
1780 bool hasFMAF:1;
1781 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001782
Eli Friedmand13b41e2012-10-12 23:32:00 +00001783public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001784 AMDGPUTargetInfo(const llvm::Triple &Triple)
1785 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001786
1787 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001788 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001789 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001790 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001791 hasFMAF = true;
1792 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001793 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001794 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001795 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001796 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001797 hasFMAF = false;
1798 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001799 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001800 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001801 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001802 }
1803
Tom Stellarda96344b2014-08-21 13:58:40 +00001804 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1805 if (GPU <= GK_CAYMAN)
1806 return 32;
1807
1808 switch(AddrSpace) {
1809 default:
1810 return 64;
1811 case 0:
1812 case 3:
1813 case 5:
1814 return 32;
1815 }
1816 }
1817
Craig Topper3164f332014-03-11 03:39:26 +00001818 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001819 return "";
1820 }
1821
Craig Topperf054e3a2015-10-19 03:52:27 +00001822 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823
Craig Topperf054e3a2015-10-19 03:52:27 +00001824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1825 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001826 }
1827
Craig Topper3164f332014-03-11 03:39:26 +00001828 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001829 TargetInfo::ConstraintInfo &Info) const override {
1830 switch (*Name) {
1831 default: break;
1832 case 'v': // vgpr
1833 case 's': // sgpr
1834 Info.setAllowsRegister();
1835 return true;
1836 }
1837 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001838 }
1839
Craig Topper6c03a542015-10-19 04:51:35 +00001840 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1841 return llvm::makeArrayRef(BuiltinInfo,
1842 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001843 }
1844
Craig Topper3164f332014-03-11 03:39:26 +00001845 void getTargetDefines(const LangOptions &Opts,
1846 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001847 if (getTriple().getArch() == llvm::Triple::amdgcn)
1848 Builder.defineMacro("__AMDGCN__");
1849 else
1850 Builder.defineMacro("__R600__");
1851
Jan Veselyeebeaea2015-05-04 19:53:36 +00001852 if (hasFMAF)
1853 Builder.defineMacro("__HAS_FMAF__");
1854 if (hasLDEXPF)
1855 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001856 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001857 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001858 if (Opts.OpenCL) {
1859 if (GPU >= GK_NORTHERN_ISLANDS) {
1860 Builder.defineMacro("cl_khr_byte_addressable_store");
1861 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1862 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1863 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1864 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1865 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001866 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001867 }
1868
Craig Topper3164f332014-03-11 03:39:26 +00001869 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001870 return TargetInfo::CharPtrBuiltinVaList;
1871 }
1872
Craig Topper3164f332014-03-11 03:39:26 +00001873 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001874 GPU = llvm::StringSwitch<GPUKind>(Name)
1875 .Case("r600" , GK_R600)
1876 .Case("rv610", GK_R600)
1877 .Case("rv620", GK_R600)
1878 .Case("rv630", GK_R600)
1879 .Case("rv635", GK_R600)
1880 .Case("rs780", GK_R600)
1881 .Case("rs880", GK_R600)
1882 .Case("rv670", GK_R600_DOUBLE_OPS)
1883 .Case("rv710", GK_R700)
1884 .Case("rv730", GK_R700)
1885 .Case("rv740", GK_R700_DOUBLE_OPS)
1886 .Case("rv770", GK_R700_DOUBLE_OPS)
1887 .Case("palm", GK_EVERGREEN)
1888 .Case("cedar", GK_EVERGREEN)
1889 .Case("sumo", GK_EVERGREEN)
1890 .Case("sumo2", GK_EVERGREEN)
1891 .Case("redwood", GK_EVERGREEN)
1892 .Case("juniper", GK_EVERGREEN)
1893 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1894 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1895 .Case("barts", GK_NORTHERN_ISLANDS)
1896 .Case("turks", GK_NORTHERN_ISLANDS)
1897 .Case("caicos", GK_NORTHERN_ISLANDS)
1898 .Case("cayman", GK_CAYMAN)
1899 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001900 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001901 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1902 .Case("verde", GK_SOUTHERN_ISLANDS)
1903 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001904 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001905 .Case("bonaire", GK_SEA_ISLANDS)
1906 .Case("kabini", GK_SEA_ISLANDS)
1907 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001908 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001909 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001910 .Case("tonga", GK_VOLCANIC_ISLANDS)
1911 .Case("iceland", GK_VOLCANIC_ISLANDS)
1912 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001913 .Case("fiji", GK_VOLCANIC_ISLANDS)
1914 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001915 .Default(GK_NONE);
1916
1917 if (GPU == GK_NONE) {
1918 return false;
1919 }
1920
1921 // Set the correct data layout
1922 switch (GPU) {
1923 case GK_NONE:
1924 case GK_R600:
1925 case GK_R700:
1926 case GK_EVERGREEN:
1927 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001928 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001929 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001930 hasFMAF = false;
1931 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001932 break;
1933 case GK_R600_DOUBLE_OPS:
1934 case GK_R700_DOUBLE_OPS:
1935 case GK_EVERGREEN_DOUBLE_OPS:
1936 case GK_CAYMAN:
James Y Knightb214cbc2016-03-04 19:00:41 +00001937 resetDataLayout(DataLayoutStringR600DoubleOps);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001938 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001939 hasFMAF = true;
1940 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001941 break;
1942 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001943 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001944 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001945 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001946 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001947 hasFMAF = true;
1948 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001949 break;
1950 }
1951
1952 return true;
1953 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001954};
1955
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001956const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001957#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001958 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001959#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001960};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001961const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001962 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1963 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1964 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1965 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1966 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1967 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1968 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1969 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1970 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1971 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1972 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1973 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1974 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1975 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1976 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1977 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1978 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1979 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1980 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1981 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1982 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1983 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1984 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1985 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1986 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1987 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1988 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1989 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1990 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1991 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1992 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1993 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1994 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1995 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1996 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1997 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1998 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1999 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2000 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2001 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2002 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2003 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2004 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2005 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2006 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2007 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2008 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2009 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
Matt Arsenaultb015d622016-02-27 09:06:22 +00002010 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2011 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002012};
2013
Craig Topperf054e3a2015-10-19 03:52:27 +00002014ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2015 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002016}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002017
Eli Friedman3fd920a2008-08-20 02:34:37 +00002018// Namespace for x86 abstract base class
2019const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002020#define BUILTIN(ID, TYPE, ATTRS) \
2021 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002022#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002023 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002024#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002025 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002026#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002027};
Eli Friedmanb5366062008-05-20 14:21:01 +00002028
Nuno Lopescfca1f02009-12-23 17:49:57 +00002029static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002030 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2031 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002032 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002033 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2034 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2035 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002036 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002037 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2038 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002039 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2040 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2041 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2042 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2043 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2044 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2045 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2046 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002047};
2048
Eric Christophercdd36352011-06-21 00:05:20 +00002049const TargetInfo::AddlRegName AddlRegNames[] = {
2050 { { "al", "ah", "eax", "rax" }, 0 },
2051 { { "bl", "bh", "ebx", "rbx" }, 3 },
2052 { { "cl", "ch", "ecx", "rcx" }, 2 },
2053 { { "dl", "dh", "edx", "rdx" }, 1 },
2054 { { "esi", "rsi" }, 4 },
2055 { { "edi", "rdi" }, 5 },
2056 { { "esp", "rsp" }, 7 },
2057 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002058 { { "r8d", "r8w", "r8b" }, 38 },
2059 { { "r9d", "r9w", "r9b" }, 39 },
2060 { { "r10d", "r10w", "r10b" }, 40 },
2061 { { "r11d", "r11w", "r11b" }, 41 },
2062 { { "r12d", "r12w", "r12b" }, 42 },
2063 { { "r13d", "r13w", "r13b" }, 43 },
2064 { { "r14d", "r14w", "r14b" }, 44 },
2065 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002066};
2067
2068// X86 target abstract base class; x86-32 and x86-64 are very close, so
2069// most of the implementation can be shared.
2070class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002071 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002072 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002073 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002074 enum MMX3DNowEnum {
2075 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002076 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002077 enum XOPEnum {
2078 NoXOP,
2079 SSE4A,
2080 FMA4,
2081 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002082 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002083
Craig Topper543f3bd2015-10-14 23:47:57 +00002084 bool HasAES = false;
2085 bool HasPCLMUL = false;
2086 bool HasLZCNT = false;
2087 bool HasRDRND = false;
2088 bool HasFSGSBASE = false;
2089 bool HasBMI = false;
2090 bool HasBMI2 = false;
2091 bool HasPOPCNT = false;
2092 bool HasRTM = false;
2093 bool HasPRFCHW = false;
2094 bool HasRDSEED = false;
2095 bool HasADX = false;
2096 bool HasTBM = false;
2097 bool HasFMA = false;
2098 bool HasF16C = false;
2099 bool HasAVX512CD = false;
2100 bool HasAVX512ER = false;
2101 bool HasAVX512PF = false;
2102 bool HasAVX512DQ = false;
2103 bool HasAVX512BW = false;
2104 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002105 bool HasAVX512VBMI = false;
2106 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002107 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002108 bool HasMPX = false;
2109 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002110 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002111 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002112 bool HasXSAVE = false;
2113 bool HasXSAVEOPT = false;
2114 bool HasXSAVEC = false;
2115 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002116 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002117 bool HasCLFLUSHOPT = false;
2118 bool HasPCOMMIT = false;
2119 bool HasCLWB = false;
2120 bool HasUMIP = false;
2121 bool HasMOVBE = false;
2122 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002123
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002124 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2125 ///
2126 /// Each enumeration represents a particular CPU supported by Clang. These
2127 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2128 enum CPUKind {
2129 CK_Generic,
2130
2131 /// \name i386
2132 /// i386-generation processors.
2133 //@{
2134 CK_i386,
2135 //@}
2136
2137 /// \name i486
2138 /// i486-generation processors.
2139 //@{
2140 CK_i486,
2141 CK_WinChipC6,
2142 CK_WinChip2,
2143 CK_C3,
2144 //@}
2145
2146 /// \name i586
2147 /// i586-generation processors, P5 microarchitecture based.
2148 //@{
2149 CK_i586,
2150 CK_Pentium,
2151 CK_PentiumMMX,
2152 //@}
2153
2154 /// \name i686
2155 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2156 //@{
2157 CK_i686,
2158 CK_PentiumPro,
2159 CK_Pentium2,
2160 CK_Pentium3,
2161 CK_Pentium3M,
2162 CK_PentiumM,
2163 CK_C3_2,
2164
2165 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2166 /// Clang however has some logic to suport this.
2167 // FIXME: Warn, deprecate, and potentially remove this.
2168 CK_Yonah,
2169 //@}
2170
2171 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002172 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002173 //@{
2174 CK_Pentium4,
2175 CK_Pentium4M,
2176 CK_Prescott,
2177 CK_Nocona,
2178 //@}
2179
2180 /// \name Core
2181 /// Core microarchitecture based processors.
2182 //@{
2183 CK_Core2,
2184
2185 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2186 /// codename which GCC no longer accepts as an option to -march, but Clang
2187 /// has some logic for recognizing it.
2188 // FIXME: Warn, deprecate, and potentially remove this.
2189 CK_Penryn,
2190 //@}
2191
2192 /// \name Atom
2193 /// Atom processors
2194 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002195 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002196 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002197 //@}
2198
2199 /// \name Nehalem
2200 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002201 CK_Nehalem,
2202
2203 /// \name Westmere
2204 /// Westmere microarchitecture based processors.
2205 CK_Westmere,
2206
2207 /// \name Sandy Bridge
2208 /// Sandy Bridge microarchitecture based processors.
2209 CK_SandyBridge,
2210
2211 /// \name Ivy Bridge
2212 /// Ivy Bridge microarchitecture based processors.
2213 CK_IvyBridge,
2214
2215 /// \name Haswell
2216 /// Haswell microarchitecture based processors.
2217 CK_Haswell,
2218
2219 /// \name Broadwell
2220 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002221 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002222
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002223 /// \name Skylake Client
2224 /// Skylake client microarchitecture based processors.
2225 CK_SkylakeClient,
2226
2227 /// \name Skylake Server
2228 /// Skylake server microarchitecture based processors.
2229 CK_SkylakeServer,
2230
2231 /// \name Cannonlake Client
2232 /// Cannonlake client microarchitecture based processors.
2233 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002234
Craig Topper449314e2013-08-20 07:09:39 +00002235 /// \name Knights Landing
2236 /// Knights Landing processor.
2237 CK_KNL,
2238
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002239 /// \name K6
2240 /// K6 architecture processors.
2241 //@{
2242 CK_K6,
2243 CK_K6_2,
2244 CK_K6_3,
2245 //@}
2246
2247 /// \name K7
2248 /// K7 architecture processors.
2249 //@{
2250 CK_Athlon,
2251 CK_AthlonThunderbird,
2252 CK_Athlon4,
2253 CK_AthlonXP,
2254 CK_AthlonMP,
2255 //@}
2256
2257 /// \name K8
2258 /// K8 architecture processors.
2259 //@{
2260 CK_Athlon64,
2261 CK_Athlon64SSE3,
2262 CK_AthlonFX,
2263 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002264 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002265 CK_Opteron,
2266 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002267 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002268 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002269
Benjamin Kramer569f2152012-01-10 11:50:18 +00002270 /// \name Bobcat
2271 /// Bobcat architecture processors.
2272 //@{
2273 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002274 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002275 //@}
2276
2277 /// \name Bulldozer
2278 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002279 //@{
2280 CK_BDVER1,
2281 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002282 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002283 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002284 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002285
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002286 /// This specification is deprecated and will be removed in the future.
2287 /// Users should prefer \see CK_K8.
2288 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002289 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002290 CK_x86_64,
2291 //@}
2292
2293 /// \name Geode
2294 /// Geode processors.
2295 //@{
2296 CK_Geode
2297 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002298 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002299
Eric Christopherc50738f2015-08-27 00:05:50 +00002300 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002301 return llvm::StringSwitch<CPUKind>(CPU)
2302 .Case("i386", CK_i386)
2303 .Case("i486", CK_i486)
2304 .Case("winchip-c6", CK_WinChipC6)
2305 .Case("winchip2", CK_WinChip2)
2306 .Case("c3", CK_C3)
2307 .Case("i586", CK_i586)
2308 .Case("pentium", CK_Pentium)
2309 .Case("pentium-mmx", CK_PentiumMMX)
2310 .Case("i686", CK_i686)
2311 .Case("pentiumpro", CK_PentiumPro)
2312 .Case("pentium2", CK_Pentium2)
2313 .Case("pentium3", CK_Pentium3)
2314 .Case("pentium3m", CK_Pentium3M)
2315 .Case("pentium-m", CK_PentiumM)
2316 .Case("c3-2", CK_C3_2)
2317 .Case("yonah", CK_Yonah)
2318 .Case("pentium4", CK_Pentium4)
2319 .Case("pentium4m", CK_Pentium4M)
2320 .Case("prescott", CK_Prescott)
2321 .Case("nocona", CK_Nocona)
2322 .Case("core2", CK_Core2)
2323 .Case("penryn", CK_Penryn)
2324 .Case("bonnell", CK_Bonnell)
2325 .Case("atom", CK_Bonnell) // Legacy name.
2326 .Case("silvermont", CK_Silvermont)
2327 .Case("slm", CK_Silvermont) // Legacy name.
2328 .Case("nehalem", CK_Nehalem)
2329 .Case("corei7", CK_Nehalem) // Legacy name.
2330 .Case("westmere", CK_Westmere)
2331 .Case("sandybridge", CK_SandyBridge)
2332 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2333 .Case("ivybridge", CK_IvyBridge)
2334 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2335 .Case("haswell", CK_Haswell)
2336 .Case("core-avx2", CK_Haswell) // Legacy name.
2337 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002338 .Case("skylake", CK_SkylakeClient)
2339 .Case("skylake-avx512", CK_SkylakeServer)
2340 .Case("skx", CK_SkylakeServer) // Legacy name.
2341 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002342 .Case("knl", CK_KNL)
2343 .Case("k6", CK_K6)
2344 .Case("k6-2", CK_K6_2)
2345 .Case("k6-3", CK_K6_3)
2346 .Case("athlon", CK_Athlon)
2347 .Case("athlon-tbird", CK_AthlonThunderbird)
2348 .Case("athlon-4", CK_Athlon4)
2349 .Case("athlon-xp", CK_AthlonXP)
2350 .Case("athlon-mp", CK_AthlonMP)
2351 .Case("athlon64", CK_Athlon64)
2352 .Case("athlon64-sse3", CK_Athlon64SSE3)
2353 .Case("athlon-fx", CK_AthlonFX)
2354 .Case("k8", CK_K8)
2355 .Case("k8-sse3", CK_K8SSE3)
2356 .Case("opteron", CK_Opteron)
2357 .Case("opteron-sse3", CK_OpteronSSE3)
2358 .Case("barcelona", CK_AMDFAM10)
2359 .Case("amdfam10", CK_AMDFAM10)
2360 .Case("btver1", CK_BTVER1)
2361 .Case("btver2", CK_BTVER2)
2362 .Case("bdver1", CK_BDVER1)
2363 .Case("bdver2", CK_BDVER2)
2364 .Case("bdver3", CK_BDVER3)
2365 .Case("bdver4", CK_BDVER4)
2366 .Case("x86-64", CK_x86_64)
2367 .Case("geode", CK_Geode)
2368 .Default(CK_Generic);
2369 }
2370
Rafael Espindolaeb265472013-08-21 21:59:03 +00002371 enum FPMathKind {
2372 FP_Default,
2373 FP_SSE,
2374 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002375 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002376
Eli Friedman3fd920a2008-08-20 02:34:37 +00002377public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002378 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002379 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002380 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002381 }
Craig Topper3164f332014-03-11 03:39:26 +00002382 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002383 // X87 evaluates with 80 bits "long double" precision.
2384 return SSELevel == NoSSE ? 2 : 0;
2385 }
Craig Topper6c03a542015-10-19 04:51:35 +00002386 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2387 return llvm::makeArrayRef(BuiltinInfo,
2388 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002389 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002390 ArrayRef<const char *> getGCCRegNames() const override {
2391 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002392 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002393 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2394 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002395 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002396 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2397 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002398 }
Eric Christopherd9832702015-06-29 21:00:05 +00002399 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002400 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002401 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002402
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002403 bool validateGlobalRegisterVariable(StringRef RegName,
2404 unsigned RegSize,
2405 bool &HasSizeMismatch) const override {
2406 // esp and ebp are the only 32-bit registers the x86 backend can currently
2407 // handle.
2408 if (RegName.equals("esp") || RegName.equals("ebp")) {
2409 // Check that the register size is 32-bit.
2410 HasSizeMismatch = RegSize != 32;
2411 return true;
2412 }
2413
2414 return false;
2415 }
2416
Akira Hatanaka974131e2014-09-18 18:17:18 +00002417 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2418
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002419 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2420
Akira Hatanaka974131e2014-09-18 18:17:18 +00002421 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2422
Craig Topper3164f332014-03-11 03:39:26 +00002423 std::string convertConstraint(const char *&Constraint) const override;
2424 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002425 return "~{dirflag},~{fpsr},~{flags}";
2426 }
Craig Topper3164f332014-03-11 03:39:26 +00002427 void getTargetDefines(const LangOptions &Opts,
2428 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002429 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2430 bool Enabled);
2431 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2432 bool Enabled);
2433 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2434 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002435 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2436 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002437 setFeatureEnabledImpl(Features, Name, Enabled);
2438 }
2439 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002440 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002441 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2442 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002443 bool
2444 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2445 StringRef CPU,
2446 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002447 bool hasFeature(StringRef Feature) const override;
2448 bool handleTargetFeatures(std::vector<std::string> &Features,
2449 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002450 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002451 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2452 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002453 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002454 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002455 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002456 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002457 return "no-mmx";
2458 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002459 }
Craig Topper3164f332014-03-11 03:39:26 +00002460 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002461 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002462
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002463 // Perform any per-CPU checks necessary to determine if this CPU is
2464 // acceptable.
2465 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2466 // invalid without explaining *why*.
2467 switch (CPU) {
2468 case CK_Generic:
2469 // No processor selected!
2470 return false;
2471
2472 case CK_i386:
2473 case CK_i486:
2474 case CK_WinChipC6:
2475 case CK_WinChip2:
2476 case CK_C3:
2477 case CK_i586:
2478 case CK_Pentium:
2479 case CK_PentiumMMX:
2480 case CK_i686:
2481 case CK_PentiumPro:
2482 case CK_Pentium2:
2483 case CK_Pentium3:
2484 case CK_Pentium3M:
2485 case CK_PentiumM:
2486 case CK_Yonah:
2487 case CK_C3_2:
2488 case CK_Pentium4:
2489 case CK_Pentium4M:
2490 case CK_Prescott:
2491 case CK_K6:
2492 case CK_K6_2:
2493 case CK_K6_3:
2494 case CK_Athlon:
2495 case CK_AthlonThunderbird:
2496 case CK_Athlon4:
2497 case CK_AthlonXP:
2498 case CK_AthlonMP:
2499 case CK_Geode:
2500 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002501 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002502 return false;
2503
2504 // Fallthrough
2505 case CK_Nocona:
2506 case CK_Core2:
2507 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002508 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002509 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002510 case CK_Nehalem:
2511 case CK_Westmere:
2512 case CK_SandyBridge:
2513 case CK_IvyBridge:
2514 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002515 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002516 case CK_SkylakeClient:
2517 case CK_SkylakeServer:
2518 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002519 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002520 case CK_Athlon64:
2521 case CK_Athlon64SSE3:
2522 case CK_AthlonFX:
2523 case CK_K8:
2524 case CK_K8SSE3:
2525 case CK_Opteron:
2526 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002527 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002528 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002529 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002530 case CK_BDVER1:
2531 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002532 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002533 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002534 case CK_x86_64:
2535 return true;
2536 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002537 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002538 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002539
Craig Topper3164f332014-03-11 03:39:26 +00002540 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002541
Craig Topper3164f332014-03-11 03:39:26 +00002542 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002543 // Most of the non-ARM calling conventions are i386 conventions.
2544 switch (CC) {
2545 case CC_X86ThisCall:
2546 case CC_X86FastCall:
2547 case CC_X86StdCall:
2548 case CC_X86VectorCall:
2549 case CC_C:
2550 case CC_Swift:
2551 case CC_X86Pascal:
2552 case CC_IntelOclBicc:
2553 return CCCR_OK;
2554 default:
2555 return CCCR_Warning;
2556 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002557 }
2558
Craig Topper3164f332014-03-11 03:39:26 +00002559 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002560 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002561 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002562
2563 bool hasSjLjLowering() const override {
2564 return true;
2565 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002566};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002567
Rafael Espindolaeb265472013-08-21 21:59:03 +00002568bool X86TargetInfo::setFPMath(StringRef Name) {
2569 if (Name == "387") {
2570 FPMath = FP_387;
2571 return true;
2572 }
2573 if (Name == "sse") {
2574 FPMath = FP_SSE;
2575 return true;
2576 }
2577 return false;
2578}
2579
Eric Christopher007b0a02015-08-28 22:32:01 +00002580bool X86TargetInfo::initFeatureMap(
2581 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002582 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002583 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002584 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002585 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002586 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002587
Eric Christopher2b4a7252015-08-27 00:05:52 +00002588 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002589 case CK_Generic:
2590 case CK_i386:
2591 case CK_i486:
2592 case CK_i586:
2593 case CK_Pentium:
2594 case CK_i686:
2595 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002596 break;
2597 case CK_PentiumMMX:
2598 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002599 case CK_K6:
2600 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002601 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 break;
2603 case CK_Pentium3:
2604 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002605 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002606 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002607 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
2609 case CK_PentiumM:
2610 case CK_Pentium4:
2611 case CK_Pentium4M:
2612 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002613 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002614 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 break;
2616 case CK_Yonah:
2617 case CK_Prescott:
2618 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002619 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002620 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002621 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 break;
2623 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002624 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002625 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002626 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002627 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 break;
2629 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002630 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002631 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002632 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002633 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002634 case CK_Cannonlake:
2635 setFeatureEnabledImpl(Features, "avx512ifma", true);
2636 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2637 setFeatureEnabledImpl(Features, "sha", true);
2638 setFeatureEnabledImpl(Features, "umip", true);
2639 // FALLTHROUGH
2640 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002641 setFeatureEnabledImpl(Features, "avx512f", true);
2642 setFeatureEnabledImpl(Features, "avx512cd", true);
2643 setFeatureEnabledImpl(Features, "avx512dq", true);
2644 setFeatureEnabledImpl(Features, "avx512bw", true);
2645 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002646 setFeatureEnabledImpl(Features, "pku", true);
2647 setFeatureEnabledImpl(Features, "pcommit", true);
2648 setFeatureEnabledImpl(Features, "clwb", true);
2649 // FALLTHROUGH
2650 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002651 setFeatureEnabledImpl(Features, "xsavec", true);
2652 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002653 setFeatureEnabledImpl(Features, "mpx", true);
2654 setFeatureEnabledImpl(Features, "sgx", true);
2655 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002656 // FALLTHROUGH
2657 case CK_Broadwell:
2658 setFeatureEnabledImpl(Features, "rdseed", true);
2659 setFeatureEnabledImpl(Features, "adx", true);
2660 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002661 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002662 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002663 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002664 setFeatureEnabledImpl(Features, "bmi", true);
2665 setFeatureEnabledImpl(Features, "bmi2", true);
2666 setFeatureEnabledImpl(Features, "rtm", true);
2667 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002668 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002669 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002670 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002671 setFeatureEnabledImpl(Features, "rdrnd", true);
2672 setFeatureEnabledImpl(Features, "f16c", true);
2673 setFeatureEnabledImpl(Features, "fsgsbase", true);
2674 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002675 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002676 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002677 setFeatureEnabledImpl(Features, "xsave", true);
2678 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002679 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002680 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002681 case CK_Silvermont:
2682 setFeatureEnabledImpl(Features, "aes", true);
2683 setFeatureEnabledImpl(Features, "pclmul", true);
2684 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002685 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002686 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002687 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002688 setFeatureEnabledImpl(Features, "cx16", true);
2689 break;
2690 case CK_KNL:
2691 setFeatureEnabledImpl(Features, "avx512f", true);
2692 setFeatureEnabledImpl(Features, "avx512cd", true);
2693 setFeatureEnabledImpl(Features, "avx512er", true);
2694 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002695 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002696 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002697 setFeatureEnabledImpl(Features, "rdseed", true);
2698 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002699 setFeatureEnabledImpl(Features, "lzcnt", true);
2700 setFeatureEnabledImpl(Features, "bmi", true);
2701 setFeatureEnabledImpl(Features, "bmi2", true);
2702 setFeatureEnabledImpl(Features, "rtm", true);
2703 setFeatureEnabledImpl(Features, "fma", true);
2704 setFeatureEnabledImpl(Features, "rdrnd", true);
2705 setFeatureEnabledImpl(Features, "f16c", true);
2706 setFeatureEnabledImpl(Features, "fsgsbase", true);
2707 setFeatureEnabledImpl(Features, "aes", true);
2708 setFeatureEnabledImpl(Features, "pclmul", true);
2709 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002710 setFeatureEnabledImpl(Features, "xsaveopt", true);
2711 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002712 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002713 break;
2714 case CK_K6_2:
2715 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002716 case CK_WinChip2:
2717 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002718 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002719 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002720 case CK_Athlon:
2721 case CK_AthlonThunderbird:
2722 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002723 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002724 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002725 case CK_Athlon4:
2726 case CK_AthlonXP:
2727 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002728 setFeatureEnabledImpl(Features, "sse", true);
2729 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002730 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002731 break;
2732 case CK_K8:
2733 case CK_Opteron:
2734 case CK_Athlon64:
2735 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002736 setFeatureEnabledImpl(Features, "sse2", true);
2737 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002738 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002739 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002740 case CK_AMDFAM10:
2741 setFeatureEnabledImpl(Features, "sse4a", true);
2742 setFeatureEnabledImpl(Features, "lzcnt", true);
2743 setFeatureEnabledImpl(Features, "popcnt", true);
2744 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002745 case CK_K8SSE3:
2746 case CK_OpteronSSE3:
2747 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002748 setFeatureEnabledImpl(Features, "sse3", true);
2749 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002750 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002751 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002752 case CK_BTVER2:
2753 setFeatureEnabledImpl(Features, "avx", true);
2754 setFeatureEnabledImpl(Features, "aes", true);
2755 setFeatureEnabledImpl(Features, "pclmul", true);
2756 setFeatureEnabledImpl(Features, "bmi", true);
2757 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002758 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002759 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002760 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002761 setFeatureEnabledImpl(Features, "ssse3", true);
2762 setFeatureEnabledImpl(Features, "sse4a", true);
2763 setFeatureEnabledImpl(Features, "lzcnt", true);
2764 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002765 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002766 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002767 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002768 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002769 case CK_BDVER4:
2770 setFeatureEnabledImpl(Features, "avx2", true);
2771 setFeatureEnabledImpl(Features, "bmi2", true);
2772 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002773 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002774 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002775 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002776 // FALLTHROUGH
2777 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002778 setFeatureEnabledImpl(Features, "bmi", true);
2779 setFeatureEnabledImpl(Features, "fma", true);
2780 setFeatureEnabledImpl(Features, "f16c", true);
2781 setFeatureEnabledImpl(Features, "tbm", true);
2782 // FALLTHROUGH
2783 case CK_BDVER1:
2784 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002785 setFeatureEnabledImpl(Features, "xop", true);
2786 setFeatureEnabledImpl(Features, "lzcnt", true);
2787 setFeatureEnabledImpl(Features, "aes", true);
2788 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002789 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002790 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002791 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002792 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002793 break;
Eli Friedman33465822011-07-08 23:31:17 +00002794 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002795 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2796 return false;
2797
2798 // Can't do this earlier because we need to be able to explicitly enable
2799 // or disable these features and the things that they depend upon.
2800
2801 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2802 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002803 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002804 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2805 FeaturesVec.end())
2806 Features["popcnt"] = true;
2807
2808 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2809 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002810 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002811 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2812 FeaturesVec.end())
2813 Features["prfchw"] = true;
2814
Eric Christophera7260af2015-10-08 20:10:18 +00002815 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2816 // then enable MMX.
2817 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002818 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002819 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2820 FeaturesVec.end())
2821 Features["mmx"] = true;
2822
Eric Christopherbbd746d2015-10-08 20:10:14 +00002823 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002824}
2825
Rafael Espindolae62e2792013-08-20 13:44:29 +00002826void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002827 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002828 if (Enabled) {
2829 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002830 case AVX512F:
2831 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002832 case AVX2:
2833 Features["avx2"] = true;
2834 case AVX:
2835 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002836 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002837 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002838 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002839 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002840 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002841 case SSSE3:
2842 Features["ssse3"] = true;
2843 case SSE3:
2844 Features["sse3"] = true;
2845 case SSE2:
2846 Features["sse2"] = true;
2847 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002848 Features["sse"] = true;
2849 case NoSSE:
2850 break;
2851 }
2852 return;
2853 }
2854
2855 switch (Level) {
2856 case NoSSE:
2857 case SSE1:
2858 Features["sse"] = false;
2859 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002860 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2861 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002862 case SSE3:
2863 Features["sse3"] = false;
2864 setXOPLevel(Features, NoXOP, false);
2865 case SSSE3:
2866 Features["ssse3"] = false;
2867 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002868 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002870 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002871 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002872 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2873 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002874 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002875 case AVX2:
2876 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002877 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002878 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002879 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002880 Features["avx512vl"] = Features["avx512vbmi"] =
2881 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002882 }
2883}
2884
2885void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002886 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 if (Enabled) {
2888 switch (Level) {
2889 case AMD3DNowAthlon:
2890 Features["3dnowa"] = true;
2891 case AMD3DNow:
2892 Features["3dnow"] = true;
2893 case MMX:
2894 Features["mmx"] = true;
2895 case NoMMX3DNow:
2896 break;
2897 }
2898 return;
2899 }
2900
2901 switch (Level) {
2902 case NoMMX3DNow:
2903 case MMX:
2904 Features["mmx"] = false;
2905 case AMD3DNow:
2906 Features["3dnow"] = false;
2907 case AMD3DNowAthlon:
2908 Features["3dnowa"] = false;
2909 }
2910}
2911
2912void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002913 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002914 if (Enabled) {
2915 switch (Level) {
2916 case XOP:
2917 Features["xop"] = true;
2918 case FMA4:
2919 Features["fma4"] = true;
2920 setSSELevel(Features, AVX, true);
2921 case SSE4A:
2922 Features["sse4a"] = true;
2923 setSSELevel(Features, SSE3, true);
2924 case NoXOP:
2925 break;
2926 }
2927 return;
2928 }
2929
2930 switch (Level) {
2931 case NoXOP:
2932 case SSE4A:
2933 Features["sse4a"] = false;
2934 case FMA4:
2935 Features["fma4"] = false;
2936 case XOP:
2937 Features["xop"] = false;
2938 }
2939}
2940
Craig Topper86d79ef2013-09-17 04:51:29 +00002941void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2942 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002943 // This is a bit of a hack to deal with the sse4 target feature when used
2944 // as part of the target attribute. We handle sse4 correctly everywhere
2945 // else. See below for more information on how we handle the sse4 options.
2946 if (Name != "sse4")
2947 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002948
Craig Topper29561122013-09-19 01:13:07 +00002949 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002950 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002951 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002952 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002953 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002954 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002955 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002956 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002957 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002958 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002959 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002960 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002961 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002962 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002963 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002964 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002965 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002966 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002967 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002968 if (Enabled)
2969 setSSELevel(Features, SSE2, Enabled);
2970 } else if (Name == "pclmul") {
2971 if (Enabled)
2972 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002973 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002974 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002975 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002976 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002977 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002978 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00002979 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
2980 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
2981 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00002982 if (Enabled)
2983 setSSELevel(Features, AVX512F, Enabled);
2984 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002985 if (Enabled)
2986 setSSELevel(Features, AVX, Enabled);
2987 } else if (Name == "fma4") {
2988 setXOPLevel(Features, FMA4, Enabled);
2989 } else if (Name == "xop") {
2990 setXOPLevel(Features, XOP, Enabled);
2991 } else if (Name == "sse4a") {
2992 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002993 } else if (Name == "f16c") {
2994 if (Enabled)
2995 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002996 } else if (Name == "sha") {
2997 if (Enabled)
2998 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002999 } else if (Name == "sse4") {
3000 // We can get here via the __target__ attribute since that's not controlled
3001 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3002 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3003 // disabled.
3004 if (Enabled)
3005 setSSELevel(Features, SSE42, Enabled);
3006 else
3007 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003008 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003009 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003010 Features["xsaveopt"] = false;
3011 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003012 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003013 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003014 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003015}
3016
Eric Christopher3ff21b32013-10-16 21:26:26 +00003017/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003018/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003019bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003020 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003021 for (const auto &Feature : Features) {
3022 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003023 continue;
3024
Eric Christopher610fe112015-08-26 08:21:55 +00003025 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003026 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003027 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003028 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003029 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003030 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003031 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003032 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003033 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003034 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003035 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003036 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003037 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003038 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003039 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003040 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003041 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003042 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003043 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003044 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003045 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003046 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003047 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003048 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003049 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003050 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003051 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003052 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003053 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003054 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003055 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003056 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003057 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003058 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003059 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003060 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003061 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003062 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003063 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003064 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003065 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003066 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003067 } else if (Feature == "+avx512vbmi") {
3068 HasAVX512VBMI = true;
3069 } else if (Feature == "+avx512ifma") {
3070 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003071 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003072 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003073 } else if (Feature == "+mpx") {
3074 HasMPX = true;
3075 } else if (Feature == "+movbe") {
3076 HasMOVBE = true;
3077 } else if (Feature == "+sgx") {
3078 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003079 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003080 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003081 } else if (Feature == "+fxsr") {
3082 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003083 } else if (Feature == "+xsave") {
3084 HasXSAVE = true;
3085 } else if (Feature == "+xsaveopt") {
3086 HasXSAVEOPT = true;
3087 } else if (Feature == "+xsavec") {
3088 HasXSAVEC = true;
3089 } else if (Feature == "+xsaves") {
3090 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003091 } else if (Feature == "+pku") {
3092 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003093 } else if (Feature == "+clflushopt") {
3094 HasCLFLUSHOPT = true;
3095 } else if (Feature == "+pcommit") {
3096 HasPCOMMIT = true;
3097 } else if (Feature == "+clwb") {
3098 HasCLWB = true;
3099 } else if (Feature == "+umip") {
3100 HasUMIP = true;
3101 } else if (Feature == "+prefetchwt1") {
3102 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003103 }
3104
Benjamin Kramer27402c62012-03-05 15:10:44 +00003105 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003106 .Case("+avx512f", AVX512F)
3107 .Case("+avx2", AVX2)
3108 .Case("+avx", AVX)
3109 .Case("+sse4.2", SSE42)
3110 .Case("+sse4.1", SSE41)
3111 .Case("+ssse3", SSSE3)
3112 .Case("+sse3", SSE3)
3113 .Case("+sse2", SSE2)
3114 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003115 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003116 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003117
Eli Friedman33465822011-07-08 23:31:17 +00003118 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003119 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003120 .Case("+3dnowa", AMD3DNowAthlon)
3121 .Case("+3dnow", AMD3DNow)
3122 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003123 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003124 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003125
3126 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003127 .Case("+xop", XOP)
3128 .Case("+fma4", FMA4)
3129 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003130 .Default(NoXOP);
3131 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003132 }
Eli Friedman33465822011-07-08 23:31:17 +00003133
Rafael Espindolaeb265472013-08-21 21:59:03 +00003134 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3135 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003136 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3137 (FPMath == FP_387 && SSELevel >= SSE1)) {
3138 Diags.Report(diag::err_target_unsupported_fpmath) <<
3139 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003140 return false;
3141 }
3142
Alexey Bataev00396512015-07-02 03:40:19 +00003143 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003144 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003145 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003146}
Chris Lattnerecd49032009-03-02 22:27:17 +00003147
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003148/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3149/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003150void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003151 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003152 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003153 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003154 Builder.defineMacro("__amd64__");
3155 Builder.defineMacro("__amd64");
3156 Builder.defineMacro("__x86_64");
3157 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003158 if (getTriple().getArchName() == "x86_64h") {
3159 Builder.defineMacro("__x86_64h");
3160 Builder.defineMacro("__x86_64h__");
3161 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003162 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003163 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003164 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003165
Chris Lattnerecd49032009-03-02 22:27:17 +00003166 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003167 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3168 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003169 switch (CPU) {
3170 case CK_Generic:
3171 break;
3172 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003173 // The rest are coming from the i386 define above.
3174 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003175 break;
3176 case CK_i486:
3177 case CK_WinChipC6:
3178 case CK_WinChip2:
3179 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003180 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003182 case CK_PentiumMMX:
3183 Builder.defineMacro("__pentium_mmx__");
3184 Builder.defineMacro("__tune_pentium_mmx__");
3185 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003186 case CK_i586:
3187 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003188 defineCPUMacros(Builder, "i586");
3189 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003190 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003191 case CK_Pentium3:
3192 case CK_Pentium3M:
3193 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003194 Builder.defineMacro("__tune_pentium3__");
3195 // Fallthrough
3196 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003197 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003198 Builder.defineMacro("__tune_pentium2__");
3199 // Fallthrough
3200 case CK_PentiumPro:
3201 Builder.defineMacro("__tune_i686__");
3202 Builder.defineMacro("__tune_pentiumpro__");
3203 // Fallthrough
3204 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003205 Builder.defineMacro("__i686");
3206 Builder.defineMacro("__i686__");
3207 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3208 Builder.defineMacro("__pentiumpro");
3209 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003210 break;
3211 case CK_Pentium4:
3212 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003213 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003214 break;
3215 case CK_Yonah:
3216 case CK_Prescott:
3217 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003218 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003219 break;
3220 case CK_Core2:
3221 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003222 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003223 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003224 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003225 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003226 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003227 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003228 defineCPUMacros(Builder, "slm");
3229 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003230 case CK_Nehalem:
3231 case CK_Westmere:
3232 case CK_SandyBridge:
3233 case CK_IvyBridge:
3234 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003235 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003236 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003237 // FIXME: Historically, we defined this legacy name, it would be nice to
3238 // remove it at some point. We've never exposed fine-grained names for
3239 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003240 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003241 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003242 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003243 defineCPUMacros(Builder, "skx");
3244 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003245 case CK_Cannonlake:
3246 break;
Craig Topper449314e2013-08-20 07:09:39 +00003247 case CK_KNL:
3248 defineCPUMacros(Builder, "knl");
3249 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003250 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003251 Builder.defineMacro("__k6_2__");
3252 Builder.defineMacro("__tune_k6_2__");
3253 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003254 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003255 if (CPU != CK_K6_2) { // In case of fallthrough
3256 // FIXME: GCC may be enabling these in cases where some other k6
3257 // architecture is specified but -m3dnow is explicitly provided. The
3258 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003259 Builder.defineMacro("__k6_3__");
3260 Builder.defineMacro("__tune_k6_3__");
3261 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003262 // Fallthrough
3263 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003264 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003265 break;
3266 case CK_Athlon:
3267 case CK_AthlonThunderbird:
3268 case CK_Athlon4:
3269 case CK_AthlonXP:
3270 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003271 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003272 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003273 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003274 Builder.defineMacro("__tune_athlon_sse__");
3275 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003276 break;
3277 case CK_K8:
3278 case CK_K8SSE3:
3279 case CK_x86_64:
3280 case CK_Opteron:
3281 case CK_OpteronSSE3:
3282 case CK_Athlon64:
3283 case CK_Athlon64SSE3:
3284 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003285 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003286 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003287 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003288 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003289 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003290 case CK_BTVER1:
3291 defineCPUMacros(Builder, "btver1");
3292 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003293 case CK_BTVER2:
3294 defineCPUMacros(Builder, "btver2");
3295 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003296 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003297 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003298 break;
3299 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003300 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003301 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003302 case CK_BDVER3:
3303 defineCPUMacros(Builder, "bdver3");
3304 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003305 case CK_BDVER4:
3306 defineCPUMacros(Builder, "bdver4");
3307 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003308 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003309 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003310 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003311 }
Chris Lattner96e43572009-03-02 22:40:39 +00003312
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003313 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003314 Builder.defineMacro("__REGISTER_PREFIX__", "");
3315
Chris Lattner6df41af2009-04-19 17:32:33 +00003316 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3317 // functions in glibc header files that use FP Stack inline asm which the
3318 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003319 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003320
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003321 if (HasAES)
3322 Builder.defineMacro("__AES__");
3323
Craig Topper3f122a72012-05-31 05:18:48 +00003324 if (HasPCLMUL)
3325 Builder.defineMacro("__PCLMUL__");
3326
Craig Topper22967d42011-12-25 05:06:45 +00003327 if (HasLZCNT)
3328 Builder.defineMacro("__LZCNT__");
3329
Benjamin Kramer1e250392012-07-07 09:39:18 +00003330 if (HasRDRND)
3331 Builder.defineMacro("__RDRND__");
3332
Craig Topper8c7f2512014-11-03 06:51:41 +00003333 if (HasFSGSBASE)
3334 Builder.defineMacro("__FSGSBASE__");
3335
Craig Topper22967d42011-12-25 05:06:45 +00003336 if (HasBMI)
3337 Builder.defineMacro("__BMI__");
3338
3339 if (HasBMI2)
3340 Builder.defineMacro("__BMI2__");
3341
Craig Topper1de83482011-12-29 16:10:46 +00003342 if (HasPOPCNT)
3343 Builder.defineMacro("__POPCNT__");
3344
Michael Liao625a8752012-11-10 05:17:46 +00003345 if (HasRTM)
3346 Builder.defineMacro("__RTM__");
3347
Michael Liao74f4eaf2013-03-26 17:52:08 +00003348 if (HasPRFCHW)
3349 Builder.defineMacro("__PRFCHW__");
3350
Michael Liaoffaae352013-03-29 05:17:55 +00003351 if (HasRDSEED)
3352 Builder.defineMacro("__RDSEED__");
3353
Robert Khasanov50e6f582014-09-19 09:53:48 +00003354 if (HasADX)
3355 Builder.defineMacro("__ADX__");
3356
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003357 if (HasTBM)
3358 Builder.defineMacro("__TBM__");
3359
Rafael Espindolae62e2792013-08-20 13:44:29 +00003360 switch (XOPLevel) {
3361 case XOP:
3362 Builder.defineMacro("__XOP__");
3363 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003364 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003365 case SSE4A:
3366 Builder.defineMacro("__SSE4A__");
3367 case NoXOP:
3368 break;
3369 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003370
Craig Topperbba778b2012-06-03 21:46:30 +00003371 if (HasFMA)
3372 Builder.defineMacro("__FMA__");
3373
Manman Rena45358c2012-10-11 00:59:55 +00003374 if (HasF16C)
3375 Builder.defineMacro("__F16C__");
3376
Craig Topper679b53a2013-08-21 05:29:10 +00003377 if (HasAVX512CD)
3378 Builder.defineMacro("__AVX512CD__");
3379 if (HasAVX512ER)
3380 Builder.defineMacro("__AVX512ER__");
3381 if (HasAVX512PF)
3382 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003383 if (HasAVX512DQ)
3384 Builder.defineMacro("__AVX512DQ__");
3385 if (HasAVX512BW)
3386 Builder.defineMacro("__AVX512BW__");
3387 if (HasAVX512VL)
3388 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003389 if (HasAVX512VBMI)
3390 Builder.defineMacro("__AVX512VBMI__");
3391 if (HasAVX512IFMA)
3392 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003393
Ben Langmuir58078d02013-09-19 13:22:04 +00003394 if (HasSHA)
3395 Builder.defineMacro("__SHA__");
3396
Craig Toppere33f51f2015-10-16 06:22:36 +00003397 if (HasFXSR)
3398 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003399 if (HasXSAVE)
3400 Builder.defineMacro("__XSAVE__");
3401 if (HasXSAVEOPT)
3402 Builder.defineMacro("__XSAVEOPT__");
3403 if (HasXSAVEC)
3404 Builder.defineMacro("__XSAVEC__");
3405 if (HasXSAVES)
3406 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003407 if (HasPKU)
3408 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003409 if (HasCX16)
3410 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3411
Chris Lattner96e43572009-03-02 22:40:39 +00003412 // Each case falls through to the previous one here.
3413 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003414 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003415 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003416 case AVX2:
3417 Builder.defineMacro("__AVX2__");
3418 case AVX:
3419 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003420 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003421 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003422 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003423 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003424 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003425 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003426 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003427 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003428 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003429 Builder.defineMacro("__SSE2__");
3430 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003431 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003432 Builder.defineMacro("__SSE__");
3433 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003434 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003435 break;
3436 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003437
Derek Schuffc7dd7222012-10-11 15:52:22 +00003438 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003439 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003440 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003441 case AVX2:
3442 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003443 case SSE42:
3444 case SSE41:
3445 case SSSE3:
3446 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003447 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003448 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003449 break;
3450 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003451 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003452 break;
3453 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003454 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003455 }
3456 }
3457
Anders Carlssone437c682010-01-27 03:47:49 +00003458 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003459 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003460 case AMD3DNowAthlon:
3461 Builder.defineMacro("__3dNOW_A__");
3462 case AMD3DNow:
3463 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003464 case MMX:
3465 Builder.defineMacro("__MMX__");
3466 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003467 break;
3468 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003469
3470 if (CPU >= CK_i486) {
3471 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3472 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3473 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3474 }
3475 if (CPU >= CK_i586)
3476 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003477}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003478
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003479bool X86TargetInfo::hasFeature(StringRef Feature) const {
3480 return llvm::StringSwitch<bool>(Feature)
3481 .Case("aes", HasAES)
3482 .Case("avx", SSELevel >= AVX)
3483 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003484 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003485 .Case("avx512cd", HasAVX512CD)
3486 .Case("avx512er", HasAVX512ER)
3487 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003488 .Case("avx512dq", HasAVX512DQ)
3489 .Case("avx512bw", HasAVX512BW)
3490 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003491 .Case("avx512vbmi", HasAVX512VBMI)
3492 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003493 .Case("bmi", HasBMI)
3494 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003495 .Case("clflushopt", HasCLFLUSHOPT)
3496 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003497 .Case("cx16", HasCX16)
3498 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003499 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003500 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003501 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003502 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003503 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003504 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3505 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3506 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003507 .Case("movbe", HasMOVBE)
3508 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003509 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003510 .Case("pcommit", HasPCOMMIT)
3511 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003512 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003513 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003514 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003515 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003516 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003517 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003518 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003519 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003520 .Case("sse", SSELevel >= SSE1)
3521 .Case("sse2", SSELevel >= SSE2)
3522 .Case("sse3", SSELevel >= SSE3)
3523 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003524 .Case("sse4.1", SSELevel >= SSE41)
3525 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003526 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003527 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003528 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003529 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003530 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3531 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003533 .Case("xsave", HasXSAVE)
3534 .Case("xsavec", HasXSAVEC)
3535 .Case("xsaves", HasXSAVES)
3536 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003537 .Default(false);
3538}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003539
Eric Christopherd9832702015-06-29 21:00:05 +00003540// We can't use a generic validation scheme for the features accepted here
3541// versus subtarget features accepted in the target attribute because the
3542// bitfield structure that's initialized in the runtime only supports the
3543// below currently rather than the full range of subtarget features. (See
3544// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3545bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3546 return llvm::StringSwitch<bool>(FeatureStr)
3547 .Case("cmov", true)
3548 .Case("mmx", true)
3549 .Case("popcnt", true)
3550 .Case("sse", true)
3551 .Case("sse2", true)
3552 .Case("sse3", true)
3553 .Case("sse4.1", true)
3554 .Case("sse4.2", true)
3555 .Case("avx", true)
3556 .Case("avx2", true)
3557 .Case("sse4a", true)
3558 .Case("fma4", true)
3559 .Case("xop", true)
3560 .Case("fma", true)
3561 .Case("avx512f", true)
3562 .Case("bmi", true)
3563 .Case("bmi2", true)
3564 .Default(false);
3565}
3566
Eli Friedman3fd920a2008-08-20 02:34:37 +00003567bool
Anders Carlsson58436352009-02-28 17:11:49 +00003568X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003569 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003570 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003571 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003572 // Constant constraints.
3573 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3574 // instructions.
3575 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3576 // x86_64 instructions.
3577 case 's':
3578 Info.setRequiresImmediate();
3579 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003580 case 'I':
3581 Info.setRequiresImmediate(0, 31);
3582 return true;
3583 case 'J':
3584 Info.setRequiresImmediate(0, 63);
3585 return true;
3586 case 'K':
3587 Info.setRequiresImmediate(-128, 127);
3588 return true;
3589 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003590 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003591 return true;
3592 case 'M':
3593 Info.setRequiresImmediate(0, 3);
3594 return true;
3595 case 'N':
3596 Info.setRequiresImmediate(0, 255);
3597 return true;
3598 case 'O':
3599 Info.setRequiresImmediate(0, 127);
3600 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003601 // Register constraints.
3602 case 'Y': // 'Y' is the first character for several 2-character constraints.
3603 // Shift the pointer to the second character of the constraint.
3604 Name++;
3605 switch (*Name) {
3606 default:
3607 return false;
3608 case '0': // First SSE register.
3609 case 't': // Any SSE register, when SSE2 is enabled.
3610 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3611 case 'm': // Any MMX register, when inter-unit moves enabled.
3612 Info.setAllowsRegister();
3613 return true;
3614 }
3615 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003616 // Constraint 'f' cannot be used for output operands.
3617 if (Info.ConstraintStr[0] == '=')
3618 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003619 Info.setAllowsRegister();
3620 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003621 case 'a': // eax.
3622 case 'b': // ebx.
3623 case 'c': // ecx.
3624 case 'd': // edx.
3625 case 'S': // esi.
3626 case 'D': // edi.
3627 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003628 case 't': // Top of floating point stack.
3629 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003630 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003631 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003632 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003633 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003634 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3635 case 'l': // "Index" registers: any general register that can be used as an
3636 // index in a base+index memory access.
3637 Info.setAllowsRegister();
3638 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003639 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003640 case 'C': // SSE floating point constant.
3641 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003642 return true;
3643 }
3644}
3645
Akira Hatanaka974131e2014-09-18 18:17:18 +00003646bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3647 unsigned Size) const {
3648 // Strip off constraint modifiers.
3649 while (Constraint[0] == '=' ||
3650 Constraint[0] == '+' ||
3651 Constraint[0] == '&')
3652 Constraint = Constraint.substr(1);
3653
3654 return validateOperandSize(Constraint, Size);
3655}
3656
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003657bool X86TargetInfo::validateInputSize(StringRef Constraint,
3658 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003659 return validateOperandSize(Constraint, Size);
3660}
3661
3662bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3663 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003664 switch (Constraint[0]) {
3665 default: break;
3666 case 'y':
3667 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003668 case 'f':
3669 case 't':
3670 case 'u':
3671 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003672 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003673 if (SSELevel >= AVX512F)
3674 // 512-bit zmm registers can be used if target supports AVX512F.
3675 return Size <= 512U;
3676 else if (SSELevel >= AVX)
3677 // 256-bit ymm registers can be used if target supports AVX.
3678 return Size <= 256U;
3679 return Size <= 128U;
3680 case 'Y':
3681 // 'Y' is the first character for several 2-character constraints.
3682 switch (Constraint[1]) {
3683 default: break;
3684 case 'm':
3685 // 'Ym' is synonymous with 'y'.
3686 return Size <= 64;
3687 case 'i':
3688 case 't':
3689 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3690 if (SSELevel >= AVX512F)
3691 return Size <= 512U;
3692 else if (SSELevel >= AVX)
3693 return Size <= 256U;
3694 return SSELevel >= SSE2 && Size <= 128U;
3695 }
3696
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003697 }
3698
3699 return true;
3700}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003701
Eli Friedman3fd920a2008-08-20 02:34:37 +00003702std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003703X86TargetInfo::convertConstraint(const char *&Constraint) const {
3704 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003705 case 'a': return std::string("{ax}");
3706 case 'b': return std::string("{bx}");
3707 case 'c': return std::string("{cx}");
3708 case 'd': return std::string("{dx}");
3709 case 'S': return std::string("{si}");
3710 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003711 case 'p': // address
3712 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003713 case 't': // top of floating point stack.
3714 return std::string("{st}");
3715 case 'u': // second from top of floating point stack.
3716 return std::string("{st(1)}"); // second from top of floating point stack.
3717 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003718 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003719 }
3720}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003721
Eli Friedman3fd920a2008-08-20 02:34:37 +00003722// X86-32 generic target
3723class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003724public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003725 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003726 DoubleAlign = LongLongAlign = 32;
3727 LongDoubleWidth = 96;
3728 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003729 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003730 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003731 SizeType = UnsignedInt;
3732 PtrDiffType = SignedInt;
3733 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003734 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003735
3736 // Use fpret for all types.
3737 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3738 (1 << TargetInfo::Double) |
3739 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003740
3741 // x86-32 has atomics up to 8 bytes
3742 // FIXME: Check that we actually have cmpxchg8b before setting
3743 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3744 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003745 }
Craig Topper3164f332014-03-11 03:39:26 +00003746 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003747 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003748 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003749
Craig Topper3164f332014-03-11 03:39:26 +00003750 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003751 if (RegNo == 0) return 0;
3752 if (RegNo == 1) return 2;
3753 return -1;
3754 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003755 bool validateOperandSize(StringRef Constraint,
3756 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003757 switch (Constraint[0]) {
3758 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003759 case 'R':
3760 case 'q':
3761 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003762 case 'a':
3763 case 'b':
3764 case 'c':
3765 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003766 case 'S':
3767 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003768 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003769 case 'A':
3770 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003771 }
3772
Akira Hatanaka974131e2014-09-18 18:17:18 +00003773 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003774 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003775};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003776
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003777class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3778public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003779 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3780 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003781
Craig Topper3164f332014-03-11 03:39:26 +00003782 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003783 unsigned Major, Minor, Micro;
3784 getTriple().getOSVersion(Major, Minor, Micro);
3785 // New NetBSD uses the default rounding mode.
3786 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3787 return X86_32TargetInfo::getFloatEvalMethod();
3788 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003789 return 1;
3790 }
3791};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003792
Eli Friedmane3aa4542009-07-05 18:47:56 +00003793class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3794public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003795 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3796 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003797 SizeType = UnsignedLong;
3798 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003799 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003800 }
3801};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003802
Eli Friedman9fa28852012-08-08 23:57:20 +00003803class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3804public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003805 BitrigI386TargetInfo(const llvm::Triple &Triple)
3806 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003807 SizeType = UnsignedLong;
3808 IntPtrType = SignedLong;
3809 PtrDiffType = SignedLong;
3810 }
3811};
Eli Friedman9fa28852012-08-08 23:57:20 +00003812
Torok Edwinb2b37c62009-06-30 17:10:35 +00003813class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003814public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003815 DarwinI386TargetInfo(const llvm::Triple &Triple)
3816 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003817 LongDoubleWidth = 128;
3818 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003819 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003820 MaxVectorAlign = 256;
3821 // The watchOS simulator uses the builtin bool type for Objective-C.
3822 llvm::Triple T = llvm::Triple(Triple);
3823 if (T.isWatchOS())
3824 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003825 SizeType = UnsignedLong;
3826 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003827 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003828 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003829 }
3830
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003831 bool handleTargetFeatures(std::vector<std::string> &Features,
3832 DiagnosticsEngine &Diags) override {
3833 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3834 Diags))
3835 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003836 // We now know the features we have: we can decide how to align vectors.
3837 MaxVectorAlign =
3838 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003839 return true;
3840 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003841};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003842
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003843// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003844class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003845public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003846 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3847 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003848 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003849 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003850 bool IsWinCOFF =
3851 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003852 resetDataLayout(IsWinCOFF
3853 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3854 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003855 }
Craig Topper3164f332014-03-11 03:39:26 +00003856 void getTargetDefines(const LangOptions &Opts,
3857 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003858 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3859 }
3860};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003861
3862// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003863class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003864public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003865 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003866 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003867 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003868 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3869 }
Craig Topper3164f332014-03-11 03:39:26 +00003870 void getTargetDefines(const LangOptions &Opts,
3871 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003872 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3873 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3874 // The value of the following reflects processor type.
3875 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3876 // We lost the original triple, so we use the default.
3877 Builder.defineMacro("_M_IX86", "600");
3878 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003879};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003880
David Majnemerae1ed0e2015-05-28 04:36:18 +00003881static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003882 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3883 // supports __declspec natively under -fms-extensions, but we define a no-op
3884 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003885 if (Opts.MicrosoftExt)
3886 Builder.defineMacro("__declspec", "__declspec");
3887 else
3888 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3889
3890 if (!Opts.MicrosoftExt) {
3891 // Provide macros for all the calling convention keywords. Provide both
3892 // single and double underscore prefixed variants. These are available on
3893 // x64 as well as x86, even though they have no effect.
3894 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3895 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003896 std::string GCCSpelling = "__attribute__((__";
3897 GCCSpelling += CC;
3898 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003899 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3900 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3901 }
3902 }
3903}
3904
David Majnemerae1ed0e2015-05-28 04:36:18 +00003905static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3906 Builder.defineMacro("__MSVCRT__");
3907 Builder.defineMacro("__MINGW32__");
3908 addCygMingDefines(Opts, Builder);
3909}
3910
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003911// x86-32 MinGW target
3912class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3913public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003914 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003915 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003916 void getTargetDefines(const LangOptions &Opts,
3917 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003918 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003919 DefineStd(Builder, "WIN32", Opts);
3920 DefineStd(Builder, "WINNT", Opts);
3921 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003922 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003923 }
3924};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003925
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003926// x86-32 Cygwin target
3927class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3928public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003929 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3930 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003931 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003932 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00003933 resetDataLayout("e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003934 }
Craig Topper3164f332014-03-11 03:39:26 +00003935 void getTargetDefines(const LangOptions &Opts,
3936 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003937 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003938 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003939 Builder.defineMacro("__CYGWIN__");
3940 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003941 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003942 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003943 if (Opts.CPlusPlus)
3944 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003945 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003946};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003947
Chris Lattnerb986aba2010-04-11 19:29:39 +00003948// x86-32 Haiku target
3949class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3950public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003951 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003952 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003953 IntPtrType = SignedLong;
3954 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003955 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003956 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003957 }
Craig Topper3164f332014-03-11 03:39:26 +00003958 void getTargetDefines(const LangOptions &Opts,
3959 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003960 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3961 Builder.defineMacro("__INTEL__");
3962 Builder.defineMacro("__HAIKU__");
3963 }
3964};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003965
Alexey Bataevc99b0492015-11-25 09:24:26 +00003966// X86-32 MCU target
3967class MCUX86_32TargetInfo : public X86_32TargetInfo {
3968public:
3969 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3970 LongDoubleWidth = 64;
3971 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00003972 resetDataLayout("e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32");
Andrey Bokhanko6e34c1d2016-02-04 11:54:45 +00003973 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003974 }
3975
3976 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3977 // On MCU we support only C calling convention.
3978 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3979 }
3980
3981 void getTargetDefines(const LangOptions &Opts,
3982 MacroBuilder &Builder) const override {
3983 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3984 Builder.defineMacro("__iamcu");
3985 Builder.defineMacro("__iamcu__");
3986 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00003987
3988 bool allowsLargerPreferedTypeAlignment() const override {
3989 return false;
3990 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00003991};
3992
Douglas Gregor9fabd852011-07-01 22:41:14 +00003993// RTEMS Target
3994template<typename Target>
3995class RTEMSTargetInfo : public OSTargetInfo<Target> {
3996protected:
Craig Topper3164f332014-03-11 03:39:26 +00003997 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3998 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003999 // RTEMS defines; list based off of gcc output
4000
Douglas Gregor9fabd852011-07-01 22:41:14 +00004001 Builder.defineMacro("__rtems__");
4002 Builder.defineMacro("__ELF__");
4003 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004004
Douglas Gregor9fabd852011-07-01 22:41:14 +00004005public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004006 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004007 switch (Triple.getArch()) {
4008 default:
4009 case llvm::Triple::x86:
4010 // this->MCountName = ".mcount";
4011 break;
4012 case llvm::Triple::mips:
4013 case llvm::Triple::mipsel:
4014 case llvm::Triple::ppc:
4015 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004016 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004017 // this->MCountName = "_mcount";
4018 break;
4019 case llvm::Triple::arm:
4020 // this->MCountName = "__mcount";
4021 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004022 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004023 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004024};
4025
Douglas Gregor9fabd852011-07-01 22:41:14 +00004026// x86-32 RTEMS target
4027class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4028public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004029 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004030 SizeType = UnsignedLong;
4031 IntPtrType = SignedLong;
4032 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004033 }
Craig Topper3164f332014-03-11 03:39:26 +00004034 void getTargetDefines(const LangOptions &Opts,
4035 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004036 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4037 Builder.defineMacro("__INTEL__");
4038 Builder.defineMacro("__rtems__");
4039 }
4040};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004041
Eli Friedman3fd920a2008-08-20 02:34:37 +00004042// x86-64 generic target
4043class X86_64TargetInfo : public X86TargetInfo {
4044public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004045 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00004046 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004047 bool IsWinCOFF =
4048 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004049 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004050 LongDoubleWidth = 128;
4051 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004052 LargeArrayMinWidth = 128;
4053 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004054 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004055 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4056 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4057 IntPtrType = IsX32 ? SignedInt : SignedLong;
4058 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004059 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004060 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004061
Eric Christopher917e9522014-11-18 22:36:15 +00004062 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004063 resetDataLayout(IsX32
4064 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4065 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4066 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004067
4068 // Use fpret only for long double.
4069 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004070
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004071 // Use fp2ret for _Complex long double.
4072 ComplexLongDoubleUsesFP2Ret = true;
4073
Charles Davisc7d5c942015-09-17 20:55:33 +00004074 // Make __builtin_ms_va_list available.
4075 HasBuiltinMSVaList = true;
4076
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004077 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004078 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004079 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004080 }
Craig Topper3164f332014-03-11 03:39:26 +00004081 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004082 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004083 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004084
Craig Topper3164f332014-03-11 03:39:26 +00004085 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004086 if (RegNo == 0) return 0;
4087 if (RegNo == 1) return 1;
4088 return -1;
4089 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004090
Craig Topper3164f332014-03-11 03:39:26 +00004091 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004092 switch (CC) {
4093 case CC_C:
4094 case CC_Swift:
4095 case CC_X86VectorCall:
4096 case CC_IntelOclBicc:
4097 case CC_X86_64Win64:
4098 return CCCR_OK;
4099 default:
4100 return CCCR_Warning;
4101 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004102 }
4103
Craig Topper3164f332014-03-11 03:39:26 +00004104 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004105 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004106 }
4107
Pavel Chupinfd223e12014-08-04 12:39:43 +00004108 // for x32 we need it here explicitly
4109 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004110 unsigned getUnwindWordWidth() const override { return 64; }
4111 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004112
4113 bool validateGlobalRegisterVariable(StringRef RegName,
4114 unsigned RegSize,
4115 bool &HasSizeMismatch) const override {
4116 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4117 // handle.
4118 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4119 // Check that the register size is 64-bit.
4120 HasSizeMismatch = RegSize != 64;
4121 return true;
4122 }
4123
4124 // Check if the register is a 32-bit register the backend can handle.
4125 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4126 HasSizeMismatch);
4127 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004128};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004129
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004130// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004131class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004132public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004133 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4134 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004135 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004136 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004137 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004138 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004139 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004140 SizeType = UnsignedLongLong;
4141 PtrDiffType = SignedLongLong;
4142 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004143 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004144
Craig Topper3164f332014-03-11 03:39:26 +00004145 void getTargetDefines(const LangOptions &Opts,
4146 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004147 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004148 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004149 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004150
Craig Topper3164f332014-03-11 03:39:26 +00004151 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004152 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004153 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004154
Craig Topper3164f332014-03-11 03:39:26 +00004155 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004156 switch (CC) {
4157 case CC_X86StdCall:
4158 case CC_X86ThisCall:
4159 case CC_X86FastCall:
4160 return CCCR_Ignore;
4161 case CC_C:
4162 case CC_X86VectorCall:
4163 case CC_IntelOclBicc:
4164 case CC_X86_64SysV:
4165 return CCCR_OK;
4166 default:
4167 return CCCR_Warning;
4168 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004169 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004170};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004171
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004172// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004173class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004174public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004175 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004176 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004177 LongDoubleWidth = LongDoubleAlign = 64;
4178 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004179 }
Craig Topper3164f332014-03-11 03:39:26 +00004180 void getTargetDefines(const LangOptions &Opts,
4181 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004182 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4183 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004184 Builder.defineMacro("_M_X64", "100");
4185 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004186 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004187};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004188
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004189// x86-64 MinGW target
4190class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4191public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004192 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004193 : WindowsX86_64TargetInfo(Triple) {
4194 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4195 // with x86 FP ops. Weird.
4196 LongDoubleWidth = LongDoubleAlign = 128;
4197 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4198 }
4199
Craig Topper3164f332014-03-11 03:39:26 +00004200 void getTargetDefines(const LangOptions &Opts,
4201 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004202 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004203 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004204 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004205 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004206
4207 // GCC defines this macro when it is using __gxx_personality_seh0.
4208 if (!Opts.SjLjExceptions)
4209 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004210 }
4211};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004212
Yaron Kerend030d112015-07-22 17:38:19 +00004213// x86-64 Cygwin target
4214class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4215public:
4216 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4217 : X86_64TargetInfo(Triple) {
4218 TLSSupported = false;
4219 WCharType = UnsignedShort;
4220 }
4221 void getTargetDefines(const LangOptions &Opts,
4222 MacroBuilder &Builder) const override {
4223 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4224 Builder.defineMacro("__x86_64__");
4225 Builder.defineMacro("__CYGWIN__");
4226 Builder.defineMacro("__CYGWIN64__");
4227 addCygMingDefines(Opts, Builder);
4228 DefineStd(Builder, "unix", Opts);
4229 if (Opts.CPlusPlus)
4230 Builder.defineMacro("_GNU_SOURCE");
4231
4232 // GCC defines this macro when it is using __gxx_personality_seh0.
4233 if (!Opts.SjLjExceptions)
4234 Builder.defineMacro("__SEH__");
4235 }
4236};
4237
Eli Friedman2857ccb2009-07-01 03:36:11 +00004238class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4239public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004240 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4241 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004242 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004243 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4244 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004245 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004246 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004247 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004248 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004249
4250 bool handleTargetFeatures(std::vector<std::string> &Features,
4251 DiagnosticsEngine &Diags) override {
4252 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4253 Diags))
4254 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004255 // We now know the features we have: we can decide how to align vectors.
4256 MaxVectorAlign =
4257 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004258 return true;
4259 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004260};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004261
Eli Friedman245f2292009-07-05 22:31:18 +00004262class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4263public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004264 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4265 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004266 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004267 Int64Type = SignedLongLong;
4268 }
4269};
Eli Friedman245f2292009-07-05 22:31:18 +00004270
Eli Friedman9fa28852012-08-08 23:57:20 +00004271class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4272public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004273 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4274 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4275 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004276 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004277 }
4278};
Tim Northover9bb857a2013-01-31 12:13:10 +00004279
Eli Friedmanf05b7722008-08-20 07:44:10 +00004280class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004281 // Possible FPU choices.
4282 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004283 VFP2FPU = (1 << 0),
4284 VFP3FPU = (1 << 1),
4285 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004286 NeonFPU = (1 << 3),
4287 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004288 };
4289
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004290 // Possible HWDiv features.
4291 enum HWDivMode {
4292 HWDivThumb = (1 << 0),
4293 HWDivARM = (1 << 1)
4294 };
4295
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004296 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004297 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004298 }
4299
4300 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4301 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004302
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004303 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004304
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004305 StringRef CPUProfile;
4306 StringRef CPUAttr;
4307
Rafael Espindolaeb265472013-08-21 21:59:03 +00004308 enum {
4309 FP_Default,
4310 FP_VFP,
4311 FP_Neon
4312 } FPMath;
4313
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004314 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004315 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004316 unsigned ArchProfile;
4317 unsigned ArchVersion;
4318
Bernard Ogdenda13af32013-10-24 18:32:51 +00004319 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004320
Logan Chien57086ce2012-10-10 06:56:20 +00004321 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004322 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004323
4324 // Initialized via features.
4325 unsigned SoftFloat : 1;
4326 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004327
Bernard Ogden18b57012013-10-29 09:47:51 +00004328 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004329 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004330 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004331 unsigned Unaligned : 1;
4332
4333 enum {
4334 LDREX_B = (1 << 0), /// byte (8-bit)
4335 LDREX_H = (1 << 1), /// half (16-bit)
4336 LDREX_W = (1 << 2), /// word (32-bit)
4337 LDREX_D = (1 << 3), /// double (64-bit)
4338 };
4339
4340 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004341
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004342 // ACLE 6.5.1 Hardware floating point
4343 enum {
4344 HW_FP_HP = (1 << 1), /// half (16-bit)
4345 HW_FP_SP = (1 << 2), /// single (32-bit)
4346 HW_FP_DP = (1 << 3), /// double (64-bit)
4347 };
4348 uint32_t HW_FP;
4349
Chris Lattner5cc15e02010-03-03 19:03:45 +00004350 static const Builtin::Info BuiltinInfo[];
4351
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004352 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004353 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004354
4355 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004356 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004357
Renato Golin9ba39232015-02-27 16:35:48 +00004358 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4359 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4360 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004361 SizeType = UnsignedLong;
4362 else
4363 SizeType = UnsignedInt;
4364
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004365 switch (T.getOS()) {
4366 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004367 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004368 break;
4369 case llvm::Triple::Win32:
4370 WCharType = UnsignedShort;
4371 break;
4372 case llvm::Triple::Linux:
4373 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004374 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4375 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004376 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004377 }
4378
4379 UseBitFieldTypeAlignment = true;
4380
4381 ZeroLengthBitfieldBoundary = 0;
4382
Tim Northover147cd2f2014-10-14 22:12:21 +00004383 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4384 // so set preferred for small types to 32.
4385 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004386 resetDataLayout(BigEndian
4387 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4388 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004389 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004390 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004391 resetDataLayout("e"
4392 "-m:w"
4393 "-p:32:32"
4394 "-i64:64"
4395 "-v128:64:128"
4396 "-a:0:32"
4397 "-n32"
4398 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004399 } else if (T.isOSNaCl()) {
4400 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004401 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004402 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004403 resetDataLayout(BigEndian
4404 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4405 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004406 }
4407
4408 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004409 }
4410
Tim Northover5627d392015-10-30 16:30:45 +00004411 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004412 const llvm::Triple &T = getTriple();
4413
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004414 IsAAPCS = false;
4415
Tim Northover5627d392015-10-30 16:30:45 +00004416 if (IsAAPCS16)
4417 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4418 else
4419 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004420
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004421 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004422 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004423 SizeType = UnsignedInt;
4424 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004425 SizeType = UnsignedLong;
4426
4427 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4428 WCharType = SignedInt;
4429
4430 // Do not respect the alignment of bit-field types when laying out
4431 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4432 UseBitFieldTypeAlignment = false;
4433
4434 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4435 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4436 /// gcc.
4437 ZeroLengthBitfieldBoundary = 32;
4438
Tim Northover5627d392015-10-30 16:30:45 +00004439 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4440 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004441 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004442 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004443 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004444 BigEndian
4445 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
James Y Knightb214cbc2016-03-04 19:00:41 +00004446 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
Tim Northover147cd2f2014-10-14 22:12:21 +00004447 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004448 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004449 BigEndian
4450 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
James Y Knightb214cbc2016-03-04 19:00:41 +00004451 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004452
4453 // FIXME: Override "preferred align" for double and long long.
4454 }
4455
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004456 void setArchInfo() {
4457 StringRef ArchName = getTriple().getArchName();
4458
Renato Goline84b0002015-10-08 16:43:26 +00004459 ArchISA = llvm::ARM::parseArchISA(ArchName);
4460 CPU = llvm::ARM::getDefaultCPU(ArchName);
4461 unsigned AK = llvm::ARM::parseArch(ArchName);
4462 if (AK != llvm::ARM::AK_INVALID)
4463 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004464 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004465 }
4466
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004467 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004468 StringRef SubArch;
4469
4470 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004471 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004472 SubArch = llvm::ARM::getSubArch(ArchKind);
4473 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4474 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004475
4476 // cache CPU related strings
4477 CPUAttr = getCPUAttr();
4478 CPUProfile = getCPUProfile();
4479 }
4480
4481 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004482 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004483 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004484 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004485 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4486 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004487 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004488 if (ArchProfile == llvm::ARM::PK_M) {
4489 MaxAtomicPromoteWidth = 32;
4490 if (ShouldUseInlineAtomic)
4491 MaxAtomicInlineWidth = 32;
4492 }
4493 else {
4494 MaxAtomicPromoteWidth = 64;
4495 if (ShouldUseInlineAtomic)
4496 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004497 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004498 }
4499
4500 bool isThumb() const {
4501 return (ArchISA == llvm::ARM::IK_THUMB);
4502 }
4503
4504 bool supportsThumb() const {
4505 return CPUAttr.count('T') || ArchVersion >= 6;
4506 }
4507
4508 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004509 return CPUAttr.equals("6T2") ||
4510 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004511 }
4512
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004513 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004514 // For most sub-arches, the build attribute CPU name is enough.
4515 // For Cortex variants, it's slightly different.
4516 switch(ArchKind) {
4517 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004518 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004519 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004520 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004521 case llvm::ARM::AK_ARMV7S:
4522 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004523 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004524 return "7A";
4525 case llvm::ARM::AK_ARMV7R:
4526 return "7R";
4527 case llvm::ARM::AK_ARMV7M:
4528 return "7M";
4529 case llvm::ARM::AK_ARMV7EM:
4530 return "7EM";
4531 case llvm::ARM::AK_ARMV8A:
4532 return "8A";
4533 case llvm::ARM::AK_ARMV8_1A:
4534 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004535 case llvm::ARM::AK_ARMV8_2A:
4536 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004537 case llvm::ARM::AK_ARMV8MBaseline:
4538 return "8M_BASE";
4539 case llvm::ARM::AK_ARMV8MMainline:
4540 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004541 }
4542 }
4543
4544 StringRef getCPUProfile() const {
4545 switch(ArchProfile) {
4546 case llvm::ARM::PK_A:
4547 return "A";
4548 case llvm::ARM::PK_R:
4549 return "R";
4550 case llvm::ARM::PK_M:
4551 return "M";
4552 default:
4553 return "";
4554 }
4555 }
4556
Chris Lattner17df24e2008-04-21 18:56:49 +00004557public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004558 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004559 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004560 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004561 BigEndian = IsBigEndian;
4562
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004563 switch (getTriple().getOS()) {
4564 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004565 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004566 break;
4567 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004568 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004569 break;
4570 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004571
Renato Goline84b0002015-10-08 16:43:26 +00004572 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004573 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004574
Chris Lattner1a8f3942010-04-23 16:29:58 +00004575 // {} in inline assembly are neon specifiers, not assembly variant
4576 // specifiers.
4577 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004578
Eric Christopher0e261882014-12-05 01:06:59 +00004579 // FIXME: This duplicates code from the driver that sets the -target-abi
4580 // option - this code is used if -target-abi isn't passed and should
4581 // be unified in some way.
4582 if (Triple.isOSBinFormatMachO()) {
4583 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4584 // the frontend matches that.
4585 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4586 Triple.getOS() == llvm::Triple::UnknownOS ||
4587 StringRef(CPU).startswith("cortex-m")) {
4588 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004589 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004590 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004591 } else {
4592 setABI("apcs-gnu");
4593 }
4594 } else if (Triple.isOSWindows()) {
4595 // FIXME: this is invalid for WindowsCE
4596 setABI("aapcs");
4597 } else {
4598 // Select the default based on the platform.
4599 switch (Triple.getEnvironment()) {
4600 case llvm::Triple::Android:
4601 case llvm::Triple::GNUEABI:
4602 case llvm::Triple::GNUEABIHF:
4603 setABI("aapcs-linux");
4604 break;
4605 case llvm::Triple::EABIHF:
4606 case llvm::Triple::EABI:
4607 setABI("aapcs");
4608 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004609 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004610 setABI("apcs-gnu");
4611 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004612 default:
4613 if (Triple.getOS() == llvm::Triple::NetBSD)
4614 setABI("apcs-gnu");
4615 else
4616 setABI("aapcs");
4617 break;
4618 }
4619 }
John McCall86353412010-08-21 22:46:04 +00004620
4621 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004622 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004623
Renato Golin15b86152015-07-03 16:41:13 +00004624 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004625 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004626
James Molloya7139222012-03-12 09:14:10 +00004627 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004628 // the alignment of the zero-length bitfield is greater than the member
4629 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004630 // zero length bitfield.
4631 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004632 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004633
Alp Toker4925ba72014-06-07 23:30:42 +00004634 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004635
Craig Topper3164f332014-03-11 03:39:26 +00004636 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004637 ABI = Name;
4638
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004639 // The defaults (above) are for AAPCS, check if we need to change them.
4640 //
4641 // FIXME: We need support for -meabi... we could just mangle it into the
4642 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004643 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004644 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004645 return true;
4646 }
4647 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4648 setABIAAPCS();
4649 return true;
4650 }
4651 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004652 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004653
Renato Golinf5c4dec2015-05-27 13:33:00 +00004654 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004655 bool
4656 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4657 StringRef CPU,
4658 const std::vector<std::string> &FeaturesVec) const override {
4659
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004660 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004661 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004662
4663 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004664 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004665 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4666
4667 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004668 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004669 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4670
4671 for (const char *Feature : TargetFeatures)
4672 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004673 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004674
Eric Christopher007b0a02015-08-28 22:32:01 +00004675 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004676 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004677
Craig Topper3164f332014-03-11 03:39:26 +00004678 bool handleTargetFeatures(std::vector<std::string> &Features,
4679 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004680 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004681 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004682 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004683 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004684 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004685 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004686 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004687
Ranjeet Singhac08e532015-06-24 23:39:25 +00004688 // This does not diagnose illegal cases like having both
4689 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4690 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004691 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004692 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004693 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004694 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004695 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004696 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004697 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004698 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004699 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004700 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004701 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004702 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004703 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004704 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004705 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004706 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004707 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004708 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004709 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004710 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004711 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004712 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004713 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004714 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004715 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004716 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004717 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004718 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004719 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004720 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004721 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004722 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004723 } else if (Feature == "+strict-align") {
4724 Unaligned = 0;
4725 } else if (Feature == "+fp16") {
4726 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004727 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004728 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004729 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004730
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004731 switch (ArchVersion) {
4732 case 6:
4733 if (ArchProfile == llvm::ARM::PK_M)
4734 LDREX = 0;
4735 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4736 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4737 else
4738 LDREX = LDREX_W;
4739 break;
4740 case 7:
4741 if (ArchProfile == llvm::ARM::PK_M)
4742 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4743 else
4744 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4745 break;
4746 case 8:
4747 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4748 }
4749
Rafael Espindolaeb265472013-08-21 21:59:03 +00004750 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4751 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4752 return false;
4753 }
4754
4755 if (FPMath == FP_Neon)
4756 Features.push_back("+neonfp");
4757 else if (FPMath == FP_VFP)
4758 Features.push_back("-neonfp");
4759
Daniel Dunbar893d4752009-12-19 04:15:38 +00004760 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004761 auto Feature =
4762 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4763 if (Feature != Features.end())
4764 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004765
Rafael Espindolaeb265472013-08-21 21:59:03 +00004766 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004767 }
4768
Craig Topper3164f332014-03-11 03:39:26 +00004769 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004770 return llvm::StringSwitch<bool>(Feature)
4771 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004772 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004773 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004774 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004775 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004776 .Case("hwdiv", HWDiv & HWDivThumb)
4777 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004778 .Default(false);
4779 }
Renato Golin15b86152015-07-03 16:41:13 +00004780
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004781 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004782 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004783 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004784
Renato Golin15b86152015-07-03 16:41:13 +00004785 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004786 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004787 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004788 CPU = Name;
4789 return true;
4790 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004791
Craig Topper3164f332014-03-11 03:39:26 +00004792 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004793
Craig Topper3164f332014-03-11 03:39:26 +00004794 void getTargetDefines(const LangOptions &Opts,
4795 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004796 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004797 Builder.defineMacro("__arm");
4798 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004799
Chris Lattnerecd49032009-03-02 22:27:17 +00004800 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004801 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004802
4803 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4804 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004805 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004806 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4807
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004808 if (!CPUAttr.empty())
4809 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004810
4811 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004812 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004813 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004814
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004815 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004816 // ACLE 6.5.7 Crypto Extension
4817 if (Crypto)
4818 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4819 // ACLE 6.5.8 CRC32 Extension
4820 if (CRC)
4821 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4822 // ACLE 6.5.10 Numeric Maximum and Minimum
4823 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4824 // ACLE 6.5.9 Directed Rounding
4825 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004826 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004827
4828 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4829 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004830 // NOTE that the default profile is assumed to be 'A'
4831 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004832 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4833
Bradley Smithf4affc12016-03-03 13:52:22 +00004834 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4835 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4836 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4837 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004838 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004839 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004840 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004841 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4842
4843 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4844 // instruction set such as ARM or Thumb.
4845 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4846
4847 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4848
4849 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004850 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004851 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004852
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004853 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004854 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004855 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004856
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004857 // ACLE 6.4.4 LDREX/STREX
4858 if (LDREX)
4859 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4860
4861 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004862 if (ArchVersion == 5 ||
4863 (ArchVersion == 6 && CPUProfile != "M") ||
4864 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004865 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4866
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004867 // ACLE 6.5.1 Hardware Floating Point
4868 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004869 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004870
Yi Konga44c4d72014-06-27 21:25:42 +00004871 // ACLE predefines.
4872 Builder.defineMacro("__ARM_ACLE", "200");
4873
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004874 // FP16 support (we currently only support IEEE format).
4875 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4876 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4877
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004878 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4879 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4880 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4881
Mike Stump9d54bd72009-04-08 02:07:04 +00004882 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004883
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004884 // FIXME: It's more complicated than this and we don't really support
4885 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004886 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004887 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004888 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004889
David Tweed8f676532012-10-25 13:33:01 +00004890 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004891 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004892 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4893 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004894 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004895 Builder.defineMacro("__ARM_PCS", "1");
4896
David Tweed8f676532012-10-25 13:33:01 +00004897 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004898 Builder.defineMacro("__ARM_PCS_VFP", "1");
4899 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004900
Daniel Dunbar893d4752009-12-19 04:15:38 +00004901 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004902 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004903
4904 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004905 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004906
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004907 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004908 Builder.defineMacro("__THUMBEL__");
4909 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004910 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004911 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004912 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004913
4914 // ACLE 6.4.9 32-bit SIMD instructions
4915 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4916 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4917
4918 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004919 if (((HWDiv & HWDivThumb) && isThumb()) ||
4920 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004921 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004922 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004923 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004924
4925 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004926 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004927
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004928 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004929 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004930 if (FPU & VFP2FPU)
4931 Builder.defineMacro("__ARM_VFPV2__");
4932 if (FPU & VFP3FPU)
4933 Builder.defineMacro("__ARM_VFPV3__");
4934 if (FPU & VFP4FPU)
4935 Builder.defineMacro("__ARM_VFPV4__");
4936 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004937
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004938 // This only gets set when Neon instructions are actually available, unlike
4939 // the VFP define, hence the soft float and arch check. This is subtly
4940 // different from gcc, we follow the intent which was that it should be set
4941 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004942 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004943 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004944 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004945 // current AArch32 NEON implementations do not support double-precision
4946 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004947 Builder.defineMacro("__ARM_NEON_FP",
4948 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004949 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004950
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004951 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4952 Opts.ShortWChar ? "2" : "4");
4953
4954 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4955 Opts.ShortEnums ? "1" : "4");
4956
Bradley Smithf4affc12016-03-03 13:52:22 +00004957 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004958 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4959 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4960 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4961 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4962 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004963
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004964 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004965 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004966 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004967 }
4968
4969 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004970 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004971 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4972 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004973 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004974 }
4975
4976 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004977 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004978 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004979
4980 if (Opts.UnsafeFPMath)
4981 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004982
4983 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4984 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004985 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004986
Craig Topper6c03a542015-10-19 04:51:35 +00004987 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4988 return llvm::makeArrayRef(BuiltinInfo,
4989 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004990 }
Craig Topper3164f332014-03-11 03:39:26 +00004991 bool isCLZForZeroUndef() const override { return false; }
4992 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004993 return IsAAPCS
4994 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00004995 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
4996 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00004997 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004998 ArrayRef<const char *> getGCCRegNames() const override;
4999 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005000 bool validateAsmConstraint(const char *&Name,
5001 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005002 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005003 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005004 case 'l': // r0-r7
5005 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005006 case 't': // VFP Floating point register single precision
5007 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005008 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005009 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005010 case 'I':
5011 case 'J':
5012 case 'K':
5013 case 'L':
5014 case 'M':
5015 // FIXME
5016 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005017 case 'Q': // A memory address that is a single base register.
5018 Info.setAllowsMemory();
5019 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005020 case 'U': // a memory reference...
5021 switch (Name[1]) {
5022 case 'q': // ...ARMV4 ldrsb
5023 case 'v': // ...VFP load/store (reg+constant offset)
5024 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005025 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005026 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005027 case 'n': // valid address for Neon doubleword vector load/store
5028 case 'm': // valid address for Neon element and structure load/store
5029 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005030 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005031 Info.setAllowsMemory();
5032 Name++;
5033 return true;
5034 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005035 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005036 return false;
5037 }
Craig Topper3164f332014-03-11 03:39:26 +00005038 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005039 std::string R;
5040 switch (*Constraint) {
5041 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005042 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005043 Constraint++;
5044 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005045 case 'p': // 'p' should be translated to 'r' by default.
5046 R = std::string("r");
5047 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005048 default:
5049 return std::string(1, *Constraint);
5050 }
5051 return R;
5052 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005053 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005054 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005055 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005056 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005057 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005058
Bill Wendling9d1ee112012-10-25 23:28:48 +00005059 // Strip off constraint modifiers.
5060 while (Constraint[0] == '=' ||
5061 Constraint[0] == '+' ||
5062 Constraint[0] == '&')
5063 Constraint = Constraint.substr(1);
5064
5065 switch (Constraint[0]) {
5066 default: break;
5067 case 'r': {
5068 switch (Modifier) {
5069 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005070 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005071 case 'q':
5072 // A register of size 32 cannot fit a vector type.
5073 return false;
5074 }
5075 }
5076 }
5077
5078 return true;
5079 }
Craig Topper3164f332014-03-11 03:39:26 +00005080 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005081 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005082 return "";
5083 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005084
Craig Topper3164f332014-03-11 03:39:26 +00005085 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005086 switch (CC) {
5087 case CC_AAPCS:
5088 case CC_AAPCS_VFP:
5089 case CC_Swift:
5090 return CCCR_OK;
5091 default:
5092 return CCCR_Warning;
5093 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005094 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005095
Craig Topper3164f332014-03-11 03:39:26 +00005096 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005097 if (RegNo == 0) return 0;
5098 if (RegNo == 1) return 1;
5099 return -1;
5100 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005101
5102 bool hasSjLjLowering() const override {
5103 return true;
5104 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005105};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005106
Rafael Espindolaeb265472013-08-21 21:59:03 +00005107bool ARMTargetInfo::setFPMath(StringRef Name) {
5108 if (Name == "neon") {
5109 FPMath = FP_Neon;
5110 return true;
5111 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5112 Name == "vfp4") {
5113 FPMath = FP_VFP;
5114 return true;
5115 }
5116 return false;
5117}
5118
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005119const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005120 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005121 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005122 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5123
5124 // Float registers
5125 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5126 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5127 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005128 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005129
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005130 // Double registers
5131 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5132 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005133 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5134 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005135
5136 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005137 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5138 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005139};
5140
Craig Topperf054e3a2015-10-19 03:52:27 +00005141ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5142 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005143}
5144
5145const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005146 { { "a1" }, "r0" },
5147 { { "a2" }, "r1" },
5148 { { "a3" }, "r2" },
5149 { { "a4" }, "r3" },
5150 { { "v1" }, "r4" },
5151 { { "v2" }, "r5" },
5152 { { "v3" }, "r6" },
5153 { { "v4" }, "r7" },
5154 { { "v5" }, "r8" },
5155 { { "v6", "rfp" }, "r9" },
5156 { { "sl" }, "r10" },
5157 { { "fp" }, "r11" },
5158 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005159 { { "r13" }, "sp" },
5160 { { "r14" }, "lr" },
5161 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005162 // The S, D and Q registers overlap, but aren't really aliases; we
5163 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005164};
5165
Craig Topperf054e3a2015-10-19 03:52:27 +00005166ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5167 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005168}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005169
5170const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005171#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005172 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005173#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5174 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005175#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005176
Craig Topper07d3b622015-08-07 05:14:44 +00005177#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005178 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005179#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005180 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005181#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5182 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005183#include "clang/Basic/BuiltinsARM.def"
5184};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005185
5186class ARMleTargetInfo : public ARMTargetInfo {
5187public:
5188 ARMleTargetInfo(const llvm::Triple &Triple)
5189 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005190 void getTargetDefines(const LangOptions &Opts,
5191 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005192 Builder.defineMacro("__ARMEL__");
5193 ARMTargetInfo::getTargetDefines(Opts, Builder);
5194 }
5195};
5196
5197class ARMbeTargetInfo : public ARMTargetInfo {
5198public:
5199 ARMbeTargetInfo(const llvm::Triple &Triple)
5200 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005201 void getTargetDefines(const LangOptions &Opts,
5202 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005203 Builder.defineMacro("__ARMEB__");
5204 Builder.defineMacro("__ARM_BIG_ENDIAN");
5205 ARMTargetInfo::getTargetDefines(Opts, Builder);
5206 }
5207};
Chris Lattner17df24e2008-04-21 18:56:49 +00005208
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005209class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5210 const llvm::Triple Triple;
5211public:
5212 WindowsARMTargetInfo(const llvm::Triple &Triple)
5213 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005214 WCharType = UnsignedShort;
5215 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005216 }
5217 void getVisualStudioDefines(const LangOptions &Opts,
5218 MacroBuilder &Builder) const {
5219 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5220
5221 // FIXME: this is invalid for WindowsCE
5222 Builder.defineMacro("_M_ARM_NT", "1");
5223 Builder.defineMacro("_M_ARMT", "_M_ARM");
5224 Builder.defineMacro("_M_THUMB", "_M_ARM");
5225
5226 assert((Triple.getArch() == llvm::Triple::arm ||
5227 Triple.getArch() == llvm::Triple::thumb) &&
5228 "invalid architecture for Windows ARM target info");
5229 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5230 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5231
5232 // TODO map the complete set of values
5233 // 31: VFPv3 40: VFPv4
5234 Builder.defineMacro("_M_ARM_FP", "31");
5235 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005236 BuiltinVaListKind getBuiltinVaListKind() const override {
5237 return TargetInfo::CharPtrBuiltinVaList;
5238 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005239 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5240 switch (CC) {
5241 case CC_X86StdCall:
5242 case CC_X86ThisCall:
5243 case CC_X86FastCall:
5244 case CC_X86VectorCall:
5245 return CCCR_Ignore;
5246 case CC_C:
5247 return CCCR_OK;
5248 default:
5249 return CCCR_Warning;
5250 }
5251 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005252};
5253
5254// Windows ARM + Itanium C++ ABI Target
5255class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5256public:
5257 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5258 : WindowsARMTargetInfo(Triple) {
5259 TheCXXABI.set(TargetCXXABI::GenericARM);
5260 }
5261
5262 void getTargetDefines(const LangOptions &Opts,
5263 MacroBuilder &Builder) const override {
5264 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5265
5266 if (Opts.MSVCCompat)
5267 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5268 }
5269};
5270
5271// Windows ARM, MS (C++) ABI
5272class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5273public:
5274 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5275 : WindowsARMTargetInfo(Triple) {
5276 TheCXXABI.set(TargetCXXABI::Microsoft);
5277 }
5278
5279 void getTargetDefines(const LangOptions &Opts,
5280 MacroBuilder &Builder) const override {
5281 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5282 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5283 }
5284};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005285
Yaron Keren321249c2015-07-15 13:32:23 +00005286// ARM MinGW target
5287class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5288public:
5289 MinGWARMTargetInfo(const llvm::Triple &Triple)
5290 : WindowsARMTargetInfo(Triple) {
5291 TheCXXABI.set(TargetCXXABI::GenericARM);
5292 }
5293
5294 void getTargetDefines(const LangOptions &Opts,
5295 MacroBuilder &Builder) const override {
5296 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5297 DefineStd(Builder, "WIN32", Opts);
5298 DefineStd(Builder, "WINNT", Opts);
5299 Builder.defineMacro("_ARM_");
5300 addMinGWDefines(Opts, Builder);
5301 }
5302};
5303
5304// ARM Cygwin target
5305class CygwinARMTargetInfo : public ARMleTargetInfo {
5306public:
5307 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5308 TLSSupported = false;
5309 WCharType = UnsignedShort;
5310 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005311 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005312 }
5313 void getTargetDefines(const LangOptions &Opts,
5314 MacroBuilder &Builder) const override {
5315 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5316 Builder.defineMacro("_ARM_");
5317 Builder.defineMacro("__CYGWIN__");
5318 Builder.defineMacro("__CYGWIN32__");
5319 DefineStd(Builder, "unix", Opts);
5320 if (Opts.CPlusPlus)
5321 Builder.defineMacro("_GNU_SOURCE");
5322 }
5323};
5324
Mike Stump11289f42009-09-09 15:08:12 +00005325class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005326 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005327protected:
Craig Topper3164f332014-03-11 03:39:26 +00005328 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5329 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005330 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005331 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005332
Torok Edwinb2b37c62009-06-30 17:10:35 +00005333public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005334 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005335 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005336 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005337 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005338 // FIXME: This should be based off of the target features in
5339 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005340 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005341
Tim Northoverd88ecb32016-01-27 19:32:40 +00005342 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005343 // Darwin on iOS uses a variant of the ARM C++ ABI.
5344 TheCXXABI.set(TargetCXXABI::WatchOS);
5345
5346 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5347 // size_t is long, it's a bit weird for it to be int.
5348 PtrDiffType = SignedLong;
5349
5350 // BOOL should be a real boolean on the new ABI
5351 UseSignedCharForObjCBool = false;
5352 } else
5353 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005354 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005355};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005356
Tim Northover573cbee2014-05-24 12:52:07 +00005357class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005358 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005359 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5360 static const char *const GCCRegNames[];
5361
James Molloy75f5f9e2014-04-16 15:33:48 +00005362 enum FPUModeEnum {
5363 FPUMode,
5364 NeonMode
5365 };
5366
5367 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005368 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005369 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005370 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005371 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005372
Tim Northovera2ee4332014-03-29 15:09:45 +00005373 static const Builtin::Info BuiltinInfo[];
5374
5375 std::string ABI;
5376
5377public:
Tim Northover573cbee2014-05-24 12:52:07 +00005378 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005379 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005380
5381 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5382 WCharType = SignedInt;
5383
5384 // NetBSD apparently prefers consistency across ARM targets to consistency
5385 // across 64-bit targets.
5386 Int64Type = SignedLongLong;
5387 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005388 } else {
5389 WCharType = UnsignedInt;
5390 Int64Type = SignedLong;
5391 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005392 }
5393
Tim Northovera2ee4332014-03-29 15:09:45 +00005394 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005395 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005396 MaxAtomicInlineWidth = 128;
5397 MaxAtomicPromoteWidth = 128;
5398
Tim Northovera6a19f12015-02-06 01:25:07 +00005399 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005400 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5401
Tim Northovera2ee4332014-03-29 15:09:45 +00005402 // {} in inline assembly are neon specifiers, not assembly variant
5403 // specifiers.
5404 NoAsmVariants = true;
5405
Tim Northover7ad87af2015-01-16 18:44:04 +00005406 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5407 // contributes to the alignment of the containing aggregate in the same way
5408 // a plain (non bit-field) member of that type would, without exception for
5409 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005410 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005411 UseZeroLengthBitfieldAlignment = true;
5412
Tim Northover573cbee2014-05-24 12:52:07 +00005413 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005414 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5415 }
5416
Alp Toker4925ba72014-06-07 23:30:42 +00005417 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005418 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005419 if (Name != "aapcs" && Name != "darwinpcs")
5420 return false;
5421
5422 ABI = Name;
5423 return true;
5424 }
5425
David Blaikie1cbb9712014-11-14 19:09:44 +00005426 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005427 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005428 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005429 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5430 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005431 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005432 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005433 .Default(false);
5434 return CPUKnown;
5435 }
5436
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005437 void getTargetDefines(const LangOptions &Opts,
5438 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005439 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005440 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005441
5442 // Target properties.
5443 Builder.defineMacro("_LP64");
5444 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005445
5446 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5447 Builder.defineMacro("__ARM_ACLE", "200");
5448 Builder.defineMacro("__ARM_ARCH", "8");
5449 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5450
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005451 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005452 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005453 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005454
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005455 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5456 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5457 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5458 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005459 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005460 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5461 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005462
5463 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5464
5465 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005466 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005467
5468 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5469 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005470 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5471 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005472
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005473 if (Opts.UnsafeFPMath)
5474 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005475
5476 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5477
5478 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5479 Opts.ShortEnums ? "1" : "4");
5480
James Molloy75f5f9e2014-04-16 15:33:48 +00005481 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005482 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005483 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005484 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005485 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005486
Bradley Smith418c5932014-05-02 15:17:51 +00005487 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005488 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005489
James Molloy75f5f9e2014-04-16 15:33:48 +00005490 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005491 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5492
5493 if (Unaligned)
5494 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005495
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005496 if (V8_1A)
5497 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5498
Reid Klecknerd167d422015-05-06 15:31:46 +00005499 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5500 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5501 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5502 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5503 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005504 }
5505
Craig Topper6c03a542015-10-19 04:51:35 +00005506 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5507 return llvm::makeArrayRef(BuiltinInfo,
5508 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005509 }
5510
David Blaikie1cbb9712014-11-14 19:09:44 +00005511 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005512 return Feature == "aarch64" ||
5513 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005514 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005515 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005516 }
5517
James Molloy5e73df52014-04-16 15:06:20 +00005518 bool handleTargetFeatures(std::vector<std::string> &Features,
5519 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005520 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005521 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005522 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005523 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005524 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005525
Eric Christopher610fe112015-08-26 08:21:55 +00005526 for (const auto &Feature : Features) {
5527 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005528 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005529 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005530 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005531 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005532 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005533 if (Feature == "+strict-align")
5534 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005535 if (Feature == "+v8.1a")
5536 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005537 }
5538
James Y Knightb214cbc2016-03-04 19:00:41 +00005539 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005540
5541 return true;
5542 }
5543
John McCall477f2bb2016-03-03 06:39:32 +00005544 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5545 switch (CC) {
5546 case CC_C:
5547 case CC_Swift:
5548 return CCCR_OK;
5549 default:
5550 return CCCR_Warning;
5551 }
5552 }
5553
David Blaikie1cbb9712014-11-14 19:09:44 +00005554 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005555
David Blaikie1cbb9712014-11-14 19:09:44 +00005556 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005557 return TargetInfo::AArch64ABIBuiltinVaList;
5558 }
5559
Craig Topperf054e3a2015-10-19 03:52:27 +00005560 ArrayRef<const char *> getGCCRegNames() const override;
5561 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005562
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005563 bool validateAsmConstraint(const char *&Name,
5564 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005565 switch (*Name) {
5566 default:
5567 return false;
5568 case 'w': // Floating point and SIMD registers (V0-V31)
5569 Info.setAllowsRegister();
5570 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005571 case 'I': // Constant that can be used with an ADD instruction
5572 case 'J': // Constant that can be used with a SUB instruction
5573 case 'K': // Constant that can be used with a 32-bit logical instruction
5574 case 'L': // Constant that can be used with a 64-bit logical instruction
5575 case 'M': // Constant that can be used as a 32-bit MOV immediate
5576 case 'N': // Constant that can be used as a 64-bit MOV immediate
5577 case 'Y': // Floating point constant zero
5578 case 'Z': // Integer constant zero
5579 return true;
5580 case 'Q': // A memory reference with base register and no offset
5581 Info.setAllowsMemory();
5582 return true;
5583 case 'S': // A symbolic address
5584 Info.setAllowsRegister();
5585 return true;
5586 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005587 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5588 // Utf: A memory address suitable for ldp/stp in TF mode.
5589 // Usa: An absolute symbolic address.
5590 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5591 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005592 case 'z': // Zero register, wzr or xzr
5593 Info.setAllowsRegister();
5594 return true;
5595 case 'x': // Floating point and SIMD registers (V0-V15)
5596 Info.setAllowsRegister();
5597 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005598 }
5599 return false;
5600 }
5601
Akira Hatanaka987f1862014-08-22 06:05:21 +00005602 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005603 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005604 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005605 // Strip off constraint modifiers.
5606 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5607 Constraint = Constraint.substr(1);
5608
5609 switch (Constraint[0]) {
5610 default:
5611 return true;
5612 case 'z':
5613 case 'r': {
5614 switch (Modifier) {
5615 case 'x':
5616 case 'w':
5617 // For now assume that the person knows what they're
5618 // doing with the modifier.
5619 return true;
5620 default:
5621 // By default an 'r' constraint will be in the 'x'
5622 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005623 if (Size == 64)
5624 return true;
5625
5626 SuggestedModifier = "w";
5627 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005628 }
5629 }
5630 }
5631 }
5632
David Blaikie1cbb9712014-11-14 19:09:44 +00005633 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005634
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005635 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005636 if (RegNo == 0)
5637 return 0;
5638 if (RegNo == 1)
5639 return 1;
5640 return -1;
5641 }
5642};
5643
Tim Northover573cbee2014-05-24 12:52:07 +00005644const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005645 // 32-bit Integer registers
5646 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5647 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5648 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5649
5650 // 64-bit Integer registers
5651 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5652 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5653 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5654
5655 // 32-bit floating point regsisters
5656 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5657 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5658 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5659
5660 // 64-bit floating point regsisters
5661 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5662 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5663 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5664
5665 // Vector registers
5666 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5667 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5668 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5669};
5670
Craig Topperf054e3a2015-10-19 03:52:27 +00005671ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5672 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005673}
5674
Tim Northover573cbee2014-05-24 12:52:07 +00005675const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005676 { { "w31" }, "wsp" },
5677 { { "x29" }, "fp" },
5678 { { "x30" }, "lr" },
5679 { { "x31" }, "sp" },
5680 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5681 // don't want to substitute one of these for a different-sized one.
5682};
5683
Craig Topperf054e3a2015-10-19 03:52:27 +00005684ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5685 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005686}
5687
Tim Northover573cbee2014-05-24 12:52:07 +00005688const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005689#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005690 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005691#include "clang/Basic/BuiltinsNEON.def"
5692
5693#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005694 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005695#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005696};
James Molloy5e73df52014-04-16 15:06:20 +00005697
Tim Northover573cbee2014-05-24 12:52:07 +00005698class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005699 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005700 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005701 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005702 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005703 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005704 }
5705
5706public:
Tim Northover573cbee2014-05-24 12:52:07 +00005707 AArch64leTargetInfo(const llvm::Triple &Triple)
5708 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005709 BigEndian = false;
5710 }
5711 void getTargetDefines(const LangOptions &Opts,
5712 MacroBuilder &Builder) const override {
5713 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005714 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005715 }
5716};
5717
Tim Northover573cbee2014-05-24 12:52:07 +00005718class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005719 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005720 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005721 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005722 }
5723
5724public:
Tim Northover573cbee2014-05-24 12:52:07 +00005725 AArch64beTargetInfo(const llvm::Triple &Triple)
5726 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005727 void getTargetDefines(const LangOptions &Opts,
5728 MacroBuilder &Builder) const override {
5729 Builder.defineMacro("__AARCH64EB__");
5730 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5731 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005732 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005733 }
5734};
Tim Northovera2ee4332014-03-29 15:09:45 +00005735
Tim Northover573cbee2014-05-24 12:52:07 +00005736class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005737protected:
5738 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5739 MacroBuilder &Builder) const override {
5740 Builder.defineMacro("__AARCH64_SIMD__");
5741 Builder.defineMacro("__ARM64_ARCH_8__");
5742 Builder.defineMacro("__ARM_NEON__");
5743 Builder.defineMacro("__LITTLE_ENDIAN__");
5744 Builder.defineMacro("__REGISTER_PREFIX__", "");
5745 Builder.defineMacro("__arm64", "1");
5746 Builder.defineMacro("__arm64__", "1");
5747
5748 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5749 }
5750
Tim Northovera2ee4332014-03-29 15:09:45 +00005751public:
Tim Northover573cbee2014-05-24 12:52:07 +00005752 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5753 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005754 Int64Type = SignedLongLong;
5755 WCharType = SignedInt;
5756 UseSignedCharForObjCBool = false;
5757
Tim Northovera6a19f12015-02-06 01:25:07 +00005758 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005759 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5760
5761 TheCXXABI.set(TargetCXXABI::iOS64);
5762 }
5763
David Blaikie1cbb9712014-11-14 19:09:44 +00005764 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005765 return TargetInfo::CharPtrBuiltinVaList;
5766 }
5767};
Tim Northovera2ee4332014-03-29 15:09:45 +00005768
Tony Linthicum76329bf2011-12-12 21:14:55 +00005769// Hexagon abstract base class
5770class HexagonTargetInfo : public TargetInfo {
5771 static const Builtin::Info BuiltinInfo[];
5772 static const char * const GCCRegNames[];
5773 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5774 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005775 bool HasHVX, HasHVXDouble;
5776
Tony Linthicum76329bf2011-12-12 21:14:55 +00005777public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005778 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005779 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005780 // Specify the vector alignment explicitly. For v512x1, the calculated
5781 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5782 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005783 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005784 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
James Y Knightb214cbc2016-03-04 19:00:41 +00005785 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005786 SizeType = UnsignedInt;
5787 PtrDiffType = SignedInt;
5788 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005789
5790 // {} in inline assembly are packet specifiers, not assembly variant
5791 // specifiers.
5792 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005793
5794 LargeArrayMinWidth = 64;
5795 LargeArrayAlign = 64;
5796 UseBitFieldTypeAlignment = true;
5797 ZeroLengthBitfieldBoundary = 32;
5798 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005799 }
5800
Craig Topper6c03a542015-10-19 04:51:35 +00005801 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5802 return llvm::makeArrayRef(BuiltinInfo,
5803 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005804 }
5805
Craig Topper3164f332014-03-11 03:39:26 +00005806 bool validateAsmConstraint(const char *&Name,
5807 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005808 return true;
5809 }
5810
Craig Topper3164f332014-03-11 03:39:26 +00005811 void getTargetDefines(const LangOptions &Opts,
5812 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005813
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005814 bool isCLZForZeroUndef() const override { return false; }
5815
Craig Topper3164f332014-03-11 03:39:26 +00005816 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005817 return llvm::StringSwitch<bool>(Feature)
5818 .Case("hexagon", true)
5819 .Case("hvx", HasHVX)
5820 .Case("hvx-double", HasHVXDouble)
5821 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005822 }
Craig Topper3164f332014-03-11 03:39:26 +00005823
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005824 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5825 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5826 const override;
5827
5828 bool handleTargetFeatures(std::vector<std::string> &Features,
5829 DiagnosticsEngine &Diags) override;
5830
Craig Topper3164f332014-03-11 03:39:26 +00005831 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005832 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005833 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005834 ArrayRef<const char *> getGCCRegNames() const override;
5835 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005836 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005837 return "";
5838 }
Sebastian Pop86500282012-01-13 20:37:10 +00005839
5840 static const char *getHexagonCPUSuffix(StringRef Name) {
5841 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005842 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005843 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005844 .Case("hexagonv55", "55")
5845 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005846 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005847 }
5848
Craig Topper3164f332014-03-11 03:39:26 +00005849 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005850 if (!getHexagonCPUSuffix(Name))
5851 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005852 CPU = Name;
5853 return true;
5854 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005855
5856 int getEHDataRegisterNumber(unsigned RegNo) const override {
5857 return RegNo < 2 ? RegNo : -1;
5858 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005859};
5860
5861void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005862 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005863 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005864 Builder.defineMacro("__hexagon__", "1");
5865
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005866 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005867 Builder.defineMacro("__HEXAGON_V4__");
5868 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005869 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005870 Builder.defineMacro("__QDSP6_V4__");
5871 Builder.defineMacro("__QDSP6_ARCH__", "4");
5872 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005873 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005874 Builder.defineMacro("__HEXAGON_V5__");
5875 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5876 if(Opts.HexagonQdsp6Compat) {
5877 Builder.defineMacro("__QDSP6_V5__");
5878 Builder.defineMacro("__QDSP6_ARCH__", "5");
5879 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005880 } else if (CPU == "hexagonv60") {
5881 Builder.defineMacro("__HEXAGON_V60__");
5882 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5883 Builder.defineMacro("__QDSP6_V60__");
5884 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005885 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005886}
5887
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005888bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5889 DiagnosticsEngine &Diags) {
5890 for (auto &F : Features) {
5891 if (F == "+hvx")
5892 HasHVX = true;
5893 else if (F == "-hvx")
5894 HasHVX = HasHVXDouble = false;
5895 else if (F == "+hvx-double")
5896 HasHVX = HasHVXDouble = true;
5897 else if (F == "-hvx-double")
5898 HasHVXDouble = false;
5899 }
5900 return true;
5901}
5902
5903bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5904 DiagnosticsEngine &Diags, StringRef CPU,
5905 const std::vector<std::string> &FeaturesVec) const {
5906 // Default for v60: -hvx, -hvx-double.
5907 Features["hvx"] = false;
5908 Features["hvx-double"] = false;
5909
5910 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5911}
5912
5913
5914const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005915 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5916 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5917 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5918 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5919 "p0", "p1", "p2", "p3",
5920 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5921};
5922
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005923ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005924 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005925}
5926
Tony Linthicum76329bf2011-12-12 21:14:55 +00005927const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5928 { { "sp" }, "r29" },
5929 { { "fp" }, "r30" },
5930 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005931};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005932
Craig Topperf054e3a2015-10-19 03:52:27 +00005933ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5934 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005935}
5936
5937
5938const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005939#define BUILTIN(ID, TYPE, ATTRS) \
5940 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5941#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5942 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005943#include "clang/Basic/BuiltinsHexagon.def"
5944};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005945
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005946// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5947class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005948 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5949 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005950 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005951public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005952 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00005953 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005954
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00005955 int getEHDataRegisterNumber(unsigned RegNo) const override {
5956 if (RegNo == 0) return 24;
5957 if (RegNo == 1) return 25;
5958 return -1;
5959 }
5960
Craig Topper3164f332014-03-11 03:39:26 +00005961 bool handleTargetFeatures(std::vector<std::string> &Features,
5962 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005963 // The backend doesn't actually handle soft float yet, but in case someone
5964 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005965 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5966 if (Feature != Features.end()) {
5967 SoftFloat = true;
5968 Features.erase(Feature);
5969 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005970 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005971 }
Craig Topper3164f332014-03-11 03:39:26 +00005972 void getTargetDefines(const LangOptions &Opts,
5973 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005974 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005975 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005976
5977 if (SoftFloat)
5978 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005979 }
Craig Topper3164f332014-03-11 03:39:26 +00005980
5981 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005982 return llvm::StringSwitch<bool>(Feature)
5983 .Case("softfloat", SoftFloat)
5984 .Case("sparc", true)
5985 .Default(false);
5986 }
Craig Topper3164f332014-03-11 03:39:26 +00005987
Craig Topper6c03a542015-10-19 04:51:35 +00005988 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005989 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005990 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005991 }
Craig Topper3164f332014-03-11 03:39:26 +00005992 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005993 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005994 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005995 ArrayRef<const char *> getGCCRegNames() const override;
5996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005997 bool validateAsmConstraint(const char *&Name,
5998 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005999 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006000 switch (*Name) {
6001 case 'I': // Signed 13-bit constant
6002 case 'J': // Zero
6003 case 'K': // 32-bit constant with the low 12 bits clear
6004 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6005 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6006 case 'N': // Same as 'K' but zext (required for SIMode)
6007 case 'O': // The constant 4096
6008 return true;
6009 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006010 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006011 }
Craig Topper3164f332014-03-11 03:39:26 +00006012 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006013 // FIXME: Implement!
6014 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006015 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006016
6017 // No Sparc V7 for now, the backend doesn't support it anyway.
6018 enum CPUKind {
6019 CK_GENERIC,
6020 CK_V8,
6021 CK_SUPERSPARC,
6022 CK_SPARCLITE,
6023 CK_F934,
6024 CK_HYPERSPARC,
6025 CK_SPARCLITE86X,
6026 CK_SPARCLET,
6027 CK_TSC701,
6028 CK_V9,
6029 CK_ULTRASPARC,
6030 CK_ULTRASPARC3,
6031 CK_NIAGARA,
6032 CK_NIAGARA2,
6033 CK_NIAGARA3,
6034 CK_NIAGARA4
6035 } CPU = CK_GENERIC;
6036
6037 enum CPUGeneration {
6038 CG_V8,
6039 CG_V9,
6040 };
6041
6042 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6043 switch (Kind) {
6044 case CK_GENERIC:
6045 case CK_V8:
6046 case CK_SUPERSPARC:
6047 case CK_SPARCLITE:
6048 case CK_F934:
6049 case CK_HYPERSPARC:
6050 case CK_SPARCLITE86X:
6051 case CK_SPARCLET:
6052 case CK_TSC701:
6053 return CG_V8;
6054 case CK_V9:
6055 case CK_ULTRASPARC:
6056 case CK_ULTRASPARC3:
6057 case CK_NIAGARA:
6058 case CK_NIAGARA2:
6059 case CK_NIAGARA3:
6060 case CK_NIAGARA4:
6061 return CG_V9;
6062 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006063 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006064 }
6065
6066 CPUKind getCPUKind(StringRef Name) const {
6067 return llvm::StringSwitch<CPUKind>(Name)
6068 .Case("v8", CK_V8)
6069 .Case("supersparc", CK_SUPERSPARC)
6070 .Case("sparclite", CK_SPARCLITE)
6071 .Case("f934", CK_F934)
6072 .Case("hypersparc", CK_HYPERSPARC)
6073 .Case("sparclite86x", CK_SPARCLITE86X)
6074 .Case("sparclet", CK_SPARCLET)
6075 .Case("tsc701", CK_TSC701)
6076 .Case("v9", CK_V9)
6077 .Case("ultrasparc", CK_ULTRASPARC)
6078 .Case("ultrasparc3", CK_ULTRASPARC3)
6079 .Case("niagara", CK_NIAGARA)
6080 .Case("niagara2", CK_NIAGARA2)
6081 .Case("niagara3", CK_NIAGARA3)
6082 .Case("niagara4", CK_NIAGARA4)
6083 .Default(CK_GENERIC);
6084 }
6085
6086 bool setCPU(const std::string &Name) override {
6087 CPU = getCPUKind(Name);
6088 return CPU != CK_GENERIC;
6089 }
Gabor Greif49991682008-02-21 16:29:08 +00006090};
6091
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006092const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006093 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6094 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6095 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6096 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6097};
6098
Craig Topperf054e3a2015-10-19 03:52:27 +00006099ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6100 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006101}
6102
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006103const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006104 { { "g0" }, "r0" },
6105 { { "g1" }, "r1" },
6106 { { "g2" }, "r2" },
6107 { { "g3" }, "r3" },
6108 { { "g4" }, "r4" },
6109 { { "g5" }, "r5" },
6110 { { "g6" }, "r6" },
6111 { { "g7" }, "r7" },
6112 { { "o0" }, "r8" },
6113 { { "o1" }, "r9" },
6114 { { "o2" }, "r10" },
6115 { { "o3" }, "r11" },
6116 { { "o4" }, "r12" },
6117 { { "o5" }, "r13" },
6118 { { "o6", "sp" }, "r14" },
6119 { { "o7" }, "r15" },
6120 { { "l0" }, "r16" },
6121 { { "l1" }, "r17" },
6122 { { "l2" }, "r18" },
6123 { { "l3" }, "r19" },
6124 { { "l4" }, "r20" },
6125 { { "l5" }, "r21" },
6126 { { "l6" }, "r22" },
6127 { { "l7" }, "r23" },
6128 { { "i0" }, "r24" },
6129 { { "i1" }, "r25" },
6130 { { "i2" }, "r26" },
6131 { { "i3" }, "r27" },
6132 { { "i4" }, "r28" },
6133 { { "i5" }, "r29" },
6134 { { "i6", "fp" }, "r30" },
6135 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006136};
6137
Craig Topperf054e3a2015-10-19 03:52:27 +00006138ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6139 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006140}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006141
6142// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6143class SparcV8TargetInfo : public SparcTargetInfo {
6144public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006145 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006146 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006147 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6148 switch (getTriple().getOS()) {
6149 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006150 SizeType = UnsignedInt;
6151 IntPtrType = SignedInt;
6152 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006153 break;
6154 case llvm::Triple::NetBSD:
6155 case llvm::Triple::OpenBSD:
6156 SizeType = UnsignedLong;
6157 IntPtrType = SignedLong;
6158 PtrDiffType = SignedLong;
6159 break;
Brad Smith56495d52015-08-13 22:00:53 +00006160 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006161 }
6162
Craig Topper3164f332014-03-11 03:39:26 +00006163 void getTargetDefines(const LangOptions &Opts,
6164 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006165 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006166 switch (getCPUGeneration(CPU)) {
6167 case CG_V8:
6168 Builder.defineMacro("__sparcv8");
6169 if (getTriple().getOS() != llvm::Triple::Solaris)
6170 Builder.defineMacro("__sparcv8__");
6171 break;
6172 case CG_V9:
6173 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006174 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006175 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006176 Builder.defineMacro("__sparc_v9__");
6177 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006178 break;
6179 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006180 }
6181};
6182
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006183// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6184class SparcV8elTargetInfo : public SparcV8TargetInfo {
6185 public:
6186 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006187 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006188 BigEndian = false;
6189 }
6190};
6191
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006192// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6193class SparcV9TargetInfo : public SparcTargetInfo {
6194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006195 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006196 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006197 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006198 // This is an LP64 platform.
6199 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006200
6201 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006202 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006203 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006204 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006205 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006206 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006207
6208 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6209 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6210 LongDoubleWidth = 128;
6211 LongDoubleAlign = 128;
6212 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006213 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006214 }
6215
Craig Topper3164f332014-03-11 03:39:26 +00006216 void getTargetDefines(const LangOptions &Opts,
6217 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006218 SparcTargetInfo::getTargetDefines(Opts, Builder);
6219 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006220 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006221 // Solaris doesn't need these variants, but the BSDs do.
6222 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006223 Builder.defineMacro("__sparc64__");
6224 Builder.defineMacro("__sparc_v9__");
6225 Builder.defineMacro("__sparcv9__");
6226 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006227 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006228
Craig Topper3164f332014-03-11 03:39:26 +00006229 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006230 if (!SparcTargetInfo::setCPU(Name))
6231 return false;
6232 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006233 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006234};
6235
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006236class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006237 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006238 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006239 std::string CPU;
6240 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006241 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006242
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006243public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006244 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006245 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6246 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006247 IntMaxType = SignedLong;
6248 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006249 TLSSupported = true;
6250 IntWidth = IntAlign = 32;
6251 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6252 PointerWidth = PointerAlign = 64;
6253 LongDoubleWidth = 128;
6254 LongDoubleAlign = 64;
6255 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006256 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006257 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006258 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006259 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6260 }
6261 void getTargetDefines(const LangOptions &Opts,
6262 MacroBuilder &Builder) const override {
6263 Builder.defineMacro("__s390__");
6264 Builder.defineMacro("__s390x__");
6265 Builder.defineMacro("__zarch__");
6266 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006267
6268 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6269 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6270 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6271 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6272
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006273 if (HasTransactionalExecution)
6274 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006275 if (Opts.ZVector)
6276 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006277 }
Craig Topper6c03a542015-10-19 04:51:35 +00006278 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6279 return llvm::makeArrayRef(BuiltinInfo,
6280 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006281 }
6282
Craig Topperf054e3a2015-10-19 03:52:27 +00006283 ArrayRef<const char *> getGCCRegNames() const override;
6284 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006285 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006286 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006287 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006288 bool validateAsmConstraint(const char *&Name,
6289 TargetInfo::ConstraintInfo &info) const override;
6290 const char *getClobbers() const override {
6291 // FIXME: Is this really right?
6292 return "";
6293 }
6294 BuiltinVaListKind getBuiltinVaListKind() const override {
6295 return TargetInfo::SystemZBuiltinVaList;
6296 }
6297 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006298 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006299 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6300 .Case("z10", true)
6301 .Case("z196", true)
6302 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006303 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006304 .Default(false);
6305
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006306 return CPUKnown;
6307 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006308 bool
6309 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6310 StringRef CPU,
6311 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006312 if (CPU == "zEC12")
6313 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006314 if (CPU == "z13") {
6315 Features["transactional-execution"] = true;
6316 Features["vector"] = true;
6317 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006318 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006319 }
6320
6321 bool handleTargetFeatures(std::vector<std::string> &Features,
6322 DiagnosticsEngine &Diags) override {
6323 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006324 for (const auto &Feature : Features) {
6325 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006326 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006327 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006328 HasVector = true;
6329 }
6330 // If we use the vector ABI, vector types are 64-bit aligned.
6331 if (HasVector) {
6332 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006333 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6334 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006335 }
6336 return true;
6337 }
6338
6339 bool hasFeature(StringRef Feature) const override {
6340 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006341 .Case("systemz", true)
6342 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006343 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006344 .Default(false);
6345 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006346
6347 StringRef getABI() const override {
6348 if (HasVector)
6349 return "vector";
6350 return "";
6351 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006352
6353 bool useFloat128ManglingForLongDouble() const override {
6354 return true;
6355 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006356};
6357
6358const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6359#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006360 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006361#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006362};
6363
6364const char *const SystemZTargetInfo::GCCRegNames[] = {
6365 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6366 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6367 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6368 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6369};
6370
Craig Topperf054e3a2015-10-19 03:52:27 +00006371ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6372 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006373}
6374
6375bool SystemZTargetInfo::
6376validateAsmConstraint(const char *&Name,
6377 TargetInfo::ConstraintInfo &Info) const {
6378 switch (*Name) {
6379 default:
6380 return false;
6381
6382 case 'a': // Address register
6383 case 'd': // Data register (equivalent to 'r')
6384 case 'f': // Floating-point register
6385 Info.setAllowsRegister();
6386 return true;
6387
6388 case 'I': // Unsigned 8-bit constant
6389 case 'J': // Unsigned 12-bit constant
6390 case 'K': // Signed 16-bit constant
6391 case 'L': // Signed 20-bit displacement (on all targets we support)
6392 case 'M': // 0x7fffffff
6393 return true;
6394
6395 case 'Q': // Memory with base and unsigned 12-bit displacement
6396 case 'R': // Likewise, plus an index
6397 case 'S': // Memory with base and signed 20-bit displacement
6398 case 'T': // Likewise, plus an index
6399 Info.setAllowsMemory();
6400 return true;
6401 }
6402}
Ulrich Weigand47445072013-05-06 16:26:41 +00006403
Eric Christopherc48497a2015-09-18 21:26:24 +00006404class MSP430TargetInfo : public TargetInfo {
6405 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006406
Eric Christopherc48497a2015-09-18 21:26:24 +00006407public:
6408 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6409 BigEndian = false;
6410 TLSSupported = false;
6411 IntWidth = 16;
6412 IntAlign = 16;
6413 LongWidth = 32;
6414 LongLongWidth = 64;
6415 LongAlign = LongLongAlign = 16;
6416 PointerWidth = 16;
6417 PointerAlign = 16;
6418 SuitableAlign = 16;
6419 SizeType = UnsignedInt;
6420 IntMaxType = SignedLongLong;
6421 IntPtrType = SignedInt;
6422 PtrDiffType = SignedInt;
6423 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006424 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006425 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006426 void getTargetDefines(const LangOptions &Opts,
6427 MacroBuilder &Builder) const override {
6428 Builder.defineMacro("MSP430");
6429 Builder.defineMacro("__MSP430__");
6430 // FIXME: defines for different 'flavours' of MCU
6431 }
Craig Topper6c03a542015-10-19 04:51:35 +00006432 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006433 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006434 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006435 }
6436 bool hasFeature(StringRef Feature) const override {
6437 return Feature == "msp430";
6438 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006439 ArrayRef<const char *> getGCCRegNames() const override;
6440 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006441 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006442 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006443 }
6444 bool validateAsmConstraint(const char *&Name,
6445 TargetInfo::ConstraintInfo &info) const override {
6446 // FIXME: implement
6447 switch (*Name) {
6448 case 'K': // the constant 1
6449 case 'L': // constant -1^20 .. 1^19
6450 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006451 return true;
6452 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006453 // No target constraints for now.
6454 return false;
6455 }
6456 const char *getClobbers() const override {
6457 // FIXME: Is this really right?
6458 return "";
6459 }
6460 BuiltinVaListKind getBuiltinVaListKind() const override {
6461 // FIXME: implement
6462 return TargetInfo::CharPtrBuiltinVaList;
6463 }
6464};
6465
6466const char *const MSP430TargetInfo::GCCRegNames[] = {
6467 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6468 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6469
Craig Topperf054e3a2015-10-19 03:52:27 +00006470ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6471 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006472}
6473
6474// LLVM and Clang cannot be used directly to output native binaries for
6475// target, but is used to compile C code to llvm bitcode with correct
6476// type and alignment information.
6477//
6478// TCE uses the llvm bitcode as input and uses it for generating customized
6479// target processor and program binary. TCE co-design environment is
6480// publicly available in http://tce.cs.tut.fi
6481
6482static const unsigned TCEOpenCLAddrSpaceMap[] = {
6483 3, // opencl_global
6484 4, // opencl_local
6485 5, // opencl_constant
6486 // FIXME: generic has to be added to the target
6487 0, // opencl_generic
6488 0, // cuda_device
6489 0, // cuda_constant
6490 0 // cuda_shared
6491};
6492
6493class TCETargetInfo : public TargetInfo {
6494public:
6495 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6496 TLSSupported = false;
6497 IntWidth = 32;
6498 LongWidth = LongLongWidth = 32;
6499 PointerWidth = 32;
6500 IntAlign = 32;
6501 LongAlign = LongLongAlign = 32;
6502 PointerAlign = 32;
6503 SuitableAlign = 32;
6504 SizeType = UnsignedInt;
6505 IntMaxType = SignedLong;
6506 IntPtrType = SignedInt;
6507 PtrDiffType = SignedInt;
6508 FloatWidth = 32;
6509 FloatAlign = 32;
6510 DoubleWidth = 32;
6511 DoubleAlign = 32;
6512 LongDoubleWidth = 32;
6513 LongDoubleAlign = 32;
6514 FloatFormat = &llvm::APFloat::IEEEsingle;
6515 DoubleFormat = &llvm::APFloat::IEEEsingle;
6516 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006517 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6518 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006519 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6520 UseAddrSpaceMapMangling = true;
6521 }
6522
6523 void getTargetDefines(const LangOptions &Opts,
6524 MacroBuilder &Builder) const override {
6525 DefineStd(Builder, "tce", Opts);
6526 Builder.defineMacro("__TCE__");
6527 Builder.defineMacro("__TCE_V1__");
6528 }
6529 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6530
Craig Topper6c03a542015-10-19 04:51:35 +00006531 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006532 const char *getClobbers() const override { return ""; }
6533 BuiltinVaListKind getBuiltinVaListKind() const override {
6534 return TargetInfo::VoidPtrBuiltinVaList;
6535 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006536 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006537 bool validateAsmConstraint(const char *&Name,
6538 TargetInfo::ConstraintInfo &info) const override {
6539 return true;
6540 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006541 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6542 return None;
6543 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006544};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006545
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006546class BPFTargetInfo : public TargetInfo {
6547public:
6548 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6549 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6550 SizeType = UnsignedLong;
6551 PtrDiffType = SignedLong;
6552 IntPtrType = SignedLong;
6553 IntMaxType = SignedLong;
6554 Int64Type = SignedLong;
6555 RegParmMax = 5;
6556 if (Triple.getArch() == llvm::Triple::bpfeb) {
6557 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006558 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006559 } else {
6560 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006561 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006562 }
6563 MaxAtomicPromoteWidth = 64;
6564 MaxAtomicInlineWidth = 64;
6565 TLSSupported = false;
6566 }
6567 void getTargetDefines(const LangOptions &Opts,
6568 MacroBuilder &Builder) const override {
6569 DefineStd(Builder, "bpf", Opts);
6570 Builder.defineMacro("__BPF__");
6571 }
6572 bool hasFeature(StringRef Feature) const override {
6573 return Feature == "bpf";
6574 }
6575
Craig Topper6c03a542015-10-19 04:51:35 +00006576 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006577 const char *getClobbers() const override {
6578 return "";
6579 }
6580 BuiltinVaListKind getBuiltinVaListKind() const override {
6581 return TargetInfo::VoidPtrBuiltinVaList;
6582 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006583 ArrayRef<const char *> getGCCRegNames() const override {
6584 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006585 }
6586 bool validateAsmConstraint(const char *&Name,
6587 TargetInfo::ConstraintInfo &info) const override {
6588 return true;
6589 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006590 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6591 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006592 }
6593};
6594
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006595class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006596 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006597
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006598 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006599 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006600 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006601 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006602 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006603 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006604 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006605 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006606 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006607 enum DspRevEnum {
6608 NoDSP, DSP1, DSP2
6609 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006610 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006611
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006612protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006613 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006614 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006615
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006616public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006617 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6618 const std::string &CPUStr)
6619 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006620 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006621 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6622 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6623 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006624
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006625 bool isNaN2008Default() const {
6626 return CPU == "mips32r6" || CPU == "mips64r6";
6627 }
6628
6629 bool isFP64Default() const {
6630 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6631 }
6632
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006633 bool isNan2008() const override {
6634 return IsNan2008;
6635 }
6636
Alp Toker4925ba72014-06-07 23:30:42 +00006637 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006638 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006639 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6640 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006641 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006642 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006643 .Case("mips1", IsMips32)
6644 .Case("mips2", IsMips32)
6645 .Case("mips3", true)
6646 .Case("mips4", true)
6647 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006648 .Case("mips32", IsMips32)
6649 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006650 .Case("mips32r3", IsMips32)
6651 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006652 .Case("mips32r6", IsMips32)
6653 .Case("mips64", true)
6654 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006655 .Case("mips64r3", true)
6656 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006657 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006658 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006659 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006660 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006661 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006662 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006663 bool
6664 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6665 StringRef CPU,
6666 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006667 if (CPU.empty())
6668 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006669 if (CPU == "octeon")
6670 Features["mips64r2"] = Features["cnmips"] = true;
6671 else
6672 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006673 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006674 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006675
Craig Topper3164f332014-03-11 03:39:26 +00006676 void getTargetDefines(const LangOptions &Opts,
6677 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006678 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006679 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006680 if (Opts.GNUMode)
6681 Builder.defineMacro("mips");
6682
Simon Atanasyan683535b2012-08-29 19:14:58 +00006683 Builder.defineMacro("__REGISTER_PREFIX__", "");
6684
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006685 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006686 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006687 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006688 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006689 case SoftFloat:
6690 Builder.defineMacro("__mips_soft_float", Twine(1));
6691 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006692 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006693
Simon Atanasyan16071912013-04-14 14:07:30 +00006694 if (IsSingleFloat)
6695 Builder.defineMacro("__mips_single_float", Twine(1));
6696
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006697 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6698 Builder.defineMacro("_MIPS_FPSET",
6699 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6700
Simon Atanasyan72244b62012-07-05 16:06:06 +00006701 if (IsMips16)
6702 Builder.defineMacro("__mips16", Twine(1));
6703
Simon Atanasyan60777612013-04-14 14:07:51 +00006704 if (IsMicromips)
6705 Builder.defineMacro("__mips_micromips", Twine(1));
6706
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006707 if (IsNan2008)
6708 Builder.defineMacro("__mips_nan2008", Twine(1));
6709
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006710 switch (DspRev) {
6711 default:
6712 break;
6713 case DSP1:
6714 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6715 Builder.defineMacro("__mips_dsp", Twine(1));
6716 break;
6717 case DSP2:
6718 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6719 Builder.defineMacro("__mips_dspr2", Twine(1));
6720 Builder.defineMacro("__mips_dsp", Twine(1));
6721 break;
6722 }
6723
Jack Carter44ff1e52013-08-12 17:20:29 +00006724 if (HasMSA)
6725 Builder.defineMacro("__mips_msa", Twine(1));
6726
Simon Atanasyan26f19672012-04-05 19:28:31 +00006727 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6728 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6729 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006730
6731 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6732 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006733
6734 // These shouldn't be defined for MIPS-I but there's no need to check
6735 // for that since MIPS-I isn't supported.
6736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6737 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6738 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006739 }
6740
Craig Topper6c03a542015-10-19 04:51:35 +00006741 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6742 return llvm::makeArrayRef(BuiltinInfo,
6743 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006744 }
Craig Topper3164f332014-03-11 03:39:26 +00006745 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006746 return llvm::StringSwitch<bool>(Feature)
6747 .Case("mips", true)
6748 .Case("fp64", HasFP64)
6749 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006750 }
Craig Topper3164f332014-03-11 03:39:26 +00006751 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006752 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006753 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006754 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006755 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006756 // CPU register names
6757 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006758 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6759 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6760 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006761 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6762 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006763 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6764 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6765 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6766 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006767 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006768 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006769 "$fcc5","$fcc6","$fcc7",
6770 // MSA register names
6771 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6772 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6773 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6774 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6775 // MSA control register names
6776 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6777 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006778 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006779 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006780 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006781 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006782 bool validateAsmConstraint(const char *&Name,
6783 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006784 switch (*Name) {
6785 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006786 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006787 case 'r': // CPU registers.
6788 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006789 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006790 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006791 case 'c': // $25 for indirect jumps
6792 case 'l': // lo register
6793 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006794 Info.setAllowsRegister();
6795 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006796 case 'I': // Signed 16-bit constant
6797 case 'J': // Integer 0
6798 case 'K': // Unsigned 16-bit constant
6799 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6800 case 'M': // Constants not loadable via lui, addiu, or ori
6801 case 'N': // Constant -1 to -65535
6802 case 'O': // A signed 15-bit constant
6803 case 'P': // A constant between 1 go 65535
6804 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006805 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006806 Info.setAllowsMemory();
6807 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006808 case 'Z':
6809 if (Name[1] == 'C') { // An address usable by ll, and sc.
6810 Info.setAllowsMemory();
6811 Name++; // Skip over 'Z'.
6812 return true;
6813 }
6814 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006815 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006816 }
6817
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006818 std::string convertConstraint(const char *&Constraint) const override {
6819 std::string R;
6820 switch (*Constraint) {
6821 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6822 if (Constraint[1] == 'C') {
6823 R = std::string("^") + std::string(Constraint, 2);
6824 Constraint++;
6825 return R;
6826 }
6827 break;
6828 }
6829 return TargetInfo::convertConstraint(Constraint);
6830 }
6831
Craig Topper3164f332014-03-11 03:39:26 +00006832 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006833 // In GCC, $1 is not widely used in generated code (it's used only in a few
6834 // specific situations), so there is no real need for users to add it to
6835 // the clobbers list if they want to use it in their inline assembly code.
6836 //
6837 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6838 // code generation, so using it in inline assembly without adding it to the
6839 // clobbers list can cause conflicts between the inline assembly code and
6840 // the surrounding generated code.
6841 //
6842 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6843 // operands, which will conflict with the ".set at" assembler option (which
6844 // we use only for inline assembly, in order to maintain compatibility with
6845 // GCC) and will also conflict with the user's usage of $1.
6846 //
6847 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6848 // register for generated code is to automatically clobber $1 for all inline
6849 // assembly code.
6850 //
6851 // FIXME: We should automatically clobber $1 only for inline assembly code
6852 // which actually uses it. This would allow LLVM to use $1 for inline
6853 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006854 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006855 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006856
Craig Topper3164f332014-03-11 03:39:26 +00006857 bool handleTargetFeatures(std::vector<std::string> &Features,
6858 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006859 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006860 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006861 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006862 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006863 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006864 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006865 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006866
Eric Christopher610fe112015-08-26 08:21:55 +00006867 for (const auto &Feature : Features) {
6868 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006869 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006870 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006871 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006872 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006873 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006874 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006875 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006876 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006877 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006878 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006879 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006880 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006881 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006882 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006883 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006884 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006885 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006886 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006887 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006888 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006889 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006890 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006891
James Y Knightb214cbc2016-03-04 19:00:41 +00006892 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006893
Rafael Espindolaeb265472013-08-21 21:59:03 +00006894 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006895 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006896
Craig Topper3164f332014-03-11 03:39:26 +00006897 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006898 if (RegNo == 0) return 4;
6899 if (RegNo == 1) return 5;
6900 return -1;
6901 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006902
6903 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006904};
6905
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006906const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006907#define BUILTIN(ID, TYPE, ATTRS) \
6908 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6909#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6910 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006911#include "clang/Basic/BuiltinsMips.def"
6912};
6913
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006914class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006915public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006916 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006917 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006918 SizeType = UnsignedInt;
6919 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006920 Int64Type = SignedLongLong;
6921 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006922 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006923 }
Craig Topper3164f332014-03-11 03:39:26 +00006924 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006925 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006926 ABI = Name;
6927 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006928 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006929 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006930 }
Craig Topper3164f332014-03-11 03:39:26 +00006931 void getTargetDefines(const LangOptions &Opts,
6932 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006933 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006934
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006935 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006936 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6937
6938 const std::string& CPUStr = getCPU();
6939 if (CPUStr == "mips32")
6940 Builder.defineMacro("__mips_isa_rev", "1");
6941 else if (CPUStr == "mips32r2")
6942 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006943 else if (CPUStr == "mips32r3")
6944 Builder.defineMacro("__mips_isa_rev", "3");
6945 else if (CPUStr == "mips32r5")
6946 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006947 else if (CPUStr == "mips32r6")
6948 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006949
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006950 if (ABI == "o32") {
6951 Builder.defineMacro("__mips_o32");
6952 Builder.defineMacro("_ABIO32", "1");
6953 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6954 }
6955 else if (ABI == "eabi")
6956 Builder.defineMacro("__mips_eabi");
6957 else
David Blaikie83d382b2011-09-23 05:06:16 +00006958 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006959 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006960 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006961 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6962 { { "at" }, "$1" },
6963 { { "v0" }, "$2" },
6964 { { "v1" }, "$3" },
6965 { { "a0" }, "$4" },
6966 { { "a1" }, "$5" },
6967 { { "a2" }, "$6" },
6968 { { "a3" }, "$7" },
6969 { { "t0" }, "$8" },
6970 { { "t1" }, "$9" },
6971 { { "t2" }, "$10" },
6972 { { "t3" }, "$11" },
6973 { { "t4" }, "$12" },
6974 { { "t5" }, "$13" },
6975 { { "t6" }, "$14" },
6976 { { "t7" }, "$15" },
6977 { { "s0" }, "$16" },
6978 { { "s1" }, "$17" },
6979 { { "s2" }, "$18" },
6980 { { "s3" }, "$19" },
6981 { { "s4" }, "$20" },
6982 { { "s5" }, "$21" },
6983 { { "s6" }, "$22" },
6984 { { "s7" }, "$23" },
6985 { { "t8" }, "$24" },
6986 { { "t9" }, "$25" },
6987 { { "k0" }, "$26" },
6988 { { "k1" }, "$27" },
6989 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006990 { { "sp","$sp" }, "$29" },
6991 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006992 { { "ra" }, "$31" }
6993 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006994 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006995 }
6996};
6997
6998class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00006999 void setDataLayout() override {
7000 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007001 }
7002
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007003public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007004 Mips32EBTargetInfo(const llvm::Triple &Triple)
7005 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007006 }
Craig Topper3164f332014-03-11 03:39:26 +00007007 void getTargetDefines(const LangOptions &Opts,
7008 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007009 DefineStd(Builder, "MIPSEB", Opts);
7010 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007011 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007012 }
7013};
7014
7015class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007016 void setDataLayout() override {
7017 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007018 }
7019
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007020public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007021 Mips32ELTargetInfo(const llvm::Triple &Triple)
7022 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007023 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007024 }
Craig Topper3164f332014-03-11 03:39:26 +00007025 void getTargetDefines(const LangOptions &Opts,
7026 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007027 DefineStd(Builder, "MIPSEL", Opts);
7028 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007029 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007030 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007031};
Akira Hatanakabef17452011-09-20 19:21:49 +00007032
7033class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007034public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007035 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007036 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007037 LongDoubleWidth = LongDoubleAlign = 128;
7038 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007039 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7040 LongDoubleWidth = LongDoubleAlign = 64;
7041 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7042 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007043 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007044 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007045 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007046 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007047
7048 void setN64ABITypes() {
7049 LongWidth = LongAlign = 64;
7050 PointerWidth = PointerAlign = 64;
7051 SizeType = UnsignedLong;
7052 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007053 Int64Type = SignedLong;
7054 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007055 }
7056
7057 void setN32ABITypes() {
7058 LongWidth = LongAlign = 32;
7059 PointerWidth = PointerAlign = 32;
7060 SizeType = UnsignedInt;
7061 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007062 Int64Type = SignedLongLong;
7063 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007064 }
7065
Craig Topper3164f332014-03-11 03:39:26 +00007066 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007067 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007068 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007069 ABI = Name;
7070 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007071 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007072 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007073 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007074 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007075 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007076 }
7077 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007078 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007079
Craig Topper3164f332014-03-11 03:39:26 +00007080 void getTargetDefines(const LangOptions &Opts,
7081 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007082 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007083
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007084 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007085 Builder.defineMacro("__mips64");
7086 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007087 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7088
7089 const std::string& CPUStr = getCPU();
7090 if (CPUStr == "mips64")
7091 Builder.defineMacro("__mips_isa_rev", "1");
7092 else if (CPUStr == "mips64r2")
7093 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007094 else if (CPUStr == "mips64r3")
7095 Builder.defineMacro("__mips_isa_rev", "3");
7096 else if (CPUStr == "mips64r5")
7097 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007098 else if (CPUStr == "mips64r6")
7099 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007100
Akira Hatanakabef17452011-09-20 19:21:49 +00007101 if (ABI == "n32") {
7102 Builder.defineMacro("__mips_n32");
7103 Builder.defineMacro("_ABIN32", "2");
7104 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7105 }
7106 else if (ABI == "n64") {
7107 Builder.defineMacro("__mips_n64");
7108 Builder.defineMacro("_ABI64", "3");
7109 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7110 }
7111 else
David Blaikie83d382b2011-09-23 05:06:16 +00007112 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007113
7114 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007115 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007116 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007117 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7118 { { "at" }, "$1" },
7119 { { "v0" }, "$2" },
7120 { { "v1" }, "$3" },
7121 { { "a0" }, "$4" },
7122 { { "a1" }, "$5" },
7123 { { "a2" }, "$6" },
7124 { { "a3" }, "$7" },
7125 { { "a4" }, "$8" },
7126 { { "a5" }, "$9" },
7127 { { "a6" }, "$10" },
7128 { { "a7" }, "$11" },
7129 { { "t0" }, "$12" },
7130 { { "t1" }, "$13" },
7131 { { "t2" }, "$14" },
7132 { { "t3" }, "$15" },
7133 { { "s0" }, "$16" },
7134 { { "s1" }, "$17" },
7135 { { "s2" }, "$18" },
7136 { { "s3" }, "$19" },
7137 { { "s4" }, "$20" },
7138 { { "s5" }, "$21" },
7139 { { "s6" }, "$22" },
7140 { { "s7" }, "$23" },
7141 { { "t8" }, "$24" },
7142 { { "t9" }, "$25" },
7143 { { "k0" }, "$26" },
7144 { { "k1" }, "$27" },
7145 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007146 { { "sp","$sp" }, "$29" },
7147 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007148 { { "ra" }, "$31" }
7149 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007150 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007151 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007152
7153 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007154};
7155
7156class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007157 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007158 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007159 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007160 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007161 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007162 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007163
Akira Hatanakabef17452011-09-20 19:21:49 +00007164public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007165 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007166 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007167 void getTargetDefines(const LangOptions &Opts,
7168 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007169 DefineStd(Builder, "MIPSEB", Opts);
7170 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007171 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007172 }
7173};
7174
7175class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007176 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007177 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007178 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007179 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007180 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007181 }
7182public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007183 Mips64ELTargetInfo(const llvm::Triple &Triple)
7184 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007185 // Default ABI is n64.
7186 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007187 }
Craig Topper3164f332014-03-11 03:39:26 +00007188 void getTargetDefines(const LangOptions &Opts,
7189 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007190 DefineStd(Builder, "MIPSEL", Opts);
7191 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007192 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007193 }
7194};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007195
Ivan Krasindd7403e2011-08-24 20:22:22 +00007196class PNaClTargetInfo : public TargetInfo {
7197public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007198 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007199 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007200 this->LongAlign = 32;
7201 this->LongWidth = 32;
7202 this->PointerAlign = 32;
7203 this->PointerWidth = 32;
7204 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007205 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007206 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007207 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007208 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007209 this->SizeType = TargetInfo::UnsignedInt;
7210 this->PtrDiffType = TargetInfo::SignedInt;
7211 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007212 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007213 }
7214
Craig Toppere6f17d02014-03-11 04:07:52 +00007215 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007216 Builder.defineMacro("__le32__");
7217 Builder.defineMacro("__pnacl__");
7218 }
Craig Topper3164f332014-03-11 03:39:26 +00007219 void getTargetDefines(const LangOptions &Opts,
7220 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007221 getArchDefines(Opts, Builder);
7222 }
Craig Topper3164f332014-03-11 03:39:26 +00007223 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007224 return Feature == "pnacl";
7225 }
Craig Topper6c03a542015-10-19 04:51:35 +00007226 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007227 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007228 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007229 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007230 ArrayRef<const char *> getGCCRegNames() const override;
7231 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007232 bool validateAsmConstraint(const char *&Name,
7233 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007234 return false;
7235 }
7236
Craig Topper3164f332014-03-11 03:39:26 +00007237 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007238 return "";
7239 }
7240};
7241
Craig Topperf054e3a2015-10-19 03:52:27 +00007242ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7243 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007244}
7245
Craig Topperf054e3a2015-10-19 03:52:27 +00007246ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7247 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007248}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007249
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007250// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7251class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7252public:
7253 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007254 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007255 }
7256
7257 BuiltinVaListKind getBuiltinVaListKind() const override {
7258 return TargetInfo::PNaClABIBuiltinVaList;
7259 }
7260};
7261
JF Bastien643817d2014-09-12 17:52:47 +00007262class Le64TargetInfo : public TargetInfo {
7263 static const Builtin::Info BuiltinInfo[];
7264
7265public:
7266 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7267 BigEndian = false;
7268 NoAsmVariants = true;
7269 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7270 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007271 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007272 }
7273
7274 void getTargetDefines(const LangOptions &Opts,
7275 MacroBuilder &Builder) const override {
7276 DefineStd(Builder, "unix", Opts);
7277 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7278 Builder.defineMacro("__ELF__");
7279 }
Craig Topper6c03a542015-10-19 04:51:35 +00007280 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7281 return llvm::makeArrayRef(BuiltinInfo,
7282 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007283 }
7284 BuiltinVaListKind getBuiltinVaListKind() const override {
7285 return TargetInfo::PNaClABIBuiltinVaList;
7286 }
7287 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007288 ArrayRef<const char *> getGCCRegNames() const override {
7289 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007290 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007291 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7292 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007293 }
7294 bool validateAsmConstraint(const char *&Name,
7295 TargetInfo::ConstraintInfo &Info) const override {
7296 return false;
7297 }
7298
7299 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007300};
Dan Gohmanc2853072015-09-03 22:51:53 +00007301
7302class WebAssemblyTargetInfo : public TargetInfo {
7303 static const Builtin::Info BuiltinInfo[];
7304
7305 enum SIMDEnum {
7306 NoSIMD,
7307 SIMD128,
7308 } SIMDLevel;
7309
7310public:
7311 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7312 : TargetInfo(T), SIMDLevel(NoSIMD) {
7313 BigEndian = false;
7314 NoAsmVariants = true;
7315 SuitableAlign = 128;
7316 LargeArrayMinWidth = 128;
7317 LargeArrayAlign = 128;
7318 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007319 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007320 LongDoubleWidth = LongDoubleAlign = 128;
7321 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007322 }
7323
7324protected:
7325 void getTargetDefines(const LangOptions &Opts,
7326 MacroBuilder &Builder) const override {
7327 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7328 if (SIMDLevel >= SIMD128)
7329 Builder.defineMacro("__wasm_simd128__");
7330 }
7331
7332private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007333 bool
7334 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7335 StringRef CPU,
7336 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007337 if (CPU == "bleeding-edge")
7338 Features["simd128"] = true;
7339 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7340 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007341 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007342 return llvm::StringSwitch<bool>(Feature)
7343 .Case("simd128", SIMDLevel >= SIMD128)
7344 .Default(false);
7345 }
7346 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007347 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007348 for (const auto &Feature : Features) {
7349 if (Feature == "+simd128") {
7350 SIMDLevel = std::max(SIMDLevel, SIMD128);
7351 continue;
7352 }
7353 if (Feature == "-simd128") {
7354 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7355 continue;
7356 }
7357
7358 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7359 << "-target-feature";
7360 return false;
7361 }
7362 return true;
7363 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007364 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007365 return llvm::StringSwitch<bool>(Name)
7366 .Case("mvp", true)
7367 .Case("bleeding-edge", true)
7368 .Case("generic", true)
7369 .Default(false);
7370 }
Craig Topper6c03a542015-10-19 04:51:35 +00007371 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7372 return llvm::makeArrayRef(BuiltinInfo,
7373 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007374 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007375 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007376 return VoidPtrBuiltinVaList;
7377 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007378 ArrayRef<const char *> getGCCRegNames() const final {
7379 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007380 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007381 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7382 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007383 }
7384 bool
7385 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007386 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007387 return false;
7388 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007389 const char *getClobbers() const final { return ""; }
7390 bool isCLZForZeroUndef() const final { return false; }
7391 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007392 IntType getIntTypeByWidth(unsigned BitWidth,
7393 bool IsSigned) const final {
7394 // WebAssembly prefers long long for explicitly 64-bit integers.
7395 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7396 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7397 }
7398 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7399 bool IsSigned) const final {
7400 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7401 return BitWidth == 64
7402 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7403 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7404 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007405};
7406
7407const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7408#define BUILTIN(ID, TYPE, ATTRS) \
7409 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7410#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7411 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7412#include "clang/Basic/BuiltinsWebAssembly.def"
7413};
7414
7415class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7416public:
7417 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7418 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007419 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007420 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007421 }
7422
7423protected:
7424 void getTargetDefines(const LangOptions &Opts,
7425 MacroBuilder &Builder) const override {
7426 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7427 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7428 }
7429};
7430
7431class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7432public:
7433 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7434 : WebAssemblyTargetInfo(T) {
7435 LongAlign = LongWidth = 64;
7436 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007437 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007438 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007439 }
7440
7441protected:
7442 void getTargetDefines(const LangOptions &Opts,
7443 MacroBuilder &Builder) const override {
7444 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7445 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7446 }
7447};
7448
JF Bastien643817d2014-09-12 17:52:47 +00007449const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7450#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007451 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007452#include "clang/Basic/BuiltinsLe64.def"
7453};
7454
Eric Christopherc48497a2015-09-18 21:26:24 +00007455static const unsigned SPIRAddrSpaceMap[] = {
7456 1, // opencl_global
7457 3, // opencl_local
7458 2, // opencl_constant
7459 4, // opencl_generic
7460 0, // cuda_device
7461 0, // cuda_constant
7462 0 // cuda_shared
7463};
7464class SPIRTargetInfo : public TargetInfo {
7465public:
7466 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7467 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7468 "SPIR target must use unknown OS");
7469 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7470 "SPIR target must use unknown environment type");
7471 BigEndian = false;
7472 TLSSupported = false;
7473 LongWidth = LongAlign = 64;
7474 AddrSpaceMap = &SPIRAddrSpaceMap;
7475 UseAddrSpaceMapMangling = true;
7476 // Define available target features
7477 // These must be defined in sorted order!
7478 NoAsmVariants = true;
7479 }
7480 void getTargetDefines(const LangOptions &Opts,
7481 MacroBuilder &Builder) const override {
7482 DefineStd(Builder, "SPIR", Opts);
7483 }
7484 bool hasFeature(StringRef Feature) const override {
7485 return Feature == "spir";
7486 }
Craig Topper3164f332014-03-11 03:39:26 +00007487
Craig Topper6c03a542015-10-19 04:51:35 +00007488 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007489 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007490 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007491 bool validateAsmConstraint(const char *&Name,
7492 TargetInfo::ConstraintInfo &info) const override {
7493 return true;
7494 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007495 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7496 return None;
7497 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007498 BuiltinVaListKind getBuiltinVaListKind() const override {
7499 return TargetInfo::VoidPtrBuiltinVaList;
7500 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007501
Eric Christopherc48497a2015-09-18 21:26:24 +00007502 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7503 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7504 : CCCR_Warning;
7505 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007506
Eric Christopherc48497a2015-09-18 21:26:24 +00007507 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7508 return CC_SpirFunction;
7509 }
7510};
Guy Benyeib798fc92012-12-11 21:38:14 +00007511
Eric Christopherc48497a2015-09-18 21:26:24 +00007512class SPIR32TargetInfo : public SPIRTargetInfo {
7513public:
7514 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7515 PointerWidth = PointerAlign = 32;
7516 SizeType = TargetInfo::UnsignedInt;
7517 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007518 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7519 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007520 }
7521 void getTargetDefines(const LangOptions &Opts,
7522 MacroBuilder &Builder) const override {
7523 DefineStd(Builder, "SPIR32", Opts);
7524 }
7525};
Guy Benyeib798fc92012-12-11 21:38:14 +00007526
Eric Christopherc48497a2015-09-18 21:26:24 +00007527class SPIR64TargetInfo : public SPIRTargetInfo {
7528public:
7529 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7530 PointerWidth = PointerAlign = 64;
7531 SizeType = TargetInfo::UnsignedLong;
7532 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007533 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7534 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007535 }
7536 void getTargetDefines(const LangOptions &Opts,
7537 MacroBuilder &Builder) const override {
7538 DefineStd(Builder, "SPIR64", Opts);
7539 }
7540};
Guy Benyeib798fc92012-12-11 21:38:14 +00007541
Robert Lytton0e076492013-08-13 09:43:10 +00007542class XCoreTargetInfo : public TargetInfo {
7543 static const Builtin::Info BuiltinInfo[];
7544public:
7545 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7546 BigEndian = false;
7547 NoAsmVariants = true;
7548 LongLongAlign = 32;
7549 SuitableAlign = 32;
7550 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007551 SizeType = UnsignedInt;
7552 PtrDiffType = SignedInt;
7553 IntPtrType = SignedInt;
7554 WCharType = UnsignedChar;
7555 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007556 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007557 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7558 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007559 }
Craig Topper3164f332014-03-11 03:39:26 +00007560 void getTargetDefines(const LangOptions &Opts,
7561 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007562 Builder.defineMacro("__XS1B__");
7563 }
Craig Topper6c03a542015-10-19 04:51:35 +00007564 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7565 return llvm::makeArrayRef(BuiltinInfo,
7566 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007567 }
Craig Topper3164f332014-03-11 03:39:26 +00007568 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007569 return TargetInfo::VoidPtrBuiltinVaList;
7570 }
Craig Topper3164f332014-03-11 03:39:26 +00007571 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007572 return "";
7573 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007574 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007575 static const char * const GCCRegNames[] = {
7576 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7577 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7578 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007579 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007580 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007581 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7582 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007583 }
Craig Topper3164f332014-03-11 03:39:26 +00007584 bool validateAsmConstraint(const char *&Name,
7585 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007586 return false;
7587 }
Craig Topper3164f332014-03-11 03:39:26 +00007588 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007589 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7590 return (RegNo < 2)? RegNo : -1;
7591 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007592 bool allowsLargerPreferedTypeAlignment() const override {
7593 return false;
7594 }
Robert Lytton0e076492013-08-13 09:43:10 +00007595};
7596
7597const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007598#define BUILTIN(ID, TYPE, ATTRS) \
7599 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7600#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7601 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007602#include "clang/Basic/BuiltinsXCore.def"
7603};
Robert Lytton0e076492013-08-13 09:43:10 +00007604
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007605// x86_32 Android target
7606class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7607public:
7608 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7609 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7610 SuitableAlign = 32;
7611 LongDoubleWidth = 64;
7612 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7613 }
7614};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007615
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007616// x86_64 Android target
7617class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7618public:
7619 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7620 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7621 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7622 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007623
7624 bool useFloat128ManglingForLongDouble() const override {
7625 return true;
7626 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007627};
7628} // end anonymous namespace
7629
Chris Lattner5ba61f02006-10-14 07:39:34 +00007630//===----------------------------------------------------------------------===//
7631// Driver code
7632//===----------------------------------------------------------------------===//
7633
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007634static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007635 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007636
Daniel Dunbar52322032009-08-18 05:47:58 +00007637 switch (Triple.getArch()) {
7638 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007639 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007640
Tim Northover2a0783d2014-05-30 14:14:07 +00007641 case llvm::Triple::xcore:
7642 return new XCoreTargetInfo(Triple);
7643
7644 case llvm::Triple::hexagon:
7645 return new HexagonTargetInfo(Triple);
7646
7647 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007648 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007649 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007650
7651 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007652 case llvm::Triple::CloudABI:
7653 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007654 case llvm::Triple::FreeBSD:
7655 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007656 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007657 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007658 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007659 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007660 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007661 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007662 }
7663
Christian Pirker9b019ae2014-02-25 13:51:00 +00007664 case llvm::Triple::aarch64_be:
7665 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007666 case llvm::Triple::FreeBSD:
7667 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007668 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007669 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007670 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007671 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007672 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007673 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007674 }
7675
Daniel Dunbar52322032009-08-18 05:47:58 +00007676 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007677 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007678 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007679 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007680
Daniel Dunbar52322032009-08-18 05:47:58 +00007681 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007682 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007683 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007684 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007685 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007686 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007687 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007688 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007689 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007690 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007691 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007692 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007693 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007694 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007695 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007696 case llvm::Triple::Win32:
7697 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007698 case llvm::Triple::Cygnus:
7699 return new CygwinARMTargetInfo(Triple);
7700 case llvm::Triple::GNU:
7701 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007702 case llvm::Triple::Itanium:
7703 return new ItaniumWindowsARMleTargetInfo(Triple);
7704 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007705 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007706 return new MicrosoftARMleTargetInfo(Triple);
7707 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007708 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007709 return new ARMleTargetInfo(Triple);
7710 }
7711
7712 case llvm::Triple::armeb:
7713 case llvm::Triple::thumbeb:
7714 if (Triple.isOSDarwin())
7715 return new DarwinARMTargetInfo(Triple);
7716
7717 switch (os) {
7718 case llvm::Triple::Linux:
7719 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7720 case llvm::Triple::FreeBSD:
7721 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7722 case llvm::Triple::NetBSD:
7723 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7724 case llvm::Triple::OpenBSD:
7725 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7726 case llvm::Triple::Bitrig:
7727 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7728 case llvm::Triple::RTEMS:
7729 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7730 case llvm::Triple::NaCl:
7731 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7732 default:
7733 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007734 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007735
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007736 case llvm::Triple::bpfeb:
7737 case llvm::Triple::bpfel:
7738 return new BPFTargetInfo(Triple);
7739
Daniel Dunbar52322032009-08-18 05:47:58 +00007740 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007741 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007742
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007743 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007744 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007745 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007746 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007747 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007748 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007749 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007750 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007751 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007752 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007753 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007754 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007755 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007756
7757 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007758 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007759 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007760 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007761 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007762 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007763 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007764 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007765 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007766 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007767 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007768 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007769 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007770 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007771 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007772
Akira Hatanakabef17452011-09-20 19:21:49 +00007773 case llvm::Triple::mips64:
7774 switch (os) {
7775 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007776 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007777 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007778 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007779 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007780 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007781 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007782 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007783 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007784 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007785 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007786 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007787 }
7788
7789 case llvm::Triple::mips64el:
7790 switch (os) {
7791 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007792 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007793 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007794 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007795 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007796 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007797 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007798 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007799 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007800 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007801 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007802 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007803 }
7804
Ivan Krasindd7403e2011-08-24 20:22:22 +00007805 case llvm::Triple::le32:
7806 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007807 case llvm::Triple::NaCl:
7808 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7809 default:
7810 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007811 }
7812
JF Bastien643817d2014-09-12 17:52:47 +00007813 case llvm::Triple::le64:
7814 return new Le64TargetInfo(Triple);
7815
Daniel Dunbar52322032009-08-18 05:47:58 +00007816 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007817 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007818 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007819 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007820 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007821 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007822 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007823 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007824 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007825 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007826 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007827 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007828 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007829 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007830 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007831 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007832 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007833
7834 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007835 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007836 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007837 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007838 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007839 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007840 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007841 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007842 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007843 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007844 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007845 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007846 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007847 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007848 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007849
Bill Schmidt778d3872013-07-26 01:36:11 +00007850 case llvm::Triple::ppc64le:
7851 switch (os) {
7852 case llvm::Triple::Linux:
7853 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007854 case llvm::Triple::NetBSD:
7855 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007856 default:
7857 return new PPC64TargetInfo(Triple);
7858 }
7859
Peter Collingbournec947aae2012-05-20 23:28:41 +00007860 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007861 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007862 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007863 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007864
Tom Stellardd8e38a32015-01-06 20:34:47 +00007865 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007866 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007867 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007868
Daniel Dunbar52322032009-08-18 05:47:58 +00007869 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007870 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007871 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007872 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007873 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007874 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007875 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007876 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007877 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007878 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007879 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007880 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007881 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007882 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007883 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007884
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007885 // The 'sparcel' architecture copies all the above cases except for Solaris.
7886 case llvm::Triple::sparcel:
7887 switch (os) {
7888 case llvm::Triple::Linux:
7889 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7890 case llvm::Triple::NetBSD:
7891 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7892 case llvm::Triple::OpenBSD:
7893 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7894 case llvm::Triple::RTEMS:
7895 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7896 default:
7897 return new SparcV8elTargetInfo(Triple);
7898 }
7899
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007900 case llvm::Triple::sparcv9:
7901 switch (os) {
7902 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007903 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007904 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007905 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007906 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007907 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007908 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007909 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007910 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007911 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007912 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007913 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007914 }
7915
Ulrich Weigand47445072013-05-06 16:26:41 +00007916 case llvm::Triple::systemz:
7917 switch (os) {
7918 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007919 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007920 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007921 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007922 }
7923
Eli Friedmana9c3d712009-08-19 20:47:07 +00007924 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007925 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007926
Daniel Dunbar52322032009-08-18 05:47:58 +00007927 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007928 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007929 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007930
Daniel Dunbar52322032009-08-18 05:47:58 +00007931 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007932 case llvm::Triple::CloudABI:
7933 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007934 case llvm::Triple::Linux: {
7935 switch (Triple.getEnvironment()) {
7936 default:
7937 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7938 case llvm::Triple::Android:
7939 return new AndroidX86_32TargetInfo(Triple);
7940 }
7941 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007942 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007943 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007944 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007945 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007946 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007947 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007948 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007949 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007950 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007951 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007952 case llvm::Triple::KFreeBSD:
7953 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007954 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007955 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007956 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007957 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007958 case llvm::Triple::Win32: {
7959 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007960 case llvm::Triple::Cygnus:
7961 return new CygwinX86_32TargetInfo(Triple);
7962 case llvm::Triple::GNU:
7963 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007964 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007965 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007966 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007967 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007968 }
7969 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007970 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007971 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007972 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007973 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007974 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007975 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00007976 case llvm::Triple::ELFIAMCU:
7977 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007978 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007979 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007980 }
7981
7982 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007983 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007984 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007985
Daniel Dunbar52322032009-08-18 05:47:58 +00007986 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007987 case llvm::Triple::CloudABI:
7988 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007989 case llvm::Triple::Linux: {
7990 switch (Triple.getEnvironment()) {
7991 default:
7992 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7993 case llvm::Triple::Android:
7994 return new AndroidX86_64TargetInfo(Triple);
7995 }
7996 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007997 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007998 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007999 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008000 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008001 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008002 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008003 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008004 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008005 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008006 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008007 case llvm::Triple::KFreeBSD:
8008 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008009 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008010 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008011 case llvm::Triple::Win32: {
8012 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008013 case llvm::Triple::Cygnus:
8014 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008015 case llvm::Triple::GNU:
8016 return new MinGWX86_64TargetInfo(Triple);
8017 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008018 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008019 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008020 }
8021 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008022 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008023 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008024 case llvm::Triple::PS4:
8025 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008026 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008027 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008028 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008029
Douglas Katzman78d7c542015-05-12 21:18:10 +00008030 case llvm::Triple::spir: {
8031 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8032 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8033 return nullptr;
8034 return new SPIR32TargetInfo(Triple);
8035 }
8036 case llvm::Triple::spir64: {
8037 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8038 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8039 return nullptr;
8040 return new SPIR64TargetInfo(Triple);
8041 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008042 case llvm::Triple::wasm32:
8043 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8044 return nullptr;
8045 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
8046 case llvm::Triple::wasm64:
8047 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8048 return nullptr;
8049 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008050 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008051}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008052
8053/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008054/// options.
Alp Toker80758082014-07-06 05:26:44 +00008055TargetInfo *
8056TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
8057 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008058 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008059
8060 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00008061 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008062 if (!Target) {
8063 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008064 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008065 }
Alp Toker80758082014-07-06 05:26:44 +00008066 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008067
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008068 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008069 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8070 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008071 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008072 }
8073
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008074 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008075 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8076 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008077 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008078 }
8079
Rafael Espindolaeb265472013-08-21 21:59:03 +00008080 // Set the fp math unit.
8081 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8082 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008083 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008084 }
8085
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008086 // Compute the default target features, we need the target to handle this
8087 // because features may have dependencies on one another.
8088 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008089 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8090 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008091 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008092
8093 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008094 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008095 for (const auto &F : Features)
8096 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8097
Eric Christopher3ff21b32013-10-16 21:26:26 +00008098 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008099 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008100
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008101 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008102}