blob: a0c379aeb7f801b652285da37d6f790423594022 [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"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000030#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000033
Chris Lattner5ba61f02006-10-14 07:39:34 +000034using namespace clang;
35
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000037// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000038//===----------------------------------------------------------------------===//
39
Chris Lattner1e1c0b92009-03-20 16:06:38 +000040/// DefineStd - Define a macro name and standard variants. For example if
41/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
42/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 const LangOptions &Opts) {
45 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000046
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
48 // in the user's namespace.
49 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057}
58
Benjamin Kramere3b442d2012-01-10 11:50:09 +000059static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
60 bool Tuning = true) {
61 Builder.defineMacro("__" + CPUName);
62 Builder.defineMacro("__" + CPUName + "__");
63 if (Tuning)
64 Builder.defineMacro("__tune_" + CPUName + "__");
65}
66
Chris Lattner09d98f52008-10-05 21:50:58 +000067//===----------------------------------------------------------------------===//
68// Defines specific to certain operating systems.
69//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000070
Torok Edwinb2b37c62009-06-30 17:10:35 +000071namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000072template<typename TgtInfo>
73class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000074protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000075 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000076 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000077public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000078 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000079 void getTargetDefines(const LangOptions &Opts,
80 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000081 TgtInfo::getTargetDefines(Opts, Builder);
82 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000083 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000084
85};
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Eric Christopher7d0c7252015-09-24 21:17:04 +000087// CloudABI Target
88template <typename Target>
89class CloudABITargetInfo : public OSTargetInfo<Target> {
90protected:
91 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
92 MacroBuilder &Builder) const override {
93 Builder.defineMacro("__CloudABI__");
94 Builder.defineMacro("__ELF__");
95
96 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
97 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
98 Builder.defineMacro("__STDC_UTF_16__");
99 Builder.defineMacro("__STDC_UTF_32__");
100 }
101
102public:
103 CloudABITargetInfo(const llvm::Triple &Triple)
104 : OSTargetInfo<Target>(Triple) {
105 this->UserLabelPrefix = "";
106 }
107};
108
Daniel Dunbard86666f2010-01-26 01:44:04 +0000109static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000110 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000112 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000113 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000116 // AddressSanitizer doesn't play well with source fortification, which is on
117 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000118 if (Opts.Sanitize.has(SanitizerKind::Address))
119 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000120
John McCall460ce582015-10-22 18:38:17 +0000121 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
122 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000123 // __weak is always defined, for use in blocks and with objc pointers.
124 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000125 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000126 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000127 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000128
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000129 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000130 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000131 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000132 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000133
134 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000136
Daniel Dunbarecf13562011-04-19 21:40:34 +0000137 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000138 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000139 if (Triple.isMacOSX()) {
140 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000143 Triple.getOSVersion(Maj, Min, Rev);
144 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000146
Sebastian Pop422377c2012-01-20 22:01:23 +0000147 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000148 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000149 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
150 if (PlatformName == "win32") {
151 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
152 return;
153 }
154
Evan Cheng31dd9a62014-01-26 23:12:43 +0000155 // Set the appropriate OS version define.
156 if (Triple.isiOS()) {
157 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
158 char Str[6];
159 Str[0] = '0' + Maj;
160 Str[1] = '0' + (Min / 10);
161 Str[2] = '0' + (Min % 10);
162 Str[3] = '0' + (Rev / 10);
163 Str[4] = '0' + (Rev % 10);
164 Str[5] = '\0';
Eric Christopher7d0c7252015-09-24 21:17:04 +0000165 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000166 } else if (Triple.isMacOSX()) {
167 // Note that the Driver allows versions which aren't representable in the
168 // define (because we only get a single digit for the minor and micro
169 // revision numbers). So, we limit them to the maximum representable
170 // version.
171 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000172 char Str[7];
173 if (Maj < 10 || (Maj == 10 && Min < 10)) {
174 Str[0] = '0' + (Maj / 10);
175 Str[1] = '0' + (Maj % 10);
176 Str[2] = '0' + std::min(Min, 9U);
177 Str[3] = '0' + std::min(Rev, 9U);
178 Str[4] = '\0';
179 } else {
180 // Handle versions > 10.9.
181 Str[0] = '0' + (Maj / 10);
182 Str[1] = '0' + (Maj % 10);
183 Str[2] = '0' + (Min / 10);
184 Str[3] = '0' + (Min % 10);
185 Str[4] = '0' + (Rev / 10);
186 Str[5] = '0' + (Rev % 10);
187 Str[6] = '\0';
188 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000189 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000190 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000191
Tim Northover157d9112014-01-16 08:48:16 +0000192 // Tell users about the kernel if there is one.
193 if (Triple.isOSDarwin())
194 Builder.defineMacro("__MACH__");
195
Daniel Dunbarecf13562011-04-19 21:40:34 +0000196 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000197}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000198
Torok Edwinb2b37c62009-06-30 17:10:35 +0000199template<typename Target>
200class DarwinTargetInfo : public OSTargetInfo<Target> {
201protected:
Craig Topper3164f332014-03-11 03:39:26 +0000202 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
203 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000204 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000205 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000206 }
Mike Stump11289f42009-09-09 15:08:12 +0000207
Torok Edwinb2b37c62009-06-30 17:10:35 +0000208public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000209 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
210 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
211 this->MCountName = "\01mcount";
212 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213
Craig Topper3164f332014-03-11 03:39:26 +0000214 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000215 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000216 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000217 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000218 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000219 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000220 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000221 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000222
Craig Topper3164f332014-03-11 03:39:26 +0000223 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000224 // FIXME: We should return 0 when building kexts.
225 return "__TEXT,__StaticInit,regular,pure_instructions";
226 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000227
John McCalleed64c72012-01-29 01:20:30 +0000228 /// Darwin does not support protected visibility. Darwin's "default"
229 /// is very similar to ELF's "protected"; Darwin requires a "weak"
230 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000231 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000232 return false;
233 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234};
235
Chris Lattner30ba6742009-08-10 19:03:04 +0000236
Torok Edwinb2b37c62009-06-30 17:10:35 +0000237// DragonFlyBSD Target
238template<typename Target>
239class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
240protected:
Craig Topper3164f332014-03-11 03:39:26 +0000241 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
242 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000244 Builder.defineMacro("__DragonFly__");
245 Builder.defineMacro("__DragonFly_cc_version", "100001");
246 Builder.defineMacro("__ELF__");
247 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
248 Builder.defineMacro("__tune_i386__");
249 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000250 }
251public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000252 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
253 : OSTargetInfo<Target>(Triple) {
254 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000255
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000256 switch (Triple.getArch()) {
257 default:
258 case llvm::Triple::x86:
259 case llvm::Triple::x86_64:
260 this->MCountName = ".mcount";
261 break;
262 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000263 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000264};
265
266// FreeBSD Target
267template<typename Target>
268class FreeBSDTargetInfo : public OSTargetInfo<Target> {
269protected:
Craig Topper3164f332014-03-11 03:39:26 +0000270 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
271 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272 // FreeBSD defines; list based off of gcc output
273
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000274 unsigned Release = Triple.getOSMajorVersion();
275 if (Release == 0U)
276 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000277
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000278 Builder.defineMacro("__FreeBSD__", Twine(Release));
279 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000280 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
281 DefineStd(Builder, "unix", Opts);
282 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000283
284 // On FreeBSD, wchar_t contains the number of the code point as
285 // used by the character set of the locale. These character sets are
286 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000287 //
288 // FIXME: This is wrong; the macro refers to the numerical values
289 // of wchar_t *literals*, which are not locale-dependent. However,
290 // FreeBSD systems apparently depend on us getting this wrong, and
291 // setting this to 1 is conforming even if all the basic source
292 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000293 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294 }
295public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000296 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
297 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000298
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 switch (Triple.getArch()) {
300 default:
301 case llvm::Triple::x86:
302 case llvm::Triple::x86_64:
303 this->MCountName = ".mcount";
304 break;
305 case llvm::Triple::mips:
306 case llvm::Triple::mipsel:
307 case llvm::Triple::ppc:
308 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000309 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000310 this->MCountName = "_mcount";
311 break;
312 case llvm::Triple::arm:
313 this->MCountName = "__mcount";
314 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000315 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000316 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000317};
318
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000319// GNU/kFreeBSD Target
320template<typename Target>
321class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
322protected:
Craig Topper3164f332014-03-11 03:39:26 +0000323 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
324 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000325 // GNU/kFreeBSD defines; list based off of gcc output
326
327 DefineStd(Builder, "unix", Opts);
328 Builder.defineMacro("__FreeBSD_kernel__");
329 Builder.defineMacro("__GLIBC__");
330 Builder.defineMacro("__ELF__");
331 if (Opts.POSIXThreads)
332 Builder.defineMacro("_REENTRANT");
333 if (Opts.CPlusPlus)
334 Builder.defineMacro("_GNU_SOURCE");
335 }
336public:
Eric Christopher917e9522014-11-18 22:36:15 +0000337 KFreeBSDTargetInfo(const llvm::Triple &Triple)
338 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000339 this->UserLabelPrefix = "";
340 }
341};
342
Chris Lattner3e2ee142010-07-07 16:01:42 +0000343// Minix Target
344template<typename Target>
345class MinixTargetInfo : public OSTargetInfo<Target> {
346protected:
Craig Topper3164f332014-03-11 03:39:26 +0000347 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
348 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000349 // Minix defines
350
351 Builder.defineMacro("__minix", "3");
352 Builder.defineMacro("_EM_WSIZE", "4");
353 Builder.defineMacro("_EM_PSIZE", "4");
354 Builder.defineMacro("_EM_SSIZE", "2");
355 Builder.defineMacro("_EM_LSIZE", "4");
356 Builder.defineMacro("_EM_FSIZE", "4");
357 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000358 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359 DefineStd(Builder, "unix", Opts);
360 }
361public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000362 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
363 this->UserLabelPrefix = "";
364 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000365};
366
Torok Edwinb2b37c62009-06-30 17:10:35 +0000367// Linux target
368template<typename Target>
369class LinuxTargetInfo : public OSTargetInfo<Target> {
370protected:
Craig Topper3164f332014-03-11 03:39:26 +0000371 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
372 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000374 DefineStd(Builder, "unix", Opts);
375 DefineStd(Builder, "linux", Opts);
376 Builder.defineMacro("__gnu_linux__");
377 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000378 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000379 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000380 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000381 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000382 this->PlatformName = "android";
383 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
384 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000385 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000386 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000387 if (Opts.CPlusPlus)
388 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000389 }
390public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000391 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000392 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000393 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000394
395 switch (Triple.getArch()) {
396 default:
397 break;
398 case llvm::Triple::ppc:
399 case llvm::Triple::ppc64:
400 case llvm::Triple::ppc64le:
401 this->MCountName = "_mcount";
402 break;
403 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000404 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000405
Craig Topper3164f332014-03-11 03:39:26 +0000406 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000407 return ".text.startup";
408 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000409};
410
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000411// NetBSD Target
412template<typename Target>
413class NetBSDTargetInfo : public OSTargetInfo<Target> {
414protected:
Craig Topper3164f332014-03-11 03:39:26 +0000415 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
416 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000417 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000418 Builder.defineMacro("__NetBSD__");
419 Builder.defineMacro("__unix__");
420 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000421 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000422 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000423
424 switch (Triple.getArch()) {
425 default:
426 break;
427 case llvm::Triple::arm:
428 case llvm::Triple::armeb:
429 case llvm::Triple::thumb:
430 case llvm::Triple::thumbeb:
431 Builder.defineMacro("__ARM_DWARF_EH__");
432 break;
433 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000434 }
435public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000436 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
437 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000438 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000439 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000440};
441
Torok Edwinb2b37c62009-06-30 17:10:35 +0000442// OpenBSD Target
443template<typename Target>
444class OpenBSDTargetInfo : public OSTargetInfo<Target> {
445protected:
Craig Topper3164f332014-03-11 03:39:26 +0000446 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
447 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000448 // OpenBSD defines; list based off of gcc output
449
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000450 Builder.defineMacro("__OpenBSD__");
451 DefineStd(Builder, "unix", Opts);
452 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000453 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000454 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000455 }
456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000457 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
458 this->UserLabelPrefix = "";
459 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000460
Eli Friedman3715d1f2011-12-15 02:15:56 +0000461 switch (Triple.getArch()) {
462 default:
463 case llvm::Triple::x86:
464 case llvm::Triple::x86_64:
465 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000466 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000467 this->MCountName = "__mcount";
468 break;
469 case llvm::Triple::mips64:
470 case llvm::Triple::mips64el:
471 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000472 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000473 this->MCountName = "_mcount";
474 break;
475 }
476 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477};
478
Eli Friedman9fa28852012-08-08 23:57:20 +0000479// Bitrig Target
480template<typename Target>
481class BitrigTargetInfo : public OSTargetInfo<Target> {
482protected:
Craig Topper3164f332014-03-11 03:39:26 +0000483 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
484 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000485 // Bitrig defines; list based off of gcc output
486
487 Builder.defineMacro("__Bitrig__");
488 DefineStd(Builder, "unix", Opts);
489 Builder.defineMacro("__ELF__");
490 if (Opts.POSIXThreads)
491 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000492
493 switch (Triple.getArch()) {
494 default:
495 break;
496 case llvm::Triple::arm:
497 case llvm::Triple::armeb:
498 case llvm::Triple::thumb:
499 case llvm::Triple::thumbeb:
500 Builder.defineMacro("__ARM_DWARF_EH__");
501 break;
502 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000503 }
504public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000505 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
506 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000507 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000508 }
509};
510
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000511// PSP Target
512template<typename Target>
513class PSPTargetInfo : public OSTargetInfo<Target> {
514protected:
Craig Topper3164f332014-03-11 03:39:26 +0000515 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
516 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000517 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000518 Builder.defineMacro("PSP");
519 Builder.defineMacro("_PSP");
520 Builder.defineMacro("__psp__");
521 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000522 }
523public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000524 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000525 this->UserLabelPrefix = "";
526 }
527};
528
John Thompsone467e192009-11-19 17:18:50 +0000529// PS3 PPU Target
530template<typename Target>
531class PS3PPUTargetInfo : public OSTargetInfo<Target> {
532protected:
Craig Topper3164f332014-03-11 03:39:26 +0000533 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
534 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000535 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000536 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000537 Builder.defineMacro("__PPU__");
538 Builder.defineMacro("__CELLOS_LV2__");
539 Builder.defineMacro("__ELF__");
540 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000541 Builder.defineMacro("_ARCH_PPC64");
542 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000543 }
544public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000545 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000546 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000547 this->LongWidth = this->LongAlign = 32;
548 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000549 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000550 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000551 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000552 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000553 }
554};
555
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000556template <typename Target>
557class PS4OSTargetInfo : public OSTargetInfo<Target> {
558protected:
559 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
560 MacroBuilder &Builder) const override {
561 Builder.defineMacro("__FreeBSD__", "9");
562 Builder.defineMacro("__FreeBSD_cc_version", "900001");
563 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
564 DefineStd(Builder, "unix", Opts);
565 Builder.defineMacro("__ELF__");
566 Builder.defineMacro("__PS4__");
567 }
568public:
569 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
570 this->WCharType = this->UnsignedShort;
571
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000572 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
573 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000574 this->UserLabelPrefix = "";
575
576 switch (Triple.getArch()) {
577 default:
578 case llvm::Triple::x86_64:
579 this->MCountName = ".mcount";
580 break;
581 }
582 }
583};
584
Torok Edwinb2b37c62009-06-30 17:10:35 +0000585// Solaris target
586template<typename Target>
587class SolarisTargetInfo : public OSTargetInfo<Target> {
588protected:
Craig Topper3164f332014-03-11 03:39:26 +0000589 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
590 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000591 DefineStd(Builder, "sun", Opts);
592 DefineStd(Builder, "unix", Opts);
593 Builder.defineMacro("__ELF__");
594 Builder.defineMacro("__svr4__");
595 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000596 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
597 // newer, but to 500 for everything else. feature_test.h has a check to
598 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000599 // with a new version.
600 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000601 Builder.defineMacro("_XOPEN_SOURCE", "600");
602 else
603 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000604 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000605 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000606 Builder.defineMacro("_LARGEFILE_SOURCE");
607 Builder.defineMacro("_LARGEFILE64_SOURCE");
608 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000610 }
611public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000612 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000613 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000614 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000615 // FIXME: WIntType should be SignedLong
616 }
617};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000618
619// Windows target
620template<typename Target>
621class WindowsTargetInfo : public OSTargetInfo<Target> {
622protected:
Craig Topper3164f332014-03-11 03:39:26 +0000623 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
624 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000625 Builder.defineMacro("_WIN32");
626 }
627 void getVisualStudioDefines(const LangOptions &Opts,
628 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000629 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000630 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000631 Builder.defineMacro("_CPPRTTI");
632
Reid Kleckner16514352015-01-30 21:42:55 +0000633 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000634 Builder.defineMacro("_CPPUNWIND");
635 }
636
David Majnemer6a658902015-07-22 22:36:26 +0000637 if (Opts.Bool)
638 Builder.defineMacro("__BOOL_DEFINED");
639
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000640 if (!Opts.CharIsSigned)
641 Builder.defineMacro("_CHAR_UNSIGNED");
642
643 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
644 // but it works for now.
645 if (Opts.POSIXThreads)
646 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000647
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000648 if (Opts.MSCompatibilityVersion) {
649 Builder.defineMacro("_MSC_VER",
650 Twine(Opts.MSCompatibilityVersion / 100000));
651 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000652 // FIXME We cannot encode the revision information into 32-bits
653 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000654
David Majnemerb710a932015-05-11 03:57:49 +0000655 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000656 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000657 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000658
659 if (Opts.MicrosoftExt) {
660 Builder.defineMacro("_MSC_EXTENSIONS");
661
662 if (Opts.CPlusPlus11) {
663 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
664 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
665 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
666 }
667 }
668
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000669 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000670 }
671
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000672public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000673 WindowsTargetInfo(const llvm::Triple &Triple)
674 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000675};
676
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000677template <typename Target>
678class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000679protected:
Craig Topper3164f332014-03-11 03:39:26 +0000680 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
681 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000682 if (Opts.POSIXThreads)
683 Builder.defineMacro("_REENTRANT");
684 if (Opts.CPlusPlus)
685 Builder.defineMacro("_GNU_SOURCE");
686
687 DefineStd(Builder, "unix", Opts);
688 Builder.defineMacro("__ELF__");
689 Builder.defineMacro("__native_client__");
690 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000691
692public:
693 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000694 this->UserLabelPrefix = "";
695 this->LongAlign = 32;
696 this->LongWidth = 32;
697 this->PointerAlign = 32;
698 this->PointerWidth = 32;
699 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000700 this->Int64Type = TargetInfo::SignedLongLong;
701 this->DoubleAlign = 64;
702 this->LongDoubleWidth = 64;
703 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000704 this->LongLongWidth = 64;
705 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000706 this->SizeType = TargetInfo::UnsignedInt;
707 this->PtrDiffType = TargetInfo::SignedInt;
708 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000709 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000710 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000711 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000712 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000713 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000714 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000715 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000716 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000717 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000718 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 } else {
720 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000721 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000723 }
724};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000725
Dan Gohmanc2853072015-09-03 22:51:53 +0000726// WebAssembly target
727template <typename Target>
728class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
729 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000730 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000731 // A common platform macro.
732 if (Opts.POSIXThreads)
733 Builder.defineMacro("_REENTRANT");
734 // Follow g++ convention and predefine _GNU_SOURCE for C++.
735 if (Opts.CPlusPlus)
736 Builder.defineMacro("_GNU_SOURCE");
737 }
738
739 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000740 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000741 return ".text.__startup";
742 }
743
744public:
745 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
746 : OSTargetInfo<Target>(Triple) {
747 this->MCountName = "__mcount";
748 this->UserLabelPrefix = "";
749 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
750 }
751};
Dan Gohmanc2853072015-09-03 22:51:53 +0000752
Chris Lattner09d98f52008-10-05 21:50:58 +0000753//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000754// Specific target implementations.
755//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000756
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000757// PPC abstract base class
758class PPCTargetInfo : public TargetInfo {
759 static const Builtin::Info BuiltinInfo[];
760 static const char * const GCCRegNames[];
761 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000762 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000763
764 // Target cpu features.
765 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000766 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000767 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000768 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000769 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000770 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000771 bool HasBPERMD;
772 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000773
Ulrich Weigand8afad612014-07-28 13:17:52 +0000774protected:
775 std::string ABI;
776
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000777public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000778 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000779 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000780 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000781 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000782 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000783 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000784 LongDoubleWidth = LongDoubleAlign = 128;
785 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
786 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000787
Hal Finkel6b984f02012-07-03 16:51:04 +0000788 /// \brief Flags for architecture specific defines.
789 typedef enum {
790 ArchDefineNone = 0,
791 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
792 ArchDefinePpcgr = 1 << 1,
793 ArchDefinePpcsq = 1 << 2,
794 ArchDefine440 = 1 << 3,
795 ArchDefine603 = 1 << 4,
796 ArchDefine604 = 1 << 5,
797 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000798 ArchDefinePwr5 = 1 << 7,
799 ArchDefinePwr5x = 1 << 8,
800 ArchDefinePwr6 = 1 << 9,
801 ArchDefinePwr6x = 1 << 10,
802 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000803 ArchDefinePwr8 = 1 << 12,
804 ArchDefineA2 = 1 << 13,
805 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000806 } ArchDefineTypes;
807
Bill Schmidt38378a02013-02-01 20:23:10 +0000808 // Note: GCC recognizes the following additional cpus:
809 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
810 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
811 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000812 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000813 bool CPUKnown = llvm::StringSwitch<bool>(Name)
814 .Case("generic", true)
815 .Case("440", true)
816 .Case("450", true)
817 .Case("601", true)
818 .Case("602", true)
819 .Case("603", true)
820 .Case("603e", true)
821 .Case("603ev", true)
822 .Case("604", true)
823 .Case("604e", true)
824 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000825 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000826 .Case("g3", true)
827 .Case("7400", true)
828 .Case("g4", true)
829 .Case("7450", true)
830 .Case("g4+", true)
831 .Case("750", true)
832 .Case("970", true)
833 .Case("g5", true)
834 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000835 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000836 .Case("e500mc", true)
837 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000838 .Case("power3", true)
839 .Case("pwr3", true)
840 .Case("power4", true)
841 .Case("pwr4", true)
842 .Case("power5", true)
843 .Case("pwr5", true)
844 .Case("power5x", true)
845 .Case("pwr5x", true)
846 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000847 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000848 .Case("power6x", true)
849 .Case("pwr6x", true)
850 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000851 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000852 .Case("power8", true)
853 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000854 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000855 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000856 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000857 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000858 .Case("powerpc64le", true)
859 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000860 .Default(false);
861
862 if (CPUKnown)
863 CPU = Name;
864
865 return CPUKnown;
866 }
867
Ulrich Weigand8afad612014-07-28 13:17:52 +0000868
869 StringRef getABI() const override { return ABI; }
870
Craig Topper6c03a542015-10-19 04:51:35 +0000871 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
872 return llvm::makeArrayRef(BuiltinInfo,
873 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000874 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000875
Craig Topper3164f332014-03-11 03:39:26 +0000876 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000877
Craig Topper3164f332014-03-11 03:39:26 +0000878 void getTargetDefines(const LangOptions &Opts,
879 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000880
Eric Christopher8c47b422015-10-09 18:39:55 +0000881 bool
882 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
883 StringRef CPU,
884 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000885
Craig Topper3164f332014-03-11 03:39:26 +0000886 bool handleTargetFeatures(std::vector<std::string> &Features,
887 DiagnosticsEngine &Diags) override;
888 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000889 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
890 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000891
Craig Topperf054e3a2015-10-19 03:52:27 +0000892 ArrayRef<const char *> getGCCRegNames() const override;
893 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000894 bool validateAsmConstraint(const char *&Name,
895 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000896 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000897 default: return false;
898 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000899 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000900 case 'b': // Base register
901 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000902 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000903 break;
904 // FIXME: The following are added to allow parsing.
905 // I just took a guess at what the actions should be.
906 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000907 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000908 case 'v': // Altivec vector register
909 Info.setAllowsRegister();
910 break;
911 case 'w':
912 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000913 case 'd':// VSX vector register to hold vector double data
914 case 'f':// VSX vector register to hold vector float data
915 case 's':// VSX vector register to hold scalar float data
916 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000917 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000918 break;
919 default:
920 return false;
921 }
922 Info.setAllowsRegister();
923 Name++; // Skip over 'w'.
924 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000925 case 'h': // `MQ', `CTR', or `LINK' register
926 case 'q': // `MQ' register
927 case 'c': // `CTR' register
928 case 'l': // `LINK' register
929 case 'x': // `CR' register (condition register) number 0
930 case 'y': // `CR' register (condition register)
931 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000932 Info.setAllowsRegister();
933 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000934 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000935 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000936 // (use `L' instead for SImode constants)
937 case 'K': // Unsigned 16-bit constant
938 case 'L': // Signed 16-bit constant shifted left 16 bits
939 case 'M': // Constant larger than 31
940 case 'N': // Exact power of 2
941 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000942 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000943 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000944 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000945 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000946 break;
947 case 'm': // Memory operand. Note that on PowerPC targets, m can
948 // include addresses that update the base register. It
949 // is therefore only safe to use `m' in an asm statement
950 // if that asm statement accesses the operand exactly once.
951 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000952 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000954 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000956 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
957 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000958 // register to be updated.
959 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000960 if (Name[1] != 's')
961 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000962 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000963 // include any automodification of the base register. Unlike
964 // `m', this constraint can be used in asm statements that
965 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000966 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000967 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000968 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000969 break;
970 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000972 case 'Z': // Memory operand that is an indexed or indirect from a
973 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000975 Info.setAllowsMemory();
976 Info.setAllowsRegister();
977 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000978 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000979 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000980 // register (`p' is preferable for asm statements)
981 case 'S': // Constant suitable as a 64-bit mask operand
982 case 'T': // Constant suitable as a 32-bit mask operand
983 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000984 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000985 // instructions
986 case 'W': // Vector constant that does not require memory
987 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000988 break;
989 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000990 }
John Thompson07a61a42010-06-24 22:44:13 +0000991 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000992 }
Craig Topper3164f332014-03-11 03:39:26 +0000993 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000994 std::string R;
995 switch (*Constraint) {
996 case 'e':
997 case 'w':
998 // Two-character constraint; add "^" hint for later parsing.
999 R = std::string("^") + std::string(Constraint, 2);
1000 Constraint++;
1001 break;
1002 default:
1003 return TargetInfo::convertConstraint(Constraint);
1004 }
1005 return R;
1006 }
Craig Topper3164f332014-03-11 03:39:26 +00001007 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001008 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001009 }
Craig Topper3164f332014-03-11 03:39:26 +00001010 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001011 if (RegNo == 0) return 3;
1012 if (RegNo == 1) return 4;
1013 return -1;
1014 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001015
1016 bool hasSjLjLowering() const override {
1017 return true;
1018 }
David Majnemer2617ea62015-06-09 18:05:33 +00001019
1020 bool useFloat128ManglingForLongDouble() const override {
1021 return LongDoubleWidth == 128 &&
1022 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1023 getTriple().isOSBinFormatELF();
1024 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001025};
Anders Carlssonf511f642007-11-27 04:11:28 +00001026
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001027const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001028#define BUILTIN(ID, TYPE, ATTRS) \
1029 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1030#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1031 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001032#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001033};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001034
Eric Christopher917e9522014-11-18 22:36:15 +00001035/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001036/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001037bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001038 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001039 for (const auto &Feature : Features) {
1040 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001041 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001042 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001043 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001044 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001045 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001046 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001047 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001048 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001049 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001050 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001051 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001052 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001053 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001054 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001055 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001056 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 // TODO: Finish this list and add an assert that we've handled them
1058 // all.
1059 }
Eric Christopher02c33352015-08-25 00:59:11 +00001060
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001061 return true;
1062}
1063
Chris Lattnerecd49032009-03-02 22:27:17 +00001064/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1065/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001066void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001067 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001068 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001069 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001070 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001071 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001072 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001073 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001074 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001075 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001076 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001078 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001079 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001080
Chris Lattnerecd49032009-03-02 22:27:17 +00001081 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001082 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1083 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001084 } else {
1085 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1086 getTriple().getOS() != llvm::Triple::OpenBSD)
1087 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001088 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001089
Ulrich Weigand8afad612014-07-28 13:17:52 +00001090 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001091 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001092 Builder.defineMacro("_CALL_ELF", "1");
1093 if (ABI == "elfv2")
1094 Builder.defineMacro("_CALL_ELF", "2");
1095
Chris Lattnerecd49032009-03-02 22:27:17 +00001096 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001097 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1098 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001099
Chris Lattnerecd49032009-03-02 22:27:17 +00001100 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001101 if (LongDoubleWidth == 128)
1102 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103
John Thompsone467e192009-11-19 17:18:50 +00001104 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001105 Builder.defineMacro("__VEC__", "10206");
1106 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001107 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001108
1109 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001110 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1111 .Case("440", ArchDefineName)
1112 .Case("450", ArchDefineName | ArchDefine440)
1113 .Case("601", ArchDefineName)
1114 .Case("602", ArchDefineName | ArchDefinePpcgr)
1115 .Case("603", ArchDefineName | ArchDefinePpcgr)
1116 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1117 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1118 .Case("604", ArchDefineName | ArchDefinePpcgr)
1119 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1120 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001121 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001122 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1123 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1124 .Case("750", ArchDefineName | ArchDefinePpcgr)
1125 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1126 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001127 .Case("a2", ArchDefineA2)
1128 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001129 .Case("pwr3", ArchDefinePpcgr)
1130 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1131 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1132 | ArchDefinePpcsq)
1133 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1134 | ArchDefinePpcgr | ArchDefinePpcsq)
1135 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1136 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1137 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1138 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1139 | ArchDefinePpcsq)
1140 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1141 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001142 | ArchDefinePpcgr | ArchDefinePpcsq)
1143 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1144 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1145 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001146 .Case("power3", ArchDefinePpcgr)
1147 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1148 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1149 | ArchDefinePpcsq)
1150 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1151 | ArchDefinePpcgr | ArchDefinePpcsq)
1152 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1153 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1155 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1156 | ArchDefinePpcsq)
1157 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1158 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001159 | ArchDefinePpcgr | ArchDefinePpcsq)
1160 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1161 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1162 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001163 .Default(ArchDefineNone);
1164
1165 if (defs & ArchDefineName)
1166 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1167 if (defs & ArchDefinePpcgr)
1168 Builder.defineMacro("_ARCH_PPCGR");
1169 if (defs & ArchDefinePpcsq)
1170 Builder.defineMacro("_ARCH_PPCSQ");
1171 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001172 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001173 if (defs & ArchDefine603)
1174 Builder.defineMacro("_ARCH_603");
1175 if (defs & ArchDefine604)
1176 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001177 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001178 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001179 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001180 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001181 if (defs & ArchDefinePwr5x)
1182 Builder.defineMacro("_ARCH_PWR5X");
1183 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001184 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001185 if (defs & ArchDefinePwr6x)
1186 Builder.defineMacro("_ARCH_PWR6X");
1187 if (defs & ArchDefinePwr7)
1188 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001189 if (defs & ArchDefinePwr8)
1190 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001191 if (defs & ArchDefineA2)
1192 Builder.defineMacro("_ARCH_A2");
1193 if (defs & ArchDefineA2q) {
1194 Builder.defineMacro("_ARCH_A2Q");
1195 Builder.defineMacro("_ARCH_QP");
1196 }
1197
1198 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1199 Builder.defineMacro("__bg__");
1200 Builder.defineMacro("__THW_BLUEGENE__");
1201 Builder.defineMacro("__bgq__");
1202 Builder.defineMacro("__TOS_BGQ__");
1203 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001204
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001205 if (HasVSX)
1206 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001207 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001208 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001209 if (HasP8Crypto)
1210 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001211 if (HasHTM)
1212 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001213
1214 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1215 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1216 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1217 if (PointerWidth == 64)
1218 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001219
Bill Schmidt38378a02013-02-01 20:23:10 +00001220 // FIXME: The following are not yet generated here by Clang, but are
1221 // generated by GCC:
1222 //
1223 // _SOFT_FLOAT_
1224 // __RECIP_PRECISION__
1225 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001226 // __RECIP__
1227 // __RECIPF__
1228 // __RSQRTE__
1229 // __RSQRTEF__
1230 // _SOFT_DOUBLE_
1231 // __NO_LWSYNC__
1232 // __HAVE_BSWAP__
1233 // __LONGDOUBLE128
1234 // __CMODEL_MEDIUM__
1235 // __CMODEL_LARGE__
1236 // _CALL_SYSV
1237 // _CALL_DARWIN
1238 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001239}
1240
Eric Christophera8a14c32015-08-31 18:39:16 +00001241// Handle explicit options being passed to the compiler here: if we've
1242// explicitly turned off vsx and turned on power8-vector or direct-move then
1243// go ahead and error since the customer has expressed a somewhat incompatible
1244// set of options.
1245static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001246 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001247
1248 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1249 FeaturesVec.end()) {
1250 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1251 FeaturesVec.end()) {
1252 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1253 << "-mno-vsx";
1254 return false;
1255 }
1256
1257 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1258 FeaturesVec.end()) {
1259 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1260 << "-mno-vsx";
1261 return false;
1262 }
1263 }
1264
1265 return true;
1266}
1267
Eric Christopher8c47b422015-10-09 18:39:55 +00001268bool PPCTargetInfo::initFeatureMap(
1269 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1270 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001271 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1272 .Case("7400", true)
1273 .Case("g4", true)
1274 .Case("7450", true)
1275 .Case("g4+", true)
1276 .Case("970", true)
1277 .Case("g5", true)
1278 .Case("pwr6", true)
1279 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001280 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001281 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001282 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001283 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001284
1285 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001286 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1287 .Case("ppc64le", true)
1288 .Case("pwr8", true)
1289 .Default(false);
1290 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1291 .Case("ppc64le", true)
1292 .Case("pwr8", true)
1293 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001294 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1295 .Case("ppc64le", true)
1296 .Case("pwr8", true)
1297 .Case("pwr7", true)
1298 .Default(false);
1299 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1300 .Case("ppc64le", true)
1301 .Case("pwr8", true)
1302 .Case("pwr7", true)
1303 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001304 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1305 .Case("ppc64le", true)
1306 .Case("pwr8", true)
1307 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001308 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1309 .Case("ppc64le", true)
1310 .Case("pwr8", true)
1311 .Case("pwr7", true)
1312 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001313
Eric Christophera8a14c32015-08-31 18:39:16 +00001314 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1315 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001316
Eric Christopher007b0a02015-08-28 22:32:01 +00001317 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001318}
1319
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001320bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001321 return llvm::StringSwitch<bool>(Feature)
1322 .Case("powerpc", true)
1323 .Case("vsx", HasVSX)
1324 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001325 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001326 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001327 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001328 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001329 .Case("bpermd", HasBPERMD)
1330 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001331 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001332}
Chris Lattner17df24e2008-04-21 18:56:49 +00001333
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001334void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1335 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001336 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1337 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1338 // incompatible options.
1339 if (Enabled) {
1340 if (Name == "vsx") {
1341 Features[Name] = true;
1342 } else if (Name == "direct-move") {
1343 Features[Name] = Features["vsx"] = true;
1344 } else if (Name == "power8-vector") {
1345 Features[Name] = Features["vsx"] = true;
1346 } else {
1347 Features[Name] = true;
1348 }
1349 } else {
1350 if (Name == "vsx") {
1351 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1352 false;
1353 } else {
1354 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001355 }
1356 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001357}
1358
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001359const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001360 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1361 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1362 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1363 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1364 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1365 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1366 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1367 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001368 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001369 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001370 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001371 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1372 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1373 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1374 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001375 "vrsave", "vscr",
1376 "spe_acc", "spefscr",
1377 "sfp"
1378};
Chris Lattner10a5b382007-01-29 05:24:35 +00001379
Craig Topperf054e3a2015-10-19 03:52:27 +00001380ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1381 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001382}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001383
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1385 // While some of these aliases do map to different registers
1386 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001387 { { "0" }, "r0" },
1388 { { "1"}, "r1" },
1389 { { "2" }, "r2" },
1390 { { "3" }, "r3" },
1391 { { "4" }, "r4" },
1392 { { "5" }, "r5" },
1393 { { "6" }, "r6" },
1394 { { "7" }, "r7" },
1395 { { "8" }, "r8" },
1396 { { "9" }, "r9" },
1397 { { "10" }, "r10" },
1398 { { "11" }, "r11" },
1399 { { "12" }, "r12" },
1400 { { "13" }, "r13" },
1401 { { "14" }, "r14" },
1402 { { "15" }, "r15" },
1403 { { "16" }, "r16" },
1404 { { "17" }, "r17" },
1405 { { "18" }, "r18" },
1406 { { "19" }, "r19" },
1407 { { "20" }, "r20" },
1408 { { "21" }, "r21" },
1409 { { "22" }, "r22" },
1410 { { "23" }, "r23" },
1411 { { "24" }, "r24" },
1412 { { "25" }, "r25" },
1413 { { "26" }, "r26" },
1414 { { "27" }, "r27" },
1415 { { "28" }, "r28" },
1416 { { "29" }, "r29" },
1417 { { "30" }, "r30" },
1418 { { "31" }, "r31" },
1419 { { "fr0" }, "f0" },
1420 { { "fr1" }, "f1" },
1421 { { "fr2" }, "f2" },
1422 { { "fr3" }, "f3" },
1423 { { "fr4" }, "f4" },
1424 { { "fr5" }, "f5" },
1425 { { "fr6" }, "f6" },
1426 { { "fr7" }, "f7" },
1427 { { "fr8" }, "f8" },
1428 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001429 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001430 { { "fr11" }, "f11" },
1431 { { "fr12" }, "f12" },
1432 { { "fr13" }, "f13" },
1433 { { "fr14" }, "f14" },
1434 { { "fr15" }, "f15" },
1435 { { "fr16" }, "f16" },
1436 { { "fr17" }, "f17" },
1437 { { "fr18" }, "f18" },
1438 { { "fr19" }, "f19" },
1439 { { "fr20" }, "f20" },
1440 { { "fr21" }, "f21" },
1441 { { "fr22" }, "f22" },
1442 { { "fr23" }, "f23" },
1443 { { "fr24" }, "f24" },
1444 { { "fr25" }, "f25" },
1445 { { "fr26" }, "f26" },
1446 { { "fr27" }, "f27" },
1447 { { "fr28" }, "f28" },
1448 { { "fr29" }, "f29" },
1449 { { "fr30" }, "f30" },
1450 { { "fr31" }, "f31" },
1451 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001452};
1453
Craig Topperf054e3a2015-10-19 03:52:27 +00001454ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1455 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001456}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001457
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001458class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001459public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001460 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001461 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001462
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001463 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001464 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001465 case llvm::Triple::FreeBSD:
1466 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001467 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001468 PtrDiffType = SignedInt;
1469 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001470 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001471 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001472 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001473 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001474
Roman Divacky3ffe7462012-03-13 19:20:17 +00001475 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1476 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001477 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001478 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001479
1480 // PPC32 supports atomics up to 4 bytes.
1481 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001482 }
1483
Craig Topper3164f332014-03-11 03:39:26 +00001484 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001485 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001486 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001487 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001488};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001489
Bill Schmidt778d3872013-07-26 01:36:11 +00001490// Note: ABI differences may eventually require us to have a separate
1491// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001492class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001493public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001494 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001495 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001496 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001497 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001498
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001499 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001500 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001501 ABI = "elfv2";
1502 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001503 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001504 ABI = "elfv1";
1505 }
1506
1507 switch (getTriple().getOS()) {
1508 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001509 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001510 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001511 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001512 case llvm::Triple::NetBSD:
1513 IntMaxType = SignedLongLong;
1514 Int64Type = SignedLongLong;
1515 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001516 default:
1517 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001518 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001519
1520 // PPC64 supports atomics up to 8 bytes.
1521 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001522 }
Craig Topper3164f332014-03-11 03:39:26 +00001523 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001524 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001525 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001526 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001527 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001528 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 ABI = Name;
1530 return true;
1531 }
1532 return false;
1533 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001535
Roman Divacky965b0b72011-01-06 08:27:10 +00001536class DarwinPPC32TargetInfo :
1537 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001538public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001539 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1540 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001541 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001542 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001543 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001544 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001545 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001546 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001547 }
Craig Topper3164f332014-03-11 03:39:26 +00001548 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001549 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001550 }
1551};
1552
1553class DarwinPPC64TargetInfo :
1554 public DarwinTargetInfo<PPC64TargetInfo> {
1555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001556 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1557 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001558 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001559 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001560 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001561 }
1562};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001563
Eric Christopherc48497a2015-09-18 21:26:24 +00001564static const unsigned NVPTXAddrSpaceMap[] = {
1565 1, // opencl_global
1566 3, // opencl_local
1567 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001568 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001569 0, // opencl_generic
1570 1, // cuda_device
1571 4, // cuda_constant
1572 3, // cuda_shared
1573};
1574
1575class NVPTXTargetInfo : public TargetInfo {
1576 static const char *const GCCRegNames[];
1577 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001578
1579 // The GPU profiles supported by the NVPTX backend
1580 enum GPUKind {
1581 GK_NONE,
1582 GK_SM20,
1583 GK_SM21,
1584 GK_SM30,
1585 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001586 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001587 } GPU;
1588
Eric Christopherc48497a2015-09-18 21:26:24 +00001589public:
1590 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1591 BigEndian = false;
1592 TLSSupported = false;
1593 LongWidth = LongAlign = 64;
1594 AddrSpaceMap = &NVPTXAddrSpaceMap;
1595 UseAddrSpaceMapMangling = true;
1596 // Define available target features
1597 // These must be defined in sorted order!
1598 NoAsmVariants = true;
1599 // Set the default GPU to sm20
1600 GPU = GK_SM20;
1601 }
1602 void getTargetDefines(const LangOptions &Opts,
1603 MacroBuilder &Builder) const override {
1604 Builder.defineMacro("__PTX__");
1605 Builder.defineMacro("__NVPTX__");
1606 if (Opts.CUDAIsDevice) {
1607 // Set __CUDA_ARCH__ for the GPU specified.
1608 std::string CUDAArchCode;
1609 switch (GPU) {
1610 case GK_SM20:
1611 CUDAArchCode = "200";
1612 break;
1613 case GK_SM21:
1614 CUDAArchCode = "210";
1615 break;
1616 case GK_SM30:
1617 CUDAArchCode = "300";
1618 break;
1619 case GK_SM35:
1620 CUDAArchCode = "350";
1621 break;
1622 case GK_SM37:
1623 CUDAArchCode = "370";
1624 break;
1625 default:
1626 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001627 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001628 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001629 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001630 }
Craig Topper6c03a542015-10-19 04:51:35 +00001631 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1632 return llvm::makeArrayRef(BuiltinInfo,
1633 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001634 }
1635 bool hasFeature(StringRef Feature) const override {
1636 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001637 }
1638
Craig Topperf054e3a2015-10-19 03:52:27 +00001639 ArrayRef<const char *> getGCCRegNames() const override;
1640 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001641 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001642 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001643 }
1644 bool validateAsmConstraint(const char *&Name,
1645 TargetInfo::ConstraintInfo &Info) const override {
1646 switch (*Name) {
1647 default:
1648 return false;
1649 case 'c':
1650 case 'h':
1651 case 'r':
1652 case 'l':
1653 case 'f':
1654 case 'd':
1655 Info.setAllowsRegister();
1656 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001657 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001658 }
1659 const char *getClobbers() const override {
1660 // FIXME: Is this really right?
1661 return "";
1662 }
1663 BuiltinVaListKind getBuiltinVaListKind() const override {
1664 // FIXME: implement
1665 return TargetInfo::CharPtrBuiltinVaList;
1666 }
1667 bool setCPU(const std::string &Name) override {
1668 GPU = llvm::StringSwitch<GPUKind>(Name)
1669 .Case("sm_20", GK_SM20)
1670 .Case("sm_21", GK_SM21)
1671 .Case("sm_30", GK_SM30)
1672 .Case("sm_35", GK_SM35)
1673 .Case("sm_37", GK_SM37)
1674 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001675
Eric Christopherc48497a2015-09-18 21:26:24 +00001676 return GPU != GK_NONE;
1677 }
1678};
1679
1680const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1681#define BUILTIN(ID, TYPE, ATTRS) \
1682 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1683#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1684 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1685#include "clang/Basic/BuiltinsNVPTX.def"
1686};
1687
1688const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1689
Craig Topperf054e3a2015-10-19 03:52:27 +00001690ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1691 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001692}
1693
1694class NVPTX32TargetInfo : public NVPTXTargetInfo {
1695public:
1696 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001697 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001698 PointerWidth = PointerAlign = 32;
1699 SizeType = TargetInfo::UnsignedInt;
1700 PtrDiffType = TargetInfo::SignedInt;
1701 IntPtrType = TargetInfo::SignedInt;
1702 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1703 }
1704};
1705
1706class NVPTX64TargetInfo : public NVPTXTargetInfo {
1707public:
1708 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1709 PointerWidth = PointerAlign = 64;
1710 SizeType = TargetInfo::UnsignedLong;
1711 PtrDiffType = TargetInfo::SignedLong;
1712 IntPtrType = TargetInfo::SignedLong;
1713 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1714 }
1715};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001716
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001717static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001718 1, // opencl_global
1719 3, // opencl_local
1720 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001721 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001722 1, // cuda_device
1723 2, // cuda_constant
1724 3 // cuda_shared
1725};
1726
Tom Stellarda96344b2014-08-21 13:58:40 +00001727// If you edit the description strings, make sure you update
1728// getPointerWidthV().
1729
Craig Topper273dbc62015-10-18 05:29:26 +00001730static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001731 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1732 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001733
Craig Topper273dbc62015-10-18 05:29:26 +00001734static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001735 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1736 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001737
Craig Topper273dbc62015-10-18 05:29:26 +00001738static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001739 "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 +00001740 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1741 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001742
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001743class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001744 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001745 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001746
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001747 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001748 enum GPUKind {
1749 GK_NONE,
1750 GK_R600,
1751 GK_R600_DOUBLE_OPS,
1752 GK_R700,
1753 GK_R700_DOUBLE_OPS,
1754 GK_EVERGREEN,
1755 GK_EVERGREEN_DOUBLE_OPS,
1756 GK_NORTHERN_ISLANDS,
1757 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001758 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001759 GK_SEA_ISLANDS,
1760 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001761 } GPU;
1762
Jan Veselyeebeaea2015-05-04 19:53:36 +00001763 bool hasFP64:1;
1764 bool hasFMAF:1;
1765 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001766
Eli Friedmand13b41e2012-10-12 23:32:00 +00001767public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001768 AMDGPUTargetInfo(const llvm::Triple &Triple)
1769 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001770
1771 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001772 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001773 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001774 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001775 hasFMAF = true;
1776 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001777 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001778 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001779 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001780 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001781 hasFMAF = false;
1782 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001783 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001784 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001785 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001786 }
1787
Tom Stellarda96344b2014-08-21 13:58:40 +00001788 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1789 if (GPU <= GK_CAYMAN)
1790 return 32;
1791
1792 switch(AddrSpace) {
1793 default:
1794 return 64;
1795 case 0:
1796 case 3:
1797 case 5:
1798 return 32;
1799 }
1800 }
1801
Craig Topper3164f332014-03-11 03:39:26 +00001802 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001803 return "";
1804 }
1805
Craig Topperf054e3a2015-10-19 03:52:27 +00001806 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001807
Craig Topperf054e3a2015-10-19 03:52:27 +00001808 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1809 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001810 }
1811
Craig Topper3164f332014-03-11 03:39:26 +00001812 bool validateAsmConstraint(const char *&Name,
1813 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001814 return true;
1815 }
1816
Craig Topper6c03a542015-10-19 04:51:35 +00001817 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1818 return llvm::makeArrayRef(BuiltinInfo,
1819 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001820 }
1821
Craig Topper3164f332014-03-11 03:39:26 +00001822 void getTargetDefines(const LangOptions &Opts,
1823 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001824 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001825 if (hasFMAF)
1826 Builder.defineMacro("__HAS_FMAF__");
1827 if (hasLDEXPF)
1828 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001829 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001830 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001831 if (Opts.OpenCL) {
1832 if (GPU >= GK_NORTHERN_ISLANDS) {
1833 Builder.defineMacro("cl_khr_byte_addressable_store");
1834 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1835 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1836 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1837 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1838 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001839 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001840 }
1841
Craig Topper3164f332014-03-11 03:39:26 +00001842 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001843 return TargetInfo::CharPtrBuiltinVaList;
1844 }
1845
Craig Topper3164f332014-03-11 03:39:26 +00001846 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001847 GPU = llvm::StringSwitch<GPUKind>(Name)
1848 .Case("r600" , GK_R600)
1849 .Case("rv610", GK_R600)
1850 .Case("rv620", GK_R600)
1851 .Case("rv630", GK_R600)
1852 .Case("rv635", GK_R600)
1853 .Case("rs780", GK_R600)
1854 .Case("rs880", GK_R600)
1855 .Case("rv670", GK_R600_DOUBLE_OPS)
1856 .Case("rv710", GK_R700)
1857 .Case("rv730", GK_R700)
1858 .Case("rv740", GK_R700_DOUBLE_OPS)
1859 .Case("rv770", GK_R700_DOUBLE_OPS)
1860 .Case("palm", GK_EVERGREEN)
1861 .Case("cedar", GK_EVERGREEN)
1862 .Case("sumo", GK_EVERGREEN)
1863 .Case("sumo2", GK_EVERGREEN)
1864 .Case("redwood", GK_EVERGREEN)
1865 .Case("juniper", GK_EVERGREEN)
1866 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1867 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1868 .Case("barts", GK_NORTHERN_ISLANDS)
1869 .Case("turks", GK_NORTHERN_ISLANDS)
1870 .Case("caicos", GK_NORTHERN_ISLANDS)
1871 .Case("cayman", GK_CAYMAN)
1872 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001873 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001874 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1875 .Case("verde", GK_SOUTHERN_ISLANDS)
1876 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001877 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001878 .Case("bonaire", GK_SEA_ISLANDS)
1879 .Case("kabini", GK_SEA_ISLANDS)
1880 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001881 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001882 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001883 .Case("tonga", GK_VOLCANIC_ISLANDS)
1884 .Case("iceland", GK_VOLCANIC_ISLANDS)
1885 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001886 .Default(GK_NONE);
1887
1888 if (GPU == GK_NONE) {
1889 return false;
1890 }
1891
1892 // Set the correct data layout
1893 switch (GPU) {
1894 case GK_NONE:
1895 case GK_R600:
1896 case GK_R700:
1897 case GK_EVERGREEN:
1898 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001899 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001900 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001901 hasFMAF = false;
1902 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001903 break;
1904 case GK_R600_DOUBLE_OPS:
1905 case GK_R700_DOUBLE_OPS:
1906 case GK_EVERGREEN_DOUBLE_OPS:
1907 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001908 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001909 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001910 hasFMAF = true;
1911 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001912 break;
1913 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001914 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001915 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001916 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001917 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001918 hasFMAF = true;
1919 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001920 break;
1921 }
1922
1923 return true;
1924 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001925};
1926
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001927const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001928#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001929 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001930#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001931};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001932const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001933 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1934 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1935 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1936 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1937 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1938 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1939 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1940 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1941 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1942 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1943 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1944 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1945 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1946 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1947 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1948 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1949 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1950 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1951 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1952 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1953 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1954 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1955 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1956 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1957 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1958 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1959 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1960 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1961 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1962 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1963 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1964 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1965 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1966 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1967 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1968 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1969 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1970 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1971 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1972 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1973 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1974 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1975 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1976 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1977 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1978 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1979 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1980 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1981 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1982 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1983};
1984
Craig Topperf054e3a2015-10-19 03:52:27 +00001985ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
1986 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00001987}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001988
Eli Friedman3fd920a2008-08-20 02:34:37 +00001989// Namespace for x86 abstract base class
1990const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001991#define BUILTIN(ID, TYPE, ATTRS) \
1992 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00001993#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00001994 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00001995#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00001996 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00001997#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001998};
Eli Friedmanb5366062008-05-20 14:21:01 +00001999
Nuno Lopescfca1f02009-12-23 17:49:57 +00002000static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002001 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2002 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002003 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002004 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2005 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2006 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002007 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002008 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2009 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002010};
2011
Eric Christophercdd36352011-06-21 00:05:20 +00002012const TargetInfo::AddlRegName AddlRegNames[] = {
2013 { { "al", "ah", "eax", "rax" }, 0 },
2014 { { "bl", "bh", "ebx", "rbx" }, 3 },
2015 { { "cl", "ch", "ecx", "rcx" }, 2 },
2016 { { "dl", "dh", "edx", "rdx" }, 1 },
2017 { { "esi", "rsi" }, 4 },
2018 { { "edi", "rdi" }, 5 },
2019 { { "esp", "rsp" }, 7 },
2020 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002021 { { "r8d", "r8w", "r8b" }, 38 },
2022 { { "r9d", "r9w", "r9b" }, 39 },
2023 { { "r10d", "r10w", "r10b" }, 40 },
2024 { { "r11d", "r11w", "r11b" }, 41 },
2025 { { "r12d", "r12w", "r12b" }, 42 },
2026 { { "r13d", "r13w", "r13b" }, 43 },
2027 { { "r14d", "r14w", "r14b" }, 44 },
2028 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002029};
2030
2031// X86 target abstract base class; x86-32 and x86-64 are very close, so
2032// most of the implementation can be shared.
2033class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002034 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002035 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002036 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002037 enum MMX3DNowEnum {
2038 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002039 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002040 enum XOPEnum {
2041 NoXOP,
2042 SSE4A,
2043 FMA4,
2044 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002045 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002046
Craig Topper543f3bd2015-10-14 23:47:57 +00002047 bool HasAES = false;
2048 bool HasPCLMUL = false;
2049 bool HasLZCNT = false;
2050 bool HasRDRND = false;
2051 bool HasFSGSBASE = false;
2052 bool HasBMI = false;
2053 bool HasBMI2 = false;
2054 bool HasPOPCNT = false;
2055 bool HasRTM = false;
2056 bool HasPRFCHW = false;
2057 bool HasRDSEED = false;
2058 bool HasADX = false;
2059 bool HasTBM = false;
2060 bool HasFMA = false;
2061 bool HasF16C = false;
2062 bool HasAVX512CD = false;
2063 bool HasAVX512ER = false;
2064 bool HasAVX512PF = false;
2065 bool HasAVX512DQ = false;
2066 bool HasAVX512BW = false;
2067 bool HasAVX512VL = false;
2068 bool HasSHA = false;
2069 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002070 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002071 bool HasXSAVE = false;
2072 bool HasXSAVEOPT = false;
2073 bool HasXSAVEC = false;
2074 bool HasXSAVES = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002075
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002076 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2077 ///
2078 /// Each enumeration represents a particular CPU supported by Clang. These
2079 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2080 enum CPUKind {
2081 CK_Generic,
2082
2083 /// \name i386
2084 /// i386-generation processors.
2085 //@{
2086 CK_i386,
2087 //@}
2088
2089 /// \name i486
2090 /// i486-generation processors.
2091 //@{
2092 CK_i486,
2093 CK_WinChipC6,
2094 CK_WinChip2,
2095 CK_C3,
2096 //@}
2097
2098 /// \name i586
2099 /// i586-generation processors, P5 microarchitecture based.
2100 //@{
2101 CK_i586,
2102 CK_Pentium,
2103 CK_PentiumMMX,
2104 //@}
2105
2106 /// \name i686
2107 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2108 //@{
2109 CK_i686,
2110 CK_PentiumPro,
2111 CK_Pentium2,
2112 CK_Pentium3,
2113 CK_Pentium3M,
2114 CK_PentiumM,
2115 CK_C3_2,
2116
2117 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2118 /// Clang however has some logic to suport this.
2119 // FIXME: Warn, deprecate, and potentially remove this.
2120 CK_Yonah,
2121 //@}
2122
2123 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002124 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002125 //@{
2126 CK_Pentium4,
2127 CK_Pentium4M,
2128 CK_Prescott,
2129 CK_Nocona,
2130 //@}
2131
2132 /// \name Core
2133 /// Core microarchitecture based processors.
2134 //@{
2135 CK_Core2,
2136
2137 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2138 /// codename which GCC no longer accepts as an option to -march, but Clang
2139 /// has some logic for recognizing it.
2140 // FIXME: Warn, deprecate, and potentially remove this.
2141 CK_Penryn,
2142 //@}
2143
2144 /// \name Atom
2145 /// Atom processors
2146 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002147 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002148 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002149 //@}
2150
2151 /// \name Nehalem
2152 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002153 CK_Nehalem,
2154
2155 /// \name Westmere
2156 /// Westmere microarchitecture based processors.
2157 CK_Westmere,
2158
2159 /// \name Sandy Bridge
2160 /// Sandy Bridge microarchitecture based processors.
2161 CK_SandyBridge,
2162
2163 /// \name Ivy Bridge
2164 /// Ivy Bridge microarchitecture based processors.
2165 CK_IvyBridge,
2166
2167 /// \name Haswell
2168 /// Haswell microarchitecture based processors.
2169 CK_Haswell,
2170
2171 /// \name Broadwell
2172 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002173 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002174
2175 /// \name Skylake
2176 /// Skylake microarchitecture based processors.
2177 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002178
Craig Topper449314e2013-08-20 07:09:39 +00002179 /// \name Knights Landing
2180 /// Knights Landing processor.
2181 CK_KNL,
2182
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002183 /// \name K6
2184 /// K6 architecture processors.
2185 //@{
2186 CK_K6,
2187 CK_K6_2,
2188 CK_K6_3,
2189 //@}
2190
2191 /// \name K7
2192 /// K7 architecture processors.
2193 //@{
2194 CK_Athlon,
2195 CK_AthlonThunderbird,
2196 CK_Athlon4,
2197 CK_AthlonXP,
2198 CK_AthlonMP,
2199 //@}
2200
2201 /// \name K8
2202 /// K8 architecture processors.
2203 //@{
2204 CK_Athlon64,
2205 CK_Athlon64SSE3,
2206 CK_AthlonFX,
2207 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002208 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002209 CK_Opteron,
2210 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002211 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002212 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002213
Benjamin Kramer569f2152012-01-10 11:50:18 +00002214 /// \name Bobcat
2215 /// Bobcat architecture processors.
2216 //@{
2217 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002218 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002219 //@}
2220
2221 /// \name Bulldozer
2222 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002223 //@{
2224 CK_BDVER1,
2225 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002226 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002227 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002228 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002229
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002230 /// This specification is deprecated and will be removed in the future.
2231 /// Users should prefer \see CK_K8.
2232 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002233 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002234 CK_x86_64,
2235 //@}
2236
2237 /// \name Geode
2238 /// Geode processors.
2239 //@{
2240 CK_Geode
2241 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002242 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002243
Eric Christopherc50738f2015-08-27 00:05:50 +00002244 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002245 return llvm::StringSwitch<CPUKind>(CPU)
2246 .Case("i386", CK_i386)
2247 .Case("i486", CK_i486)
2248 .Case("winchip-c6", CK_WinChipC6)
2249 .Case("winchip2", CK_WinChip2)
2250 .Case("c3", CK_C3)
2251 .Case("i586", CK_i586)
2252 .Case("pentium", CK_Pentium)
2253 .Case("pentium-mmx", CK_PentiumMMX)
2254 .Case("i686", CK_i686)
2255 .Case("pentiumpro", CK_PentiumPro)
2256 .Case("pentium2", CK_Pentium2)
2257 .Case("pentium3", CK_Pentium3)
2258 .Case("pentium3m", CK_Pentium3M)
2259 .Case("pentium-m", CK_PentiumM)
2260 .Case("c3-2", CK_C3_2)
2261 .Case("yonah", CK_Yonah)
2262 .Case("pentium4", CK_Pentium4)
2263 .Case("pentium4m", CK_Pentium4M)
2264 .Case("prescott", CK_Prescott)
2265 .Case("nocona", CK_Nocona)
2266 .Case("core2", CK_Core2)
2267 .Case("penryn", CK_Penryn)
2268 .Case("bonnell", CK_Bonnell)
2269 .Case("atom", CK_Bonnell) // Legacy name.
2270 .Case("silvermont", CK_Silvermont)
2271 .Case("slm", CK_Silvermont) // Legacy name.
2272 .Case("nehalem", CK_Nehalem)
2273 .Case("corei7", CK_Nehalem) // Legacy name.
2274 .Case("westmere", CK_Westmere)
2275 .Case("sandybridge", CK_SandyBridge)
2276 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2277 .Case("ivybridge", CK_IvyBridge)
2278 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2279 .Case("haswell", CK_Haswell)
2280 .Case("core-avx2", CK_Haswell) // Legacy name.
2281 .Case("broadwell", CK_Broadwell)
2282 .Case("skylake", CK_Skylake)
2283 .Case("skx", CK_Skylake) // Legacy name.
2284 .Case("knl", CK_KNL)
2285 .Case("k6", CK_K6)
2286 .Case("k6-2", CK_K6_2)
2287 .Case("k6-3", CK_K6_3)
2288 .Case("athlon", CK_Athlon)
2289 .Case("athlon-tbird", CK_AthlonThunderbird)
2290 .Case("athlon-4", CK_Athlon4)
2291 .Case("athlon-xp", CK_AthlonXP)
2292 .Case("athlon-mp", CK_AthlonMP)
2293 .Case("athlon64", CK_Athlon64)
2294 .Case("athlon64-sse3", CK_Athlon64SSE3)
2295 .Case("athlon-fx", CK_AthlonFX)
2296 .Case("k8", CK_K8)
2297 .Case("k8-sse3", CK_K8SSE3)
2298 .Case("opteron", CK_Opteron)
2299 .Case("opteron-sse3", CK_OpteronSSE3)
2300 .Case("barcelona", CK_AMDFAM10)
2301 .Case("amdfam10", CK_AMDFAM10)
2302 .Case("btver1", CK_BTVER1)
2303 .Case("btver2", CK_BTVER2)
2304 .Case("bdver1", CK_BDVER1)
2305 .Case("bdver2", CK_BDVER2)
2306 .Case("bdver3", CK_BDVER3)
2307 .Case("bdver4", CK_BDVER4)
2308 .Case("x86-64", CK_x86_64)
2309 .Case("geode", CK_Geode)
2310 .Default(CK_Generic);
2311 }
2312
Rafael Espindolaeb265472013-08-21 21:59:03 +00002313 enum FPMathKind {
2314 FP_Default,
2315 FP_SSE,
2316 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002317 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002318
Eli Friedman3fd920a2008-08-20 02:34:37 +00002319public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002320 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002321 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002322 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002323 }
Craig Topper3164f332014-03-11 03:39:26 +00002324 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002325 // X87 evaluates with 80 bits "long double" precision.
2326 return SSELevel == NoSSE ? 2 : 0;
2327 }
Craig Topper6c03a542015-10-19 04:51:35 +00002328 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2329 return llvm::makeArrayRef(BuiltinInfo,
2330 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002331 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002332 ArrayRef<const char *> getGCCRegNames() const override {
2333 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002334 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002335 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2336 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002337 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002338 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2339 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002340 }
Eric Christopherd9832702015-06-29 21:00:05 +00002341 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002342 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002343 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002344
Akira Hatanaka974131e2014-09-18 18:17:18 +00002345 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2346
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002347 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2348
Akira Hatanaka974131e2014-09-18 18:17:18 +00002349 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2350
Craig Topper3164f332014-03-11 03:39:26 +00002351 std::string convertConstraint(const char *&Constraint) const override;
2352 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002353 return "~{dirflag},~{fpsr},~{flags}";
2354 }
Craig Topper3164f332014-03-11 03:39:26 +00002355 void getTargetDefines(const LangOptions &Opts,
2356 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002357 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2358 bool Enabled);
2359 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2360 bool Enabled);
2361 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2362 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002363 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2364 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002365 setFeatureEnabledImpl(Features, Name, Enabled);
2366 }
2367 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002368 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002369 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2370 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002371 bool
2372 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2373 StringRef CPU,
2374 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002375 bool hasFeature(StringRef Feature) const override;
2376 bool handleTargetFeatures(std::vector<std::string> &Features,
2377 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002378 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002379 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2380 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002381 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002382 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002383 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002384 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002385 return "no-mmx";
2386 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002387 }
Craig Topper3164f332014-03-11 03:39:26 +00002388 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002389 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002390
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002391 // Perform any per-CPU checks necessary to determine if this CPU is
2392 // acceptable.
2393 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2394 // invalid without explaining *why*.
2395 switch (CPU) {
2396 case CK_Generic:
2397 // No processor selected!
2398 return false;
2399
2400 case CK_i386:
2401 case CK_i486:
2402 case CK_WinChipC6:
2403 case CK_WinChip2:
2404 case CK_C3:
2405 case CK_i586:
2406 case CK_Pentium:
2407 case CK_PentiumMMX:
2408 case CK_i686:
2409 case CK_PentiumPro:
2410 case CK_Pentium2:
2411 case CK_Pentium3:
2412 case CK_Pentium3M:
2413 case CK_PentiumM:
2414 case CK_Yonah:
2415 case CK_C3_2:
2416 case CK_Pentium4:
2417 case CK_Pentium4M:
2418 case CK_Prescott:
2419 case CK_K6:
2420 case CK_K6_2:
2421 case CK_K6_3:
2422 case CK_Athlon:
2423 case CK_AthlonThunderbird:
2424 case CK_Athlon4:
2425 case CK_AthlonXP:
2426 case CK_AthlonMP:
2427 case CK_Geode:
2428 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002429 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002430 return false;
2431
2432 // Fallthrough
2433 case CK_Nocona:
2434 case CK_Core2:
2435 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002436 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002437 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002438 case CK_Nehalem:
2439 case CK_Westmere:
2440 case CK_SandyBridge:
2441 case CK_IvyBridge:
2442 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002443 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002444 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002445 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002446 case CK_Athlon64:
2447 case CK_Athlon64SSE3:
2448 case CK_AthlonFX:
2449 case CK_K8:
2450 case CK_K8SSE3:
2451 case CK_Opteron:
2452 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002453 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002454 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002455 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002456 case CK_BDVER1:
2457 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002458 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002459 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002460 case CK_x86_64:
2461 return true;
2462 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002463 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002464 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002465
Craig Topper3164f332014-03-11 03:39:26 +00002466 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002467
Craig Topper3164f332014-03-11 03:39:26 +00002468 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002469 // We accept all non-ARM calling conventions
2470 return (CC == CC_X86ThisCall ||
2471 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002472 CC == CC_X86StdCall ||
2473 CC == CC_X86VectorCall ||
2474 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002475 CC == CC_X86Pascal ||
2476 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002477 }
2478
Craig Topper3164f332014-03-11 03:39:26 +00002479 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002480 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002481 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002482
2483 bool hasSjLjLowering() const override {
2484 return true;
2485 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002486};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002487
Rafael Espindolaeb265472013-08-21 21:59:03 +00002488bool X86TargetInfo::setFPMath(StringRef Name) {
2489 if (Name == "387") {
2490 FPMath = FP_387;
2491 return true;
2492 }
2493 if (Name == "sse") {
2494 FPMath = FP_SSE;
2495 return true;
2496 }
2497 return false;
2498}
2499
Eric Christopher007b0a02015-08-28 22:32:01 +00002500bool X86TargetInfo::initFeatureMap(
2501 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002502 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002503 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002504 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002505 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002506 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002507
Eric Christopher2b4a7252015-08-27 00:05:52 +00002508 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002509 case CK_Generic:
2510 case CK_i386:
2511 case CK_i486:
2512 case CK_i586:
2513 case CK_Pentium:
2514 case CK_i686:
2515 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002516 break;
2517 case CK_PentiumMMX:
2518 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002519 case CK_K6:
2520 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002521 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002522 break;
2523 case CK_Pentium3:
2524 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002525 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002526 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002527 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002528 break;
2529 case CK_PentiumM:
2530 case CK_Pentium4:
2531 case CK_Pentium4M:
2532 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002533 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002534 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002535 break;
2536 case CK_Yonah:
2537 case CK_Prescott:
2538 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002539 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002540 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002541 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002542 break;
2543 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002544 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002545 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002546 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002547 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002548 break;
2549 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002550 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002551 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002552 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002553 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002554 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002555 setFeatureEnabledImpl(Features, "avx512f", true);
2556 setFeatureEnabledImpl(Features, "avx512cd", true);
2557 setFeatureEnabledImpl(Features, "avx512dq", true);
2558 setFeatureEnabledImpl(Features, "avx512bw", true);
2559 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002560 setFeatureEnabledImpl(Features, "xsavec", true);
2561 setFeatureEnabledImpl(Features, "xsaves", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002562 // FALLTHROUGH
2563 case CK_Broadwell:
2564 setFeatureEnabledImpl(Features, "rdseed", true);
2565 setFeatureEnabledImpl(Features, "adx", true);
2566 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002567 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002568 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002569 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002570 setFeatureEnabledImpl(Features, "bmi", true);
2571 setFeatureEnabledImpl(Features, "bmi2", true);
2572 setFeatureEnabledImpl(Features, "rtm", true);
2573 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002574 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002575 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002576 setFeatureEnabledImpl(Features, "rdrnd", true);
2577 setFeatureEnabledImpl(Features, "f16c", true);
2578 setFeatureEnabledImpl(Features, "fsgsbase", true);
2579 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002580 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002581 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002582 setFeatureEnabledImpl(Features, "xsave", true);
2583 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002584 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002585 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002586 case CK_Silvermont:
2587 setFeatureEnabledImpl(Features, "aes", true);
2588 setFeatureEnabledImpl(Features, "pclmul", true);
2589 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002590 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002591 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002592 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002593 setFeatureEnabledImpl(Features, "cx16", true);
2594 break;
2595 case CK_KNL:
2596 setFeatureEnabledImpl(Features, "avx512f", true);
2597 setFeatureEnabledImpl(Features, "avx512cd", true);
2598 setFeatureEnabledImpl(Features, "avx512er", true);
2599 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002600 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002601 setFeatureEnabledImpl(Features, "rdseed", true);
2602 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002603 setFeatureEnabledImpl(Features, "lzcnt", true);
2604 setFeatureEnabledImpl(Features, "bmi", true);
2605 setFeatureEnabledImpl(Features, "bmi2", true);
2606 setFeatureEnabledImpl(Features, "rtm", true);
2607 setFeatureEnabledImpl(Features, "fma", true);
2608 setFeatureEnabledImpl(Features, "rdrnd", true);
2609 setFeatureEnabledImpl(Features, "f16c", true);
2610 setFeatureEnabledImpl(Features, "fsgsbase", true);
2611 setFeatureEnabledImpl(Features, "aes", true);
2612 setFeatureEnabledImpl(Features, "pclmul", true);
2613 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002614 setFeatureEnabledImpl(Features, "xsaveopt", true);
2615 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002616 break;
2617 case CK_K6_2:
2618 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002619 case CK_WinChip2:
2620 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002621 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002623 case CK_Athlon:
2624 case CK_AthlonThunderbird:
2625 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002626 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002627 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 case CK_Athlon4:
2629 case CK_AthlonXP:
2630 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002631 setFeatureEnabledImpl(Features, "sse", true);
2632 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002633 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002634 break;
2635 case CK_K8:
2636 case CK_Opteron:
2637 case CK_Athlon64:
2638 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002639 setFeatureEnabledImpl(Features, "sse2", true);
2640 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002641 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002643 case CK_AMDFAM10:
2644 setFeatureEnabledImpl(Features, "sse4a", true);
2645 setFeatureEnabledImpl(Features, "lzcnt", true);
2646 setFeatureEnabledImpl(Features, "popcnt", true);
2647 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 case CK_K8SSE3:
2649 case CK_OpteronSSE3:
2650 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002651 setFeatureEnabledImpl(Features, "sse3", true);
2652 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002653 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002654 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002655 case CK_BTVER2:
2656 setFeatureEnabledImpl(Features, "avx", true);
2657 setFeatureEnabledImpl(Features, "aes", true);
2658 setFeatureEnabledImpl(Features, "pclmul", true);
2659 setFeatureEnabledImpl(Features, "bmi", true);
2660 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002661 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002662 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002663 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002664 setFeatureEnabledImpl(Features, "ssse3", true);
2665 setFeatureEnabledImpl(Features, "sse4a", true);
2666 setFeatureEnabledImpl(Features, "lzcnt", true);
2667 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002668 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002669 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002670 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002671 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002672 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002673 case CK_BDVER4:
2674 setFeatureEnabledImpl(Features, "avx2", true);
2675 setFeatureEnabledImpl(Features, "bmi2", true);
2676 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002677 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002678 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002679 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002680 // FALLTHROUGH
2681 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002682 setFeatureEnabledImpl(Features, "bmi", true);
2683 setFeatureEnabledImpl(Features, "fma", true);
2684 setFeatureEnabledImpl(Features, "f16c", true);
2685 setFeatureEnabledImpl(Features, "tbm", true);
2686 // FALLTHROUGH
2687 case CK_BDVER1:
2688 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002689 setFeatureEnabledImpl(Features, "xop", true);
2690 setFeatureEnabledImpl(Features, "lzcnt", true);
2691 setFeatureEnabledImpl(Features, "aes", true);
2692 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002693 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002694 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002695 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002696 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002697 break;
Eli Friedman33465822011-07-08 23:31:17 +00002698 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002699 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2700 return false;
2701
2702 // Can't do this earlier because we need to be able to explicitly enable
2703 // or disable these features and the things that they depend upon.
2704
2705 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2706 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002707 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002708 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2709 FeaturesVec.end())
2710 Features["popcnt"] = true;
2711
2712 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2713 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002714 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002715 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2716 FeaturesVec.end())
2717 Features["prfchw"] = true;
2718
Eric Christophera7260af2015-10-08 20:10:18 +00002719 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2720 // then enable MMX.
2721 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002722 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002723 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2724 FeaturesVec.end())
2725 Features["mmx"] = true;
2726
Eric Christopherbbd746d2015-10-08 20:10:14 +00002727 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002728}
2729
Rafael Espindolae62e2792013-08-20 13:44:29 +00002730void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002731 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002732 if (Enabled) {
2733 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002734 case AVX512F:
2735 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002736 case AVX2:
2737 Features["avx2"] = true;
2738 case AVX:
2739 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002740 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002741 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002742 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002743 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002744 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002745 case SSSE3:
2746 Features["ssse3"] = true;
2747 case SSE3:
2748 Features["sse3"] = true;
2749 case SSE2:
2750 Features["sse2"] = true;
2751 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002752 Features["sse"] = true;
2753 case NoSSE:
2754 break;
2755 }
2756 return;
2757 }
2758
2759 switch (Level) {
2760 case NoSSE:
2761 case SSE1:
2762 Features["sse"] = false;
2763 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002764 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2765 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002766 case SSE3:
2767 Features["sse3"] = false;
2768 setXOPLevel(Features, NoXOP, false);
2769 case SSSE3:
2770 Features["ssse3"] = false;
2771 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002772 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002773 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002774 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002775 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002776 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2777 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002778 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002779 case AVX2:
2780 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002781 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002782 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002783 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2784 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002785 }
2786}
2787
2788void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002789 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002790 if (Enabled) {
2791 switch (Level) {
2792 case AMD3DNowAthlon:
2793 Features["3dnowa"] = true;
2794 case AMD3DNow:
2795 Features["3dnow"] = true;
2796 case MMX:
2797 Features["mmx"] = true;
2798 case NoMMX3DNow:
2799 break;
2800 }
2801 return;
2802 }
2803
2804 switch (Level) {
2805 case NoMMX3DNow:
2806 case MMX:
2807 Features["mmx"] = false;
2808 case AMD3DNow:
2809 Features["3dnow"] = false;
2810 case AMD3DNowAthlon:
2811 Features["3dnowa"] = false;
2812 }
2813}
2814
2815void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002816 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002817 if (Enabled) {
2818 switch (Level) {
2819 case XOP:
2820 Features["xop"] = true;
2821 case FMA4:
2822 Features["fma4"] = true;
2823 setSSELevel(Features, AVX, true);
2824 case SSE4A:
2825 Features["sse4a"] = true;
2826 setSSELevel(Features, SSE3, true);
2827 case NoXOP:
2828 break;
2829 }
2830 return;
2831 }
2832
2833 switch (Level) {
2834 case NoXOP:
2835 case SSE4A:
2836 Features["sse4a"] = false;
2837 case FMA4:
2838 Features["fma4"] = false;
2839 case XOP:
2840 Features["xop"] = false;
2841 }
2842}
2843
Craig Topper86d79ef2013-09-17 04:51:29 +00002844void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2845 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002846 // This is a bit of a hack to deal with the sse4 target feature when used
2847 // as part of the target attribute. We handle sse4 correctly everywhere
2848 // else. See below for more information on how we handle the sse4 options.
2849 if (Name != "sse4")
2850 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002851
Craig Topper29561122013-09-19 01:13:07 +00002852 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002853 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002854 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002855 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002856 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002857 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002858 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002859 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002860 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002861 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002862 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002863 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002864 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002865 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002866 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002867 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002868 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002870 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002871 if (Enabled)
2872 setSSELevel(Features, SSE2, Enabled);
2873 } else if (Name == "pclmul") {
2874 if (Enabled)
2875 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002876 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002877 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002878 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002879 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002880 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002881 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002882 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2883 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002884 if (Enabled)
2885 setSSELevel(Features, AVX512F, Enabled);
2886 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 if (Enabled)
2888 setSSELevel(Features, AVX, Enabled);
2889 } else if (Name == "fma4") {
2890 setXOPLevel(Features, FMA4, Enabled);
2891 } else if (Name == "xop") {
2892 setXOPLevel(Features, XOP, Enabled);
2893 } else if (Name == "sse4a") {
2894 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002895 } else if (Name == "f16c") {
2896 if (Enabled)
2897 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002898 } else if (Name == "sha") {
2899 if (Enabled)
2900 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002901 } else if (Name == "sse4") {
2902 // We can get here via the __target__ attribute since that's not controlled
2903 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2904 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2905 // disabled.
2906 if (Enabled)
2907 setSSELevel(Features, SSE42, Enabled);
2908 else
2909 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002910 } else if (Name == "xsave") {
2911 if (Enabled)
2912 setSSELevel(Features, AVX, Enabled);
2913 else
2914 Features["xsaveopt"] = false;
2915 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2916 if (Enabled) {
2917 Features["xsave"] = true;
2918 setSSELevel(Features, AVX, Enabled);
2919 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002920 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002921}
2922
Eric Christopher3ff21b32013-10-16 21:26:26 +00002923/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002924/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002925bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002926 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002927 for (const auto &Feature : Features) {
2928 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002929 continue;
2930
Eric Christopher610fe112015-08-26 08:21:55 +00002931 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002932 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002933 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002934 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002935 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002936 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002937 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002938 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002939 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002940 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002941 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002942 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002943 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002944 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002945 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002946 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002947 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002948 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002949 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002950 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002951 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002952 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002953 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002954 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002955 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002956 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002957 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002958 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002959 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002960 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002961 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002962 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002963 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002964 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002965 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002966 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002967 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002968 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002969 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002970 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002971 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002972 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002973 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002974 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002975 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002976 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00002977 } else if (Feature == "+fxsr") {
2978 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002979 } else if (Feature == "+xsave") {
2980 HasXSAVE = true;
2981 } else if (Feature == "+xsaveopt") {
2982 HasXSAVEOPT = true;
2983 } else if (Feature == "+xsavec") {
2984 HasXSAVEC = true;
2985 } else if (Feature == "+xsaves") {
2986 HasXSAVES = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002987 }
2988
Benjamin Kramer27402c62012-03-05 15:10:44 +00002989 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002990 .Case("+avx512f", AVX512F)
2991 .Case("+avx2", AVX2)
2992 .Case("+avx", AVX)
2993 .Case("+sse4.2", SSE42)
2994 .Case("+sse4.1", SSE41)
2995 .Case("+ssse3", SSSE3)
2996 .Case("+sse3", SSE3)
2997 .Case("+sse2", SSE2)
2998 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002999 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003000 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003001
Eli Friedman33465822011-07-08 23:31:17 +00003002 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003003 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003004 .Case("+3dnowa", AMD3DNowAthlon)
3005 .Case("+3dnow", AMD3DNow)
3006 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003007 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003008 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003009
3010 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003011 .Case("+xop", XOP)
3012 .Case("+fma4", FMA4)
3013 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003014 .Default(NoXOP);
3015 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003016 }
Eli Friedman33465822011-07-08 23:31:17 +00003017
Rafael Espindolaeb265472013-08-21 21:59:03 +00003018 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3019 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003020 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3021 (FPMath == FP_387 && SSELevel >= SSE1)) {
3022 Diags.Report(diag::err_target_unsupported_fpmath) <<
3023 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003024 return false;
3025 }
3026
Alexey Bataev00396512015-07-02 03:40:19 +00003027 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003028 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003029 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003030}
Chris Lattnerecd49032009-03-02 22:27:17 +00003031
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003032/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3033/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003034void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003035 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003036 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003037 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003038 Builder.defineMacro("__amd64__");
3039 Builder.defineMacro("__amd64");
3040 Builder.defineMacro("__x86_64");
3041 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003042 if (getTriple().getArchName() == "x86_64h") {
3043 Builder.defineMacro("__x86_64h");
3044 Builder.defineMacro("__x86_64h__");
3045 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003046 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003047 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003048 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003049
Chris Lattnerecd49032009-03-02 22:27:17 +00003050 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003051 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3052 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003053 switch (CPU) {
3054 case CK_Generic:
3055 break;
3056 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003057 // The rest are coming from the i386 define above.
3058 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 break;
3060 case CK_i486:
3061 case CK_WinChipC6:
3062 case CK_WinChip2:
3063 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003064 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003066 case CK_PentiumMMX:
3067 Builder.defineMacro("__pentium_mmx__");
3068 Builder.defineMacro("__tune_pentium_mmx__");
3069 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003070 case CK_i586:
3071 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003072 defineCPUMacros(Builder, "i586");
3073 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003074 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003075 case CK_Pentium3:
3076 case CK_Pentium3M:
3077 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003078 Builder.defineMacro("__tune_pentium3__");
3079 // Fallthrough
3080 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003081 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003082 Builder.defineMacro("__tune_pentium2__");
3083 // Fallthrough
3084 case CK_PentiumPro:
3085 Builder.defineMacro("__tune_i686__");
3086 Builder.defineMacro("__tune_pentiumpro__");
3087 // Fallthrough
3088 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003089 Builder.defineMacro("__i686");
3090 Builder.defineMacro("__i686__");
3091 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3092 Builder.defineMacro("__pentiumpro");
3093 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 break;
3095 case CK_Pentium4:
3096 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003097 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 break;
3099 case CK_Yonah:
3100 case CK_Prescott:
3101 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003102 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003103 break;
3104 case CK_Core2:
3105 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003106 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003107 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003108 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003109 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003110 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003111 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003112 defineCPUMacros(Builder, "slm");
3113 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003114 case CK_Nehalem:
3115 case CK_Westmere:
3116 case CK_SandyBridge:
3117 case CK_IvyBridge:
3118 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003119 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003120 // FIXME: Historically, we defined this legacy name, it would be nice to
3121 // remove it at some point. We've never exposed fine-grained names for
3122 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003123 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003124 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003125 case CK_Skylake:
3126 // FIXME: Historically, we defined this legacy name, it would be nice to
3127 // remove it at some point. This is the only fine-grained CPU macro in the
3128 // main intel CPU line, and it would be better to not have these and force
3129 // people to use ISA macros.
3130 defineCPUMacros(Builder, "skx");
3131 break;
Craig Topper449314e2013-08-20 07:09:39 +00003132 case CK_KNL:
3133 defineCPUMacros(Builder, "knl");
3134 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003135 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003136 Builder.defineMacro("__k6_2__");
3137 Builder.defineMacro("__tune_k6_2__");
3138 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003139 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003140 if (CPU != CK_K6_2) { // In case of fallthrough
3141 // FIXME: GCC may be enabling these in cases where some other k6
3142 // architecture is specified but -m3dnow is explicitly provided. The
3143 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003144 Builder.defineMacro("__k6_3__");
3145 Builder.defineMacro("__tune_k6_3__");
3146 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003147 // Fallthrough
3148 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003149 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003150 break;
3151 case CK_Athlon:
3152 case CK_AthlonThunderbird:
3153 case CK_Athlon4:
3154 case CK_AthlonXP:
3155 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003156 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003157 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003158 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003159 Builder.defineMacro("__tune_athlon_sse__");
3160 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003161 break;
3162 case CK_K8:
3163 case CK_K8SSE3:
3164 case CK_x86_64:
3165 case CK_Opteron:
3166 case CK_OpteronSSE3:
3167 case CK_Athlon64:
3168 case CK_Athlon64SSE3:
3169 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003170 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003171 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003172 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003173 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003174 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003175 case CK_BTVER1:
3176 defineCPUMacros(Builder, "btver1");
3177 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003178 case CK_BTVER2:
3179 defineCPUMacros(Builder, "btver2");
3180 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003181 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003182 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003183 break;
3184 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003185 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003186 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003187 case CK_BDVER3:
3188 defineCPUMacros(Builder, "bdver3");
3189 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003190 case CK_BDVER4:
3191 defineCPUMacros(Builder, "bdver4");
3192 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003193 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003194 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003195 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003196 }
Chris Lattner96e43572009-03-02 22:40:39 +00003197
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003198 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003199 Builder.defineMacro("__REGISTER_PREFIX__", "");
3200
Chris Lattner6df41af2009-04-19 17:32:33 +00003201 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3202 // functions in glibc header files that use FP Stack inline asm which the
3203 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003204 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003205
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003206 if (HasAES)
3207 Builder.defineMacro("__AES__");
3208
Craig Topper3f122a72012-05-31 05:18:48 +00003209 if (HasPCLMUL)
3210 Builder.defineMacro("__PCLMUL__");
3211
Craig Topper22967d42011-12-25 05:06:45 +00003212 if (HasLZCNT)
3213 Builder.defineMacro("__LZCNT__");
3214
Benjamin Kramer1e250392012-07-07 09:39:18 +00003215 if (HasRDRND)
3216 Builder.defineMacro("__RDRND__");
3217
Craig Topper8c7f2512014-11-03 06:51:41 +00003218 if (HasFSGSBASE)
3219 Builder.defineMacro("__FSGSBASE__");
3220
Craig Topper22967d42011-12-25 05:06:45 +00003221 if (HasBMI)
3222 Builder.defineMacro("__BMI__");
3223
3224 if (HasBMI2)
3225 Builder.defineMacro("__BMI2__");
3226
Craig Topper1de83482011-12-29 16:10:46 +00003227 if (HasPOPCNT)
3228 Builder.defineMacro("__POPCNT__");
3229
Michael Liao625a8752012-11-10 05:17:46 +00003230 if (HasRTM)
3231 Builder.defineMacro("__RTM__");
3232
Michael Liao74f4eaf2013-03-26 17:52:08 +00003233 if (HasPRFCHW)
3234 Builder.defineMacro("__PRFCHW__");
3235
Michael Liaoffaae352013-03-29 05:17:55 +00003236 if (HasRDSEED)
3237 Builder.defineMacro("__RDSEED__");
3238
Robert Khasanov50e6f582014-09-19 09:53:48 +00003239 if (HasADX)
3240 Builder.defineMacro("__ADX__");
3241
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003242 if (HasTBM)
3243 Builder.defineMacro("__TBM__");
3244
Rafael Espindolae62e2792013-08-20 13:44:29 +00003245 switch (XOPLevel) {
3246 case XOP:
3247 Builder.defineMacro("__XOP__");
3248 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003249 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003250 case SSE4A:
3251 Builder.defineMacro("__SSE4A__");
3252 case NoXOP:
3253 break;
3254 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003255
Craig Topperbba778b2012-06-03 21:46:30 +00003256 if (HasFMA)
3257 Builder.defineMacro("__FMA__");
3258
Manman Rena45358c2012-10-11 00:59:55 +00003259 if (HasF16C)
3260 Builder.defineMacro("__F16C__");
3261
Craig Topper679b53a2013-08-21 05:29:10 +00003262 if (HasAVX512CD)
3263 Builder.defineMacro("__AVX512CD__");
3264 if (HasAVX512ER)
3265 Builder.defineMacro("__AVX512ER__");
3266 if (HasAVX512PF)
3267 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003268 if (HasAVX512DQ)
3269 Builder.defineMacro("__AVX512DQ__");
3270 if (HasAVX512BW)
3271 Builder.defineMacro("__AVX512BW__");
3272 if (HasAVX512VL)
3273 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003274
Ben Langmuir58078d02013-09-19 13:22:04 +00003275 if (HasSHA)
3276 Builder.defineMacro("__SHA__");
3277
Craig Toppere33f51f2015-10-16 06:22:36 +00003278 if (HasFXSR)
3279 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003280 if (HasXSAVE)
3281 Builder.defineMacro("__XSAVE__");
3282 if (HasXSAVEOPT)
3283 Builder.defineMacro("__XSAVEOPT__");
3284 if (HasXSAVEC)
3285 Builder.defineMacro("__XSAVEC__");
3286 if (HasXSAVES)
3287 Builder.defineMacro("__XSAVES__");
3288
Nick Lewycky50e8f482013-10-05 20:14:27 +00003289 if (HasCX16)
3290 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3291
Chris Lattner96e43572009-03-02 22:40:39 +00003292 // Each case falls through to the previous one here.
3293 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003294 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003295 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003296 case AVX2:
3297 Builder.defineMacro("__AVX2__");
3298 case AVX:
3299 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003300 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003301 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003302 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003303 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003304 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003305 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003306 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003307 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003308 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003309 Builder.defineMacro("__SSE2__");
3310 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003311 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003312 Builder.defineMacro("__SSE__");
3313 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003314 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003315 break;
3316 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003317
Derek Schuffc7dd7222012-10-11 15:52:22 +00003318 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003319 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003320 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003321 case AVX2:
3322 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003323 case SSE42:
3324 case SSE41:
3325 case SSSE3:
3326 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003327 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003328 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003329 break;
3330 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003331 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003332 break;
3333 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003334 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003335 }
3336 }
3337
Anders Carlssone437c682010-01-27 03:47:49 +00003338 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003339 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003340 case AMD3DNowAthlon:
3341 Builder.defineMacro("__3dNOW_A__");
3342 case AMD3DNow:
3343 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003344 case MMX:
3345 Builder.defineMacro("__MMX__");
3346 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003347 break;
3348 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003349
3350 if (CPU >= CK_i486) {
3351 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3352 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3353 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3354 }
3355 if (CPU >= CK_i586)
3356 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003357}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003358
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003359bool X86TargetInfo::hasFeature(StringRef Feature) const {
3360 return llvm::StringSwitch<bool>(Feature)
3361 .Case("aes", HasAES)
3362 .Case("avx", SSELevel >= AVX)
3363 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003364 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003365 .Case("avx512cd", HasAVX512CD)
3366 .Case("avx512er", HasAVX512ER)
3367 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003368 .Case("avx512dq", HasAVX512DQ)
3369 .Case("avx512bw", HasAVX512BW)
3370 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003371 .Case("bmi", HasBMI)
3372 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003373 .Case("cx16", HasCX16)
3374 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003375 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003376 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003377 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003378 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003379 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003380 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3381 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3382 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003383 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003384 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003385 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003386 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003387 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003388 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003389 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003390 .Case("sse", SSELevel >= SSE1)
3391 .Case("sse2", SSELevel >= SSE2)
3392 .Case("sse3", SSELevel >= SSE3)
3393 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003394 .Case("sse4.1", SSELevel >= SSE41)
3395 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003396 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003397 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003398 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003399 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3400 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003401 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003402 .Case("xsave", HasXSAVE)
3403 .Case("xsavec", HasXSAVEC)
3404 .Case("xsaves", HasXSAVES)
3405 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003406 .Default(false);
3407}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003408
Eric Christopherd9832702015-06-29 21:00:05 +00003409// We can't use a generic validation scheme for the features accepted here
3410// versus subtarget features accepted in the target attribute because the
3411// bitfield structure that's initialized in the runtime only supports the
3412// below currently rather than the full range of subtarget features. (See
3413// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3414bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3415 return llvm::StringSwitch<bool>(FeatureStr)
3416 .Case("cmov", true)
3417 .Case("mmx", true)
3418 .Case("popcnt", true)
3419 .Case("sse", true)
3420 .Case("sse2", true)
3421 .Case("sse3", true)
3422 .Case("sse4.1", true)
3423 .Case("sse4.2", true)
3424 .Case("avx", true)
3425 .Case("avx2", true)
3426 .Case("sse4a", true)
3427 .Case("fma4", true)
3428 .Case("xop", true)
3429 .Case("fma", true)
3430 .Case("avx512f", true)
3431 .Case("bmi", true)
3432 .Case("bmi2", true)
3433 .Default(false);
3434}
3435
Eli Friedman3fd920a2008-08-20 02:34:37 +00003436bool
Anders Carlsson58436352009-02-28 17:11:49 +00003437X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003438 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003439 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003440 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003441 // Constant constraints.
3442 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3443 // instructions.
3444 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3445 // x86_64 instructions.
3446 case 's':
3447 Info.setRequiresImmediate();
3448 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003449 case 'I':
3450 Info.setRequiresImmediate(0, 31);
3451 return true;
3452 case 'J':
3453 Info.setRequiresImmediate(0, 63);
3454 return true;
3455 case 'K':
3456 Info.setRequiresImmediate(-128, 127);
3457 return true;
3458 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003459 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003460 return true;
3461 case 'M':
3462 Info.setRequiresImmediate(0, 3);
3463 return true;
3464 case 'N':
3465 Info.setRequiresImmediate(0, 255);
3466 return true;
3467 case 'O':
3468 Info.setRequiresImmediate(0, 127);
3469 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003470 // Register constraints.
3471 case 'Y': // 'Y' is the first character for several 2-character constraints.
3472 // Shift the pointer to the second character of the constraint.
3473 Name++;
3474 switch (*Name) {
3475 default:
3476 return false;
3477 case '0': // First SSE register.
3478 case 't': // Any SSE register, when SSE2 is enabled.
3479 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3480 case 'm': // Any MMX register, when inter-unit moves enabled.
3481 Info.setAllowsRegister();
3482 return true;
3483 }
3484 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003485 // Constraint 'f' cannot be used for output operands.
3486 if (Info.ConstraintStr[0] == '=')
3487 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003488 Info.setAllowsRegister();
3489 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003490 case 'a': // eax.
3491 case 'b': // ebx.
3492 case 'c': // ecx.
3493 case 'd': // edx.
3494 case 'S': // esi.
3495 case 'D': // edi.
3496 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003497 case 't': // Top of floating point stack.
3498 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003499 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003500 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003501 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003502 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003503 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3504 case 'l': // "Index" registers: any general register that can be used as an
3505 // index in a base+index memory access.
3506 Info.setAllowsRegister();
3507 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003508 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003509 case 'C': // SSE floating point constant.
3510 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003511 return true;
3512 }
3513}
3514
Akira Hatanaka974131e2014-09-18 18:17:18 +00003515bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3516 unsigned Size) const {
3517 // Strip off constraint modifiers.
3518 while (Constraint[0] == '=' ||
3519 Constraint[0] == '+' ||
3520 Constraint[0] == '&')
3521 Constraint = Constraint.substr(1);
3522
3523 return validateOperandSize(Constraint, Size);
3524}
3525
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003526bool X86TargetInfo::validateInputSize(StringRef Constraint,
3527 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003528 return validateOperandSize(Constraint, Size);
3529}
3530
3531bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3532 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003533 switch (Constraint[0]) {
3534 default: break;
3535 case 'y':
3536 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003537 case 'f':
3538 case 't':
3539 case 'u':
3540 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003541 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003542 if (SSELevel >= AVX512F)
3543 // 512-bit zmm registers can be used if target supports AVX512F.
3544 return Size <= 512U;
3545 else if (SSELevel >= AVX)
3546 // 256-bit ymm registers can be used if target supports AVX.
3547 return Size <= 256U;
3548 return Size <= 128U;
3549 case 'Y':
3550 // 'Y' is the first character for several 2-character constraints.
3551 switch (Constraint[1]) {
3552 default: break;
3553 case 'm':
3554 // 'Ym' is synonymous with 'y'.
3555 return Size <= 64;
3556 case 'i':
3557 case 't':
3558 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3559 if (SSELevel >= AVX512F)
3560 return Size <= 512U;
3561 else if (SSELevel >= AVX)
3562 return Size <= 256U;
3563 return SSELevel >= SSE2 && Size <= 128U;
3564 }
3565
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003566 }
3567
3568 return true;
3569}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003570
Eli Friedman3fd920a2008-08-20 02:34:37 +00003571std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003572X86TargetInfo::convertConstraint(const char *&Constraint) const {
3573 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003574 case 'a': return std::string("{ax}");
3575 case 'b': return std::string("{bx}");
3576 case 'c': return std::string("{cx}");
3577 case 'd': return std::string("{dx}");
3578 case 'S': return std::string("{si}");
3579 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003580 case 'p': // address
3581 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003582 case 't': // top of floating point stack.
3583 return std::string("{st}");
3584 case 'u': // second from top of floating point stack.
3585 return std::string("{st(1)}"); // second from top of floating point stack.
3586 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003587 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003588 }
3589}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003590
Eli Friedman3fd920a2008-08-20 02:34:37 +00003591// X86-32 generic target
3592class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003593public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003594 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003595 DoubleAlign = LongLongAlign = 32;
3596 LongDoubleWidth = 96;
3597 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003598 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003599 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003600 SizeType = UnsignedInt;
3601 PtrDiffType = SignedInt;
3602 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003603 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003604
3605 // Use fpret for all types.
3606 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3607 (1 << TargetInfo::Double) |
3608 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003609
3610 // x86-32 has atomics up to 8 bytes
3611 // FIXME: Check that we actually have cmpxchg8b before setting
3612 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003614 }
Craig Topper3164f332014-03-11 03:39:26 +00003615 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003616 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003617 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003618
Craig Topper3164f332014-03-11 03:39:26 +00003619 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003620 if (RegNo == 0) return 0;
3621 if (RegNo == 1) return 2;
3622 return -1;
3623 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003624 bool validateOperandSize(StringRef Constraint,
3625 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003626 switch (Constraint[0]) {
3627 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003628 case 'R':
3629 case 'q':
3630 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003631 case 'a':
3632 case 'b':
3633 case 'c':
3634 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003635 case 'S':
3636 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003637 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003638 case 'A':
3639 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003640 }
3641
Akira Hatanaka974131e2014-09-18 18:17:18 +00003642 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003643 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003644};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003645
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003646class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3647public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003648 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3649 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003650
Craig Topper3164f332014-03-11 03:39:26 +00003651 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003652 unsigned Major, Minor, Micro;
3653 getTriple().getOSVersion(Major, Minor, Micro);
3654 // New NetBSD uses the default rounding mode.
3655 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3656 return X86_32TargetInfo::getFloatEvalMethod();
3657 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003658 return 1;
3659 }
3660};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003661
Eli Friedmane3aa4542009-07-05 18:47:56 +00003662class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3663public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003664 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3665 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003666 SizeType = UnsignedLong;
3667 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003668 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003669 }
3670};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003671
Eli Friedman9fa28852012-08-08 23:57:20 +00003672class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3673public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003674 BitrigI386TargetInfo(const llvm::Triple &Triple)
3675 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003676 SizeType = UnsignedLong;
3677 IntPtrType = SignedLong;
3678 PtrDiffType = SignedLong;
3679 }
3680};
Eli Friedman9fa28852012-08-08 23:57:20 +00003681
Torok Edwinb2b37c62009-06-30 17:10:35 +00003682class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003684 DarwinI386TargetInfo(const llvm::Triple &Triple)
3685 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003686 LongDoubleWidth = 128;
3687 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003688 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003689 SizeType = UnsignedLong;
3690 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003691 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003692 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003693 }
3694
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003695 bool handleTargetFeatures(std::vector<std::string> &Features,
3696 DiagnosticsEngine &Diags) override {
3697 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3698 Diags))
3699 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003700 // We now know the features we have: we can decide how to align vectors.
3701 MaxVectorAlign =
3702 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003703 return true;
3704 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003705};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003706
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003707// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003708class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003709public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003710 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3711 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003712 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003713 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003714 bool IsWinCOFF =
3715 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003716 DataLayoutString = IsWinCOFF
3717 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3718 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003719 }
Craig Topper3164f332014-03-11 03:39:26 +00003720 void getTargetDefines(const LangOptions &Opts,
3721 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003722 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3723 }
3724};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003725
3726// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003727class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003728public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003729 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003730 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003731 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003732 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3733 }
Craig Topper3164f332014-03-11 03:39:26 +00003734 void getTargetDefines(const LangOptions &Opts,
3735 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003736 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3737 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3738 // The value of the following reflects processor type.
3739 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3740 // We lost the original triple, so we use the default.
3741 Builder.defineMacro("_M_IX86", "600");
3742 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003743};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003744
David Majnemerae1ed0e2015-05-28 04:36:18 +00003745static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003746 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3747 // supports __declspec natively under -fms-extensions, but we define a no-op
3748 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003749 if (Opts.MicrosoftExt)
3750 Builder.defineMacro("__declspec", "__declspec");
3751 else
3752 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3753
3754 if (!Opts.MicrosoftExt) {
3755 // Provide macros for all the calling convention keywords. Provide both
3756 // single and double underscore prefixed variants. These are available on
3757 // x64 as well as x86, even though they have no effect.
3758 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3759 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003760 std::string GCCSpelling = "__attribute__((__";
3761 GCCSpelling += CC;
3762 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003763 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3764 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3765 }
3766 }
3767}
3768
David Majnemerae1ed0e2015-05-28 04:36:18 +00003769static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3770 Builder.defineMacro("__MSVCRT__");
3771 Builder.defineMacro("__MINGW32__");
3772 addCygMingDefines(Opts, Builder);
3773}
3774
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003775// x86-32 MinGW target
3776class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3777public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003778 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003779 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003780 void getTargetDefines(const LangOptions &Opts,
3781 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003782 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003783 DefineStd(Builder, "WIN32", Opts);
3784 DefineStd(Builder, "WINNT", Opts);
3785 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003786 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003787 }
3788};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003789
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003790// x86-32 Cygwin target
3791class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3792public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003793 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3794 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003795 TLSSupported = false;
3796 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003797 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003798 DataLayoutString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003799 }
Craig Topper3164f332014-03-11 03:39:26 +00003800 void getTargetDefines(const LangOptions &Opts,
3801 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003802 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003803 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003804 Builder.defineMacro("__CYGWIN__");
3805 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003806 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003807 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003808 if (Opts.CPlusPlus)
3809 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003810 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003811};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003812
Chris Lattnerb986aba2010-04-11 19:29:39 +00003813// x86-32 Haiku target
3814class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3815public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003816 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003817 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003818 IntPtrType = SignedLong;
3819 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003820 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003821 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003822 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003823 }
Craig Topper3164f332014-03-11 03:39:26 +00003824 void getTargetDefines(const LangOptions &Opts,
3825 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003826 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3827 Builder.defineMacro("__INTEL__");
3828 Builder.defineMacro("__HAIKU__");
3829 }
3830};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003831
Douglas Gregor9fabd852011-07-01 22:41:14 +00003832// RTEMS Target
3833template<typename Target>
3834class RTEMSTargetInfo : public OSTargetInfo<Target> {
3835protected:
Craig Topper3164f332014-03-11 03:39:26 +00003836 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3837 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003838 // RTEMS defines; list based off of gcc output
3839
Douglas Gregor9fabd852011-07-01 22:41:14 +00003840 Builder.defineMacro("__rtems__");
3841 Builder.defineMacro("__ELF__");
3842 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003843
Douglas Gregor9fabd852011-07-01 22:41:14 +00003844public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003845 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3846 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003847
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003848 switch (Triple.getArch()) {
3849 default:
3850 case llvm::Triple::x86:
3851 // this->MCountName = ".mcount";
3852 break;
3853 case llvm::Triple::mips:
3854 case llvm::Triple::mipsel:
3855 case llvm::Triple::ppc:
3856 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003857 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003858 // this->MCountName = "_mcount";
3859 break;
3860 case llvm::Triple::arm:
3861 // this->MCountName = "__mcount";
3862 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003863 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003864 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003865};
3866
Douglas Gregor9fabd852011-07-01 22:41:14 +00003867// x86-32 RTEMS target
3868class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3869public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003870 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003871 SizeType = UnsignedLong;
3872 IntPtrType = SignedLong;
3873 PtrDiffType = SignedLong;
3874 this->UserLabelPrefix = "";
3875 }
Craig Topper3164f332014-03-11 03:39:26 +00003876 void getTargetDefines(const LangOptions &Opts,
3877 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003878 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3879 Builder.defineMacro("__INTEL__");
3880 Builder.defineMacro("__rtems__");
3881 }
3882};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003883
Eli Friedman3fd920a2008-08-20 02:34:37 +00003884// x86-64 generic target
3885class X86_64TargetInfo : public X86TargetInfo {
3886public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003887 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003888 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003889 bool IsWinCOFF =
3890 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003891 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003892 LongDoubleWidth = 128;
3893 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003894 LargeArrayMinWidth = 128;
3895 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003896 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003897 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3898 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3899 IntPtrType = IsX32 ? SignedInt : SignedLong;
3900 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003901 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003902 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003903
Eric Christopher917e9522014-11-18 22:36:15 +00003904 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003905 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3906 : IsWinCOFF
3907 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3908 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003909
3910 // Use fpret only for long double.
3911 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003912
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003913 // Use fp2ret for _Complex long double.
3914 ComplexLongDoubleUsesFP2Ret = true;
3915
Charles Davisc7d5c942015-09-17 20:55:33 +00003916 // Make __builtin_ms_va_list available.
3917 HasBuiltinMSVaList = true;
3918
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003919 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003920 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003921 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003922 }
Craig Topper3164f332014-03-11 03:39:26 +00003923 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003924 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003925 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003926
Craig Topper3164f332014-03-11 03:39:26 +00003927 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003928 if (RegNo == 0) return 0;
3929 if (RegNo == 1) return 1;
3930 return -1;
3931 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003932
Craig Topper3164f332014-03-11 03:39:26 +00003933 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003934 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003935 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003936 CC == CC_IntelOclBicc ||
3937 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003938 }
3939
Craig Topper3164f332014-03-11 03:39:26 +00003940 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003941 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003942 }
3943
Pavel Chupinfd223e12014-08-04 12:39:43 +00003944 // for x32 we need it here explicitly
3945 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003946};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003947
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003948// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003949class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003950public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003951 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3952 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003953 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003954 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003955 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003956 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003957 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003958 SizeType = UnsignedLongLong;
3959 PtrDiffType = SignedLongLong;
3960 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003961 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003962 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003963
Craig Topper3164f332014-03-11 03:39:26 +00003964 void getTargetDefines(const LangOptions &Opts,
3965 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003966 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003967 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003968 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003969
Craig Topper3164f332014-03-11 03:39:26 +00003970 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003971 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003972 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003973
Craig Topper3164f332014-03-11 03:39:26 +00003974 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003975 switch (CC) {
3976 case CC_X86StdCall:
3977 case CC_X86ThisCall:
3978 case CC_X86FastCall:
3979 return CCCR_Ignore;
3980 case CC_C:
3981 case CC_X86VectorCall:
3982 case CC_IntelOclBicc:
3983 case CC_X86_64SysV:
3984 return CCCR_OK;
3985 default:
3986 return CCCR_Warning;
3987 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003988 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003989};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003990
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003991// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003992class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003993public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003994 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003995 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003996 LongDoubleWidth = LongDoubleAlign = 64;
3997 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003998 }
Craig Topper3164f332014-03-11 03:39:26 +00003999 void getTargetDefines(const LangOptions &Opts,
4000 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004001 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4002 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004003 Builder.defineMacro("_M_X64", "100");
4004 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004005 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004006};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004007
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004008// x86-64 MinGW target
4009class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4010public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004011 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004012 : WindowsX86_64TargetInfo(Triple) {
4013 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4014 // with x86 FP ops. Weird.
4015 LongDoubleWidth = LongDoubleAlign = 128;
4016 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4017 }
4018
Craig Topper3164f332014-03-11 03:39:26 +00004019 void getTargetDefines(const LangOptions &Opts,
4020 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004021 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004022 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004023 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004024 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004025
4026 // GCC defines this macro when it is using __gxx_personality_seh0.
4027 if (!Opts.SjLjExceptions)
4028 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004029 }
4030};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004031
Yaron Kerend030d112015-07-22 17:38:19 +00004032// x86-64 Cygwin target
4033class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4034public:
4035 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4036 : X86_64TargetInfo(Triple) {
4037 TLSSupported = false;
4038 WCharType = UnsignedShort;
4039 }
4040 void getTargetDefines(const LangOptions &Opts,
4041 MacroBuilder &Builder) const override {
4042 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4043 Builder.defineMacro("__x86_64__");
4044 Builder.defineMacro("__CYGWIN__");
4045 Builder.defineMacro("__CYGWIN64__");
4046 addCygMingDefines(Opts, Builder);
4047 DefineStd(Builder, "unix", Opts);
4048 if (Opts.CPlusPlus)
4049 Builder.defineMacro("_GNU_SOURCE");
4050
4051 // GCC defines this macro when it is using __gxx_personality_seh0.
4052 if (!Opts.SjLjExceptions)
4053 Builder.defineMacro("__SEH__");
4054 }
4055};
4056
Eli Friedman2857ccb2009-07-01 03:36:11 +00004057class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4058public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004059 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4060 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004061 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004062 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4063 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004064 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004065 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004066 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004067 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004068
4069 bool handleTargetFeatures(std::vector<std::string> &Features,
4070 DiagnosticsEngine &Diags) override {
4071 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4072 Diags))
4073 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004074 // We now know the features we have: we can decide how to align vectors.
4075 MaxVectorAlign =
4076 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004077 return true;
4078 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004079};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004080
Eli Friedman245f2292009-07-05 22:31:18 +00004081class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4082public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004083 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4084 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004085 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004086 Int64Type = SignedLongLong;
4087 }
4088};
Eli Friedman245f2292009-07-05 22:31:18 +00004089
Eli Friedman9fa28852012-08-08 23:57:20 +00004090class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4091public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004092 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4093 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4094 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004095 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004096 }
4097};
Tim Northover9bb857a2013-01-31 12:13:10 +00004098
Eli Friedmanf05b7722008-08-20 07:44:10 +00004099class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004100 // Possible FPU choices.
4101 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004102 VFP2FPU = (1 << 0),
4103 VFP3FPU = (1 << 1),
4104 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004105 NeonFPU = (1 << 3),
4106 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004107 };
4108
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004109 // Possible HWDiv features.
4110 enum HWDivMode {
4111 HWDivThumb = (1 << 0),
4112 HWDivARM = (1 << 1)
4113 };
4114
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004115 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004116 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004117 }
4118
4119 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4120 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004121
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004122 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004123
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004124 StringRef CPUProfile;
4125 StringRef CPUAttr;
4126
Rafael Espindolaeb265472013-08-21 21:59:03 +00004127 enum {
4128 FP_Default,
4129 FP_VFP,
4130 FP_Neon
4131 } FPMath;
4132
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004133 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004134 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004135 unsigned ArchProfile;
4136 unsigned ArchVersion;
4137
Bernard Ogdenda13af32013-10-24 18:32:51 +00004138 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004139
Logan Chien57086ce2012-10-10 06:56:20 +00004140 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004141 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004142
4143 // Initialized via features.
4144 unsigned SoftFloat : 1;
4145 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004146
Bernard Ogden18b57012013-10-29 09:47:51 +00004147 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004148 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004149 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004150 unsigned Unaligned : 1;
4151
4152 enum {
4153 LDREX_B = (1 << 0), /// byte (8-bit)
4154 LDREX_H = (1 << 1), /// half (16-bit)
4155 LDREX_W = (1 << 2), /// word (32-bit)
4156 LDREX_D = (1 << 3), /// double (64-bit)
4157 };
4158
4159 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004160
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004161 // ACLE 6.5.1 Hardware floating point
4162 enum {
4163 HW_FP_HP = (1 << 1), /// half (16-bit)
4164 HW_FP_SP = (1 << 2), /// single (32-bit)
4165 HW_FP_DP = (1 << 3), /// double (64-bit)
4166 };
4167 uint32_t HW_FP;
4168
Chris Lattner5cc15e02010-03-03 19:03:45 +00004169 static const Builtin::Info BuiltinInfo[];
4170
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004171 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004172 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004173
4174 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004175 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004176
Renato Golin9ba39232015-02-27 16:35:48 +00004177 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4178 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4179 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004180 SizeType = UnsignedLong;
4181 else
4182 SizeType = UnsignedInt;
4183
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004184 switch (T.getOS()) {
4185 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004186 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004187 break;
4188 case llvm::Triple::Win32:
4189 WCharType = UnsignedShort;
4190 break;
4191 case llvm::Triple::Linux:
4192 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004193 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4194 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004195 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004196 }
4197
4198 UseBitFieldTypeAlignment = true;
4199
4200 ZeroLengthBitfieldBoundary = 0;
4201
Tim Northover147cd2f2014-10-14 22:12:21 +00004202 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4203 // so set preferred for small types to 32.
4204 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004205 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004206 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4207 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4208 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004209 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004210 DataLayoutString = "e"
4211 "-m:w"
4212 "-p:32:32"
4213 "-i64:64"
4214 "-v128:64:128"
4215 "-a:0:32"
4216 "-n32"
4217 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004218 } else if (T.isOSNaCl()) {
4219 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004220 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004221 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004222 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004223 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4224 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004225 }
4226
4227 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004228 }
4229
4230 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004231 const llvm::Triple &T = getTriple();
4232
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004233 IsAAPCS = false;
4234
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004235 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004236
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004237 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004238 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004239 SizeType = UnsignedInt;
4240 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004241 SizeType = UnsignedLong;
4242
4243 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4244 WCharType = SignedInt;
4245
4246 // Do not respect the alignment of bit-field types when laying out
4247 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4248 UseBitFieldTypeAlignment = false;
4249
4250 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4251 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4252 /// gcc.
4253 ZeroLengthBitfieldBoundary = 32;
4254
Tim Northover147cd2f2014-10-14 22:12:21 +00004255 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004256 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004257 BigEndian
4258 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4259 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4260 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004261 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004262 BigEndian
4263 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4264 : "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 +00004265
4266 // FIXME: Override "preferred align" for double and long long.
4267 }
4268
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004269 void setArchInfo() {
4270 StringRef ArchName = getTriple().getArchName();
4271
Renato Goline84b0002015-10-08 16:43:26 +00004272 ArchISA = llvm::ARM::parseArchISA(ArchName);
4273 CPU = llvm::ARM::getDefaultCPU(ArchName);
4274 unsigned AK = llvm::ARM::parseArch(ArchName);
4275 if (AK != llvm::ARM::AK_INVALID)
4276 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004277 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004278 }
4279
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004280 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004281 StringRef SubArch;
4282
4283 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004284 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004285 SubArch = llvm::ARM::getSubArch(ArchKind);
4286 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4287 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004288
4289 // cache CPU related strings
4290 CPUAttr = getCPUAttr();
4291 CPUProfile = getCPUProfile();
4292 }
4293
4294 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004295 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004296 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004297 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004298 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4299 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004300 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004301 if (ArchProfile == llvm::ARM::PK_M) {
4302 MaxAtomicPromoteWidth = 32;
4303 if (ShouldUseInlineAtomic)
4304 MaxAtomicInlineWidth = 32;
4305 }
4306 else {
4307 MaxAtomicPromoteWidth = 64;
4308 if (ShouldUseInlineAtomic)
4309 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004310 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004311 }
4312
4313 bool isThumb() const {
4314 return (ArchISA == llvm::ARM::IK_THUMB);
4315 }
4316
4317 bool supportsThumb() const {
4318 return CPUAttr.count('T') || ArchVersion >= 6;
4319 }
4320
4321 bool supportsThumb2() const {
4322 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4323 }
4324
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004325 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004326 // For most sub-arches, the build attribute CPU name is enough.
4327 // For Cortex variants, it's slightly different.
4328 switch(ArchKind) {
4329 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004330 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004331 case llvm::ARM::AK_ARMV6M:
4332 case llvm::ARM::AK_ARMV6SM:
4333 case llvm::ARM::AK_ARMV6HL:
4334 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004335 case llvm::ARM::AK_ARMV7S:
4336 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004337 case llvm::ARM::AK_ARMV7:
4338 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004339 case llvm::ARM::AK_ARMV7L:
4340 case llvm::ARM::AK_ARMV7HL:
4341 return "7A";
4342 case llvm::ARM::AK_ARMV7R:
4343 return "7R";
4344 case llvm::ARM::AK_ARMV7M:
4345 return "7M";
4346 case llvm::ARM::AK_ARMV7EM:
4347 return "7EM";
4348 case llvm::ARM::AK_ARMV8A:
4349 return "8A";
4350 case llvm::ARM::AK_ARMV8_1A:
4351 return "8_1A";
4352 }
4353 }
4354
4355 StringRef getCPUProfile() const {
4356 switch(ArchProfile) {
4357 case llvm::ARM::PK_A:
4358 return "A";
4359 case llvm::ARM::PK_R:
4360 return "R";
4361 case llvm::ARM::PK_M:
4362 return "M";
4363 default:
4364 return "";
4365 }
4366 }
4367
Chris Lattner17df24e2008-04-21 18:56:49 +00004368public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004369 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004370 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004371 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004372 BigEndian = IsBigEndian;
4373
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004374 switch (getTriple().getOS()) {
4375 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004376 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004377 break;
4378 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004379 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004380 break;
4381 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004382
Renato Goline84b0002015-10-08 16:43:26 +00004383 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004384 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004385
Chris Lattner1a8f3942010-04-23 16:29:58 +00004386 // {} in inline assembly are neon specifiers, not assembly variant
4387 // specifiers.
4388 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004389
Eric Christopher0e261882014-12-05 01:06:59 +00004390 // FIXME: This duplicates code from the driver that sets the -target-abi
4391 // option - this code is used if -target-abi isn't passed and should
4392 // be unified in some way.
4393 if (Triple.isOSBinFormatMachO()) {
4394 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4395 // the frontend matches that.
4396 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4397 Triple.getOS() == llvm::Triple::UnknownOS ||
4398 StringRef(CPU).startswith("cortex-m")) {
4399 setABI("aapcs");
4400 } else {
4401 setABI("apcs-gnu");
4402 }
4403 } else if (Triple.isOSWindows()) {
4404 // FIXME: this is invalid for WindowsCE
4405 setABI("aapcs");
4406 } else {
4407 // Select the default based on the platform.
4408 switch (Triple.getEnvironment()) {
4409 case llvm::Triple::Android:
4410 case llvm::Triple::GNUEABI:
4411 case llvm::Triple::GNUEABIHF:
4412 setABI("aapcs-linux");
4413 break;
4414 case llvm::Triple::EABIHF:
4415 case llvm::Triple::EABI:
4416 setABI("aapcs");
4417 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004418 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004419 setABI("apcs-gnu");
4420 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004421 default:
4422 if (Triple.getOS() == llvm::Triple::NetBSD)
4423 setABI("apcs-gnu");
4424 else
4425 setABI("aapcs");
4426 break;
4427 }
4428 }
John McCall86353412010-08-21 22:46:04 +00004429
4430 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004431 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004432
Renato Golin15b86152015-07-03 16:41:13 +00004433 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004434 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004435
James Molloya7139222012-03-12 09:14:10 +00004436 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004437 // the alignment of the zero-length bitfield is greater than the member
4438 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004439 // zero length bitfield.
4440 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004441 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004442
Alp Toker4925ba72014-06-07 23:30:42 +00004443 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004444
Craig Topper3164f332014-03-11 03:39:26 +00004445 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004446 ABI = Name;
4447
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004448 // The defaults (above) are for AAPCS, check if we need to change them.
4449 //
4450 // FIXME: We need support for -meabi... we could just mangle it into the
4451 // name.
4452 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004453 setABIAPCS();
4454 return true;
4455 }
4456 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4457 setABIAAPCS();
4458 return true;
4459 }
4460 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004461 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004462
Renato Golinf5c4dec2015-05-27 13:33:00 +00004463 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004464 bool
4465 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4466 StringRef CPU,
4467 const std::vector<std::string> &FeaturesVec) const override {
4468
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004469 std::vector<const char*> TargetFeatures;
4470
4471 // get default FPU features
4472 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4473 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4474
4475 // get default Extension features
4476 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4477 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4478
4479 for (const char *Feature : TargetFeatures)
4480 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004481 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004482
Eric Christopher007b0a02015-08-28 22:32:01 +00004483 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004484 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004485
Craig Topper3164f332014-03-11 03:39:26 +00004486 bool handleTargetFeatures(std::vector<std::string> &Features,
4487 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004488 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004489 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004490 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004491 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004492 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004493 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004494 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004495
Ranjeet Singhac08e532015-06-24 23:39:25 +00004496 // This does not diagnose illegal cases like having both
4497 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4498 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004499 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004500 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004501 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004502 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004503 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004504 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004505 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004506 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004507 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004508 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004509 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004510 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004511 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004512 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004513 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004514 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004515 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004516 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004517 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004518 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004519 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004520 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004521 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004522 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004523 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004524 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004525 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004526 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004527 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004528 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004529 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004530 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004531 } else if (Feature == "+strict-align") {
4532 Unaligned = 0;
4533 } else if (Feature == "+fp16") {
4534 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004535 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004536 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004537 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004538
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004539 switch (ArchVersion) {
4540 case 6:
4541 if (ArchProfile == llvm::ARM::PK_M)
4542 LDREX = 0;
4543 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4544 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4545 else
4546 LDREX = LDREX_W;
4547 break;
4548 case 7:
4549 if (ArchProfile == llvm::ARM::PK_M)
4550 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4551 else
4552 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4553 break;
4554 case 8:
4555 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4556 }
4557
Rafael Espindolaeb265472013-08-21 21:59:03 +00004558 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4559 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4560 return false;
4561 }
4562
4563 if (FPMath == FP_Neon)
4564 Features.push_back("+neonfp");
4565 else if (FPMath == FP_VFP)
4566 Features.push_back("-neonfp");
4567
Daniel Dunbar893d4752009-12-19 04:15:38 +00004568 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004569 auto Feature =
4570 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4571 if (Feature != Features.end())
4572 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004573
Rafael Espindolaeb265472013-08-21 21:59:03 +00004574 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004575 }
4576
Craig Topper3164f332014-03-11 03:39:26 +00004577 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004578 return llvm::StringSwitch<bool>(Feature)
4579 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004580 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004581 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004582 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004583 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004584 .Case("hwdiv", HWDiv & HWDivThumb)
4585 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004586 .Default(false);
4587 }
Renato Golin15b86152015-07-03 16:41:13 +00004588
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004589 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004590 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004591 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004592
Renato Golin15b86152015-07-03 16:41:13 +00004593 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004594 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004595 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004596 CPU = Name;
4597 return true;
4598 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004599
Craig Topper3164f332014-03-11 03:39:26 +00004600 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004601
Craig Topper3164f332014-03-11 03:39:26 +00004602 void getTargetDefines(const LangOptions &Opts,
4603 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004604 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004605 Builder.defineMacro("__arm");
4606 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004607
Chris Lattnerecd49032009-03-02 22:27:17 +00004608 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004609 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004610 if (!CPUAttr.empty())
4611 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004612
4613 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004614 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004615 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004616
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004617 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004618 // ACLE 6.5.7 Crypto Extension
4619 if (Crypto)
4620 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4621 // ACLE 6.5.8 CRC32 Extension
4622 if (CRC)
4623 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4624 // ACLE 6.5.10 Numeric Maximum and Minimum
4625 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4626 // ACLE 6.5.9 Directed Rounding
4627 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004628 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004629
4630 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4631 // is not defined for the M-profile.
4632 // NOTE that the deffault profile is assumed to be 'A'
4633 if (CPUProfile.empty() || CPUProfile != "M")
4634 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4635
4636 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4637 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4638 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004639 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004640 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004641 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004642 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4643
4644 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4645 // instruction set such as ARM or Thumb.
4646 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4647
4648 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4649
4650 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004651 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004652 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004653
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004654 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004655 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004656 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004657
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004658 // ACLE 6.4.4 LDREX/STREX
4659 if (LDREX)
4660 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4661
4662 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004663 if (ArchVersion == 5 ||
4664 (ArchVersion == 6 && CPUProfile != "M") ||
4665 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004666 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4667
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004668 // ACLE 6.5.1 Hardware Floating Point
4669 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004670 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004671
Yi Konga44c4d72014-06-27 21:25:42 +00004672 // ACLE predefines.
4673 Builder.defineMacro("__ARM_ACLE", "200");
4674
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004675 // FP16 support (we currently only support IEEE format).
4676 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4677 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4678
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004679 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4680 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4681 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4682
Mike Stump9d54bd72009-04-08 02:07:04 +00004683 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004684
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004685 // FIXME: It's more complicated than this and we don't really support
4686 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004687 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004688 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004689 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004690
David Tweed8f676532012-10-25 13:33:01 +00004691 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004692 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004693 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4694 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004695 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004696 Builder.defineMacro("__ARM_PCS", "1");
4697
David Tweed8f676532012-10-25 13:33:01 +00004698 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004699 Builder.defineMacro("__ARM_PCS_VFP", "1");
4700 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004701
Daniel Dunbar893d4752009-12-19 04:15:38 +00004702 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004703 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004704
4705 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004706 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004707
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004708 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004709 Builder.defineMacro("__THUMBEL__");
4710 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004711 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004712 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004713 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004714
4715 // ACLE 6.4.9 32-bit SIMD instructions
4716 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4717 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4718
4719 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004720 if (((HWDiv & HWDivThumb) && isThumb()) ||
4721 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004722 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004723 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004724 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004725
4726 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004727 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004728
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004729 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004730 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004731 if (FPU & VFP2FPU)
4732 Builder.defineMacro("__ARM_VFPV2__");
4733 if (FPU & VFP3FPU)
4734 Builder.defineMacro("__ARM_VFPV3__");
4735 if (FPU & VFP4FPU)
4736 Builder.defineMacro("__ARM_VFPV4__");
4737 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004738
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004739 // This only gets set when Neon instructions are actually available, unlike
4740 // the VFP define, hence the soft float and arch check. This is subtly
4741 // different from gcc, we follow the intent which was that it should be set
4742 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004743 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004744 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004745 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004746 // current AArch32 NEON implementations do not support double-precision
4747 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004748 Builder.defineMacro("__ARM_NEON_FP",
4749 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004750 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004751
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004752 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4753 Opts.ShortWChar ? "2" : "4");
4754
4755 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4756 Opts.ShortEnums ? "1" : "4");
4757
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004758 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004759 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4760 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4761 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4762 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4763 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004764
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004765 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004766 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004767 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004768 }
4769
4770 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004771 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004772 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4773 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004774 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004775 }
4776
4777 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004778 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004779 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004780
4781 if (Opts.UnsafeFPMath)
4782 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004783 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004784
Craig Topper6c03a542015-10-19 04:51:35 +00004785 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4786 return llvm::makeArrayRef(BuiltinInfo,
4787 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004788 }
Craig Topper3164f332014-03-11 03:39:26 +00004789 bool isCLZForZeroUndef() const override { return false; }
4790 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004791 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004792 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004793 ArrayRef<const char *> getGCCRegNames() const override;
4794 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004795 bool validateAsmConstraint(const char *&Name,
4796 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004797 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004798 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004799 case 'l': // r0-r7
4800 case 'h': // r8-r15
4801 case 'w': // VFP Floating point register single precision
4802 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004803 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004804 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004805 case 'I':
4806 case 'J':
4807 case 'K':
4808 case 'L':
4809 case 'M':
4810 // FIXME
4811 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004812 case 'Q': // A memory address that is a single base register.
4813 Info.setAllowsMemory();
4814 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004815 case 'U': // a memory reference...
4816 switch (Name[1]) {
4817 case 'q': // ...ARMV4 ldrsb
4818 case 'v': // ...VFP load/store (reg+constant offset)
4819 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004820 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004821 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004822 case 'n': // valid address for Neon doubleword vector load/store
4823 case 'm': // valid address for Neon element and structure load/store
4824 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004825 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004826 Info.setAllowsMemory();
4827 Name++;
4828 return true;
4829 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004830 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004831 return false;
4832 }
Craig Topper3164f332014-03-11 03:39:26 +00004833 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004834 std::string R;
4835 switch (*Constraint) {
4836 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004837 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004838 Constraint++;
4839 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004840 case 'p': // 'p' should be translated to 'r' by default.
4841 R = std::string("r");
4842 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004843 default:
4844 return std::string(1, *Constraint);
4845 }
4846 return R;
4847 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004848 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004849 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004850 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004851 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004852 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004853
Bill Wendling9d1ee112012-10-25 23:28:48 +00004854 // Strip off constraint modifiers.
4855 while (Constraint[0] == '=' ||
4856 Constraint[0] == '+' ||
4857 Constraint[0] == '&')
4858 Constraint = Constraint.substr(1);
4859
4860 switch (Constraint[0]) {
4861 default: break;
4862 case 'r': {
4863 switch (Modifier) {
4864 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004865 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004866 case 'q':
4867 // A register of size 32 cannot fit a vector type.
4868 return false;
4869 }
4870 }
4871 }
4872
4873 return true;
4874 }
Craig Topper3164f332014-03-11 03:39:26 +00004875 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004876 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004877 return "";
4878 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004879
Craig Topper3164f332014-03-11 03:39:26 +00004880 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004881 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4882 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004883
Craig Topper3164f332014-03-11 03:39:26 +00004884 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004885 if (RegNo == 0) return 0;
4886 if (RegNo == 1) return 1;
4887 return -1;
4888 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004889
4890 bool hasSjLjLowering() const override {
4891 return true;
4892 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004893};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004894
Rafael Espindolaeb265472013-08-21 21:59:03 +00004895bool ARMTargetInfo::setFPMath(StringRef Name) {
4896 if (Name == "neon") {
4897 FPMath = FP_Neon;
4898 return true;
4899 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4900 Name == "vfp4") {
4901 FPMath = FP_VFP;
4902 return true;
4903 }
4904 return false;
4905}
4906
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004907const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004908 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004909 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004910 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4911
4912 // Float registers
4913 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4914 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4915 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004916 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004917
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004918 // Double registers
4919 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4920 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004921 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4922 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004923
4924 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004925 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4926 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004927};
4928
Craig Topperf054e3a2015-10-19 03:52:27 +00004929ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
4930 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004931}
4932
4933const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004934 { { "a1" }, "r0" },
4935 { { "a2" }, "r1" },
4936 { { "a3" }, "r2" },
4937 { { "a4" }, "r3" },
4938 { { "v1" }, "r4" },
4939 { { "v2" }, "r5" },
4940 { { "v3" }, "r6" },
4941 { { "v4" }, "r7" },
4942 { { "v5" }, "r8" },
4943 { { "v6", "rfp" }, "r9" },
4944 { { "sl" }, "r10" },
4945 { { "fp" }, "r11" },
4946 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004947 { { "r13" }, "sp" },
4948 { { "r14" }, "lr" },
4949 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004950 // The S, D and Q registers overlap, but aren't really aliases; we
4951 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004952};
4953
Craig Topperf054e3a2015-10-19 03:52:27 +00004954ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
4955 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004956}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004957
4958const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004959#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004960 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004961#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4962 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004963#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004964
Craig Topper07d3b622015-08-07 05:14:44 +00004965#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004966 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004967#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004968 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004969#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4970 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004971#include "clang/Basic/BuiltinsARM.def"
4972};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004973
4974class ARMleTargetInfo : public ARMTargetInfo {
4975public:
4976 ARMleTargetInfo(const llvm::Triple &Triple)
4977 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004978 void getTargetDefines(const LangOptions &Opts,
4979 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004980 Builder.defineMacro("__ARMEL__");
4981 ARMTargetInfo::getTargetDefines(Opts, Builder);
4982 }
4983};
4984
4985class ARMbeTargetInfo : public ARMTargetInfo {
4986public:
4987 ARMbeTargetInfo(const llvm::Triple &Triple)
4988 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004989 void getTargetDefines(const LangOptions &Opts,
4990 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004991 Builder.defineMacro("__ARMEB__");
4992 Builder.defineMacro("__ARM_BIG_ENDIAN");
4993 ARMTargetInfo::getTargetDefines(Opts, Builder);
4994 }
4995};
Chris Lattner17df24e2008-04-21 18:56:49 +00004996
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004997class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4998 const llvm::Triple Triple;
4999public:
5000 WindowsARMTargetInfo(const llvm::Triple &Triple)
5001 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
5002 TLSSupported = false;
5003 WCharType = UnsignedShort;
5004 SizeType = UnsignedInt;
5005 UserLabelPrefix = "";
5006 }
5007 void getVisualStudioDefines(const LangOptions &Opts,
5008 MacroBuilder &Builder) const {
5009 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5010
5011 // FIXME: this is invalid for WindowsCE
5012 Builder.defineMacro("_M_ARM_NT", "1");
5013 Builder.defineMacro("_M_ARMT", "_M_ARM");
5014 Builder.defineMacro("_M_THUMB", "_M_ARM");
5015
5016 assert((Triple.getArch() == llvm::Triple::arm ||
5017 Triple.getArch() == llvm::Triple::thumb) &&
5018 "invalid architecture for Windows ARM target info");
5019 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5020 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5021
5022 // TODO map the complete set of values
5023 // 31: VFPv3 40: VFPv4
5024 Builder.defineMacro("_M_ARM_FP", "31");
5025 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005026 BuiltinVaListKind getBuiltinVaListKind() const override {
5027 return TargetInfo::CharPtrBuiltinVaList;
5028 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005029 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5030 switch (CC) {
5031 case CC_X86StdCall:
5032 case CC_X86ThisCall:
5033 case CC_X86FastCall:
5034 case CC_X86VectorCall:
5035 return CCCR_Ignore;
5036 case CC_C:
5037 return CCCR_OK;
5038 default:
5039 return CCCR_Warning;
5040 }
5041 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005042};
5043
5044// Windows ARM + Itanium C++ ABI Target
5045class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5046public:
5047 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5048 : WindowsARMTargetInfo(Triple) {
5049 TheCXXABI.set(TargetCXXABI::GenericARM);
5050 }
5051
5052 void getTargetDefines(const LangOptions &Opts,
5053 MacroBuilder &Builder) const override {
5054 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5055
5056 if (Opts.MSVCCompat)
5057 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5058 }
5059};
5060
5061// Windows ARM, MS (C++) ABI
5062class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5063public:
5064 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5065 : WindowsARMTargetInfo(Triple) {
5066 TheCXXABI.set(TargetCXXABI::Microsoft);
5067 }
5068
5069 void getTargetDefines(const LangOptions &Opts,
5070 MacroBuilder &Builder) const override {
5071 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5072 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5073 }
5074};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005075
Yaron Keren321249c2015-07-15 13:32:23 +00005076// ARM MinGW target
5077class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5078public:
5079 MinGWARMTargetInfo(const llvm::Triple &Triple)
5080 : WindowsARMTargetInfo(Triple) {
5081 TheCXXABI.set(TargetCXXABI::GenericARM);
5082 }
5083
5084 void getTargetDefines(const LangOptions &Opts,
5085 MacroBuilder &Builder) const override {
5086 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5087 DefineStd(Builder, "WIN32", Opts);
5088 DefineStd(Builder, "WINNT", Opts);
5089 Builder.defineMacro("_ARM_");
5090 addMinGWDefines(Opts, Builder);
5091 }
5092};
5093
5094// ARM Cygwin target
5095class CygwinARMTargetInfo : public ARMleTargetInfo {
5096public:
5097 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5098 TLSSupported = false;
5099 WCharType = UnsignedShort;
5100 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005101 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005102 }
5103 void getTargetDefines(const LangOptions &Opts,
5104 MacroBuilder &Builder) const override {
5105 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5106 Builder.defineMacro("_ARM_");
5107 Builder.defineMacro("__CYGWIN__");
5108 Builder.defineMacro("__CYGWIN32__");
5109 DefineStd(Builder, "unix", Opts);
5110 if (Opts.CPlusPlus)
5111 Builder.defineMacro("_GNU_SOURCE");
5112 }
5113};
5114
Mike Stump11289f42009-09-09 15:08:12 +00005115class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005116 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005117protected:
Craig Topper3164f332014-03-11 03:39:26 +00005118 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5119 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005120 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005121 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005122
Torok Edwinb2b37c62009-06-30 17:10:35 +00005123public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005124 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005125 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005126 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005127 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005128 // FIXME: This should be based off of the target features in
5129 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005130 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005131
5132 // Darwin on iOS uses a variant of the ARM C++ ABI.
5133 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005134 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005135};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005136
Tim Northover573cbee2014-05-24 12:52:07 +00005137class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005138 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005139 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5140 static const char *const GCCRegNames[];
5141
James Molloy75f5f9e2014-04-16 15:33:48 +00005142 enum FPUModeEnum {
5143 FPUMode,
5144 NeonMode
5145 };
5146
5147 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005148 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005149 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005150 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005151
Tim Northovera2ee4332014-03-29 15:09:45 +00005152 static const Builtin::Info BuiltinInfo[];
5153
5154 std::string ABI;
5155
5156public:
Tim Northover573cbee2014-05-24 12:52:07 +00005157 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005158 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005159
5160 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5161 WCharType = SignedInt;
5162
5163 // NetBSD apparently prefers consistency across ARM targets to consistency
5164 // across 64-bit targets.
5165 Int64Type = SignedLongLong;
5166 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005167 } else {
5168 WCharType = UnsignedInt;
5169 Int64Type = SignedLong;
5170 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005171 }
5172
Tim Northovera2ee4332014-03-29 15:09:45 +00005173 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005174 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005175 MaxAtomicInlineWidth = 128;
5176 MaxAtomicPromoteWidth = 128;
5177
Tim Northovera6a19f12015-02-06 01:25:07 +00005178 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005179 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5180
Tim Northovera2ee4332014-03-29 15:09:45 +00005181 // {} in inline assembly are neon specifiers, not assembly variant
5182 // specifiers.
5183 NoAsmVariants = true;
5184
Tim Northover7ad87af2015-01-16 18:44:04 +00005185 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5186 // contributes to the alignment of the containing aggregate in the same way
5187 // a plain (non bit-field) member of that type would, without exception for
5188 // zero-sized or anonymous bit-fields."
5189 UseBitFieldTypeAlignment = true;
5190 UseZeroLengthBitfieldAlignment = true;
5191
Tim Northover573cbee2014-05-24 12:52:07 +00005192 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005193 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5194 }
5195
Alp Toker4925ba72014-06-07 23:30:42 +00005196 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005197 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005198 if (Name != "aapcs" && Name != "darwinpcs")
5199 return false;
5200
5201 ABI = Name;
5202 return true;
5203 }
5204
David Blaikie1cbb9712014-11-14 19:09:44 +00005205 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005206 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005207 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005208 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005209 .Case("cyclone", true)
5210 .Default(false);
5211 return CPUKnown;
5212 }
5213
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005214 void getTargetDefines(const LangOptions &Opts,
5215 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005216 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005217 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005218
5219 // Target properties.
5220 Builder.defineMacro("_LP64");
5221 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005222
5223 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5224 Builder.defineMacro("__ARM_ACLE", "200");
5225 Builder.defineMacro("__ARM_ARCH", "8");
5226 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5227
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005228 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005229 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005230 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005231
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005232 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5233 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5234 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5235 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005236 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005237 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5238 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005239
5240 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5241
5242 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005243 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005244
5245 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5246 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005247 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5248 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005249
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005250 if (Opts.UnsafeFPMath)
5251 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005252
5253 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5254
5255 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5256 Opts.ShortEnums ? "1" : "4");
5257
James Molloy75f5f9e2014-04-16 15:33:48 +00005258 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005259 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005260 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005261 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005262 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005263
Bradley Smith418c5932014-05-02 15:17:51 +00005264 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005265 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005266
James Molloy75f5f9e2014-04-16 15:33:48 +00005267 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005268 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5269
5270 if (Unaligned)
5271 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005272
5273 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5274 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5275 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5276 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5277 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005278 }
5279
Craig Topper6c03a542015-10-19 04:51:35 +00005280 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5281 return llvm::makeArrayRef(BuiltinInfo,
5282 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005283 }
5284
David Blaikie1cbb9712014-11-14 19:09:44 +00005285 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005286 return Feature == "aarch64" ||
5287 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005288 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005289 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005290 }
5291
James Molloy5e73df52014-04-16 15:06:20 +00005292 bool handleTargetFeatures(std::vector<std::string> &Features,
5293 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005294 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005295 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005296 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005297 Unaligned = 1;
5298
Eric Christopher610fe112015-08-26 08:21:55 +00005299 for (const auto &Feature : Features) {
5300 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005301 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005302 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005303 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005304 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005305 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005306 if (Feature == "+strict-align")
5307 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005308 }
5309
Eric Christopher964a5f32015-08-05 23:48:05 +00005310 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005311
5312 return true;
5313 }
5314
David Blaikie1cbb9712014-11-14 19:09:44 +00005315 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005316
David Blaikie1cbb9712014-11-14 19:09:44 +00005317 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005318 return TargetInfo::AArch64ABIBuiltinVaList;
5319 }
5320
Craig Topperf054e3a2015-10-19 03:52:27 +00005321 ArrayRef<const char *> getGCCRegNames() const override;
5322 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005323
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005324 bool validateAsmConstraint(const char *&Name,
5325 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005326 switch (*Name) {
5327 default:
5328 return false;
5329 case 'w': // Floating point and SIMD registers (V0-V31)
5330 Info.setAllowsRegister();
5331 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005332 case 'I': // Constant that can be used with an ADD instruction
5333 case 'J': // Constant that can be used with a SUB instruction
5334 case 'K': // Constant that can be used with a 32-bit logical instruction
5335 case 'L': // Constant that can be used with a 64-bit logical instruction
5336 case 'M': // Constant that can be used as a 32-bit MOV immediate
5337 case 'N': // Constant that can be used as a 64-bit MOV immediate
5338 case 'Y': // Floating point constant zero
5339 case 'Z': // Integer constant zero
5340 return true;
5341 case 'Q': // A memory reference with base register and no offset
5342 Info.setAllowsMemory();
5343 return true;
5344 case 'S': // A symbolic address
5345 Info.setAllowsRegister();
5346 return true;
5347 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005348 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5349 // Utf: A memory address suitable for ldp/stp in TF mode.
5350 // Usa: An absolute symbolic address.
5351 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5352 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005353 case 'z': // Zero register, wzr or xzr
5354 Info.setAllowsRegister();
5355 return true;
5356 case 'x': // Floating point and SIMD registers (V0-V15)
5357 Info.setAllowsRegister();
5358 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005359 }
5360 return false;
5361 }
5362
Akira Hatanaka987f1862014-08-22 06:05:21 +00005363 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005364 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005365 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005366 // Strip off constraint modifiers.
5367 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5368 Constraint = Constraint.substr(1);
5369
5370 switch (Constraint[0]) {
5371 default:
5372 return true;
5373 case 'z':
5374 case 'r': {
5375 switch (Modifier) {
5376 case 'x':
5377 case 'w':
5378 // For now assume that the person knows what they're
5379 // doing with the modifier.
5380 return true;
5381 default:
5382 // By default an 'r' constraint will be in the 'x'
5383 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005384 if (Size == 64)
5385 return true;
5386
5387 SuggestedModifier = "w";
5388 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005389 }
5390 }
5391 }
5392 }
5393
David Blaikie1cbb9712014-11-14 19:09:44 +00005394 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005395
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005396 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005397 if (RegNo == 0)
5398 return 0;
5399 if (RegNo == 1)
5400 return 1;
5401 return -1;
5402 }
5403};
5404
Tim Northover573cbee2014-05-24 12:52:07 +00005405const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005406 // 32-bit Integer registers
5407 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5408 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5409 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5410
5411 // 64-bit Integer registers
5412 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5413 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5414 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5415
5416 // 32-bit floating point regsisters
5417 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5418 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5419 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5420
5421 // 64-bit floating point regsisters
5422 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5423 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5424 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5425
5426 // Vector registers
5427 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5428 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5429 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5430};
5431
Craig Topperf054e3a2015-10-19 03:52:27 +00005432ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5433 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005434}
5435
Tim Northover573cbee2014-05-24 12:52:07 +00005436const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005437 { { "w31" }, "wsp" },
5438 { { "x29" }, "fp" },
5439 { { "x30" }, "lr" },
5440 { { "x31" }, "sp" },
5441 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5442 // don't want to substitute one of these for a different-sized one.
5443};
5444
Craig Topperf054e3a2015-10-19 03:52:27 +00005445ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5446 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005447}
5448
Tim Northover573cbee2014-05-24 12:52:07 +00005449const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005450#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005451 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005452#include "clang/Basic/BuiltinsNEON.def"
5453
5454#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005455 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005456#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005457};
James Molloy5e73df52014-04-16 15:06:20 +00005458
Tim Northover573cbee2014-05-24 12:52:07 +00005459class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005460 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005461 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005462 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005463 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005464 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005465 }
5466
5467public:
Tim Northover573cbee2014-05-24 12:52:07 +00005468 AArch64leTargetInfo(const llvm::Triple &Triple)
5469 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005470 BigEndian = false;
5471 }
5472 void getTargetDefines(const LangOptions &Opts,
5473 MacroBuilder &Builder) const override {
5474 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005475 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005476 }
5477};
5478
Tim Northover573cbee2014-05-24 12:52:07 +00005479class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005480 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005481 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005482 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005483 }
5484
5485public:
Tim Northover573cbee2014-05-24 12:52:07 +00005486 AArch64beTargetInfo(const llvm::Triple &Triple)
5487 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005488 void getTargetDefines(const LangOptions &Opts,
5489 MacroBuilder &Builder) const override {
5490 Builder.defineMacro("__AARCH64EB__");
5491 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5492 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005493 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005494 }
5495};
Tim Northovera2ee4332014-03-29 15:09:45 +00005496
Tim Northover573cbee2014-05-24 12:52:07 +00005497class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005498protected:
5499 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5500 MacroBuilder &Builder) const override {
5501 Builder.defineMacro("__AARCH64_SIMD__");
5502 Builder.defineMacro("__ARM64_ARCH_8__");
5503 Builder.defineMacro("__ARM_NEON__");
5504 Builder.defineMacro("__LITTLE_ENDIAN__");
5505 Builder.defineMacro("__REGISTER_PREFIX__", "");
5506 Builder.defineMacro("__arm64", "1");
5507 Builder.defineMacro("__arm64__", "1");
5508
5509 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5510 }
5511
Tim Northovera2ee4332014-03-29 15:09:45 +00005512public:
Tim Northover573cbee2014-05-24 12:52:07 +00005513 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5514 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005515 Int64Type = SignedLongLong;
5516 WCharType = SignedInt;
5517 UseSignedCharForObjCBool = false;
5518
Tim Northovera6a19f12015-02-06 01:25:07 +00005519 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005520 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5521
5522 TheCXXABI.set(TargetCXXABI::iOS64);
5523 }
5524
David Blaikie1cbb9712014-11-14 19:09:44 +00005525 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005526 return TargetInfo::CharPtrBuiltinVaList;
5527 }
5528};
Tim Northovera2ee4332014-03-29 15:09:45 +00005529
Tony Linthicum76329bf2011-12-12 21:14:55 +00005530// Hexagon abstract base class
5531class HexagonTargetInfo : public TargetInfo {
5532 static const Builtin::Info BuiltinInfo[];
5533 static const char * const GCCRegNames[];
5534 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5535 std::string CPU;
5536public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005537 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005538 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005539 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005540
5541 // {} in inline assembly are packet specifiers, not assembly variant
5542 // specifiers.
5543 NoAsmVariants = true;
5544 }
5545
Craig Topper6c03a542015-10-19 04:51:35 +00005546 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5547 return llvm::makeArrayRef(BuiltinInfo,
5548 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005549 }
5550
Craig Topper3164f332014-03-11 03:39:26 +00005551 bool validateAsmConstraint(const char *&Name,
5552 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005553 return true;
5554 }
5555
Craig Topper3164f332014-03-11 03:39:26 +00005556 void getTargetDefines(const LangOptions &Opts,
5557 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005558
Craig Topper3164f332014-03-11 03:39:26 +00005559 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005560 return Feature == "hexagon";
5561 }
Craig Topper3164f332014-03-11 03:39:26 +00005562
5563 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005564 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005565 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005566 ArrayRef<const char *> getGCCRegNames() const override;
5567 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005568 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005569 return "";
5570 }
Sebastian Pop86500282012-01-13 20:37:10 +00005571
5572 static const char *getHexagonCPUSuffix(StringRef Name) {
5573 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005574 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005575 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005576 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005577 }
5578
Craig Topper3164f332014-03-11 03:39:26 +00005579 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005580 if (!getHexagonCPUSuffix(Name))
5581 return false;
5582
Tony Linthicum76329bf2011-12-12 21:14:55 +00005583 CPU = Name;
5584 return true;
5585 }
5586};
5587
5588void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5589 MacroBuilder &Builder) const {
5590 Builder.defineMacro("qdsp6");
5591 Builder.defineMacro("__qdsp6", "1");
5592 Builder.defineMacro("__qdsp6__", "1");
5593
5594 Builder.defineMacro("hexagon");
5595 Builder.defineMacro("__hexagon", "1");
5596 Builder.defineMacro("__hexagon__", "1");
5597
5598 if(CPU == "hexagonv1") {
5599 Builder.defineMacro("__HEXAGON_V1__");
5600 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5601 if(Opts.HexagonQdsp6Compat) {
5602 Builder.defineMacro("__QDSP6_V1__");
5603 Builder.defineMacro("__QDSP6_ARCH__", "1");
5604 }
5605 }
5606 else if(CPU == "hexagonv2") {
5607 Builder.defineMacro("__HEXAGON_V2__");
5608 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5609 if(Opts.HexagonQdsp6Compat) {
5610 Builder.defineMacro("__QDSP6_V2__");
5611 Builder.defineMacro("__QDSP6_ARCH__", "2");
5612 }
5613 }
5614 else if(CPU == "hexagonv3") {
5615 Builder.defineMacro("__HEXAGON_V3__");
5616 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5617 if(Opts.HexagonQdsp6Compat) {
5618 Builder.defineMacro("__QDSP6_V3__");
5619 Builder.defineMacro("__QDSP6_ARCH__", "3");
5620 }
5621 }
5622 else if(CPU == "hexagonv4") {
5623 Builder.defineMacro("__HEXAGON_V4__");
5624 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5625 if(Opts.HexagonQdsp6Compat) {
5626 Builder.defineMacro("__QDSP6_V4__");
5627 Builder.defineMacro("__QDSP6_ARCH__", "4");
5628 }
5629 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005630 else if(CPU == "hexagonv5") {
5631 Builder.defineMacro("__HEXAGON_V5__");
5632 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5633 if(Opts.HexagonQdsp6Compat) {
5634 Builder.defineMacro("__QDSP6_V5__");
5635 Builder.defineMacro("__QDSP6_ARCH__", "5");
5636 }
5637 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005638}
5639
5640const char * const HexagonTargetInfo::GCCRegNames[] = {
5641 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5642 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5643 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5644 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5645 "p0", "p1", "p2", "p3",
5646 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5647};
5648
Craig Topperf054e3a2015-10-19 03:52:27 +00005649ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const {
5650 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005651}
5652
5653
5654const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5655 { { "sp" }, "r29" },
5656 { { "fp" }, "r30" },
5657 { { "lr" }, "r31" },
5658 };
5659
Craig Topperf054e3a2015-10-19 03:52:27 +00005660ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5661 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005662}
5663
5664
5665const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005666#define BUILTIN(ID, TYPE, ATTRS) \
5667 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5668#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5669 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005670#include "clang/Basic/BuiltinsHexagon.def"
5671};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005672
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005673// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5674class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005675 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5676 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005677 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005678public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005679 SparcTargetInfo(const llvm::Triple &Triple)
5680 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005681
Craig Topper3164f332014-03-11 03:39:26 +00005682 bool handleTargetFeatures(std::vector<std::string> &Features,
5683 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005684 // The backend doesn't actually handle soft float yet, but in case someone
5685 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005686 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5687 if (Feature != Features.end()) {
5688 SoftFloat = true;
5689 Features.erase(Feature);
5690 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005691 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005692 }
Craig Topper3164f332014-03-11 03:39:26 +00005693 void getTargetDefines(const LangOptions &Opts,
5694 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005695 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005696 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005697
5698 if (SoftFloat)
5699 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005700 }
Craig Topper3164f332014-03-11 03:39:26 +00005701
5702 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005703 return llvm::StringSwitch<bool>(Feature)
5704 .Case("softfloat", SoftFloat)
5705 .Case("sparc", true)
5706 .Default(false);
5707 }
Craig Topper3164f332014-03-11 03:39:26 +00005708
Craig Topper6c03a542015-10-19 04:51:35 +00005709 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005710 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005711 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005712 }
Craig Topper3164f332014-03-11 03:39:26 +00005713 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005714 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005715 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005716 ArrayRef<const char *> getGCCRegNames() const override;
5717 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005718 bool validateAsmConstraint(const char *&Name,
5719 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005720 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005721 switch (*Name) {
5722 case 'I': // Signed 13-bit constant
5723 case 'J': // Zero
5724 case 'K': // 32-bit constant with the low 12 bits clear
5725 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5726 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5727 case 'N': // Same as 'K' but zext (required for SIMode)
5728 case 'O': // The constant 4096
5729 return true;
5730 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005731 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005732 }
Craig Topper3164f332014-03-11 03:39:26 +00005733 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005734 // FIXME: Implement!
5735 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005736 }
5737};
5738
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005739const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005740 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5741 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5742 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5743 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5744};
5745
Craig Topperf054e3a2015-10-19 03:52:27 +00005746ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
5747 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00005748}
5749
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005750const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005751 { { "g0" }, "r0" },
5752 { { "g1" }, "r1" },
5753 { { "g2" }, "r2" },
5754 { { "g3" }, "r3" },
5755 { { "g4" }, "r4" },
5756 { { "g5" }, "r5" },
5757 { { "g6" }, "r6" },
5758 { { "g7" }, "r7" },
5759 { { "o0" }, "r8" },
5760 { { "o1" }, "r9" },
5761 { { "o2" }, "r10" },
5762 { { "o3" }, "r11" },
5763 { { "o4" }, "r12" },
5764 { { "o5" }, "r13" },
5765 { { "o6", "sp" }, "r14" },
5766 { { "o7" }, "r15" },
5767 { { "l0" }, "r16" },
5768 { { "l1" }, "r17" },
5769 { { "l2" }, "r18" },
5770 { { "l3" }, "r19" },
5771 { { "l4" }, "r20" },
5772 { { "l5" }, "r21" },
5773 { { "l6" }, "r22" },
5774 { { "l7" }, "r23" },
5775 { { "i0" }, "r24" },
5776 { { "i1" }, "r25" },
5777 { { "i2" }, "r26" },
5778 { { "i3" }, "r27" },
5779 { { "i4" }, "r28" },
5780 { { "i5" }, "r29" },
5781 { { "i6", "fp" }, "r30" },
5782 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005783};
5784
Craig Topperf054e3a2015-10-19 03:52:27 +00005785ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
5786 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00005787}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005788
5789// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5790class SparcV8TargetInfo : public SparcTargetInfo {
5791public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005792 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005793 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005794 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5795 switch (getTriple().getOS()) {
5796 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005797 SizeType = UnsignedInt;
5798 IntPtrType = SignedInt;
5799 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005800 break;
5801 case llvm::Triple::NetBSD:
5802 case llvm::Triple::OpenBSD:
5803 SizeType = UnsignedLong;
5804 IntPtrType = SignedLong;
5805 PtrDiffType = SignedLong;
5806 break;
Brad Smith56495d52015-08-13 22:00:53 +00005807 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005808 }
5809
Craig Topper3164f332014-03-11 03:39:26 +00005810 void getTargetDefines(const LangOptions &Opts,
5811 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005812 SparcTargetInfo::getTargetDefines(Opts, Builder);
5813 Builder.defineMacro("__sparcv8");
5814 }
5815};
5816
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005817// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5818class SparcV8elTargetInfo : public SparcV8TargetInfo {
5819 public:
5820 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005821 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005822 BigEndian = false;
5823 }
5824};
5825
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005826// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5827class SparcV9TargetInfo : public SparcTargetInfo {
5828public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005829 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005830 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005831 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005832 // This is an LP64 platform.
5833 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005834
5835 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005836 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005837 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005838 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005839 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005840 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005841
5842 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5843 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5844 LongDoubleWidth = 128;
5845 LongDoubleAlign = 128;
5846 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005847 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005848 }
5849
Craig Topper3164f332014-03-11 03:39:26 +00005850 void getTargetDefines(const LangOptions &Opts,
5851 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005852 SparcTargetInfo::getTargetDefines(Opts, Builder);
5853 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005854 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005855 // Solaris doesn't need these variants, but the BSDs do.
5856 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005857 Builder.defineMacro("__sparc64__");
5858 Builder.defineMacro("__sparc_v9__");
5859 Builder.defineMacro("__sparcv9__");
5860 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005861 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005862
Craig Topper3164f332014-03-11 03:39:26 +00005863 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005864 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5865 .Case("v9", true)
5866 .Case("ultrasparc", true)
5867 .Case("ultrasparc3", true)
5868 .Case("niagara", true)
5869 .Case("niagara2", true)
5870 .Case("niagara3", true)
5871 .Case("niagara4", true)
5872 .Default(false);
5873
5874 // No need to store the CPU yet. There aren't any CPU-specific
5875 // macros to define.
5876 return CPUKnown;
5877 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005878};
5879
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005880class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005881 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005882 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005883 std::string CPU;
5884 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005885 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005886
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005887public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005888 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00005889 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
5890 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005891 IntMaxType = SignedLong;
5892 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005893 TLSSupported = true;
5894 IntWidth = IntAlign = 32;
5895 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5896 PointerWidth = PointerAlign = 64;
5897 LongDoubleWidth = 128;
5898 LongDoubleAlign = 64;
5899 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005900 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005901 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005902 DataLayoutString = "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 +00005903 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5904 }
5905 void getTargetDefines(const LangOptions &Opts,
5906 MacroBuilder &Builder) const override {
5907 Builder.defineMacro("__s390__");
5908 Builder.defineMacro("__s390x__");
5909 Builder.defineMacro("__zarch__");
5910 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005911 if (HasTransactionalExecution)
5912 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005913 if (Opts.ZVector)
5914 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005915 }
Craig Topper6c03a542015-10-19 04:51:35 +00005916 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5917 return llvm::makeArrayRef(BuiltinInfo,
5918 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00005919 }
5920
Craig Topperf054e3a2015-10-19 03:52:27 +00005921 ArrayRef<const char *> getGCCRegNames() const override;
5922 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005923 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00005924 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00005925 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005926 bool validateAsmConstraint(const char *&Name,
5927 TargetInfo::ConstraintInfo &info) const override;
5928 const char *getClobbers() const override {
5929 // FIXME: Is this really right?
5930 return "";
5931 }
5932 BuiltinVaListKind getBuiltinVaListKind() const override {
5933 return TargetInfo::SystemZBuiltinVaList;
5934 }
5935 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005936 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005937 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5938 .Case("z10", true)
5939 .Case("z196", true)
5940 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005941 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005942 .Default(false);
5943
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005944 return CPUKnown;
5945 }
Eric Christopher8c47b422015-10-09 18:39:55 +00005946 bool
5947 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5948 StringRef CPU,
5949 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005950 if (CPU == "zEC12")
5951 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005952 if (CPU == "z13") {
5953 Features["transactional-execution"] = true;
5954 Features["vector"] = true;
5955 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005956 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005957 }
5958
5959 bool handleTargetFeatures(std::vector<std::string> &Features,
5960 DiagnosticsEngine &Diags) override {
5961 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005962 for (const auto &Feature : Features) {
5963 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005964 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005965 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005966 HasVector = true;
5967 }
5968 // If we use the vector ABI, vector types are 64-bit aligned.
5969 if (HasVector) {
5970 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005971 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5972 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005973 }
5974 return true;
5975 }
5976
5977 bool hasFeature(StringRef Feature) const override {
5978 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005979 .Case("systemz", true)
5980 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005981 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005982 .Default(false);
5983 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005984
5985 StringRef getABI() const override {
5986 if (HasVector)
5987 return "vector";
5988 return "";
5989 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005990
5991 bool useFloat128ManglingForLongDouble() const override {
5992 return true;
5993 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005994};
5995
5996const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5997#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005998 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005999#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006000};
6001
6002const char *const SystemZTargetInfo::GCCRegNames[] = {
6003 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6004 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6005 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6006 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6007};
6008
Craig Topperf054e3a2015-10-19 03:52:27 +00006009ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6010 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006011}
6012
6013bool SystemZTargetInfo::
6014validateAsmConstraint(const char *&Name,
6015 TargetInfo::ConstraintInfo &Info) const {
6016 switch (*Name) {
6017 default:
6018 return false;
6019
6020 case 'a': // Address register
6021 case 'd': // Data register (equivalent to 'r')
6022 case 'f': // Floating-point register
6023 Info.setAllowsRegister();
6024 return true;
6025
6026 case 'I': // Unsigned 8-bit constant
6027 case 'J': // Unsigned 12-bit constant
6028 case 'K': // Signed 16-bit constant
6029 case 'L': // Signed 20-bit displacement (on all targets we support)
6030 case 'M': // 0x7fffffff
6031 return true;
6032
6033 case 'Q': // Memory with base and unsigned 12-bit displacement
6034 case 'R': // Likewise, plus an index
6035 case 'S': // Memory with base and signed 20-bit displacement
6036 case 'T': // Likewise, plus an index
6037 Info.setAllowsMemory();
6038 return true;
6039 }
6040}
Ulrich Weigand47445072013-05-06 16:26:41 +00006041
Eric Christopherc48497a2015-09-18 21:26:24 +00006042class MSP430TargetInfo : public TargetInfo {
6043 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006044
Eric Christopherc48497a2015-09-18 21:26:24 +00006045public:
6046 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6047 BigEndian = false;
6048 TLSSupported = false;
6049 IntWidth = 16;
6050 IntAlign = 16;
6051 LongWidth = 32;
6052 LongLongWidth = 64;
6053 LongAlign = LongLongAlign = 16;
6054 PointerWidth = 16;
6055 PointerAlign = 16;
6056 SuitableAlign = 16;
6057 SizeType = UnsignedInt;
6058 IntMaxType = SignedLongLong;
6059 IntPtrType = SignedInt;
6060 PtrDiffType = SignedInt;
6061 SigAtomicType = SignedLong;
6062 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006063 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006064 void getTargetDefines(const LangOptions &Opts,
6065 MacroBuilder &Builder) const override {
6066 Builder.defineMacro("MSP430");
6067 Builder.defineMacro("__MSP430__");
6068 // FIXME: defines for different 'flavours' of MCU
6069 }
Craig Topper6c03a542015-10-19 04:51:35 +00006070 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006071 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006072 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006073 }
6074 bool hasFeature(StringRef Feature) const override {
6075 return Feature == "msp430";
6076 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006077 ArrayRef<const char *> getGCCRegNames() const override;
6078 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006079 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006080 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006081 }
6082 bool validateAsmConstraint(const char *&Name,
6083 TargetInfo::ConstraintInfo &info) const override {
6084 // FIXME: implement
6085 switch (*Name) {
6086 case 'K': // the constant 1
6087 case 'L': // constant -1^20 .. 1^19
6088 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006089 return true;
6090 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006091 // No target constraints for now.
6092 return false;
6093 }
6094 const char *getClobbers() const override {
6095 // FIXME: Is this really right?
6096 return "";
6097 }
6098 BuiltinVaListKind getBuiltinVaListKind() const override {
6099 // FIXME: implement
6100 return TargetInfo::CharPtrBuiltinVaList;
6101 }
6102};
6103
6104const char *const MSP430TargetInfo::GCCRegNames[] = {
6105 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6106 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6107
Craig Topperf054e3a2015-10-19 03:52:27 +00006108ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6109 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006110}
6111
6112// LLVM and Clang cannot be used directly to output native binaries for
6113// target, but is used to compile C code to llvm bitcode with correct
6114// type and alignment information.
6115//
6116// TCE uses the llvm bitcode as input and uses it for generating customized
6117// target processor and program binary. TCE co-design environment is
6118// publicly available in http://tce.cs.tut.fi
6119
6120static const unsigned TCEOpenCLAddrSpaceMap[] = {
6121 3, // opencl_global
6122 4, // opencl_local
6123 5, // opencl_constant
6124 // FIXME: generic has to be added to the target
6125 0, // opencl_generic
6126 0, // cuda_device
6127 0, // cuda_constant
6128 0 // cuda_shared
6129};
6130
6131class TCETargetInfo : public TargetInfo {
6132public:
6133 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6134 TLSSupported = false;
6135 IntWidth = 32;
6136 LongWidth = LongLongWidth = 32;
6137 PointerWidth = 32;
6138 IntAlign = 32;
6139 LongAlign = LongLongAlign = 32;
6140 PointerAlign = 32;
6141 SuitableAlign = 32;
6142 SizeType = UnsignedInt;
6143 IntMaxType = SignedLong;
6144 IntPtrType = SignedInt;
6145 PtrDiffType = SignedInt;
6146 FloatWidth = 32;
6147 FloatAlign = 32;
6148 DoubleWidth = 32;
6149 DoubleAlign = 32;
6150 LongDoubleWidth = 32;
6151 LongDoubleAlign = 32;
6152 FloatFormat = &llvm::APFloat::IEEEsingle;
6153 DoubleFormat = &llvm::APFloat::IEEEsingle;
6154 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6155 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6156 "-f64:32-v64:32-v128:32-a:0:32-n32";
6157 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6158 UseAddrSpaceMapMangling = true;
6159 }
6160
6161 void getTargetDefines(const LangOptions &Opts,
6162 MacroBuilder &Builder) const override {
6163 DefineStd(Builder, "tce", Opts);
6164 Builder.defineMacro("__TCE__");
6165 Builder.defineMacro("__TCE_V1__");
6166 }
6167 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6168
Craig Topper6c03a542015-10-19 04:51:35 +00006169 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006170 const char *getClobbers() const override { return ""; }
6171 BuiltinVaListKind getBuiltinVaListKind() const override {
6172 return TargetInfo::VoidPtrBuiltinVaList;
6173 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006174 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006175 bool validateAsmConstraint(const char *&Name,
6176 TargetInfo::ConstraintInfo &info) const override {
6177 return true;
6178 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006179 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6180 return None;
6181 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006182};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006183
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006184class BPFTargetInfo : public TargetInfo {
6185public:
6186 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6187 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6188 SizeType = UnsignedLong;
6189 PtrDiffType = SignedLong;
6190 IntPtrType = SignedLong;
6191 IntMaxType = SignedLong;
6192 Int64Type = SignedLong;
6193 RegParmMax = 5;
6194 if (Triple.getArch() == llvm::Triple::bpfeb) {
6195 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006196 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006197 } else {
6198 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006199 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006200 }
6201 MaxAtomicPromoteWidth = 64;
6202 MaxAtomicInlineWidth = 64;
6203 TLSSupported = false;
6204 }
6205 void getTargetDefines(const LangOptions &Opts,
6206 MacroBuilder &Builder) const override {
6207 DefineStd(Builder, "bpf", Opts);
6208 Builder.defineMacro("__BPF__");
6209 }
6210 bool hasFeature(StringRef Feature) const override {
6211 return Feature == "bpf";
6212 }
6213
Craig Topper6c03a542015-10-19 04:51:35 +00006214 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006215 const char *getClobbers() const override {
6216 return "";
6217 }
6218 BuiltinVaListKind getBuiltinVaListKind() const override {
6219 return TargetInfo::VoidPtrBuiltinVaList;
6220 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006221 ArrayRef<const char *> getGCCRegNames() const override {
6222 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006223 }
6224 bool validateAsmConstraint(const char *&Name,
6225 TargetInfo::ConstraintInfo &info) const override {
6226 return true;
6227 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006228 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6229 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006230 }
6231};
6232
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006233class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006234 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006235
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006236 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006237 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006238 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006239 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006240 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006241 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006242 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006243 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006244 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006245 enum DspRevEnum {
6246 NoDSP, DSP1, DSP2
6247 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006248 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006249
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006250protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006251 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006252 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006253
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006254public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006255 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6256 const std::string &CPUStr)
6257 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006258 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006259 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6260 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6261 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006262
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006263 bool isNaN2008Default() const {
6264 return CPU == "mips32r6" || CPU == "mips64r6";
6265 }
6266
6267 bool isFP64Default() const {
6268 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6269 }
6270
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006271 bool isNan2008() const override {
6272 return IsNan2008;
6273 }
6274
Alp Toker4925ba72014-06-07 23:30:42 +00006275 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006276 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006277 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6278 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006279 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006280 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006281 .Case("mips1", IsMips32)
6282 .Case("mips2", IsMips32)
6283 .Case("mips3", true)
6284 .Case("mips4", true)
6285 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006286 .Case("mips32", IsMips32)
6287 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006288 .Case("mips32r3", IsMips32)
6289 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006290 .Case("mips32r6", IsMips32)
6291 .Case("mips64", true)
6292 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006293 .Case("mips64r3", true)
6294 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006295 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006296 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006297 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006298 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006299 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006300 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006301 bool
6302 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6303 StringRef CPU,
6304 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006305 if (CPU == "octeon")
6306 Features["mips64r2"] = Features["cnmips"] = true;
6307 else
6308 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006309 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006310 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006311
Craig Topper3164f332014-03-11 03:39:26 +00006312 void getTargetDefines(const LangOptions &Opts,
6313 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006314 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006315 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006316 if (Opts.GNUMode)
6317 Builder.defineMacro("mips");
6318
Simon Atanasyan683535b2012-08-29 19:14:58 +00006319 Builder.defineMacro("__REGISTER_PREFIX__", "");
6320
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006321 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006322 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006323 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006324 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006325 case SoftFloat:
6326 Builder.defineMacro("__mips_soft_float", Twine(1));
6327 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006328 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006329
Simon Atanasyan16071912013-04-14 14:07:30 +00006330 if (IsSingleFloat)
6331 Builder.defineMacro("__mips_single_float", Twine(1));
6332
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006333 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6334 Builder.defineMacro("_MIPS_FPSET",
6335 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6336
Simon Atanasyan72244b62012-07-05 16:06:06 +00006337 if (IsMips16)
6338 Builder.defineMacro("__mips16", Twine(1));
6339
Simon Atanasyan60777612013-04-14 14:07:51 +00006340 if (IsMicromips)
6341 Builder.defineMacro("__mips_micromips", Twine(1));
6342
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006343 if (IsNan2008)
6344 Builder.defineMacro("__mips_nan2008", Twine(1));
6345
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006346 switch (DspRev) {
6347 default:
6348 break;
6349 case DSP1:
6350 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6351 Builder.defineMacro("__mips_dsp", Twine(1));
6352 break;
6353 case DSP2:
6354 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6355 Builder.defineMacro("__mips_dspr2", Twine(1));
6356 Builder.defineMacro("__mips_dsp", Twine(1));
6357 break;
6358 }
6359
Jack Carter44ff1e52013-08-12 17:20:29 +00006360 if (HasMSA)
6361 Builder.defineMacro("__mips_msa", Twine(1));
6362
Simon Atanasyan26f19672012-04-05 19:28:31 +00006363 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6364 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6365 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006366
6367 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6368 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006369 }
6370
Craig Topper6c03a542015-10-19 04:51:35 +00006371 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6372 return llvm::makeArrayRef(BuiltinInfo,
6373 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006374 }
Craig Topper3164f332014-03-11 03:39:26 +00006375 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006376 return llvm::StringSwitch<bool>(Feature)
6377 .Case("mips", true)
6378 .Case("fp64", HasFP64)
6379 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006380 }
Craig Topper3164f332014-03-11 03:39:26 +00006381 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006382 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006383 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006384 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006385 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006386 // CPU register names
6387 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006388 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6389 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6390 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006391 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6392 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006393 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6394 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6395 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6396 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006397 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006398 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006399 "$fcc5","$fcc6","$fcc7",
6400 // MSA register names
6401 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6402 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6403 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6404 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6405 // MSA control register names
6406 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6407 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006408 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006409 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006410 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006411 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006412 bool validateAsmConstraint(const char *&Name,
6413 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006414 switch (*Name) {
6415 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006416 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006417 case 'r': // CPU registers.
6418 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006419 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006420 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006421 case 'c': // $25 for indirect jumps
6422 case 'l': // lo register
6423 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006424 Info.setAllowsRegister();
6425 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006426 case 'I': // Signed 16-bit constant
6427 case 'J': // Integer 0
6428 case 'K': // Unsigned 16-bit constant
6429 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6430 case 'M': // Constants not loadable via lui, addiu, or ori
6431 case 'N': // Constant -1 to -65535
6432 case 'O': // A signed 15-bit constant
6433 case 'P': // A constant between 1 go 65535
6434 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006435 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006436 Info.setAllowsMemory();
6437 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006438 case 'Z':
6439 if (Name[1] == 'C') { // An address usable by ll, and sc.
6440 Info.setAllowsMemory();
6441 Name++; // Skip over 'Z'.
6442 return true;
6443 }
6444 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006445 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006446 }
6447
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006448 std::string convertConstraint(const char *&Constraint) const override {
6449 std::string R;
6450 switch (*Constraint) {
6451 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6452 if (Constraint[1] == 'C') {
6453 R = std::string("^") + std::string(Constraint, 2);
6454 Constraint++;
6455 return R;
6456 }
6457 break;
6458 }
6459 return TargetInfo::convertConstraint(Constraint);
6460 }
6461
Craig Topper3164f332014-03-11 03:39:26 +00006462 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006463 // In GCC, $1 is not widely used in generated code (it's used only in a few
6464 // specific situations), so there is no real need for users to add it to
6465 // the clobbers list if they want to use it in their inline assembly code.
6466 //
6467 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6468 // code generation, so using it in inline assembly without adding it to the
6469 // clobbers list can cause conflicts between the inline assembly code and
6470 // the surrounding generated code.
6471 //
6472 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6473 // operands, which will conflict with the ".set at" assembler option (which
6474 // we use only for inline assembly, in order to maintain compatibility with
6475 // GCC) and will also conflict with the user's usage of $1.
6476 //
6477 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6478 // register for generated code is to automatically clobber $1 for all inline
6479 // assembly code.
6480 //
6481 // FIXME: We should automatically clobber $1 only for inline assembly code
6482 // which actually uses it. This would allow LLVM to use $1 for inline
6483 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006484 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006485 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006486
Craig Topper3164f332014-03-11 03:39:26 +00006487 bool handleTargetFeatures(std::vector<std::string> &Features,
6488 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006489 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006490 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006491 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006492 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006493 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006494 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006495 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006496
Eric Christopher610fe112015-08-26 08:21:55 +00006497 for (const auto &Feature : Features) {
6498 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006499 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006500 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006501 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006502 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006503 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006504 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006505 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006506 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006507 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006508 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006509 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006510 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006511 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006512 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006513 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006514 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006515 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006516 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006517 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006518 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006519 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006520 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006521
Eric Christopher964a5f32015-08-05 23:48:05 +00006522 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006523
Rafael Espindolaeb265472013-08-21 21:59:03 +00006524 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006525 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006526
Craig Topper3164f332014-03-11 03:39:26 +00006527 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006528 if (RegNo == 0) return 4;
6529 if (RegNo == 1) return 5;
6530 return -1;
6531 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006532
6533 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006534};
6535
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006536const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006537#define BUILTIN(ID, TYPE, ATTRS) \
6538 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6539#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6540 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006541#include "clang/Basic/BuiltinsMips.def"
6542};
6543
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006544class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006545public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006546 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006547 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006548 SizeType = UnsignedInt;
6549 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006550 Int64Type = SignedLongLong;
6551 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006552 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006553 }
Craig Topper3164f332014-03-11 03:39:26 +00006554 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006555 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006556 ABI = Name;
6557 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006558 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006559 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006560 }
Craig Topper3164f332014-03-11 03:39:26 +00006561 void getTargetDefines(const LangOptions &Opts,
6562 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006563 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006564
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006565 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006566 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6567
6568 const std::string& CPUStr = getCPU();
6569 if (CPUStr == "mips32")
6570 Builder.defineMacro("__mips_isa_rev", "1");
6571 else if (CPUStr == "mips32r2")
6572 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006573 else if (CPUStr == "mips32r3")
6574 Builder.defineMacro("__mips_isa_rev", "3");
6575 else if (CPUStr == "mips32r5")
6576 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006577 else if (CPUStr == "mips32r6")
6578 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006579
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006580 if (ABI == "o32") {
6581 Builder.defineMacro("__mips_o32");
6582 Builder.defineMacro("_ABIO32", "1");
6583 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6584 }
6585 else if (ABI == "eabi")
6586 Builder.defineMacro("__mips_eabi");
6587 else
David Blaikie83d382b2011-09-23 05:06:16 +00006588 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006589 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006590 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006591 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6592 { { "at" }, "$1" },
6593 { { "v0" }, "$2" },
6594 { { "v1" }, "$3" },
6595 { { "a0" }, "$4" },
6596 { { "a1" }, "$5" },
6597 { { "a2" }, "$6" },
6598 { { "a3" }, "$7" },
6599 { { "t0" }, "$8" },
6600 { { "t1" }, "$9" },
6601 { { "t2" }, "$10" },
6602 { { "t3" }, "$11" },
6603 { { "t4" }, "$12" },
6604 { { "t5" }, "$13" },
6605 { { "t6" }, "$14" },
6606 { { "t7" }, "$15" },
6607 { { "s0" }, "$16" },
6608 { { "s1" }, "$17" },
6609 { { "s2" }, "$18" },
6610 { { "s3" }, "$19" },
6611 { { "s4" }, "$20" },
6612 { { "s5" }, "$21" },
6613 { { "s6" }, "$22" },
6614 { { "s7" }, "$23" },
6615 { { "t8" }, "$24" },
6616 { { "t9" }, "$25" },
6617 { { "k0" }, "$26" },
6618 { { "k1" }, "$27" },
6619 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006620 { { "sp","$sp" }, "$29" },
6621 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006622 { { "ra" }, "$31" }
6623 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006624 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006625 }
6626};
6627
6628class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006629 void setDataLayoutString() override {
6630 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006631 }
6632
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006633public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006634 Mips32EBTargetInfo(const llvm::Triple &Triple)
6635 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006636 }
Craig Topper3164f332014-03-11 03:39:26 +00006637 void getTargetDefines(const LangOptions &Opts,
6638 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006639 DefineStd(Builder, "MIPSEB", Opts);
6640 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006641 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006642 }
6643};
6644
6645class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006646 void setDataLayoutString() override {
6647 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006648 }
6649
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006650public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006651 Mips32ELTargetInfo(const llvm::Triple &Triple)
6652 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006653 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006654 }
Craig Topper3164f332014-03-11 03:39:26 +00006655 void getTargetDefines(const LangOptions &Opts,
6656 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006657 DefineStd(Builder, "MIPSEL", Opts);
6658 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006659 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006660 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006661};
Akira Hatanakabef17452011-09-20 19:21:49 +00006662
6663class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006664public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006665 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006666 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006667 LongDoubleWidth = LongDoubleAlign = 128;
6668 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006669 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6670 LongDoubleWidth = LongDoubleAlign = 64;
6671 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6672 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006673 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006674 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006675 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006676 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006677
6678 void setN64ABITypes() {
6679 LongWidth = LongAlign = 64;
6680 PointerWidth = PointerAlign = 64;
6681 SizeType = UnsignedLong;
6682 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006683 Int64Type = SignedLong;
6684 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006685 }
6686
6687 void setN32ABITypes() {
6688 LongWidth = LongAlign = 32;
6689 PointerWidth = PointerAlign = 32;
6690 SizeType = UnsignedInt;
6691 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006692 Int64Type = SignedLongLong;
6693 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006694 }
6695
Craig Topper3164f332014-03-11 03:39:26 +00006696 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006697 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006698 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006699 ABI = Name;
6700 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006701 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006702 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006703 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006704 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006705 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006706 }
6707 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006708 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006709
Craig Topper3164f332014-03-11 03:39:26 +00006710 void getTargetDefines(const LangOptions &Opts,
6711 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006712 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006713
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006714 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006715 Builder.defineMacro("__mips64");
6716 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006717 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6718
6719 const std::string& CPUStr = getCPU();
6720 if (CPUStr == "mips64")
6721 Builder.defineMacro("__mips_isa_rev", "1");
6722 else if (CPUStr == "mips64r2")
6723 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006724 else if (CPUStr == "mips64r3")
6725 Builder.defineMacro("__mips_isa_rev", "3");
6726 else if (CPUStr == "mips64r5")
6727 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006728 else if (CPUStr == "mips64r6")
6729 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006730
Akira Hatanakabef17452011-09-20 19:21:49 +00006731 if (ABI == "n32") {
6732 Builder.defineMacro("__mips_n32");
6733 Builder.defineMacro("_ABIN32", "2");
6734 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6735 }
6736 else if (ABI == "n64") {
6737 Builder.defineMacro("__mips_n64");
6738 Builder.defineMacro("_ABI64", "3");
6739 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6740 }
6741 else
David Blaikie83d382b2011-09-23 05:06:16 +00006742 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006743 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006744 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006745 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6746 { { "at" }, "$1" },
6747 { { "v0" }, "$2" },
6748 { { "v1" }, "$3" },
6749 { { "a0" }, "$4" },
6750 { { "a1" }, "$5" },
6751 { { "a2" }, "$6" },
6752 { { "a3" }, "$7" },
6753 { { "a4" }, "$8" },
6754 { { "a5" }, "$9" },
6755 { { "a6" }, "$10" },
6756 { { "a7" }, "$11" },
6757 { { "t0" }, "$12" },
6758 { { "t1" }, "$13" },
6759 { { "t2" }, "$14" },
6760 { { "t3" }, "$15" },
6761 { { "s0" }, "$16" },
6762 { { "s1" }, "$17" },
6763 { { "s2" }, "$18" },
6764 { { "s3" }, "$19" },
6765 { { "s4" }, "$20" },
6766 { { "s5" }, "$21" },
6767 { { "s6" }, "$22" },
6768 { { "s7" }, "$23" },
6769 { { "t8" }, "$24" },
6770 { { "t9" }, "$25" },
6771 { { "k0" }, "$26" },
6772 { { "k1" }, "$27" },
6773 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006774 { { "sp","$sp" }, "$29" },
6775 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006776 { { "ra" }, "$31" }
6777 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006778 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00006779 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006780
6781 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006782};
6783
6784class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006785 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006786 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006787 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006788 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006789 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006790
Akira Hatanakabef17452011-09-20 19:21:49 +00006791 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006792
Akira Hatanakabef17452011-09-20 19:21:49 +00006793public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006794 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006795 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006796 void getTargetDefines(const LangOptions &Opts,
6797 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006798 DefineStd(Builder, "MIPSEB", Opts);
6799 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006800 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006801 }
6802};
6803
6804class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006805 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006806 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006807 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006808 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006809 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006810 }
6811public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 Mips64ELTargetInfo(const llvm::Triple &Triple)
6813 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006814 // Default ABI is n64.
6815 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006816 }
Craig Topper3164f332014-03-11 03:39:26 +00006817 void getTargetDefines(const LangOptions &Opts,
6818 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006819 DefineStd(Builder, "MIPSEL", Opts);
6820 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006821 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006822 }
6823};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006824
Ivan Krasindd7403e2011-08-24 20:22:22 +00006825class PNaClTargetInfo : public TargetInfo {
6826public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006827 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006828 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006829 this->UserLabelPrefix = "";
6830 this->LongAlign = 32;
6831 this->LongWidth = 32;
6832 this->PointerAlign = 32;
6833 this->PointerWidth = 32;
6834 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006835 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006836 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006837 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006838 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006839 this->SizeType = TargetInfo::UnsignedInt;
6840 this->PtrDiffType = TargetInfo::SignedInt;
6841 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006842 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006843 }
6844
Craig Toppere6f17d02014-03-11 04:07:52 +00006845 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006846 Builder.defineMacro("__le32__");
6847 Builder.defineMacro("__pnacl__");
6848 }
Craig Topper3164f332014-03-11 03:39:26 +00006849 void getTargetDefines(const LangOptions &Opts,
6850 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006851 getArchDefines(Opts, Builder);
6852 }
Craig Topper3164f332014-03-11 03:39:26 +00006853 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006854 return Feature == "pnacl";
6855 }
Craig Topper6c03a542015-10-19 04:51:35 +00006856 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00006857 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006858 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006859 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006860 ArrayRef<const char *> getGCCRegNames() const override;
6861 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006862 bool validateAsmConstraint(const char *&Name,
6863 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006864 return false;
6865 }
6866
Craig Topper3164f332014-03-11 03:39:26 +00006867 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006868 return "";
6869 }
6870};
6871
Craig Topperf054e3a2015-10-19 03:52:27 +00006872ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
6873 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006874}
6875
Craig Topperf054e3a2015-10-19 03:52:27 +00006876ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
6877 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006878}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006879
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006880// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6881class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6882public:
6883 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006884 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006885 }
6886
6887 BuiltinVaListKind getBuiltinVaListKind() const override {
6888 return TargetInfo::PNaClABIBuiltinVaList;
6889 }
6890};
6891
JF Bastien643817d2014-09-12 17:52:47 +00006892class Le64TargetInfo : public TargetInfo {
6893 static const Builtin::Info BuiltinInfo[];
6894
6895public:
6896 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6897 BigEndian = false;
6898 NoAsmVariants = true;
6899 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6900 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006901 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006902 }
6903
6904 void getTargetDefines(const LangOptions &Opts,
6905 MacroBuilder &Builder) const override {
6906 DefineStd(Builder, "unix", Opts);
6907 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6908 Builder.defineMacro("__ELF__");
6909 }
Craig Topper6c03a542015-10-19 04:51:35 +00006910 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6911 return llvm::makeArrayRef(BuiltinInfo,
6912 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00006913 }
6914 BuiltinVaListKind getBuiltinVaListKind() const override {
6915 return TargetInfo::PNaClABIBuiltinVaList;
6916 }
6917 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00006918 ArrayRef<const char *> getGCCRegNames() const override {
6919 return None;
JF Bastien643817d2014-09-12 17:52:47 +00006920 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006921 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6922 return None;
JF Bastien643817d2014-09-12 17:52:47 +00006923 }
6924 bool validateAsmConstraint(const char *&Name,
6925 TargetInfo::ConstraintInfo &Info) const override {
6926 return false;
6927 }
6928
6929 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006930};
Dan Gohmanc2853072015-09-03 22:51:53 +00006931
6932class WebAssemblyTargetInfo : public TargetInfo {
6933 static const Builtin::Info BuiltinInfo[];
6934
6935 enum SIMDEnum {
6936 NoSIMD,
6937 SIMD128,
6938 } SIMDLevel;
6939
6940public:
6941 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6942 : TargetInfo(T), SIMDLevel(NoSIMD) {
6943 BigEndian = false;
6944 NoAsmVariants = true;
6945 SuitableAlign = 128;
6946 LargeArrayMinWidth = 128;
6947 LargeArrayAlign = 128;
6948 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006949 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006950 }
6951
6952protected:
6953 void getTargetDefines(const LangOptions &Opts,
6954 MacroBuilder &Builder) const override {
6955 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6956 if (SIMDLevel >= SIMD128)
6957 Builder.defineMacro("__wasm_simd128__");
6958 }
6959
6960private:
Eric Christopher8c47b422015-10-09 18:39:55 +00006961 bool
6962 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6963 StringRef CPU,
6964 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00006965 if (CPU == "bleeding-edge")
6966 Features["simd128"] = true;
6967 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6968 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00006969 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006970 return llvm::StringSwitch<bool>(Feature)
6971 .Case("simd128", SIMDLevel >= SIMD128)
6972 .Default(false);
6973 }
6974 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00006975 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006976 for (const auto &Feature : Features) {
6977 if (Feature == "+simd128") {
6978 SIMDLevel = std::max(SIMDLevel, SIMD128);
6979 continue;
6980 }
6981 if (Feature == "-simd128") {
6982 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
6983 continue;
6984 }
6985
6986 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
6987 << "-target-feature";
6988 return false;
6989 }
6990 return true;
6991 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00006992 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006993 return llvm::StringSwitch<bool>(Name)
6994 .Case("mvp", true)
6995 .Case("bleeding-edge", true)
6996 .Case("generic", true)
6997 .Default(false);
6998 }
Craig Topper6c03a542015-10-19 04:51:35 +00006999 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7000 return llvm::makeArrayRef(BuiltinInfo,
7001 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007002 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007003 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007004 // TODO: Implement va_list properly.
7005 return VoidPtrBuiltinVaList;
7006 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007007 ArrayRef<const char *> getGCCRegNames() const final {
7008 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007009 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007010 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7011 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007012 }
7013 bool
7014 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007015 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007016 return false;
7017 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007018 const char *getClobbers() const final { return ""; }
7019 bool isCLZForZeroUndef() const final { return false; }
7020 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007021 IntType getIntTypeByWidth(unsigned BitWidth,
7022 bool IsSigned) const final {
7023 // WebAssembly prefers long long for explicitly 64-bit integers.
7024 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7025 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7026 }
7027 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7028 bool IsSigned) const final {
7029 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7030 return BitWidth == 64
7031 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7032 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7033 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007034};
7035
7036const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7037#define BUILTIN(ID, TYPE, ATTRS) \
7038 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7039#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7040 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7041#include "clang/Basic/BuiltinsWebAssembly.def"
7042};
7043
7044class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7045public:
7046 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7047 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007048 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007049 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7050 }
7051
7052protected:
7053 void getTargetDefines(const LangOptions &Opts,
7054 MacroBuilder &Builder) const override {
7055 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7056 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7057 }
7058};
7059
7060class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7061public:
7062 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7063 : WebAssemblyTargetInfo(T) {
7064 LongAlign = LongWidth = 64;
7065 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007066 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007067 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7068 }
7069
7070protected:
7071 void getTargetDefines(const LangOptions &Opts,
7072 MacroBuilder &Builder) const override {
7073 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7074 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7075 }
7076};
7077
JF Bastien643817d2014-09-12 17:52:47 +00007078const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7079#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007080 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007081#include "clang/Basic/BuiltinsLe64.def"
7082};
7083
Eric Christopherc48497a2015-09-18 21:26:24 +00007084static const unsigned SPIRAddrSpaceMap[] = {
7085 1, // opencl_global
7086 3, // opencl_local
7087 2, // opencl_constant
7088 4, // opencl_generic
7089 0, // cuda_device
7090 0, // cuda_constant
7091 0 // cuda_shared
7092};
7093class SPIRTargetInfo : public TargetInfo {
7094public:
7095 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7096 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7097 "SPIR target must use unknown OS");
7098 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7099 "SPIR target must use unknown environment type");
7100 BigEndian = false;
7101 TLSSupported = false;
7102 LongWidth = LongAlign = 64;
7103 AddrSpaceMap = &SPIRAddrSpaceMap;
7104 UseAddrSpaceMapMangling = true;
7105 // Define available target features
7106 // These must be defined in sorted order!
7107 NoAsmVariants = true;
7108 }
7109 void getTargetDefines(const LangOptions &Opts,
7110 MacroBuilder &Builder) const override {
7111 DefineStd(Builder, "SPIR", Opts);
7112 }
7113 bool hasFeature(StringRef Feature) const override {
7114 return Feature == "spir";
7115 }
Craig Topper3164f332014-03-11 03:39:26 +00007116
Craig Topper6c03a542015-10-19 04:51:35 +00007117 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007118 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007119 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007120 bool validateAsmConstraint(const char *&Name,
7121 TargetInfo::ConstraintInfo &info) const override {
7122 return true;
7123 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007124 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7125 return None;
7126 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007127 BuiltinVaListKind getBuiltinVaListKind() const override {
7128 return TargetInfo::VoidPtrBuiltinVaList;
7129 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007130
Eric Christopherc48497a2015-09-18 21:26:24 +00007131 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7132 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7133 : CCCR_Warning;
7134 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007135
Eric Christopherc48497a2015-09-18 21:26:24 +00007136 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7137 return CC_SpirFunction;
7138 }
7139};
Guy Benyeib798fc92012-12-11 21:38:14 +00007140
Eric Christopherc48497a2015-09-18 21:26:24 +00007141class SPIR32TargetInfo : public SPIRTargetInfo {
7142public:
7143 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7144 PointerWidth = PointerAlign = 32;
7145 SizeType = TargetInfo::UnsignedInt;
7146 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7147 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7148 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7149 }
7150 void getTargetDefines(const LangOptions &Opts,
7151 MacroBuilder &Builder) const override {
7152 DefineStd(Builder, "SPIR32", Opts);
7153 }
7154};
Guy Benyeib798fc92012-12-11 21:38:14 +00007155
Eric Christopherc48497a2015-09-18 21:26:24 +00007156class SPIR64TargetInfo : public SPIRTargetInfo {
7157public:
7158 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7159 PointerWidth = PointerAlign = 64;
7160 SizeType = TargetInfo::UnsignedLong;
7161 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7162 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7163 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7164 }
7165 void getTargetDefines(const LangOptions &Opts,
7166 MacroBuilder &Builder) const override {
7167 DefineStd(Builder, "SPIR64", Opts);
7168 }
7169};
Guy Benyeib798fc92012-12-11 21:38:14 +00007170
Robert Lytton0e076492013-08-13 09:43:10 +00007171class XCoreTargetInfo : public TargetInfo {
7172 static const Builtin::Info BuiltinInfo[];
7173public:
7174 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7175 BigEndian = false;
7176 NoAsmVariants = true;
7177 LongLongAlign = 32;
7178 SuitableAlign = 32;
7179 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007180 SizeType = UnsignedInt;
7181 PtrDiffType = SignedInt;
7182 IntPtrType = SignedInt;
7183 WCharType = UnsignedChar;
7184 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007185 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007186 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7187 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007188 }
Craig Topper3164f332014-03-11 03:39:26 +00007189 void getTargetDefines(const LangOptions &Opts,
7190 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007191 Builder.defineMacro("__XS1B__");
7192 }
Craig Topper6c03a542015-10-19 04:51:35 +00007193 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7194 return llvm::makeArrayRef(BuiltinInfo,
7195 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007196 }
Craig Topper3164f332014-03-11 03:39:26 +00007197 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007198 return TargetInfo::VoidPtrBuiltinVaList;
7199 }
Craig Topper3164f332014-03-11 03:39:26 +00007200 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007201 return "";
7202 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007203 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007204 static const char * const GCCRegNames[] = {
7205 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7206 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7207 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007208 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007209 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007210 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7211 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007212 }
Craig Topper3164f332014-03-11 03:39:26 +00007213 bool validateAsmConstraint(const char *&Name,
7214 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007215 return false;
7216 }
Craig Topper3164f332014-03-11 03:39:26 +00007217 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007218 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7219 return (RegNo < 2)? RegNo : -1;
7220 }
Robert Lytton0e076492013-08-13 09:43:10 +00007221};
7222
7223const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007224#define BUILTIN(ID, TYPE, ATTRS) \
7225 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7226#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7227 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007228#include "clang/Basic/BuiltinsXCore.def"
7229};
Robert Lytton0e076492013-08-13 09:43:10 +00007230
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007231// x86_32 Android target
7232class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7233public:
7234 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7235 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7236 SuitableAlign = 32;
7237 LongDoubleWidth = 64;
7238 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7239 }
7240};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007241
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007242// x86_64 Android target
7243class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7244public:
7245 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7246 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7247 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7248 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007249
7250 bool useFloat128ManglingForLongDouble() const override {
7251 return true;
7252 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007253};
7254} // end anonymous namespace
7255
Chris Lattner5ba61f02006-10-14 07:39:34 +00007256//===----------------------------------------------------------------------===//
7257// Driver code
7258//===----------------------------------------------------------------------===//
7259
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007260static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007261 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007262
Daniel Dunbar52322032009-08-18 05:47:58 +00007263 switch (Triple.getArch()) {
7264 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007265 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007266
Tim Northover2a0783d2014-05-30 14:14:07 +00007267 case llvm::Triple::xcore:
7268 return new XCoreTargetInfo(Triple);
7269
7270 case llvm::Triple::hexagon:
7271 return new HexagonTargetInfo(Triple);
7272
7273 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007274 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007275 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007276
7277 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007278 case llvm::Triple::CloudABI:
7279 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007280 case llvm::Triple::FreeBSD:
7281 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007282 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007283 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007284 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007285 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007286 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007287 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007288 }
7289
Christian Pirker9b019ae2014-02-25 13:51:00 +00007290 case llvm::Triple::aarch64_be:
7291 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007292 case llvm::Triple::FreeBSD:
7293 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007294 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007295 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007296 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007297 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007298 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007299 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007300 }
7301
Daniel Dunbar52322032009-08-18 05:47:58 +00007302 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007303 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007304 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007305 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007306
Daniel Dunbar52322032009-08-18 05:47:58 +00007307 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007308 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007309 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007310 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007311 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007312 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007313 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007314 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007315 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007316 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007317 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007318 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007319 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007320 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007321 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007322 case llvm::Triple::Win32:
7323 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007324 case llvm::Triple::Cygnus:
7325 return new CygwinARMTargetInfo(Triple);
7326 case llvm::Triple::GNU:
7327 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007328 case llvm::Triple::Itanium:
7329 return new ItaniumWindowsARMleTargetInfo(Triple);
7330 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007331 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007332 return new MicrosoftARMleTargetInfo(Triple);
7333 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007334 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007335 return new ARMleTargetInfo(Triple);
7336 }
7337
7338 case llvm::Triple::armeb:
7339 case llvm::Triple::thumbeb:
7340 if (Triple.isOSDarwin())
7341 return new DarwinARMTargetInfo(Triple);
7342
7343 switch (os) {
7344 case llvm::Triple::Linux:
7345 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7346 case llvm::Triple::FreeBSD:
7347 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7348 case llvm::Triple::NetBSD:
7349 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7350 case llvm::Triple::OpenBSD:
7351 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7352 case llvm::Triple::Bitrig:
7353 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7354 case llvm::Triple::RTEMS:
7355 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7356 case llvm::Triple::NaCl:
7357 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7358 default:
7359 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007360 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007361
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007362 case llvm::Triple::bpfeb:
7363 case llvm::Triple::bpfel:
7364 return new BPFTargetInfo(Triple);
7365
Daniel Dunbar52322032009-08-18 05:47:58 +00007366 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007367 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007368
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007369 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007370 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007371 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007372 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007373 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007374 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007375 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007376 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007377 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007378 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007379 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007380 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007381 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007382
7383 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007384 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007385 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007386 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007387 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007388 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007389 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007390 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007391 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007392 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007393 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007394 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007395 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007396 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007397 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007398
Akira Hatanakabef17452011-09-20 19:21:49 +00007399 case llvm::Triple::mips64:
7400 switch (os) {
7401 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007402 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007403 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007404 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007405 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007406 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007407 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007408 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007409 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007410 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007411 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007412 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007413 }
7414
7415 case llvm::Triple::mips64el:
7416 switch (os) {
7417 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007418 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007419 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007420 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007421 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007422 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007423 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007424 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007425 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007426 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007427 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007428 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007429 }
7430
Ivan Krasindd7403e2011-08-24 20:22:22 +00007431 case llvm::Triple::le32:
7432 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007433 case llvm::Triple::NaCl:
7434 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7435 default:
7436 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007437 }
7438
JF Bastien643817d2014-09-12 17:52:47 +00007439 case llvm::Triple::le64:
7440 return new Le64TargetInfo(Triple);
7441
Daniel Dunbar52322032009-08-18 05:47:58 +00007442 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007443 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007444 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007445 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007446 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007447 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007448 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007450 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007452 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007453 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007454 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007455 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007456 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007457 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007458 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007459
7460 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007461 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007462 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007463 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007464 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007465 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007466 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007467 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007468 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007469 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007470 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007471 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007472 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007473 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007474 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007475
Bill Schmidt778d3872013-07-26 01:36:11 +00007476 case llvm::Triple::ppc64le:
7477 switch (os) {
7478 case llvm::Triple::Linux:
7479 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007480 case llvm::Triple::NetBSD:
7481 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007482 default:
7483 return new PPC64TargetInfo(Triple);
7484 }
7485
Peter Collingbournec947aae2012-05-20 23:28:41 +00007486 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007487 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007488 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007489 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007490
Tom Stellardd8e38a32015-01-06 20:34:47 +00007491 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007492 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007493 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007494
Daniel Dunbar52322032009-08-18 05:47:58 +00007495 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007496 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007497 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007498 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007499 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007500 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007501 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007502 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007503 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007504 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007505 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007506 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007507 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007508 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007509 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007510
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007511 // The 'sparcel' architecture copies all the above cases except for Solaris.
7512 case llvm::Triple::sparcel:
7513 switch (os) {
7514 case llvm::Triple::Linux:
7515 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7516 case llvm::Triple::NetBSD:
7517 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7518 case llvm::Triple::OpenBSD:
7519 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7520 case llvm::Triple::RTEMS:
7521 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7522 default:
7523 return new SparcV8elTargetInfo(Triple);
7524 }
7525
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007526 case llvm::Triple::sparcv9:
7527 switch (os) {
7528 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007529 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007530 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007531 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007532 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007533 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007534 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007535 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007536 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007537 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007538 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007539 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007540 }
7541
Ulrich Weigand47445072013-05-06 16:26:41 +00007542 case llvm::Triple::systemz:
7543 switch (os) {
7544 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007545 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007546 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007547 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007548 }
7549
Eli Friedmana9c3d712009-08-19 20:47:07 +00007550 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007551 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007552
Daniel Dunbar52322032009-08-18 05:47:58 +00007553 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007554 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007555 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007556
Daniel Dunbar52322032009-08-18 05:47:58 +00007557 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007558 case llvm::Triple::CloudABI:
7559 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007560 case llvm::Triple::Linux: {
7561 switch (Triple.getEnvironment()) {
7562 default:
7563 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7564 case llvm::Triple::Android:
7565 return new AndroidX86_32TargetInfo(Triple);
7566 }
7567 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007568 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007569 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007570 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007571 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007572 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007573 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007574 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007575 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007576 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007578 case llvm::Triple::KFreeBSD:
7579 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007580 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007581 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007582 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007583 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007584 case llvm::Triple::Win32: {
7585 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007586 case llvm::Triple::Cygnus:
7587 return new CygwinX86_32TargetInfo(Triple);
7588 case llvm::Triple::GNU:
7589 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007590 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007591 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007592 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007593 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007594 }
7595 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007596 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007597 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007598 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007599 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007600 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007601 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007602 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007603 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007604 }
7605
7606 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007607 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007608 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007609
Daniel Dunbar52322032009-08-18 05:47:58 +00007610 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007611 case llvm::Triple::CloudABI:
7612 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007613 case llvm::Triple::Linux: {
7614 switch (Triple.getEnvironment()) {
7615 default:
7616 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7617 case llvm::Triple::Android:
7618 return new AndroidX86_64TargetInfo(Triple);
7619 }
7620 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007621 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007622 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007623 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007624 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007625 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007626 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007627 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007628 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007629 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007630 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007631 case llvm::Triple::KFreeBSD:
7632 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007633 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007634 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007635 case llvm::Triple::Win32: {
7636 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007637 case llvm::Triple::Cygnus:
7638 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007639 case llvm::Triple::GNU:
7640 return new MinGWX86_64TargetInfo(Triple);
7641 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007642 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007643 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007644 }
7645 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007646 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007647 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007648 case llvm::Triple::PS4:
7649 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007650 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007651 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007652 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007653
Douglas Katzman78d7c542015-05-12 21:18:10 +00007654 case llvm::Triple::spir: {
7655 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7656 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7657 return nullptr;
7658 return new SPIR32TargetInfo(Triple);
7659 }
7660 case llvm::Triple::spir64: {
7661 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7662 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7663 return nullptr;
7664 return new SPIR64TargetInfo(Triple);
7665 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007666 case llvm::Triple::wasm32:
7667 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7668 return nullptr;
7669 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7670 case llvm::Triple::wasm64:
7671 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7672 return nullptr;
7673 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007674 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007675}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007676
7677/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007678/// options.
Alp Toker80758082014-07-06 05:26:44 +00007679TargetInfo *
7680TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7681 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007682 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007683
7684 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007685 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007686 if (!Target) {
7687 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007688 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007689 }
Alp Toker80758082014-07-06 05:26:44 +00007690 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007691
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007692 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007693 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7694 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007695 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007696 }
7697
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007698 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007699 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7700 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007701 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007702 }
7703
Rafael Espindolaeb265472013-08-21 21:59:03 +00007704 // Set the fp math unit.
7705 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7706 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007707 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007708 }
7709
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007710 // Compute the default target features, we need the target to handle this
7711 // because features may have dependencies on one another.
7712 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007713 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7714 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007715 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007716
7717 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007718 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007719 for (const auto &F : Features)
7720 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7721
Eric Christopher3ff21b32013-10-16 21:26:26 +00007722 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007723 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007724
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007725 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007726}