blob: 132864fa8df8ee47367ccf5f98cc7c20ece83ae6 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068//===----------------------------------------------------------------------===//
69// Defines specific to certain operating systems.
70//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000071
Torok Edwinb2b37c62009-06-30 17:10:35 +000072namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000073template<typename TgtInfo>
74class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000075protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000076 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000077 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000079 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000080 void getTargetDefines(const LangOptions &Opts,
81 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 TgtInfo::getTargetDefines(Opts, Builder);
83 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000084 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000085
86};
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Eric Christopher7d0c7252015-09-24 21:17:04 +000088// CloudABI Target
89template <typename Target>
90class CloudABITargetInfo : public OSTargetInfo<Target> {
91protected:
92 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
93 MacroBuilder &Builder) const override {
94 Builder.defineMacro("__CloudABI__");
95 Builder.defineMacro("__ELF__");
96
97 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
98 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
99 Builder.defineMacro("__STDC_UTF_16__");
100 Builder.defineMacro("__STDC_UTF_32__");
101 }
102
103public:
104 CloudABITargetInfo(const llvm::Triple &Triple)
105 : OSTargetInfo<Target>(Triple) {
106 this->UserLabelPrefix = "";
107 }
108};
109
Daniel Dunbard86666f2010-01-26 01:44:04 +0000110static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000111 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000112 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000114 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000117 // AddressSanitizer doesn't play well with source fortification, which is on
118 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000119 if (Opts.Sanitize.has(SanitizerKind::Address))
120 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000121
John McCall460ce582015-10-22 18:38:17 +0000122 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
123 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000124 // __weak is always defined, for use in blocks and with objc pointers.
125 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000126 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000127 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000128 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000129
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000130 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000131 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000134
135 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000136 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137
Daniel Dunbarecf13562011-04-19 21:40:34 +0000138 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000140 if (Triple.isMacOSX()) {
141 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000143 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 Triple.getOSVersion(Maj, Min, Rev);
145 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000146 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000147
Sebastian Pop422377c2012-01-20 22:01:23 +0000148 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000149 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000150 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
151 if (PlatformName == "win32") {
152 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
153 return;
154 }
155
Evan Cheng31dd9a62014-01-26 23:12:43 +0000156 // Set the appropriate OS version define.
157 if (Triple.isiOS()) {
158 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
159 char Str[6];
160 Str[0] = '0' + Maj;
161 Str[1] = '0' + (Min / 10);
162 Str[2] = '0' + (Min % 10);
163 Str[3] = '0' + (Rev / 10);
164 Str[4] = '0' + (Rev % 10);
165 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000166 if (Triple.isTvOS())
167 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
168 else
169 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
170 Str);
171
172 } else if (Triple.isWatchOS()) {
173 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
174 char Str[6];
175 Str[0] = '0' + Maj;
176 Str[1] = '0' + (Min / 10);
177 Str[2] = '0' + (Min % 10);
178 Str[3] = '0' + (Rev / 10);
179 Str[4] = '0' + (Rev % 10);
180 Str[5] = '\0';
181 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000182 } else if (Triple.isMacOSX()) {
183 // Note that the Driver allows versions which aren't representable in the
184 // define (because we only get a single digit for the minor and micro
185 // revision numbers). So, we limit them to the maximum representable
186 // version.
187 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000188 char Str[7];
189 if (Maj < 10 || (Maj == 10 && Min < 10)) {
190 Str[0] = '0' + (Maj / 10);
191 Str[1] = '0' + (Maj % 10);
192 Str[2] = '0' + std::min(Min, 9U);
193 Str[3] = '0' + std::min(Rev, 9U);
194 Str[4] = '\0';
195 } else {
196 // Handle versions > 10.9.
197 Str[0] = '0' + (Maj / 10);
198 Str[1] = '0' + (Maj % 10);
199 Str[2] = '0' + (Min / 10);
200 Str[3] = '0' + (Min % 10);
201 Str[4] = '0' + (Rev / 10);
202 Str[5] = '0' + (Rev % 10);
203 Str[6] = '\0';
204 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000205 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000206 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000207
Tim Northover157d9112014-01-16 08:48:16 +0000208 // Tell users about the kernel if there is one.
209 if (Triple.isOSDarwin())
210 Builder.defineMacro("__MACH__");
211
Daniel Dunbarecf13562011-04-19 21:40:34 +0000212 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000213}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000214
Torok Edwinb2b37c62009-06-30 17:10:35 +0000215template<typename Target>
216class DarwinTargetInfo : public OSTargetInfo<Target> {
217protected:
Craig Topper3164f332014-03-11 03:39:26 +0000218 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
219 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000220 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000221 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222 }
Mike Stump11289f42009-09-09 15:08:12 +0000223
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000225 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
226 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
227 this->MCountName = "\01mcount";
228 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000229
Craig Topper3164f332014-03-11 03:39:26 +0000230 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000232 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000233 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000234 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000235 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000236 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000237 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000238
Craig Topper3164f332014-03-11 03:39:26 +0000239 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000240 // FIXME: We should return 0 when building kexts.
241 return "__TEXT,__StaticInit,regular,pure_instructions";
242 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000243
John McCalleed64c72012-01-29 01:20:30 +0000244 /// Darwin does not support protected visibility. Darwin's "default"
245 /// is very similar to ELF's "protected"; Darwin requires a "weak"
246 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000247 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000248 return false;
249 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000250};
251
Chris Lattner30ba6742009-08-10 19:03:04 +0000252
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253// DragonFlyBSD Target
254template<typename Target>
255class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
256protected:
Craig Topper3164f332014-03-11 03:39:26 +0000257 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
258 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000260 Builder.defineMacro("__DragonFly__");
261 Builder.defineMacro("__DragonFly_cc_version", "100001");
262 Builder.defineMacro("__ELF__");
263 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
264 Builder.defineMacro("__tune_i386__");
265 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266 }
267public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000268 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
269 : OSTargetInfo<Target>(Triple) {
270 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000271
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000272 switch (Triple.getArch()) {
273 default:
274 case llvm::Triple::x86:
275 case llvm::Triple::x86_64:
276 this->MCountName = ".mcount";
277 break;
278 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000279 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000280};
281
282// FreeBSD Target
283template<typename Target>
284class FreeBSDTargetInfo : public OSTargetInfo<Target> {
285protected:
Craig Topper3164f332014-03-11 03:39:26 +0000286 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
287 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000288 // FreeBSD defines; list based off of gcc output
289
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000290 unsigned Release = Triple.getOSMajorVersion();
291 if (Release == 0U)
292 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000293
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000294 Builder.defineMacro("__FreeBSD__", Twine(Release));
295 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000296 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
297 DefineStd(Builder, "unix", Opts);
298 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000299
300 // On FreeBSD, wchar_t contains the number of the code point as
301 // used by the character set of the locale. These character sets are
302 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000303 //
304 // FIXME: This is wrong; the macro refers to the numerical values
305 // of wchar_t *literals*, which are not locale-dependent. However,
306 // FreeBSD systems apparently depend on us getting this wrong, and
307 // setting this to 1 is conforming even if all the basic source
308 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000309 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000312 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
313 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000314
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000315 switch (Triple.getArch()) {
316 default:
317 case llvm::Triple::x86:
318 case llvm::Triple::x86_64:
319 this->MCountName = ".mcount";
320 break;
321 case llvm::Triple::mips:
322 case llvm::Triple::mipsel:
323 case llvm::Triple::ppc:
324 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000325 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 this->MCountName = "_mcount";
327 break;
328 case llvm::Triple::arm:
329 this->MCountName = "__mcount";
330 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000331 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000332 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000333};
334
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000335// GNU/kFreeBSD Target
336template<typename Target>
337class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
338protected:
Craig Topper3164f332014-03-11 03:39:26 +0000339 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
340 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000341 // GNU/kFreeBSD defines; list based off of gcc output
342
343 DefineStd(Builder, "unix", Opts);
344 Builder.defineMacro("__FreeBSD_kernel__");
345 Builder.defineMacro("__GLIBC__");
346 Builder.defineMacro("__ELF__");
347 if (Opts.POSIXThreads)
348 Builder.defineMacro("_REENTRANT");
349 if (Opts.CPlusPlus)
350 Builder.defineMacro("_GNU_SOURCE");
351 }
352public:
Eric Christopher917e9522014-11-18 22:36:15 +0000353 KFreeBSDTargetInfo(const llvm::Triple &Triple)
354 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000355 this->UserLabelPrefix = "";
356 }
357};
358
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359// Minix Target
360template<typename Target>
361class MinixTargetInfo : public OSTargetInfo<Target> {
362protected:
Craig Topper3164f332014-03-11 03:39:26 +0000363 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
364 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000365 // Minix defines
366
367 Builder.defineMacro("__minix", "3");
368 Builder.defineMacro("_EM_WSIZE", "4");
369 Builder.defineMacro("_EM_PSIZE", "4");
370 Builder.defineMacro("_EM_SSIZE", "2");
371 Builder.defineMacro("_EM_LSIZE", "4");
372 Builder.defineMacro("_EM_FSIZE", "4");
373 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000374 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375 DefineStd(Builder, "unix", Opts);
376 }
377public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000378 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
379 this->UserLabelPrefix = "";
380 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000381};
382
Torok Edwinb2b37c62009-06-30 17:10:35 +0000383// Linux target
384template<typename Target>
385class LinuxTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000389 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000390 DefineStd(Builder, "unix", Opts);
391 DefineStd(Builder, "linux", Opts);
392 Builder.defineMacro("__gnu_linux__");
393 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000394 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000395 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000396 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000397 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000398 this->PlatformName = "android";
399 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
400 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000401 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000402 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000403 if (Opts.CPlusPlus)
404 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000405 }
406public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000407 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000408 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000409 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000410
411 switch (Triple.getArch()) {
412 default:
413 break;
414 case llvm::Triple::ppc:
415 case llvm::Triple::ppc64:
416 case llvm::Triple::ppc64le:
417 this->MCountName = "_mcount";
418 break;
419 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000420 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000421
Craig Topper3164f332014-03-11 03:39:26 +0000422 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000423 return ".text.startup";
424 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425};
426
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000427// NetBSD Target
428template<typename Target>
429class NetBSDTargetInfo : public OSTargetInfo<Target> {
430protected:
Craig Topper3164f332014-03-11 03:39:26 +0000431 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
432 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000433 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000434 Builder.defineMacro("__NetBSD__");
435 Builder.defineMacro("__unix__");
436 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000437 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000438 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000439
440 switch (Triple.getArch()) {
441 default:
442 break;
443 case llvm::Triple::arm:
444 case llvm::Triple::armeb:
445 case llvm::Triple::thumb:
446 case llvm::Triple::thumbeb:
447 Builder.defineMacro("__ARM_DWARF_EH__");
448 break;
449 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000450 }
451public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000452 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
453 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000454 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000455 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000456};
457
Torok Edwinb2b37c62009-06-30 17:10:35 +0000458// OpenBSD Target
459template<typename Target>
460class OpenBSDTargetInfo : public OSTargetInfo<Target> {
461protected:
Craig Topper3164f332014-03-11 03:39:26 +0000462 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
463 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000464 // OpenBSD defines; list based off of gcc output
465
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000466 Builder.defineMacro("__OpenBSD__");
467 DefineStd(Builder, "unix", Opts);
468 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000470 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000471 }
472public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000473 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
474 this->UserLabelPrefix = "";
475 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000476
Eli Friedman3715d1f2011-12-15 02:15:56 +0000477 switch (Triple.getArch()) {
478 default:
479 case llvm::Triple::x86:
480 case llvm::Triple::x86_64:
481 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000482 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000483 this->MCountName = "__mcount";
484 break;
485 case llvm::Triple::mips64:
486 case llvm::Triple::mips64el:
487 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000488 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000489 this->MCountName = "_mcount";
490 break;
491 }
492 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000493};
494
Eli Friedman9fa28852012-08-08 23:57:20 +0000495// Bitrig Target
496template<typename Target>
497class BitrigTargetInfo : public OSTargetInfo<Target> {
498protected:
Craig Topper3164f332014-03-11 03:39:26 +0000499 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
500 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000501 // Bitrig defines; list based off of gcc output
502
503 Builder.defineMacro("__Bitrig__");
504 DefineStd(Builder, "unix", Opts);
505 Builder.defineMacro("__ELF__");
506 if (Opts.POSIXThreads)
507 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000508
509 switch (Triple.getArch()) {
510 default:
511 break;
512 case llvm::Triple::arm:
513 case llvm::Triple::armeb:
514 case llvm::Triple::thumb:
515 case llvm::Triple::thumbeb:
516 Builder.defineMacro("__ARM_DWARF_EH__");
517 break;
518 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000519 }
520public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000521 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
522 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000523 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000524 }
525};
526
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000527// PSP Target
528template<typename Target>
529class PSPTargetInfo : public OSTargetInfo<Target> {
530protected:
Craig Topper3164f332014-03-11 03:39:26 +0000531 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
532 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000534 Builder.defineMacro("PSP");
535 Builder.defineMacro("_PSP");
536 Builder.defineMacro("__psp__");
537 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000538 }
539public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000540 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000541 this->UserLabelPrefix = "";
542 }
543};
544
John Thompsone467e192009-11-19 17:18:50 +0000545// PS3 PPU Target
546template<typename Target>
547class PS3PPUTargetInfo : public OSTargetInfo<Target> {
548protected:
Craig Topper3164f332014-03-11 03:39:26 +0000549 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
550 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000551 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000552 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000553 Builder.defineMacro("__PPU__");
554 Builder.defineMacro("__CELLOS_LV2__");
555 Builder.defineMacro("__ELF__");
556 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000557 Builder.defineMacro("_ARCH_PPC64");
558 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000559 }
560public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000561 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000562 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000563 this->LongWidth = this->LongAlign = 32;
564 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000565 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000566 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000567 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000568 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000569 }
570};
571
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000572template <typename Target>
573class PS4OSTargetInfo : public OSTargetInfo<Target> {
574protected:
575 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
576 MacroBuilder &Builder) const override {
577 Builder.defineMacro("__FreeBSD__", "9");
578 Builder.defineMacro("__FreeBSD_cc_version", "900001");
579 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
580 DefineStd(Builder, "unix", Opts);
581 Builder.defineMacro("__ELF__");
582 Builder.defineMacro("__PS4__");
583 }
584public:
585 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
586 this->WCharType = this->UnsignedShort;
587
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000588 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
589 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000590 this->UserLabelPrefix = "";
591
592 switch (Triple.getArch()) {
593 default:
594 case llvm::Triple::x86_64:
595 this->MCountName = ".mcount";
596 break;
597 }
598 }
599};
600
Torok Edwinb2b37c62009-06-30 17:10:35 +0000601// Solaris target
602template<typename Target>
603class SolarisTargetInfo : public OSTargetInfo<Target> {
604protected:
Craig Topper3164f332014-03-11 03:39:26 +0000605 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
606 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000607 DefineStd(Builder, "sun", Opts);
608 DefineStd(Builder, "unix", Opts);
609 Builder.defineMacro("__ELF__");
610 Builder.defineMacro("__svr4__");
611 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000612 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
613 // newer, but to 500 for everything else. feature_test.h has a check to
614 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000615 // with a new version.
616 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_XOPEN_SOURCE", "600");
618 else
619 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000620 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000621 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000622 Builder.defineMacro("_LARGEFILE_SOURCE");
623 Builder.defineMacro("_LARGEFILE64_SOURCE");
624 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000625 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000626 }
627public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000628 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000629 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000630 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000631 // FIXME: WIntType should be SignedLong
632 }
633};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000634
635// Windows target
636template<typename Target>
637class WindowsTargetInfo : public OSTargetInfo<Target> {
638protected:
Craig Topper3164f332014-03-11 03:39:26 +0000639 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
640 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000641 Builder.defineMacro("_WIN32");
642 }
643 void getVisualStudioDefines(const LangOptions &Opts,
644 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000645 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000646 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000647 Builder.defineMacro("_CPPRTTI");
648
Reid Kleckner16514352015-01-30 21:42:55 +0000649 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000650 Builder.defineMacro("_CPPUNWIND");
651 }
652
David Majnemer6a658902015-07-22 22:36:26 +0000653 if (Opts.Bool)
654 Builder.defineMacro("__BOOL_DEFINED");
655
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000656 if (!Opts.CharIsSigned)
657 Builder.defineMacro("_CHAR_UNSIGNED");
658
659 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
660 // but it works for now.
661 if (Opts.POSIXThreads)
662 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000663
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000664 if (Opts.MSCompatibilityVersion) {
665 Builder.defineMacro("_MSC_VER",
666 Twine(Opts.MSCompatibilityVersion / 100000));
667 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000668 // FIXME We cannot encode the revision information into 32-bits
669 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000670
David Majnemerb710a932015-05-11 03:57:49 +0000671 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000672 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000673 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000674
675 if (Opts.MicrosoftExt) {
676 Builder.defineMacro("_MSC_EXTENSIONS");
677
678 if (Opts.CPlusPlus11) {
679 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
680 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
681 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
682 }
683 }
684
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000685 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000686 }
687
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000688public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000689 WindowsTargetInfo(const llvm::Triple &Triple)
690 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000691};
692
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000693template <typename Target>
694class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000695protected:
Craig Topper3164f332014-03-11 03:39:26 +0000696 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
697 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000698 if (Opts.POSIXThreads)
699 Builder.defineMacro("_REENTRANT");
700 if (Opts.CPlusPlus)
701 Builder.defineMacro("_GNU_SOURCE");
702
703 DefineStd(Builder, "unix", Opts);
704 Builder.defineMacro("__ELF__");
705 Builder.defineMacro("__native_client__");
706 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000707
708public:
709 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000710 this->UserLabelPrefix = "";
711 this->LongAlign = 32;
712 this->LongWidth = 32;
713 this->PointerAlign = 32;
714 this->PointerWidth = 32;
715 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000716 this->Int64Type = TargetInfo::SignedLongLong;
717 this->DoubleAlign = 64;
718 this->LongDoubleWidth = 64;
719 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000720 this->LongLongWidth = 64;
721 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000722 this->SizeType = TargetInfo::UnsignedInt;
723 this->PtrDiffType = TargetInfo::SignedInt;
724 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000725 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000726 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000728 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000729 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000730 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000731 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000732 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000733 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000734 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000735 } else {
736 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000737 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000738 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000739 }
740};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000741
Dan Gohmanc2853072015-09-03 22:51:53 +0000742// WebAssembly target
743template <typename Target>
744class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
745 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000746 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000747 // A common platform macro.
748 if (Opts.POSIXThreads)
749 Builder.defineMacro("_REENTRANT");
750 // Follow g++ convention and predefine _GNU_SOURCE for C++.
751 if (Opts.CPlusPlus)
752 Builder.defineMacro("_GNU_SOURCE");
753 }
754
755 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000756 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000757 return ".text.__startup";
758 }
759
760public:
761 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
762 : OSTargetInfo<Target>(Triple) {
763 this->MCountName = "__mcount";
764 this->UserLabelPrefix = "";
765 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
766 }
767};
Dan Gohmanc2853072015-09-03 22:51:53 +0000768
Chris Lattner09d98f52008-10-05 21:50:58 +0000769//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000770// Specific target implementations.
771//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000772
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000773// PPC abstract base class
774class PPCTargetInfo : public TargetInfo {
775 static const Builtin::Info BuiltinInfo[];
776 static const char * const GCCRegNames[];
777 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000778 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000779
780 // Target cpu features.
781 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000782 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000783 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000784 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000785 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000786 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000787 bool HasBPERMD;
788 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000789
Ulrich Weigand8afad612014-07-28 13:17:52 +0000790protected:
791 std::string ABI;
792
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000793public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000794 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000795 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000796 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000797 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000798 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000799 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000800 LongDoubleWidth = LongDoubleAlign = 128;
801 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
802 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000803
Hal Finkel6b984f02012-07-03 16:51:04 +0000804 /// \brief Flags for architecture specific defines.
805 typedef enum {
806 ArchDefineNone = 0,
807 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
808 ArchDefinePpcgr = 1 << 1,
809 ArchDefinePpcsq = 1 << 2,
810 ArchDefine440 = 1 << 3,
811 ArchDefine603 = 1 << 4,
812 ArchDefine604 = 1 << 5,
813 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000814 ArchDefinePwr5 = 1 << 7,
815 ArchDefinePwr5x = 1 << 8,
816 ArchDefinePwr6 = 1 << 9,
817 ArchDefinePwr6x = 1 << 10,
818 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000819 ArchDefinePwr8 = 1 << 12,
820 ArchDefineA2 = 1 << 13,
821 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000822 } ArchDefineTypes;
823
Bill Schmidt38378a02013-02-01 20:23:10 +0000824 // Note: GCC recognizes the following additional cpus:
825 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
826 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
827 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000828 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000829 bool CPUKnown = llvm::StringSwitch<bool>(Name)
830 .Case("generic", true)
831 .Case("440", true)
832 .Case("450", true)
833 .Case("601", true)
834 .Case("602", true)
835 .Case("603", true)
836 .Case("603e", true)
837 .Case("603ev", true)
838 .Case("604", true)
839 .Case("604e", true)
840 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000841 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000842 .Case("g3", true)
843 .Case("7400", true)
844 .Case("g4", true)
845 .Case("7450", true)
846 .Case("g4+", true)
847 .Case("750", true)
848 .Case("970", true)
849 .Case("g5", true)
850 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000851 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000852 .Case("e500mc", true)
853 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000854 .Case("power3", true)
855 .Case("pwr3", true)
856 .Case("power4", true)
857 .Case("pwr4", true)
858 .Case("power5", true)
859 .Case("pwr5", true)
860 .Case("power5x", true)
861 .Case("pwr5x", true)
862 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("power6x", true)
865 .Case("pwr6x", true)
866 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000867 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000868 .Case("power8", true)
869 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000870 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000871 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000872 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000873 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000874 .Case("powerpc64le", true)
875 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000876 .Default(false);
877
878 if (CPUKnown)
879 CPU = Name;
880
881 return CPUKnown;
882 }
883
Ulrich Weigand8afad612014-07-28 13:17:52 +0000884
885 StringRef getABI() const override { return ABI; }
886
Craig Topper6c03a542015-10-19 04:51:35 +0000887 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
888 return llvm::makeArrayRef(BuiltinInfo,
889 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000890 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000891
Craig Topper3164f332014-03-11 03:39:26 +0000892 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000893
Craig Topper3164f332014-03-11 03:39:26 +0000894 void getTargetDefines(const LangOptions &Opts,
895 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000896
Eric Christopher8c47b422015-10-09 18:39:55 +0000897 bool
898 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
899 StringRef CPU,
900 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000901
Craig Topper3164f332014-03-11 03:39:26 +0000902 bool handleTargetFeatures(std::vector<std::string> &Features,
903 DiagnosticsEngine &Diags) override;
904 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000905 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
906 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000907
Craig Topperf054e3a2015-10-19 03:52:27 +0000908 ArrayRef<const char *> getGCCRegNames() const override;
909 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000910 bool validateAsmConstraint(const char *&Name,
911 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000912 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000913 default: return false;
914 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000915 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000916 case 'b': // Base register
917 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000918 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000919 break;
920 // FIXME: The following are added to allow parsing.
921 // I just took a guess at what the actions should be.
922 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000924 case 'v': // Altivec vector register
925 Info.setAllowsRegister();
926 break;
927 case 'w':
928 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 case 'd':// VSX vector register to hold vector double data
930 case 'f':// VSX vector register to hold vector float data
931 case 's':// VSX vector register to hold scalar float data
932 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000933 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000934 break;
935 default:
936 return false;
937 }
938 Info.setAllowsRegister();
939 Name++; // Skip over 'w'.
940 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 case 'h': // `MQ', `CTR', or `LINK' register
942 case 'q': // `MQ' register
943 case 'c': // `CTR' register
944 case 'l': // `LINK' register
945 case 'x': // `CR' register (condition register) number 0
946 case 'y': // `CR' register (condition register)
947 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000948 Info.setAllowsRegister();
949 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000951 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000952 // (use `L' instead for SImode constants)
953 case 'K': // Unsigned 16-bit constant
954 case 'L': // Signed 16-bit constant shifted left 16 bits
955 case 'M': // Constant larger than 31
956 case 'N': // Exact power of 2
957 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000960 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000962 break;
963 case 'm': // Memory operand. Note that on PowerPC targets, m can
964 // include addresses that update the base register. It
965 // is therefore only safe to use `m' in an asm statement
966 // if that asm statement accesses the operand exactly once.
967 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000968 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000970 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000972 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
973 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 // register to be updated.
975 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000976 if (Name[1] != 's')
977 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000978 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000979 // include any automodification of the base register. Unlike
980 // `m', this constraint can be used in asm statements that
981 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000982 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000983 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000984 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000985 break;
986 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000987 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000988 case 'Z': // Memory operand that is an indexed or indirect from a
989 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000991 Info.setAllowsMemory();
992 Info.setAllowsRegister();
993 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // register (`p' is preferable for asm statements)
997 case 'S': // Constant suitable as a 64-bit mask operand
998 case 'T': // Constant suitable as a 32-bit mask operand
999 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001000 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 // instructions
1002 case 'W': // Vector constant that does not require memory
1003 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001004 break;
1005 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001006 }
John Thompson07a61a42010-06-24 22:44:13 +00001007 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001008 }
Craig Topper3164f332014-03-11 03:39:26 +00001009 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001010 std::string R;
1011 switch (*Constraint) {
1012 case 'e':
1013 case 'w':
1014 // Two-character constraint; add "^" hint for later parsing.
1015 R = std::string("^") + std::string(Constraint, 2);
1016 Constraint++;
1017 break;
1018 default:
1019 return TargetInfo::convertConstraint(Constraint);
1020 }
1021 return R;
1022 }
Craig Topper3164f332014-03-11 03:39:26 +00001023 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001024 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 }
Craig Topper3164f332014-03-11 03:39:26 +00001026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001027 if (RegNo == 0) return 3;
1028 if (RegNo == 1) return 4;
1029 return -1;
1030 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001031
1032 bool hasSjLjLowering() const override {
1033 return true;
1034 }
David Majnemer2617ea62015-06-09 18:05:33 +00001035
1036 bool useFloat128ManglingForLongDouble() const override {
1037 return LongDoubleWidth == 128 &&
1038 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1039 getTriple().isOSBinFormatELF();
1040 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001041};
Anders Carlssonf511f642007-11-27 04:11:28 +00001042
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001043const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001044#define BUILTIN(ID, TYPE, ATTRS) \
1045 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1046#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1047 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001048#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001049};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001050
Eric Christopher917e9522014-11-18 22:36:15 +00001051/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001053bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001055 for (const auto &Feature : Features) {
1056 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001059 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001061 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001063 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001064 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001065 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001066 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001067 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001068 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001069 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001070 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001071 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001072 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001073 // TODO: Finish this list and add an assert that we've handled them
1074 // all.
1075 }
Eric Christopher02c33352015-08-25 00:59:11 +00001076
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001077 return true;
1078}
1079
Chris Lattnerecd49032009-03-02 22:27:17 +00001080/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1081/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001082void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001084 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001086 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001088 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001089 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001091 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001092 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001093 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001094 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001095 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001098 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1099 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001100 } else {
1101 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1102 getTriple().getOS() != llvm::Triple::OpenBSD)
1103 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001104 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001105
Ulrich Weigand8afad612014-07-28 13:17:52 +00001106 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001107 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001108 Builder.defineMacro("_CALL_ELF", "1");
1109 if (ABI == "elfv2")
1110 Builder.defineMacro("_CALL_ELF", "2");
1111
Chris Lattnerecd49032009-03-02 22:27:17 +00001112 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1114 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001115
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001117 if (LongDoubleWidth == 128)
1118 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001119
John Thompsone467e192009-11-19 17:18:50 +00001120 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001121 Builder.defineMacro("__VEC__", "10206");
1122 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001123 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001124
1125 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001126 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1127 .Case("440", ArchDefineName)
1128 .Case("450", ArchDefineName | ArchDefine440)
1129 .Case("601", ArchDefineName)
1130 .Case("602", ArchDefineName | ArchDefinePpcgr)
1131 .Case("603", ArchDefineName | ArchDefinePpcgr)
1132 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1133 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1134 .Case("604", ArchDefineName | ArchDefinePpcgr)
1135 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1136 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001137 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001138 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1139 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1140 .Case("750", ArchDefineName | ArchDefinePpcgr)
1141 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001143 .Case("a2", ArchDefineA2)
1144 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001145 .Case("pwr3", ArchDefinePpcgr)
1146 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1147 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1148 | ArchDefinePpcsq)
1149 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1150 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1152 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1154 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1157 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001158 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1160 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1161 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 .Case("power3", ArchDefinePpcgr)
1163 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1165 | ArchDefinePpcsq)
1166 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1167 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1169 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1171 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1174 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001175 | ArchDefinePpcgr | ArchDefinePpcsq)
1176 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1177 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1178 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001179 .Default(ArchDefineNone);
1180
1181 if (defs & ArchDefineName)
1182 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1183 if (defs & ArchDefinePpcgr)
1184 Builder.defineMacro("_ARCH_PPCGR");
1185 if (defs & ArchDefinePpcsq)
1186 Builder.defineMacro("_ARCH_PPCSQ");
1187 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001188 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 if (defs & ArchDefine603)
1190 Builder.defineMacro("_ARCH_603");
1191 if (defs & ArchDefine604)
1192 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001193 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001194 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001195 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 if (defs & ArchDefinePwr5x)
1198 Builder.defineMacro("_ARCH_PWR5X");
1199 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001200 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001201 if (defs & ArchDefinePwr6x)
1202 Builder.defineMacro("_ARCH_PWR6X");
1203 if (defs & ArchDefinePwr7)
1204 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001205 if (defs & ArchDefinePwr8)
1206 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001207 if (defs & ArchDefineA2)
1208 Builder.defineMacro("_ARCH_A2");
1209 if (defs & ArchDefineA2q) {
1210 Builder.defineMacro("_ARCH_A2Q");
1211 Builder.defineMacro("_ARCH_QP");
1212 }
1213
1214 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1215 Builder.defineMacro("__bg__");
1216 Builder.defineMacro("__THW_BLUEGENE__");
1217 Builder.defineMacro("__bgq__");
1218 Builder.defineMacro("__TOS_BGQ__");
1219 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001220
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001221 if (HasVSX)
1222 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001223 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001224 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001225 if (HasP8Crypto)
1226 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001227 if (HasHTM)
1228 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001229
1230 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1231 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1232 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1233 if (PointerWidth == 64)
1234 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001235
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 // FIXME: The following are not yet generated here by Clang, but are
1237 // generated by GCC:
1238 //
1239 // _SOFT_FLOAT_
1240 // __RECIP_PRECISION__
1241 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 // __RECIP__
1243 // __RECIPF__
1244 // __RSQRTE__
1245 // __RSQRTEF__
1246 // _SOFT_DOUBLE_
1247 // __NO_LWSYNC__
1248 // __HAVE_BSWAP__
1249 // __LONGDOUBLE128
1250 // __CMODEL_MEDIUM__
1251 // __CMODEL_LARGE__
1252 // _CALL_SYSV
1253 // _CALL_DARWIN
1254 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001255}
1256
Eric Christophera8a14c32015-08-31 18:39:16 +00001257// Handle explicit options being passed to the compiler here: if we've
1258// explicitly turned off vsx and turned on power8-vector or direct-move then
1259// go ahead and error since the customer has expressed a somewhat incompatible
1260// set of options.
1261static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001262 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001263
1264 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1265 FeaturesVec.end()) {
1266 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1267 FeaturesVec.end()) {
1268 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1269 << "-mno-vsx";
1270 return false;
1271 }
1272
1273 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1274 FeaturesVec.end()) {
1275 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1276 << "-mno-vsx";
1277 return false;
1278 }
1279 }
1280
1281 return true;
1282}
1283
Eric Christopher8c47b422015-10-09 18:39:55 +00001284bool PPCTargetInfo::initFeatureMap(
1285 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1286 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001287 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1288 .Case("7400", true)
1289 .Case("g4", true)
1290 .Case("7450", true)
1291 .Case("g4+", true)
1292 .Case("970", true)
1293 .Case("g5", true)
1294 .Case("pwr6", true)
1295 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001296 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001297 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001298 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001299 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001300
1301 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001302 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1303 .Case("ppc64le", true)
1304 .Case("pwr8", true)
1305 .Default(false);
1306 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1307 .Case("ppc64le", true)
1308 .Case("pwr8", true)
1309 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001310 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1311 .Case("ppc64le", true)
1312 .Case("pwr8", true)
1313 .Case("pwr7", true)
1314 .Default(false);
1315 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1316 .Case("ppc64le", true)
1317 .Case("pwr8", true)
1318 .Case("pwr7", true)
1319 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001320 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1321 .Case("ppc64le", true)
1322 .Case("pwr8", true)
1323 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001324 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1325 .Case("ppc64le", true)
1326 .Case("pwr8", true)
1327 .Case("pwr7", true)
1328 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001329
Eric Christophera8a14c32015-08-31 18:39:16 +00001330 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1331 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001332
Eric Christopher007b0a02015-08-28 22:32:01 +00001333 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001334}
1335
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001336bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001337 return llvm::StringSwitch<bool>(Feature)
1338 .Case("powerpc", true)
1339 .Case("vsx", HasVSX)
1340 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001341 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001342 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001343 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001344 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001345 .Case("bpermd", HasBPERMD)
1346 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001347 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001348}
Chris Lattner17df24e2008-04-21 18:56:49 +00001349
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001350void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1351 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001352 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1353 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1354 // incompatible options.
1355 if (Enabled) {
1356 if (Name == "vsx") {
1357 Features[Name] = true;
1358 } else if (Name == "direct-move") {
1359 Features[Name] = Features["vsx"] = true;
1360 } else if (Name == "power8-vector") {
1361 Features[Name] = Features["vsx"] = true;
1362 } else {
1363 Features[Name] = true;
1364 }
1365 } else {
1366 if (Name == "vsx") {
1367 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1368 false;
1369 } else {
1370 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001371 }
1372 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001373}
1374
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001375const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001376 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1378 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1379 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1380 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1381 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1382 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1383 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001385 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001387 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1388 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1389 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1390 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001391 "vrsave", "vscr",
1392 "spe_acc", "spefscr",
1393 "sfp"
1394};
Chris Lattner10a5b382007-01-29 05:24:35 +00001395
Craig Topperf054e3a2015-10-19 03:52:27 +00001396ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1397 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001398}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001399
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001400const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1401 // While some of these aliases do map to different registers
1402 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001403 { { "0" }, "r0" },
1404 { { "1"}, "r1" },
1405 { { "2" }, "r2" },
1406 { { "3" }, "r3" },
1407 { { "4" }, "r4" },
1408 { { "5" }, "r5" },
1409 { { "6" }, "r6" },
1410 { { "7" }, "r7" },
1411 { { "8" }, "r8" },
1412 { { "9" }, "r9" },
1413 { { "10" }, "r10" },
1414 { { "11" }, "r11" },
1415 { { "12" }, "r12" },
1416 { { "13" }, "r13" },
1417 { { "14" }, "r14" },
1418 { { "15" }, "r15" },
1419 { { "16" }, "r16" },
1420 { { "17" }, "r17" },
1421 { { "18" }, "r18" },
1422 { { "19" }, "r19" },
1423 { { "20" }, "r20" },
1424 { { "21" }, "r21" },
1425 { { "22" }, "r22" },
1426 { { "23" }, "r23" },
1427 { { "24" }, "r24" },
1428 { { "25" }, "r25" },
1429 { { "26" }, "r26" },
1430 { { "27" }, "r27" },
1431 { { "28" }, "r28" },
1432 { { "29" }, "r29" },
1433 { { "30" }, "r30" },
1434 { { "31" }, "r31" },
1435 { { "fr0" }, "f0" },
1436 { { "fr1" }, "f1" },
1437 { { "fr2" }, "f2" },
1438 { { "fr3" }, "f3" },
1439 { { "fr4" }, "f4" },
1440 { { "fr5" }, "f5" },
1441 { { "fr6" }, "f6" },
1442 { { "fr7" }, "f7" },
1443 { { "fr8" }, "f8" },
1444 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001445 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001446 { { "fr11" }, "f11" },
1447 { { "fr12" }, "f12" },
1448 { { "fr13" }, "f13" },
1449 { { "fr14" }, "f14" },
1450 { { "fr15" }, "f15" },
1451 { { "fr16" }, "f16" },
1452 { { "fr17" }, "f17" },
1453 { { "fr18" }, "f18" },
1454 { { "fr19" }, "f19" },
1455 { { "fr20" }, "f20" },
1456 { { "fr21" }, "f21" },
1457 { { "fr22" }, "f22" },
1458 { { "fr23" }, "f23" },
1459 { { "fr24" }, "f24" },
1460 { { "fr25" }, "f25" },
1461 { { "fr26" }, "f26" },
1462 { { "fr27" }, "f27" },
1463 { { "fr28" }, "f28" },
1464 { { "fr29" }, "f29" },
1465 { { "fr30" }, "f30" },
1466 { { "fr31" }, "f31" },
1467 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001468};
1469
Craig Topperf054e3a2015-10-19 03:52:27 +00001470ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1471 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001472}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001473
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001474class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001476 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001477 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001478
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001479 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001480 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001481 case llvm::Triple::FreeBSD:
1482 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001483 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001484 PtrDiffType = SignedInt;
1485 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001486 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001487 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001488 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001489 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001490
Roman Divacky3ffe7462012-03-13 19:20:17 +00001491 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1492 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001493 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001494 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001495
1496 // PPC32 supports atomics up to 4 bytes.
1497 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001498 }
1499
Craig Topper3164f332014-03-11 03:39:26 +00001500 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001501 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001502 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001503 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001504};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001505
Bill Schmidt778d3872013-07-26 01:36:11 +00001506// Note: ABI differences may eventually require us to have a separate
1507// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001508class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001510 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001511 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001512 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001513 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001514
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001515 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001516 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001517 ABI = "elfv2";
1518 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001519 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001520 ABI = "elfv1";
1521 }
1522
1523 switch (getTriple().getOS()) {
1524 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001525 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001526 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001527 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001528 case llvm::Triple::NetBSD:
1529 IntMaxType = SignedLongLong;
1530 Int64Type = SignedLongLong;
1531 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001532 default:
1533 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001534 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001535
1536 // PPC64 supports atomics up to 8 bytes.
1537 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001538 }
Craig Topper3164f332014-03-11 03:39:26 +00001539 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001540 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001541 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001542 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001543 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001544 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001545 ABI = Name;
1546 return true;
1547 }
1548 return false;
1549 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001551
Roman Divacky965b0b72011-01-06 08:27:10 +00001552class DarwinPPC32TargetInfo :
1553 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001555 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1556 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001557 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001558 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001559 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001560 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001561 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001562 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001563 }
Craig Topper3164f332014-03-11 03:39:26 +00001564 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001565 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001566 }
1567};
1568
1569class DarwinPPC64TargetInfo :
1570 public DarwinTargetInfo<PPC64TargetInfo> {
1571public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001572 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1573 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001574 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001575 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001576 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001577 }
1578};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001579
Eric Christopherc48497a2015-09-18 21:26:24 +00001580static const unsigned NVPTXAddrSpaceMap[] = {
1581 1, // opencl_global
1582 3, // opencl_local
1583 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001584 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001585 0, // opencl_generic
1586 1, // cuda_device
1587 4, // cuda_constant
1588 3, // cuda_shared
1589};
1590
1591class NVPTXTargetInfo : public TargetInfo {
1592 static const char *const GCCRegNames[];
1593 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001594
1595 // The GPU profiles supported by the NVPTX backend
1596 enum GPUKind {
1597 GK_NONE,
1598 GK_SM20,
1599 GK_SM21,
1600 GK_SM30,
1601 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001602 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001603 } GPU;
1604
Eric Christopherc48497a2015-09-18 21:26:24 +00001605public:
1606 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1607 BigEndian = false;
1608 TLSSupported = false;
1609 LongWidth = LongAlign = 64;
1610 AddrSpaceMap = &NVPTXAddrSpaceMap;
1611 UseAddrSpaceMapMangling = true;
1612 // Define available target features
1613 // These must be defined in sorted order!
1614 NoAsmVariants = true;
1615 // Set the default GPU to sm20
1616 GPU = GK_SM20;
1617 }
1618 void getTargetDefines(const LangOptions &Opts,
1619 MacroBuilder &Builder) const override {
1620 Builder.defineMacro("__PTX__");
1621 Builder.defineMacro("__NVPTX__");
1622 if (Opts.CUDAIsDevice) {
1623 // Set __CUDA_ARCH__ for the GPU specified.
1624 std::string CUDAArchCode;
1625 switch (GPU) {
1626 case GK_SM20:
1627 CUDAArchCode = "200";
1628 break;
1629 case GK_SM21:
1630 CUDAArchCode = "210";
1631 break;
1632 case GK_SM30:
1633 CUDAArchCode = "300";
1634 break;
1635 case GK_SM35:
1636 CUDAArchCode = "350";
1637 break;
1638 case GK_SM37:
1639 CUDAArchCode = "370";
1640 break;
1641 default:
1642 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001643 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001644 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001646 }
Craig Topper6c03a542015-10-19 04:51:35 +00001647 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1648 return llvm::makeArrayRef(BuiltinInfo,
1649 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001650 }
1651 bool hasFeature(StringRef Feature) const override {
1652 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001653 }
1654
Craig Topperf054e3a2015-10-19 03:52:27 +00001655 ArrayRef<const char *> getGCCRegNames() const override;
1656 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001657 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001658 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001659 }
1660 bool validateAsmConstraint(const char *&Name,
1661 TargetInfo::ConstraintInfo &Info) const override {
1662 switch (*Name) {
1663 default:
1664 return false;
1665 case 'c':
1666 case 'h':
1667 case 'r':
1668 case 'l':
1669 case 'f':
1670 case 'd':
1671 Info.setAllowsRegister();
1672 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001673 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 }
1675 const char *getClobbers() const override {
1676 // FIXME: Is this really right?
1677 return "";
1678 }
1679 BuiltinVaListKind getBuiltinVaListKind() const override {
1680 // FIXME: implement
1681 return TargetInfo::CharPtrBuiltinVaList;
1682 }
1683 bool setCPU(const std::string &Name) override {
1684 GPU = llvm::StringSwitch<GPUKind>(Name)
1685 .Case("sm_20", GK_SM20)
1686 .Case("sm_21", GK_SM21)
1687 .Case("sm_30", GK_SM30)
1688 .Case("sm_35", GK_SM35)
1689 .Case("sm_37", GK_SM37)
1690 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001691
Eric Christopherc48497a2015-09-18 21:26:24 +00001692 return GPU != GK_NONE;
1693 }
1694};
1695
1696const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1697#define BUILTIN(ID, TYPE, ATTRS) \
1698 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1699#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1700 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1701#include "clang/Basic/BuiltinsNVPTX.def"
1702};
1703
1704const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1705
Craig Topperf054e3a2015-10-19 03:52:27 +00001706ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1707 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001708}
1709
1710class NVPTX32TargetInfo : public NVPTXTargetInfo {
1711public:
1712 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001713 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 PointerWidth = PointerAlign = 32;
1715 SizeType = TargetInfo::UnsignedInt;
1716 PtrDiffType = TargetInfo::SignedInt;
1717 IntPtrType = TargetInfo::SignedInt;
1718 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1719 }
1720};
1721
1722class NVPTX64TargetInfo : public NVPTXTargetInfo {
1723public:
1724 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1725 PointerWidth = PointerAlign = 64;
1726 SizeType = TargetInfo::UnsignedLong;
1727 PtrDiffType = TargetInfo::SignedLong;
1728 IntPtrType = TargetInfo::SignedLong;
1729 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1730 }
1731};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001733static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001734 1, // opencl_global
1735 3, // opencl_local
1736 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001737 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001738 1, // cuda_device
1739 2, // cuda_constant
1740 3 // cuda_shared
1741};
1742
Tom Stellarda96344b2014-08-21 13:58:40 +00001743// If you edit the description strings, make sure you update
1744// getPointerWidthV().
1745
Craig Topper273dbc62015-10-18 05:29:26 +00001746static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001747 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1748 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001749
Craig Topper273dbc62015-10-18 05:29:26 +00001750static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001751 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1752 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001753
Craig Topper273dbc62015-10-18 05:29:26 +00001754static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001755 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001756 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1757 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001759class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001760 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001761 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001762
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001763 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001764 enum GPUKind {
1765 GK_NONE,
1766 GK_R600,
1767 GK_R600_DOUBLE_OPS,
1768 GK_R700,
1769 GK_R700_DOUBLE_OPS,
1770 GK_EVERGREEN,
1771 GK_EVERGREEN_DOUBLE_OPS,
1772 GK_NORTHERN_ISLANDS,
1773 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001774 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001775 GK_SEA_ISLANDS,
1776 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001777 } GPU;
1778
Jan Veselyeebeaea2015-05-04 19:53:36 +00001779 bool hasFP64:1;
1780 bool hasFMAF:1;
1781 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001782
Eli Friedmand13b41e2012-10-12 23:32:00 +00001783public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001784 AMDGPUTargetInfo(const llvm::Triple &Triple)
1785 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001786
1787 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001788 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001789 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001790 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001791 hasFMAF = true;
1792 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001793 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001794 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001795 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001796 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001797 hasFMAF = false;
1798 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001799 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001800 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001801 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001802 }
1803
Tom Stellarda96344b2014-08-21 13:58:40 +00001804 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1805 if (GPU <= GK_CAYMAN)
1806 return 32;
1807
1808 switch(AddrSpace) {
1809 default:
1810 return 64;
1811 case 0:
1812 case 3:
1813 case 5:
1814 return 32;
1815 }
1816 }
1817
Craig Topper3164f332014-03-11 03:39:26 +00001818 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001819 return "";
1820 }
1821
Craig Topperf054e3a2015-10-19 03:52:27 +00001822 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823
Craig Topperf054e3a2015-10-19 03:52:27 +00001824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1825 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001826 }
1827
Craig Topper3164f332014-03-11 03:39:26 +00001828 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001829 TargetInfo::ConstraintInfo &Info) const override {
1830 switch (*Name) {
1831 default: break;
1832 case 'v': // vgpr
1833 case 's': // sgpr
1834 Info.setAllowsRegister();
1835 return true;
1836 }
1837 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001838 }
1839
Craig Topper6c03a542015-10-19 04:51:35 +00001840 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1841 return llvm::makeArrayRef(BuiltinInfo,
1842 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001843 }
1844
Craig Topper3164f332014-03-11 03:39:26 +00001845 void getTargetDefines(const LangOptions &Opts,
1846 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001847 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001848 if (hasFMAF)
1849 Builder.defineMacro("__HAS_FMAF__");
1850 if (hasLDEXPF)
1851 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001852 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001853 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001854 if (Opts.OpenCL) {
1855 if (GPU >= GK_NORTHERN_ISLANDS) {
1856 Builder.defineMacro("cl_khr_byte_addressable_store");
1857 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1858 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1859 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1860 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1861 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001862 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001863 }
1864
Craig Topper3164f332014-03-11 03:39:26 +00001865 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001866 return TargetInfo::CharPtrBuiltinVaList;
1867 }
1868
Craig Topper3164f332014-03-11 03:39:26 +00001869 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001870 GPU = llvm::StringSwitch<GPUKind>(Name)
1871 .Case("r600" , GK_R600)
1872 .Case("rv610", GK_R600)
1873 .Case("rv620", GK_R600)
1874 .Case("rv630", GK_R600)
1875 .Case("rv635", GK_R600)
1876 .Case("rs780", GK_R600)
1877 .Case("rs880", GK_R600)
1878 .Case("rv670", GK_R600_DOUBLE_OPS)
1879 .Case("rv710", GK_R700)
1880 .Case("rv730", GK_R700)
1881 .Case("rv740", GK_R700_DOUBLE_OPS)
1882 .Case("rv770", GK_R700_DOUBLE_OPS)
1883 .Case("palm", GK_EVERGREEN)
1884 .Case("cedar", GK_EVERGREEN)
1885 .Case("sumo", GK_EVERGREEN)
1886 .Case("sumo2", GK_EVERGREEN)
1887 .Case("redwood", GK_EVERGREEN)
1888 .Case("juniper", GK_EVERGREEN)
1889 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1890 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1891 .Case("barts", GK_NORTHERN_ISLANDS)
1892 .Case("turks", GK_NORTHERN_ISLANDS)
1893 .Case("caicos", GK_NORTHERN_ISLANDS)
1894 .Case("cayman", GK_CAYMAN)
1895 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001896 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001897 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1898 .Case("verde", GK_SOUTHERN_ISLANDS)
1899 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001900 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001901 .Case("bonaire", GK_SEA_ISLANDS)
1902 .Case("kabini", GK_SEA_ISLANDS)
1903 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001904 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001905 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001906 .Case("tonga", GK_VOLCANIC_ISLANDS)
1907 .Case("iceland", GK_VOLCANIC_ISLANDS)
1908 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001909 .Default(GK_NONE);
1910
1911 if (GPU == GK_NONE) {
1912 return false;
1913 }
1914
1915 // Set the correct data layout
1916 switch (GPU) {
1917 case GK_NONE:
1918 case GK_R600:
1919 case GK_R700:
1920 case GK_EVERGREEN:
1921 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001922 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001923 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001924 hasFMAF = false;
1925 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001926 break;
1927 case GK_R600_DOUBLE_OPS:
1928 case GK_R700_DOUBLE_OPS:
1929 case GK_EVERGREEN_DOUBLE_OPS:
1930 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001931 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001932 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001933 hasFMAF = true;
1934 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935 break;
1936 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001937 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001938 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001939 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001940 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001941 hasFMAF = true;
1942 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001943 break;
1944 }
1945
1946 return true;
1947 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001948};
1949
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001950const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001951#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001952 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001953#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001954};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001955const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001956 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1957 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1958 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1959 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1960 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1961 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1962 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1963 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1964 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1965 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1966 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1967 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1968 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1969 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1970 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1971 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1972 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1973 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1974 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1975 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1976 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1977 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1978 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1979 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1980 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1981 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1982 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1983 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1984 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1985 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1986 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1987 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1988 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1989 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1990 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1991 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1992 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1993 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1994 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1995 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1996 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1997 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1998 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1999 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2000 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2001 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2002 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2003 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2004 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2005 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2006};
2007
Craig Topperf054e3a2015-10-19 03:52:27 +00002008ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2009 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002010}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002011
Eli Friedman3fd920a2008-08-20 02:34:37 +00002012// Namespace for x86 abstract base class
2013const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002014#define BUILTIN(ID, TYPE, ATTRS) \
2015 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002016#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002017 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002018#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002019 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002020#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002021};
Eli Friedmanb5366062008-05-20 14:21:01 +00002022
Nuno Lopescfca1f02009-12-23 17:49:57 +00002023static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002024 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2025 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002026 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002027 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2028 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2029 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002030 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002031 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2032 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002033};
2034
Eric Christophercdd36352011-06-21 00:05:20 +00002035const TargetInfo::AddlRegName AddlRegNames[] = {
2036 { { "al", "ah", "eax", "rax" }, 0 },
2037 { { "bl", "bh", "ebx", "rbx" }, 3 },
2038 { { "cl", "ch", "ecx", "rcx" }, 2 },
2039 { { "dl", "dh", "edx", "rdx" }, 1 },
2040 { { "esi", "rsi" }, 4 },
2041 { { "edi", "rdi" }, 5 },
2042 { { "esp", "rsp" }, 7 },
2043 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002044 { { "r8d", "r8w", "r8b" }, 38 },
2045 { { "r9d", "r9w", "r9b" }, 39 },
2046 { { "r10d", "r10w", "r10b" }, 40 },
2047 { { "r11d", "r11w", "r11b" }, 41 },
2048 { { "r12d", "r12w", "r12b" }, 42 },
2049 { { "r13d", "r13w", "r13b" }, 43 },
2050 { { "r14d", "r14w", "r14b" }, 44 },
2051 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002052};
2053
2054// X86 target abstract base class; x86-32 and x86-64 are very close, so
2055// most of the implementation can be shared.
2056class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002057 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002058 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002059 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002060 enum MMX3DNowEnum {
2061 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002062 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002063 enum XOPEnum {
2064 NoXOP,
2065 SSE4A,
2066 FMA4,
2067 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002068 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002069
Craig Topper543f3bd2015-10-14 23:47:57 +00002070 bool HasAES = false;
2071 bool HasPCLMUL = false;
2072 bool HasLZCNT = false;
2073 bool HasRDRND = false;
2074 bool HasFSGSBASE = false;
2075 bool HasBMI = false;
2076 bool HasBMI2 = false;
2077 bool HasPOPCNT = false;
2078 bool HasRTM = false;
2079 bool HasPRFCHW = false;
2080 bool HasRDSEED = false;
2081 bool HasADX = false;
2082 bool HasTBM = false;
2083 bool HasFMA = false;
2084 bool HasF16C = false;
2085 bool HasAVX512CD = false;
2086 bool HasAVX512ER = false;
2087 bool HasAVX512PF = false;
2088 bool HasAVX512DQ = false;
2089 bool HasAVX512BW = false;
2090 bool HasAVX512VL = false;
2091 bool HasSHA = false;
2092 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002093 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002094 bool HasXSAVE = false;
2095 bool HasXSAVEOPT = false;
2096 bool HasXSAVEC = false;
2097 bool HasXSAVES = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002098
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002099 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2100 ///
2101 /// Each enumeration represents a particular CPU supported by Clang. These
2102 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2103 enum CPUKind {
2104 CK_Generic,
2105
2106 /// \name i386
2107 /// i386-generation processors.
2108 //@{
2109 CK_i386,
2110 //@}
2111
2112 /// \name i486
2113 /// i486-generation processors.
2114 //@{
2115 CK_i486,
2116 CK_WinChipC6,
2117 CK_WinChip2,
2118 CK_C3,
2119 //@}
2120
2121 /// \name i586
2122 /// i586-generation processors, P5 microarchitecture based.
2123 //@{
2124 CK_i586,
2125 CK_Pentium,
2126 CK_PentiumMMX,
2127 //@}
2128
2129 /// \name i686
2130 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2131 //@{
2132 CK_i686,
2133 CK_PentiumPro,
2134 CK_Pentium2,
2135 CK_Pentium3,
2136 CK_Pentium3M,
2137 CK_PentiumM,
2138 CK_C3_2,
2139
2140 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2141 /// Clang however has some logic to suport this.
2142 // FIXME: Warn, deprecate, and potentially remove this.
2143 CK_Yonah,
2144 //@}
2145
2146 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002147 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002148 //@{
2149 CK_Pentium4,
2150 CK_Pentium4M,
2151 CK_Prescott,
2152 CK_Nocona,
2153 //@}
2154
2155 /// \name Core
2156 /// Core microarchitecture based processors.
2157 //@{
2158 CK_Core2,
2159
2160 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2161 /// codename which GCC no longer accepts as an option to -march, but Clang
2162 /// has some logic for recognizing it.
2163 // FIXME: Warn, deprecate, and potentially remove this.
2164 CK_Penryn,
2165 //@}
2166
2167 /// \name Atom
2168 /// Atom processors
2169 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002170 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002171 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002172 //@}
2173
2174 /// \name Nehalem
2175 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002176 CK_Nehalem,
2177
2178 /// \name Westmere
2179 /// Westmere microarchitecture based processors.
2180 CK_Westmere,
2181
2182 /// \name Sandy Bridge
2183 /// Sandy Bridge microarchitecture based processors.
2184 CK_SandyBridge,
2185
2186 /// \name Ivy Bridge
2187 /// Ivy Bridge microarchitecture based processors.
2188 CK_IvyBridge,
2189
2190 /// \name Haswell
2191 /// Haswell microarchitecture based processors.
2192 CK_Haswell,
2193
2194 /// \name Broadwell
2195 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002196 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002197
2198 /// \name Skylake
2199 /// Skylake microarchitecture based processors.
2200 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002201
Craig Topper449314e2013-08-20 07:09:39 +00002202 /// \name Knights Landing
2203 /// Knights Landing processor.
2204 CK_KNL,
2205
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002206 /// \name K6
2207 /// K6 architecture processors.
2208 //@{
2209 CK_K6,
2210 CK_K6_2,
2211 CK_K6_3,
2212 //@}
2213
2214 /// \name K7
2215 /// K7 architecture processors.
2216 //@{
2217 CK_Athlon,
2218 CK_AthlonThunderbird,
2219 CK_Athlon4,
2220 CK_AthlonXP,
2221 CK_AthlonMP,
2222 //@}
2223
2224 /// \name K8
2225 /// K8 architecture processors.
2226 //@{
2227 CK_Athlon64,
2228 CK_Athlon64SSE3,
2229 CK_AthlonFX,
2230 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002231 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002232 CK_Opteron,
2233 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002234 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002235 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002236
Benjamin Kramer569f2152012-01-10 11:50:18 +00002237 /// \name Bobcat
2238 /// Bobcat architecture processors.
2239 //@{
2240 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002241 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002242 //@}
2243
2244 /// \name Bulldozer
2245 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002246 //@{
2247 CK_BDVER1,
2248 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002249 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002250 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002251 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002252
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002253 /// This specification is deprecated and will be removed in the future.
2254 /// Users should prefer \see CK_K8.
2255 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002256 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002257 CK_x86_64,
2258 //@}
2259
2260 /// \name Geode
2261 /// Geode processors.
2262 //@{
2263 CK_Geode
2264 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002265 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002266
Eric Christopherc50738f2015-08-27 00:05:50 +00002267 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002268 return llvm::StringSwitch<CPUKind>(CPU)
2269 .Case("i386", CK_i386)
2270 .Case("i486", CK_i486)
2271 .Case("winchip-c6", CK_WinChipC6)
2272 .Case("winchip2", CK_WinChip2)
2273 .Case("c3", CK_C3)
2274 .Case("i586", CK_i586)
2275 .Case("pentium", CK_Pentium)
2276 .Case("pentium-mmx", CK_PentiumMMX)
2277 .Case("i686", CK_i686)
2278 .Case("pentiumpro", CK_PentiumPro)
2279 .Case("pentium2", CK_Pentium2)
2280 .Case("pentium3", CK_Pentium3)
2281 .Case("pentium3m", CK_Pentium3M)
2282 .Case("pentium-m", CK_PentiumM)
2283 .Case("c3-2", CK_C3_2)
2284 .Case("yonah", CK_Yonah)
2285 .Case("pentium4", CK_Pentium4)
2286 .Case("pentium4m", CK_Pentium4M)
2287 .Case("prescott", CK_Prescott)
2288 .Case("nocona", CK_Nocona)
2289 .Case("core2", CK_Core2)
2290 .Case("penryn", CK_Penryn)
2291 .Case("bonnell", CK_Bonnell)
2292 .Case("atom", CK_Bonnell) // Legacy name.
2293 .Case("silvermont", CK_Silvermont)
2294 .Case("slm", CK_Silvermont) // Legacy name.
2295 .Case("nehalem", CK_Nehalem)
2296 .Case("corei7", CK_Nehalem) // Legacy name.
2297 .Case("westmere", CK_Westmere)
2298 .Case("sandybridge", CK_SandyBridge)
2299 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2300 .Case("ivybridge", CK_IvyBridge)
2301 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2302 .Case("haswell", CK_Haswell)
2303 .Case("core-avx2", CK_Haswell) // Legacy name.
2304 .Case("broadwell", CK_Broadwell)
2305 .Case("skylake", CK_Skylake)
2306 .Case("skx", CK_Skylake) // Legacy name.
2307 .Case("knl", CK_KNL)
2308 .Case("k6", CK_K6)
2309 .Case("k6-2", CK_K6_2)
2310 .Case("k6-3", CK_K6_3)
2311 .Case("athlon", CK_Athlon)
2312 .Case("athlon-tbird", CK_AthlonThunderbird)
2313 .Case("athlon-4", CK_Athlon4)
2314 .Case("athlon-xp", CK_AthlonXP)
2315 .Case("athlon-mp", CK_AthlonMP)
2316 .Case("athlon64", CK_Athlon64)
2317 .Case("athlon64-sse3", CK_Athlon64SSE3)
2318 .Case("athlon-fx", CK_AthlonFX)
2319 .Case("k8", CK_K8)
2320 .Case("k8-sse3", CK_K8SSE3)
2321 .Case("opteron", CK_Opteron)
2322 .Case("opteron-sse3", CK_OpteronSSE3)
2323 .Case("barcelona", CK_AMDFAM10)
2324 .Case("amdfam10", CK_AMDFAM10)
2325 .Case("btver1", CK_BTVER1)
2326 .Case("btver2", CK_BTVER2)
2327 .Case("bdver1", CK_BDVER1)
2328 .Case("bdver2", CK_BDVER2)
2329 .Case("bdver3", CK_BDVER3)
2330 .Case("bdver4", CK_BDVER4)
2331 .Case("x86-64", CK_x86_64)
2332 .Case("geode", CK_Geode)
2333 .Default(CK_Generic);
2334 }
2335
Rafael Espindolaeb265472013-08-21 21:59:03 +00002336 enum FPMathKind {
2337 FP_Default,
2338 FP_SSE,
2339 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002340 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002341
Eli Friedman3fd920a2008-08-20 02:34:37 +00002342public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002343 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002344 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002345 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002346 }
Craig Topper3164f332014-03-11 03:39:26 +00002347 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002348 // X87 evaluates with 80 bits "long double" precision.
2349 return SSELevel == NoSSE ? 2 : 0;
2350 }
Craig Topper6c03a542015-10-19 04:51:35 +00002351 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2352 return llvm::makeArrayRef(BuiltinInfo,
2353 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002354 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002355 ArrayRef<const char *> getGCCRegNames() const override {
2356 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002357 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002358 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2359 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002360 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002361 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2362 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002363 }
Eric Christopherd9832702015-06-29 21:00:05 +00002364 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002365 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002366 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002367
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002368 bool validateGlobalRegisterVariable(StringRef RegName,
2369 unsigned RegSize,
2370 bool &HasSizeMismatch) const override {
2371 // esp and ebp are the only 32-bit registers the x86 backend can currently
2372 // handle.
2373 if (RegName.equals("esp") || RegName.equals("ebp")) {
2374 // Check that the register size is 32-bit.
2375 HasSizeMismatch = RegSize != 32;
2376 return true;
2377 }
2378
2379 return false;
2380 }
2381
Akira Hatanaka974131e2014-09-18 18:17:18 +00002382 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2383
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002384 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2385
Akira Hatanaka974131e2014-09-18 18:17:18 +00002386 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2387
Craig Topper3164f332014-03-11 03:39:26 +00002388 std::string convertConstraint(const char *&Constraint) const override;
2389 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002390 return "~{dirflag},~{fpsr},~{flags}";
2391 }
Craig Topper3164f332014-03-11 03:39:26 +00002392 void getTargetDefines(const LangOptions &Opts,
2393 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002394 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2395 bool Enabled);
2396 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2397 bool Enabled);
2398 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2399 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002400 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2401 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002402 setFeatureEnabledImpl(Features, Name, Enabled);
2403 }
2404 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002405 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002406 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2407 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002408 bool
2409 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2410 StringRef CPU,
2411 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002412 bool hasFeature(StringRef Feature) const override;
2413 bool handleTargetFeatures(std::vector<std::string> &Features,
2414 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002415 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002416 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2417 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002418 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002419 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002420 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002421 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002422 return "no-mmx";
2423 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002424 }
Craig Topper3164f332014-03-11 03:39:26 +00002425 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002426 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002427
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002428 // Perform any per-CPU checks necessary to determine if this CPU is
2429 // acceptable.
2430 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2431 // invalid without explaining *why*.
2432 switch (CPU) {
2433 case CK_Generic:
2434 // No processor selected!
2435 return false;
2436
2437 case CK_i386:
2438 case CK_i486:
2439 case CK_WinChipC6:
2440 case CK_WinChip2:
2441 case CK_C3:
2442 case CK_i586:
2443 case CK_Pentium:
2444 case CK_PentiumMMX:
2445 case CK_i686:
2446 case CK_PentiumPro:
2447 case CK_Pentium2:
2448 case CK_Pentium3:
2449 case CK_Pentium3M:
2450 case CK_PentiumM:
2451 case CK_Yonah:
2452 case CK_C3_2:
2453 case CK_Pentium4:
2454 case CK_Pentium4M:
2455 case CK_Prescott:
2456 case CK_K6:
2457 case CK_K6_2:
2458 case CK_K6_3:
2459 case CK_Athlon:
2460 case CK_AthlonThunderbird:
2461 case CK_Athlon4:
2462 case CK_AthlonXP:
2463 case CK_AthlonMP:
2464 case CK_Geode:
2465 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002466 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002467 return false;
2468
2469 // Fallthrough
2470 case CK_Nocona:
2471 case CK_Core2:
2472 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002473 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002474 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002475 case CK_Nehalem:
2476 case CK_Westmere:
2477 case CK_SandyBridge:
2478 case CK_IvyBridge:
2479 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002480 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002481 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002482 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002483 case CK_Athlon64:
2484 case CK_Athlon64SSE3:
2485 case CK_AthlonFX:
2486 case CK_K8:
2487 case CK_K8SSE3:
2488 case CK_Opteron:
2489 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002490 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002491 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002492 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002493 case CK_BDVER1:
2494 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002495 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002496 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002497 case CK_x86_64:
2498 return true;
2499 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002500 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002501 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002502
Craig Topper3164f332014-03-11 03:39:26 +00002503 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002504
Craig Topper3164f332014-03-11 03:39:26 +00002505 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002506 // We accept all non-ARM calling conventions
2507 return (CC == CC_X86ThisCall ||
2508 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002509 CC == CC_X86StdCall ||
2510 CC == CC_X86VectorCall ||
2511 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002512 CC == CC_X86Pascal ||
2513 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002514 }
2515
Craig Topper3164f332014-03-11 03:39:26 +00002516 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002517 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002518 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002519
2520 bool hasSjLjLowering() const override {
2521 return true;
2522 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002523};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002524
Rafael Espindolaeb265472013-08-21 21:59:03 +00002525bool X86TargetInfo::setFPMath(StringRef Name) {
2526 if (Name == "387") {
2527 FPMath = FP_387;
2528 return true;
2529 }
2530 if (Name == "sse") {
2531 FPMath = FP_SSE;
2532 return true;
2533 }
2534 return false;
2535}
2536
Eric Christopher007b0a02015-08-28 22:32:01 +00002537bool X86TargetInfo::initFeatureMap(
2538 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002539 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002540 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002541 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002542 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002543 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002544
Eric Christopher2b4a7252015-08-27 00:05:52 +00002545 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002546 case CK_Generic:
2547 case CK_i386:
2548 case CK_i486:
2549 case CK_i586:
2550 case CK_Pentium:
2551 case CK_i686:
2552 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002553 break;
2554 case CK_PentiumMMX:
2555 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002556 case CK_K6:
2557 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002558 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002559 break;
2560 case CK_Pentium3:
2561 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002562 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002563 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002564 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002565 break;
2566 case CK_PentiumM:
2567 case CK_Pentium4:
2568 case CK_Pentium4M:
2569 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002570 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002571 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002572 break;
2573 case CK_Yonah:
2574 case CK_Prescott:
2575 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002576 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002577 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002578 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002579 break;
2580 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002581 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002582 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002583 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002584 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002585 break;
2586 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002587 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002588 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002589 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002590 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002591 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002592 setFeatureEnabledImpl(Features, "avx512f", true);
2593 setFeatureEnabledImpl(Features, "avx512cd", true);
2594 setFeatureEnabledImpl(Features, "avx512dq", true);
2595 setFeatureEnabledImpl(Features, "avx512bw", true);
2596 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002597 setFeatureEnabledImpl(Features, "xsavec", true);
2598 setFeatureEnabledImpl(Features, "xsaves", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002599 // FALLTHROUGH
2600 case CK_Broadwell:
2601 setFeatureEnabledImpl(Features, "rdseed", true);
2602 setFeatureEnabledImpl(Features, "adx", true);
2603 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002604 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002605 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002606 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002607 setFeatureEnabledImpl(Features, "bmi", true);
2608 setFeatureEnabledImpl(Features, "bmi2", true);
2609 setFeatureEnabledImpl(Features, "rtm", true);
2610 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002611 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002612 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002613 setFeatureEnabledImpl(Features, "rdrnd", true);
2614 setFeatureEnabledImpl(Features, "f16c", true);
2615 setFeatureEnabledImpl(Features, "fsgsbase", true);
2616 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002617 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002618 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002619 setFeatureEnabledImpl(Features, "xsave", true);
2620 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002621 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002622 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002623 case CK_Silvermont:
2624 setFeatureEnabledImpl(Features, "aes", true);
2625 setFeatureEnabledImpl(Features, "pclmul", true);
2626 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002627 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002628 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002629 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002630 setFeatureEnabledImpl(Features, "cx16", true);
2631 break;
2632 case CK_KNL:
2633 setFeatureEnabledImpl(Features, "avx512f", true);
2634 setFeatureEnabledImpl(Features, "avx512cd", true);
2635 setFeatureEnabledImpl(Features, "avx512er", true);
2636 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002637 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002638 setFeatureEnabledImpl(Features, "rdseed", true);
2639 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002640 setFeatureEnabledImpl(Features, "lzcnt", true);
2641 setFeatureEnabledImpl(Features, "bmi", true);
2642 setFeatureEnabledImpl(Features, "bmi2", true);
2643 setFeatureEnabledImpl(Features, "rtm", true);
2644 setFeatureEnabledImpl(Features, "fma", true);
2645 setFeatureEnabledImpl(Features, "rdrnd", true);
2646 setFeatureEnabledImpl(Features, "f16c", true);
2647 setFeatureEnabledImpl(Features, "fsgsbase", true);
2648 setFeatureEnabledImpl(Features, "aes", true);
2649 setFeatureEnabledImpl(Features, "pclmul", true);
2650 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002651 setFeatureEnabledImpl(Features, "xsaveopt", true);
2652 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002653 break;
2654 case CK_K6_2:
2655 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002656 case CK_WinChip2:
2657 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002658 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002660 case CK_Athlon:
2661 case CK_AthlonThunderbird:
2662 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002663 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002664 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002665 case CK_Athlon4:
2666 case CK_AthlonXP:
2667 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002668 setFeatureEnabledImpl(Features, "sse", true);
2669 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002670 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002671 break;
2672 case CK_K8:
2673 case CK_Opteron:
2674 case CK_Athlon64:
2675 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002676 setFeatureEnabledImpl(Features, "sse2", true);
2677 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002678 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002679 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002680 case CK_AMDFAM10:
2681 setFeatureEnabledImpl(Features, "sse4a", true);
2682 setFeatureEnabledImpl(Features, "lzcnt", true);
2683 setFeatureEnabledImpl(Features, "popcnt", true);
2684 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002685 case CK_K8SSE3:
2686 case CK_OpteronSSE3:
2687 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002688 setFeatureEnabledImpl(Features, "sse3", true);
2689 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002690 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002691 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002692 case CK_BTVER2:
2693 setFeatureEnabledImpl(Features, "avx", true);
2694 setFeatureEnabledImpl(Features, "aes", true);
2695 setFeatureEnabledImpl(Features, "pclmul", true);
2696 setFeatureEnabledImpl(Features, "bmi", true);
2697 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002698 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002699 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002700 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002701 setFeatureEnabledImpl(Features, "ssse3", true);
2702 setFeatureEnabledImpl(Features, "sse4a", true);
2703 setFeatureEnabledImpl(Features, "lzcnt", true);
2704 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002705 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002706 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002707 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002708 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002709 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002710 case CK_BDVER4:
2711 setFeatureEnabledImpl(Features, "avx2", true);
2712 setFeatureEnabledImpl(Features, "bmi2", true);
2713 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002714 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002715 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002716 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002717 // FALLTHROUGH
2718 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002719 setFeatureEnabledImpl(Features, "bmi", true);
2720 setFeatureEnabledImpl(Features, "fma", true);
2721 setFeatureEnabledImpl(Features, "f16c", true);
2722 setFeatureEnabledImpl(Features, "tbm", true);
2723 // FALLTHROUGH
2724 case CK_BDVER1:
2725 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002726 setFeatureEnabledImpl(Features, "xop", true);
2727 setFeatureEnabledImpl(Features, "lzcnt", true);
2728 setFeatureEnabledImpl(Features, "aes", true);
2729 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002730 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002731 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002732 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002733 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002734 break;
Eli Friedman33465822011-07-08 23:31:17 +00002735 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002736 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2737 return false;
2738
2739 // Can't do this earlier because we need to be able to explicitly enable
2740 // or disable these features and the things that they depend upon.
2741
2742 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2743 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002744 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002745 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2746 FeaturesVec.end())
2747 Features["popcnt"] = true;
2748
2749 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2750 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002751 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002752 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2753 FeaturesVec.end())
2754 Features["prfchw"] = true;
2755
Eric Christophera7260af2015-10-08 20:10:18 +00002756 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2757 // then enable MMX.
2758 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002759 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002760 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2761 FeaturesVec.end())
2762 Features["mmx"] = true;
2763
Eric Christopherbbd746d2015-10-08 20:10:14 +00002764 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002765}
2766
Rafael Espindolae62e2792013-08-20 13:44:29 +00002767void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002768 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002769 if (Enabled) {
2770 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002771 case AVX512F:
2772 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002773 case AVX2:
2774 Features["avx2"] = true;
2775 case AVX:
2776 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002777 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002778 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002779 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002780 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002781 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002782 case SSSE3:
2783 Features["ssse3"] = true;
2784 case SSE3:
2785 Features["sse3"] = true;
2786 case SSE2:
2787 Features["sse2"] = true;
2788 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002789 Features["sse"] = true;
2790 case NoSSE:
2791 break;
2792 }
2793 return;
2794 }
2795
2796 switch (Level) {
2797 case NoSSE:
2798 case SSE1:
2799 Features["sse"] = false;
2800 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002801 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2802 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002803 case SSE3:
2804 Features["sse3"] = false;
2805 setXOPLevel(Features, NoXOP, false);
2806 case SSSE3:
2807 Features["ssse3"] = false;
2808 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002809 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002810 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002811 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002812 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002813 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2814 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002815 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002816 case AVX2:
2817 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002818 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002819 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002820 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2821 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002822 }
2823}
2824
2825void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002826 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002827 if (Enabled) {
2828 switch (Level) {
2829 case AMD3DNowAthlon:
2830 Features["3dnowa"] = true;
2831 case AMD3DNow:
2832 Features["3dnow"] = true;
2833 case MMX:
2834 Features["mmx"] = true;
2835 case NoMMX3DNow:
2836 break;
2837 }
2838 return;
2839 }
2840
2841 switch (Level) {
2842 case NoMMX3DNow:
2843 case MMX:
2844 Features["mmx"] = false;
2845 case AMD3DNow:
2846 Features["3dnow"] = false;
2847 case AMD3DNowAthlon:
2848 Features["3dnowa"] = false;
2849 }
2850}
2851
2852void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002853 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002854 if (Enabled) {
2855 switch (Level) {
2856 case XOP:
2857 Features["xop"] = true;
2858 case FMA4:
2859 Features["fma4"] = true;
2860 setSSELevel(Features, AVX, true);
2861 case SSE4A:
2862 Features["sse4a"] = true;
2863 setSSELevel(Features, SSE3, true);
2864 case NoXOP:
2865 break;
2866 }
2867 return;
2868 }
2869
2870 switch (Level) {
2871 case NoXOP:
2872 case SSE4A:
2873 Features["sse4a"] = false;
2874 case FMA4:
2875 Features["fma4"] = false;
2876 case XOP:
2877 Features["xop"] = false;
2878 }
2879}
2880
Craig Topper86d79ef2013-09-17 04:51:29 +00002881void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2882 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002883 // This is a bit of a hack to deal with the sse4 target feature when used
2884 // as part of the target attribute. We handle sse4 correctly everywhere
2885 // else. See below for more information on how we handle the sse4 options.
2886 if (Name != "sse4")
2887 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002888
Craig Topper29561122013-09-19 01:13:07 +00002889 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002890 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002891 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002892 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002893 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002894 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002895 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002896 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002897 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002898 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002899 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002900 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002901 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002902 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002903 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002904 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002905 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002906 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002907 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002908 if (Enabled)
2909 setSSELevel(Features, SSE2, Enabled);
2910 } else if (Name == "pclmul") {
2911 if (Enabled)
2912 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002913 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002914 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002915 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002916 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002917 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002918 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002919 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2920 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002921 if (Enabled)
2922 setSSELevel(Features, AVX512F, Enabled);
2923 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002924 if (Enabled)
2925 setSSELevel(Features, AVX, Enabled);
2926 } else if (Name == "fma4") {
2927 setXOPLevel(Features, FMA4, Enabled);
2928 } else if (Name == "xop") {
2929 setXOPLevel(Features, XOP, Enabled);
2930 } else if (Name == "sse4a") {
2931 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002932 } else if (Name == "f16c") {
2933 if (Enabled)
2934 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002935 } else if (Name == "sha") {
2936 if (Enabled)
2937 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002938 } else if (Name == "sse4") {
2939 // We can get here via the __target__ attribute since that's not controlled
2940 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2941 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2942 // disabled.
2943 if (Enabled)
2944 setSSELevel(Features, SSE42, Enabled);
2945 else
2946 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002947 } else if (Name == "xsave") {
2948 if (Enabled)
2949 setSSELevel(Features, AVX, Enabled);
2950 else
2951 Features["xsaveopt"] = false;
2952 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2953 if (Enabled) {
2954 Features["xsave"] = true;
2955 setSSELevel(Features, AVX, Enabled);
2956 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002957 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002958}
2959
Eric Christopher3ff21b32013-10-16 21:26:26 +00002960/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002961/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002962bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002963 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002964 for (const auto &Feature : Features) {
2965 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002966 continue;
2967
Eric Christopher610fe112015-08-26 08:21:55 +00002968 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002969 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002970 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002971 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002972 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002973 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002974 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002975 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002976 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002977 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002978 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002979 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002980 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002981 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002982 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002983 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002984 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002985 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002986 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002987 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002988 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002989 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002990 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002991 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002992 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002993 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002994 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002995 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002996 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002997 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002998 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002999 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003000 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003001 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003002 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003003 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003004 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003005 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003006 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003007 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003008 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003009 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003010 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003011 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003012 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003013 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003014 } else if (Feature == "+fxsr") {
3015 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003016 } else if (Feature == "+xsave") {
3017 HasXSAVE = true;
3018 } else if (Feature == "+xsaveopt") {
3019 HasXSAVEOPT = true;
3020 } else if (Feature == "+xsavec") {
3021 HasXSAVEC = true;
3022 } else if (Feature == "+xsaves") {
3023 HasXSAVES = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003024 }
3025
Benjamin Kramer27402c62012-03-05 15:10:44 +00003026 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003027 .Case("+avx512f", AVX512F)
3028 .Case("+avx2", AVX2)
3029 .Case("+avx", AVX)
3030 .Case("+sse4.2", SSE42)
3031 .Case("+sse4.1", SSE41)
3032 .Case("+ssse3", SSSE3)
3033 .Case("+sse3", SSE3)
3034 .Case("+sse2", SSE2)
3035 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003036 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003037 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003038
Eli Friedman33465822011-07-08 23:31:17 +00003039 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003040 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003041 .Case("+3dnowa", AMD3DNowAthlon)
3042 .Case("+3dnow", AMD3DNow)
3043 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003044 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003045 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003046
3047 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003048 .Case("+xop", XOP)
3049 .Case("+fma4", FMA4)
3050 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003051 .Default(NoXOP);
3052 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003053 }
Eli Friedman33465822011-07-08 23:31:17 +00003054
Rafael Espindolaeb265472013-08-21 21:59:03 +00003055 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3056 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003057 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3058 (FPMath == FP_387 && SSELevel >= SSE1)) {
3059 Diags.Report(diag::err_target_unsupported_fpmath) <<
3060 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003061 return false;
3062 }
3063
Alexey Bataev00396512015-07-02 03:40:19 +00003064 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003065 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003066 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003067}
Chris Lattnerecd49032009-03-02 22:27:17 +00003068
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003069/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3070/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003071void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003072 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003073 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003074 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003075 Builder.defineMacro("__amd64__");
3076 Builder.defineMacro("__amd64");
3077 Builder.defineMacro("__x86_64");
3078 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003079 if (getTriple().getArchName() == "x86_64h") {
3080 Builder.defineMacro("__x86_64h");
3081 Builder.defineMacro("__x86_64h__");
3082 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003083 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003084 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003085 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003086
Chris Lattnerecd49032009-03-02 22:27:17 +00003087 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003088 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3089 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003090 switch (CPU) {
3091 case CK_Generic:
3092 break;
3093 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003094 // The rest are coming from the i386 define above.
3095 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003096 break;
3097 case CK_i486:
3098 case CK_WinChipC6:
3099 case CK_WinChip2:
3100 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003101 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003102 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003103 case CK_PentiumMMX:
3104 Builder.defineMacro("__pentium_mmx__");
3105 Builder.defineMacro("__tune_pentium_mmx__");
3106 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003107 case CK_i586:
3108 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003109 defineCPUMacros(Builder, "i586");
3110 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003111 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003112 case CK_Pentium3:
3113 case CK_Pentium3M:
3114 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003115 Builder.defineMacro("__tune_pentium3__");
3116 // Fallthrough
3117 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003118 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003119 Builder.defineMacro("__tune_pentium2__");
3120 // Fallthrough
3121 case CK_PentiumPro:
3122 Builder.defineMacro("__tune_i686__");
3123 Builder.defineMacro("__tune_pentiumpro__");
3124 // Fallthrough
3125 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003126 Builder.defineMacro("__i686");
3127 Builder.defineMacro("__i686__");
3128 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3129 Builder.defineMacro("__pentiumpro");
3130 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003131 break;
3132 case CK_Pentium4:
3133 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003134 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003135 break;
3136 case CK_Yonah:
3137 case CK_Prescott:
3138 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003139 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003140 break;
3141 case CK_Core2:
3142 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003143 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003144 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003145 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003146 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003147 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003148 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003149 defineCPUMacros(Builder, "slm");
3150 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003151 case CK_Nehalem:
3152 case CK_Westmere:
3153 case CK_SandyBridge:
3154 case CK_IvyBridge:
3155 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003156 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003157 // FIXME: Historically, we defined this legacy name, it would be nice to
3158 // remove it at some point. We've never exposed fine-grained names for
3159 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003160 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003161 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003162 case CK_Skylake:
3163 // FIXME: Historically, we defined this legacy name, it would be nice to
3164 // remove it at some point. This is the only fine-grained CPU macro in the
3165 // main intel CPU line, and it would be better to not have these and force
3166 // people to use ISA macros.
3167 defineCPUMacros(Builder, "skx");
3168 break;
Craig Topper449314e2013-08-20 07:09:39 +00003169 case CK_KNL:
3170 defineCPUMacros(Builder, "knl");
3171 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003172 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003173 Builder.defineMacro("__k6_2__");
3174 Builder.defineMacro("__tune_k6_2__");
3175 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003176 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003177 if (CPU != CK_K6_2) { // In case of fallthrough
3178 // FIXME: GCC may be enabling these in cases where some other k6
3179 // architecture is specified but -m3dnow is explicitly provided. The
3180 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003181 Builder.defineMacro("__k6_3__");
3182 Builder.defineMacro("__tune_k6_3__");
3183 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003184 // Fallthrough
3185 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003186 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003187 break;
3188 case CK_Athlon:
3189 case CK_AthlonThunderbird:
3190 case CK_Athlon4:
3191 case CK_AthlonXP:
3192 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003193 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003194 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003195 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003196 Builder.defineMacro("__tune_athlon_sse__");
3197 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003198 break;
3199 case CK_K8:
3200 case CK_K8SSE3:
3201 case CK_x86_64:
3202 case CK_Opteron:
3203 case CK_OpteronSSE3:
3204 case CK_Athlon64:
3205 case CK_Athlon64SSE3:
3206 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003207 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003208 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003209 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003210 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003211 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003212 case CK_BTVER1:
3213 defineCPUMacros(Builder, "btver1");
3214 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003215 case CK_BTVER2:
3216 defineCPUMacros(Builder, "btver2");
3217 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003218 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003219 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003220 break;
3221 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003222 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003223 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003224 case CK_BDVER3:
3225 defineCPUMacros(Builder, "bdver3");
3226 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003227 case CK_BDVER4:
3228 defineCPUMacros(Builder, "bdver4");
3229 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003230 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003231 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003232 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003233 }
Chris Lattner96e43572009-03-02 22:40:39 +00003234
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003235 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003236 Builder.defineMacro("__REGISTER_PREFIX__", "");
3237
Chris Lattner6df41af2009-04-19 17:32:33 +00003238 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3239 // functions in glibc header files that use FP Stack inline asm which the
3240 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003241 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003242
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003243 if (HasAES)
3244 Builder.defineMacro("__AES__");
3245
Craig Topper3f122a72012-05-31 05:18:48 +00003246 if (HasPCLMUL)
3247 Builder.defineMacro("__PCLMUL__");
3248
Craig Topper22967d42011-12-25 05:06:45 +00003249 if (HasLZCNT)
3250 Builder.defineMacro("__LZCNT__");
3251
Benjamin Kramer1e250392012-07-07 09:39:18 +00003252 if (HasRDRND)
3253 Builder.defineMacro("__RDRND__");
3254
Craig Topper8c7f2512014-11-03 06:51:41 +00003255 if (HasFSGSBASE)
3256 Builder.defineMacro("__FSGSBASE__");
3257
Craig Topper22967d42011-12-25 05:06:45 +00003258 if (HasBMI)
3259 Builder.defineMacro("__BMI__");
3260
3261 if (HasBMI2)
3262 Builder.defineMacro("__BMI2__");
3263
Craig Topper1de83482011-12-29 16:10:46 +00003264 if (HasPOPCNT)
3265 Builder.defineMacro("__POPCNT__");
3266
Michael Liao625a8752012-11-10 05:17:46 +00003267 if (HasRTM)
3268 Builder.defineMacro("__RTM__");
3269
Michael Liao74f4eaf2013-03-26 17:52:08 +00003270 if (HasPRFCHW)
3271 Builder.defineMacro("__PRFCHW__");
3272
Michael Liaoffaae352013-03-29 05:17:55 +00003273 if (HasRDSEED)
3274 Builder.defineMacro("__RDSEED__");
3275
Robert Khasanov50e6f582014-09-19 09:53:48 +00003276 if (HasADX)
3277 Builder.defineMacro("__ADX__");
3278
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003279 if (HasTBM)
3280 Builder.defineMacro("__TBM__");
3281
Rafael Espindolae62e2792013-08-20 13:44:29 +00003282 switch (XOPLevel) {
3283 case XOP:
3284 Builder.defineMacro("__XOP__");
3285 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003286 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003287 case SSE4A:
3288 Builder.defineMacro("__SSE4A__");
3289 case NoXOP:
3290 break;
3291 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003292
Craig Topperbba778b2012-06-03 21:46:30 +00003293 if (HasFMA)
3294 Builder.defineMacro("__FMA__");
3295
Manman Rena45358c2012-10-11 00:59:55 +00003296 if (HasF16C)
3297 Builder.defineMacro("__F16C__");
3298
Craig Topper679b53a2013-08-21 05:29:10 +00003299 if (HasAVX512CD)
3300 Builder.defineMacro("__AVX512CD__");
3301 if (HasAVX512ER)
3302 Builder.defineMacro("__AVX512ER__");
3303 if (HasAVX512PF)
3304 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003305 if (HasAVX512DQ)
3306 Builder.defineMacro("__AVX512DQ__");
3307 if (HasAVX512BW)
3308 Builder.defineMacro("__AVX512BW__");
3309 if (HasAVX512VL)
3310 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003311
Ben Langmuir58078d02013-09-19 13:22:04 +00003312 if (HasSHA)
3313 Builder.defineMacro("__SHA__");
3314
Craig Toppere33f51f2015-10-16 06:22:36 +00003315 if (HasFXSR)
3316 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003317 if (HasXSAVE)
3318 Builder.defineMacro("__XSAVE__");
3319 if (HasXSAVEOPT)
3320 Builder.defineMacro("__XSAVEOPT__");
3321 if (HasXSAVEC)
3322 Builder.defineMacro("__XSAVEC__");
3323 if (HasXSAVES)
3324 Builder.defineMacro("__XSAVES__");
3325
Nick Lewycky50e8f482013-10-05 20:14:27 +00003326 if (HasCX16)
3327 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3328
Chris Lattner96e43572009-03-02 22:40:39 +00003329 // Each case falls through to the previous one here.
3330 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003331 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003332 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003333 case AVX2:
3334 Builder.defineMacro("__AVX2__");
3335 case AVX:
3336 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003337 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003338 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003339 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003340 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003341 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003342 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003343 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003344 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003345 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003346 Builder.defineMacro("__SSE2__");
3347 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003348 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003349 Builder.defineMacro("__SSE__");
3350 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003351 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003352 break;
3353 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003354
Derek Schuffc7dd7222012-10-11 15:52:22 +00003355 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003356 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003357 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003358 case AVX2:
3359 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003360 case SSE42:
3361 case SSE41:
3362 case SSSE3:
3363 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003364 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003365 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003366 break;
3367 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003368 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003369 break;
3370 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003371 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003372 }
3373 }
3374
Anders Carlssone437c682010-01-27 03:47:49 +00003375 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003376 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003377 case AMD3DNowAthlon:
3378 Builder.defineMacro("__3dNOW_A__");
3379 case AMD3DNow:
3380 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003381 case MMX:
3382 Builder.defineMacro("__MMX__");
3383 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003384 break;
3385 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003386
3387 if (CPU >= CK_i486) {
3388 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3389 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3390 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3391 }
3392 if (CPU >= CK_i586)
3393 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003394}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003395
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003396bool X86TargetInfo::hasFeature(StringRef Feature) const {
3397 return llvm::StringSwitch<bool>(Feature)
3398 .Case("aes", HasAES)
3399 .Case("avx", SSELevel >= AVX)
3400 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003401 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003402 .Case("avx512cd", HasAVX512CD)
3403 .Case("avx512er", HasAVX512ER)
3404 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003405 .Case("avx512dq", HasAVX512DQ)
3406 .Case("avx512bw", HasAVX512BW)
3407 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003408 .Case("bmi", HasBMI)
3409 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003410 .Case("cx16", HasCX16)
3411 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003412 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003413 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003414 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003415 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003416 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003417 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3418 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3419 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003420 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003421 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003422 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003423 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003424 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003425 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003426 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003427 .Case("sse", SSELevel >= SSE1)
3428 .Case("sse2", SSELevel >= SSE2)
3429 .Case("sse3", SSELevel >= SSE3)
3430 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003431 .Case("sse4.1", SSELevel >= SSE41)
3432 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003433 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003434 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003435 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003436 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3437 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003438 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003439 .Case("xsave", HasXSAVE)
3440 .Case("xsavec", HasXSAVEC)
3441 .Case("xsaves", HasXSAVES)
3442 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003443 .Default(false);
3444}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003445
Eric Christopherd9832702015-06-29 21:00:05 +00003446// We can't use a generic validation scheme for the features accepted here
3447// versus subtarget features accepted in the target attribute because the
3448// bitfield structure that's initialized in the runtime only supports the
3449// below currently rather than the full range of subtarget features. (See
3450// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3451bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3452 return llvm::StringSwitch<bool>(FeatureStr)
3453 .Case("cmov", true)
3454 .Case("mmx", true)
3455 .Case("popcnt", true)
3456 .Case("sse", true)
3457 .Case("sse2", true)
3458 .Case("sse3", true)
3459 .Case("sse4.1", true)
3460 .Case("sse4.2", true)
3461 .Case("avx", true)
3462 .Case("avx2", true)
3463 .Case("sse4a", true)
3464 .Case("fma4", true)
3465 .Case("xop", true)
3466 .Case("fma", true)
3467 .Case("avx512f", true)
3468 .Case("bmi", true)
3469 .Case("bmi2", true)
3470 .Default(false);
3471}
3472
Eli Friedman3fd920a2008-08-20 02:34:37 +00003473bool
Anders Carlsson58436352009-02-28 17:11:49 +00003474X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003475 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003476 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003477 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003478 // Constant constraints.
3479 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3480 // instructions.
3481 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3482 // x86_64 instructions.
3483 case 's':
3484 Info.setRequiresImmediate();
3485 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003486 case 'I':
3487 Info.setRequiresImmediate(0, 31);
3488 return true;
3489 case 'J':
3490 Info.setRequiresImmediate(0, 63);
3491 return true;
3492 case 'K':
3493 Info.setRequiresImmediate(-128, 127);
3494 return true;
3495 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003496 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003497 return true;
3498 case 'M':
3499 Info.setRequiresImmediate(0, 3);
3500 return true;
3501 case 'N':
3502 Info.setRequiresImmediate(0, 255);
3503 return true;
3504 case 'O':
3505 Info.setRequiresImmediate(0, 127);
3506 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003507 // Register constraints.
3508 case 'Y': // 'Y' is the first character for several 2-character constraints.
3509 // Shift the pointer to the second character of the constraint.
3510 Name++;
3511 switch (*Name) {
3512 default:
3513 return false;
3514 case '0': // First SSE register.
3515 case 't': // Any SSE register, when SSE2 is enabled.
3516 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3517 case 'm': // Any MMX register, when inter-unit moves enabled.
3518 Info.setAllowsRegister();
3519 return true;
3520 }
3521 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003522 // Constraint 'f' cannot be used for output operands.
3523 if (Info.ConstraintStr[0] == '=')
3524 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003525 Info.setAllowsRegister();
3526 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003527 case 'a': // eax.
3528 case 'b': // ebx.
3529 case 'c': // ecx.
3530 case 'd': // edx.
3531 case 'S': // esi.
3532 case 'D': // edi.
3533 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003534 case 't': // Top of floating point stack.
3535 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003536 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003537 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003538 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003539 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003540 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3541 case 'l': // "Index" registers: any general register that can be used as an
3542 // index in a base+index memory access.
3543 Info.setAllowsRegister();
3544 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003545 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003546 case 'C': // SSE floating point constant.
3547 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003548 return true;
3549 }
3550}
3551
Akira Hatanaka974131e2014-09-18 18:17:18 +00003552bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3553 unsigned Size) const {
3554 // Strip off constraint modifiers.
3555 while (Constraint[0] == '=' ||
3556 Constraint[0] == '+' ||
3557 Constraint[0] == '&')
3558 Constraint = Constraint.substr(1);
3559
3560 return validateOperandSize(Constraint, Size);
3561}
3562
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003563bool X86TargetInfo::validateInputSize(StringRef Constraint,
3564 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003565 return validateOperandSize(Constraint, Size);
3566}
3567
3568bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3569 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003570 switch (Constraint[0]) {
3571 default: break;
3572 case 'y':
3573 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003574 case 'f':
3575 case 't':
3576 case 'u':
3577 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003578 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003579 if (SSELevel >= AVX512F)
3580 // 512-bit zmm registers can be used if target supports AVX512F.
3581 return Size <= 512U;
3582 else if (SSELevel >= AVX)
3583 // 256-bit ymm registers can be used if target supports AVX.
3584 return Size <= 256U;
3585 return Size <= 128U;
3586 case 'Y':
3587 // 'Y' is the first character for several 2-character constraints.
3588 switch (Constraint[1]) {
3589 default: break;
3590 case 'm':
3591 // 'Ym' is synonymous with 'y'.
3592 return Size <= 64;
3593 case 'i':
3594 case 't':
3595 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3596 if (SSELevel >= AVX512F)
3597 return Size <= 512U;
3598 else if (SSELevel >= AVX)
3599 return Size <= 256U;
3600 return SSELevel >= SSE2 && Size <= 128U;
3601 }
3602
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003603 }
3604
3605 return true;
3606}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003607
Eli Friedman3fd920a2008-08-20 02:34:37 +00003608std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003609X86TargetInfo::convertConstraint(const char *&Constraint) const {
3610 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003611 case 'a': return std::string("{ax}");
3612 case 'b': return std::string("{bx}");
3613 case 'c': return std::string("{cx}");
3614 case 'd': return std::string("{dx}");
3615 case 'S': return std::string("{si}");
3616 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003617 case 'p': // address
3618 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003619 case 't': // top of floating point stack.
3620 return std::string("{st}");
3621 case 'u': // second from top of floating point stack.
3622 return std::string("{st(1)}"); // second from top of floating point stack.
3623 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003624 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003625 }
3626}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003627
Eli Friedman3fd920a2008-08-20 02:34:37 +00003628// X86-32 generic target
3629class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003630public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003631 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003632 DoubleAlign = LongLongAlign = 32;
3633 LongDoubleWidth = 96;
3634 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003635 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003636 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003637 SizeType = UnsignedInt;
3638 PtrDiffType = SignedInt;
3639 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003640 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003641
3642 // Use fpret for all types.
3643 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3644 (1 << TargetInfo::Double) |
3645 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003646
3647 // x86-32 has atomics up to 8 bytes
3648 // FIXME: Check that we actually have cmpxchg8b before setting
3649 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3650 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003651 }
Craig Topper3164f332014-03-11 03:39:26 +00003652 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003653 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003654 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003655
Craig Topper3164f332014-03-11 03:39:26 +00003656 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003657 if (RegNo == 0) return 0;
3658 if (RegNo == 1) return 2;
3659 return -1;
3660 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003661 bool validateOperandSize(StringRef Constraint,
3662 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003663 switch (Constraint[0]) {
3664 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003665 case 'R':
3666 case 'q':
3667 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003668 case 'a':
3669 case 'b':
3670 case 'c':
3671 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003672 case 'S':
3673 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003674 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003675 case 'A':
3676 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003677 }
3678
Akira Hatanaka974131e2014-09-18 18:17:18 +00003679 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003680 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003681};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003682
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003683class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3684public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003685 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3686 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003687
Craig Topper3164f332014-03-11 03:39:26 +00003688 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003689 unsigned Major, Minor, Micro;
3690 getTriple().getOSVersion(Major, Minor, Micro);
3691 // New NetBSD uses the default rounding mode.
3692 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3693 return X86_32TargetInfo::getFloatEvalMethod();
3694 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003695 return 1;
3696 }
3697};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003698
Eli Friedmane3aa4542009-07-05 18:47:56 +00003699class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3700public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003701 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3702 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003703 SizeType = UnsignedLong;
3704 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003705 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003706 }
3707};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003708
Eli Friedman9fa28852012-08-08 23:57:20 +00003709class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3710public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003711 BitrigI386TargetInfo(const llvm::Triple &Triple)
3712 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003713 SizeType = UnsignedLong;
3714 IntPtrType = SignedLong;
3715 PtrDiffType = SignedLong;
3716 }
3717};
Eli Friedman9fa28852012-08-08 23:57:20 +00003718
Torok Edwinb2b37c62009-06-30 17:10:35 +00003719class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003720public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003721 DarwinI386TargetInfo(const llvm::Triple &Triple)
3722 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003723 LongDoubleWidth = 128;
3724 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003725 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003726 MaxVectorAlign = 256;
3727 // The watchOS simulator uses the builtin bool type for Objective-C.
3728 llvm::Triple T = llvm::Triple(Triple);
3729 if (T.isWatchOS())
3730 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003731 SizeType = UnsignedLong;
3732 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003733 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003734 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003735 }
3736
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003737 bool handleTargetFeatures(std::vector<std::string> &Features,
3738 DiagnosticsEngine &Diags) override {
3739 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3740 Diags))
3741 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003742 // We now know the features we have: we can decide how to align vectors.
3743 MaxVectorAlign =
3744 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003745 return true;
3746 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003747};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003748
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003749// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003750class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003751public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003752 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3753 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003754 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003755 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003756 bool IsWinCOFF =
3757 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003758 DataLayoutString = IsWinCOFF
3759 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3760 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003761 }
Craig Topper3164f332014-03-11 03:39:26 +00003762 void getTargetDefines(const LangOptions &Opts,
3763 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003764 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3765 }
3766};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003767
3768// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003769class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003770public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003771 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003772 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003773 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003774 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3775 }
Craig Topper3164f332014-03-11 03:39:26 +00003776 void getTargetDefines(const LangOptions &Opts,
3777 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003778 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3779 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3780 // The value of the following reflects processor type.
3781 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3782 // We lost the original triple, so we use the default.
3783 Builder.defineMacro("_M_IX86", "600");
3784 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003785};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003786
David Majnemerae1ed0e2015-05-28 04:36:18 +00003787static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003788 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3789 // supports __declspec natively under -fms-extensions, but we define a no-op
3790 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003791 if (Opts.MicrosoftExt)
3792 Builder.defineMacro("__declspec", "__declspec");
3793 else
3794 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3795
3796 if (!Opts.MicrosoftExt) {
3797 // Provide macros for all the calling convention keywords. Provide both
3798 // single and double underscore prefixed variants. These are available on
3799 // x64 as well as x86, even though they have no effect.
3800 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3801 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003802 std::string GCCSpelling = "__attribute__((__";
3803 GCCSpelling += CC;
3804 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003805 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3806 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3807 }
3808 }
3809}
3810
David Majnemerae1ed0e2015-05-28 04:36:18 +00003811static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3812 Builder.defineMacro("__MSVCRT__");
3813 Builder.defineMacro("__MINGW32__");
3814 addCygMingDefines(Opts, Builder);
3815}
3816
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003817// x86-32 MinGW target
3818class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3819public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003820 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003821 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003822 void getTargetDefines(const LangOptions &Opts,
3823 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003824 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003825 DefineStd(Builder, "WIN32", Opts);
3826 DefineStd(Builder, "WINNT", Opts);
3827 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003828 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003829 }
3830};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003831
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003832// x86-32 Cygwin target
3833class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3834public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003835 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3836 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003837 TLSSupported = false;
3838 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003839 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003840 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 +00003841 }
Craig Topper3164f332014-03-11 03:39:26 +00003842 void getTargetDefines(const LangOptions &Opts,
3843 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003844 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003845 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003846 Builder.defineMacro("__CYGWIN__");
3847 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003848 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003849 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003850 if (Opts.CPlusPlus)
3851 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003852 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003853};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003854
Chris Lattnerb986aba2010-04-11 19:29:39 +00003855// x86-32 Haiku target
3856class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3857public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003858 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003859 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003860 IntPtrType = SignedLong;
3861 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003862 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003863 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003864 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003865 }
Craig Topper3164f332014-03-11 03:39:26 +00003866 void getTargetDefines(const LangOptions &Opts,
3867 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003868 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3869 Builder.defineMacro("__INTEL__");
3870 Builder.defineMacro("__HAIKU__");
3871 }
3872};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003873
Alexey Bataevc99b0492015-11-25 09:24:26 +00003874// X86-32 MCU target
3875class MCUX86_32TargetInfo : public X86_32TargetInfo {
3876public:
3877 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3878 LongDoubleWidth = 64;
3879 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3880 }
3881
3882 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3883 // On MCU we support only C calling convention.
3884 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3885 }
3886
3887 void getTargetDefines(const LangOptions &Opts,
3888 MacroBuilder &Builder) const override {
3889 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3890 Builder.defineMacro("__iamcu");
3891 Builder.defineMacro("__iamcu__");
3892 }
3893};
3894
Douglas Gregor9fabd852011-07-01 22:41:14 +00003895// RTEMS Target
3896template<typename Target>
3897class RTEMSTargetInfo : public OSTargetInfo<Target> {
3898protected:
Craig Topper3164f332014-03-11 03:39:26 +00003899 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3900 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003901 // RTEMS defines; list based off of gcc output
3902
Douglas Gregor9fabd852011-07-01 22:41:14 +00003903 Builder.defineMacro("__rtems__");
3904 Builder.defineMacro("__ELF__");
3905 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003906
Douglas Gregor9fabd852011-07-01 22:41:14 +00003907public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003908 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3909 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003910
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003911 switch (Triple.getArch()) {
3912 default:
3913 case llvm::Triple::x86:
3914 // this->MCountName = ".mcount";
3915 break;
3916 case llvm::Triple::mips:
3917 case llvm::Triple::mipsel:
3918 case llvm::Triple::ppc:
3919 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003920 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003921 // this->MCountName = "_mcount";
3922 break;
3923 case llvm::Triple::arm:
3924 // this->MCountName = "__mcount";
3925 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003926 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003927 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003928};
3929
Douglas Gregor9fabd852011-07-01 22:41:14 +00003930// x86-32 RTEMS target
3931class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3932public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003933 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003934 SizeType = UnsignedLong;
3935 IntPtrType = SignedLong;
3936 PtrDiffType = SignedLong;
3937 this->UserLabelPrefix = "";
3938 }
Craig Topper3164f332014-03-11 03:39:26 +00003939 void getTargetDefines(const LangOptions &Opts,
3940 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003941 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3942 Builder.defineMacro("__INTEL__");
3943 Builder.defineMacro("__rtems__");
3944 }
3945};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003946
Eli Friedman3fd920a2008-08-20 02:34:37 +00003947// x86-64 generic target
3948class X86_64TargetInfo : public X86TargetInfo {
3949public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003950 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003951 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003952 bool IsWinCOFF =
3953 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003954 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003955 LongDoubleWidth = 128;
3956 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003957 LargeArrayMinWidth = 128;
3958 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003959 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003960 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3961 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3962 IntPtrType = IsX32 ? SignedInt : SignedLong;
3963 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003964 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003965 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003966
Eric Christopher917e9522014-11-18 22:36:15 +00003967 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003968 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3969 : IsWinCOFF
3970 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3971 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003972
3973 // Use fpret only for long double.
3974 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003975
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003976 // Use fp2ret for _Complex long double.
3977 ComplexLongDoubleUsesFP2Ret = true;
3978
Charles Davisc7d5c942015-09-17 20:55:33 +00003979 // Make __builtin_ms_va_list available.
3980 HasBuiltinMSVaList = true;
3981
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003982 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003983 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003984 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003985 }
Craig Topper3164f332014-03-11 03:39:26 +00003986 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003987 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003988 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003989
Craig Topper3164f332014-03-11 03:39:26 +00003990 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003991 if (RegNo == 0) return 0;
3992 if (RegNo == 1) return 1;
3993 return -1;
3994 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003995
Craig Topper3164f332014-03-11 03:39:26 +00003996 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003997 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003998 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003999 CC == CC_IntelOclBicc ||
4000 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004001 }
4002
Craig Topper3164f332014-03-11 03:39:26 +00004003 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004004 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004005 }
4006
Pavel Chupinfd223e12014-08-04 12:39:43 +00004007 // for x32 we need it here explicitly
4008 bool hasInt128Type() const override { return true; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004009
4010 bool validateGlobalRegisterVariable(StringRef RegName,
4011 unsigned RegSize,
4012 bool &HasSizeMismatch) const override {
4013 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4014 // handle.
4015 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4016 // Check that the register size is 64-bit.
4017 HasSizeMismatch = RegSize != 64;
4018 return true;
4019 }
4020
4021 // Check if the register is a 32-bit register the backend can handle.
4022 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4023 HasSizeMismatch);
4024 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004025};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004026
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004027// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004028class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004030 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4031 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004032 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004033 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004034 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004035 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004036 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004037 SizeType = UnsignedLongLong;
4038 PtrDiffType = SignedLongLong;
4039 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00004040 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004041 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004042
Craig Topper3164f332014-03-11 03:39:26 +00004043 void getTargetDefines(const LangOptions &Opts,
4044 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004045 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004046 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004047 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004048
Craig Topper3164f332014-03-11 03:39:26 +00004049 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004050 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004051 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004052
Craig Topper3164f332014-03-11 03:39:26 +00004053 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004054 switch (CC) {
4055 case CC_X86StdCall:
4056 case CC_X86ThisCall:
4057 case CC_X86FastCall:
4058 return CCCR_Ignore;
4059 case CC_C:
4060 case CC_X86VectorCall:
4061 case CC_IntelOclBicc:
4062 case CC_X86_64SysV:
4063 return CCCR_OK;
4064 default:
4065 return CCCR_Warning;
4066 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004067 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004068};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004069
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004070// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004071class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004072public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004073 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004074 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004075 LongDoubleWidth = LongDoubleAlign = 64;
4076 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004077 }
Craig Topper3164f332014-03-11 03:39:26 +00004078 void getTargetDefines(const LangOptions &Opts,
4079 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004080 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4081 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004082 Builder.defineMacro("_M_X64", "100");
4083 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004084 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004085};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004086
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004087// x86-64 MinGW target
4088class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4089public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004090 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004091 : WindowsX86_64TargetInfo(Triple) {
4092 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4093 // with x86 FP ops. Weird.
4094 LongDoubleWidth = LongDoubleAlign = 128;
4095 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4096 }
4097
Craig Topper3164f332014-03-11 03:39:26 +00004098 void getTargetDefines(const LangOptions &Opts,
4099 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004100 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004101 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004102 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004103 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004104
4105 // GCC defines this macro when it is using __gxx_personality_seh0.
4106 if (!Opts.SjLjExceptions)
4107 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004108 }
4109};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004110
Yaron Kerend030d112015-07-22 17:38:19 +00004111// x86-64 Cygwin target
4112class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4113public:
4114 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4115 : X86_64TargetInfo(Triple) {
4116 TLSSupported = false;
4117 WCharType = UnsignedShort;
4118 }
4119 void getTargetDefines(const LangOptions &Opts,
4120 MacroBuilder &Builder) const override {
4121 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4122 Builder.defineMacro("__x86_64__");
4123 Builder.defineMacro("__CYGWIN__");
4124 Builder.defineMacro("__CYGWIN64__");
4125 addCygMingDefines(Opts, Builder);
4126 DefineStd(Builder, "unix", Opts);
4127 if (Opts.CPlusPlus)
4128 Builder.defineMacro("_GNU_SOURCE");
4129
4130 // GCC defines this macro when it is using __gxx_personality_seh0.
4131 if (!Opts.SjLjExceptions)
4132 Builder.defineMacro("__SEH__");
4133 }
4134};
4135
Eli Friedman2857ccb2009-07-01 03:36:11 +00004136class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4137public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004138 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4139 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004140 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004141 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4142 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004143 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004144 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004145 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004146 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004147
4148 bool handleTargetFeatures(std::vector<std::string> &Features,
4149 DiagnosticsEngine &Diags) override {
4150 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4151 Diags))
4152 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004153 // We now know the features we have: we can decide how to align vectors.
4154 MaxVectorAlign =
4155 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004156 return true;
4157 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004158};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004159
Eli Friedman245f2292009-07-05 22:31:18 +00004160class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4161public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004162 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4163 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004164 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004165 Int64Type = SignedLongLong;
4166 }
4167};
Eli Friedman245f2292009-07-05 22:31:18 +00004168
Eli Friedman9fa28852012-08-08 23:57:20 +00004169class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4170public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004171 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4172 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4173 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004174 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004175 }
4176};
Tim Northover9bb857a2013-01-31 12:13:10 +00004177
Eli Friedmanf05b7722008-08-20 07:44:10 +00004178class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004179 // Possible FPU choices.
4180 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004181 VFP2FPU = (1 << 0),
4182 VFP3FPU = (1 << 1),
4183 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004184 NeonFPU = (1 << 3),
4185 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004186 };
4187
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004188 // Possible HWDiv features.
4189 enum HWDivMode {
4190 HWDivThumb = (1 << 0),
4191 HWDivARM = (1 << 1)
4192 };
4193
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004194 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004195 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004196 }
4197
4198 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4199 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004200
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004201 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004202
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004203 StringRef CPUProfile;
4204 StringRef CPUAttr;
4205
Rafael Espindolaeb265472013-08-21 21:59:03 +00004206 enum {
4207 FP_Default,
4208 FP_VFP,
4209 FP_Neon
4210 } FPMath;
4211
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004212 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004213 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004214 unsigned ArchProfile;
4215 unsigned ArchVersion;
4216
Bernard Ogdenda13af32013-10-24 18:32:51 +00004217 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004218
Logan Chien57086ce2012-10-10 06:56:20 +00004219 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004220 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004221
4222 // Initialized via features.
4223 unsigned SoftFloat : 1;
4224 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004225
Bernard Ogden18b57012013-10-29 09:47:51 +00004226 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004227 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004228 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004229 unsigned Unaligned : 1;
4230
4231 enum {
4232 LDREX_B = (1 << 0), /// byte (8-bit)
4233 LDREX_H = (1 << 1), /// half (16-bit)
4234 LDREX_W = (1 << 2), /// word (32-bit)
4235 LDREX_D = (1 << 3), /// double (64-bit)
4236 };
4237
4238 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004239
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004240 // ACLE 6.5.1 Hardware floating point
4241 enum {
4242 HW_FP_HP = (1 << 1), /// half (16-bit)
4243 HW_FP_SP = (1 << 2), /// single (32-bit)
4244 HW_FP_DP = (1 << 3), /// double (64-bit)
4245 };
4246 uint32_t HW_FP;
4247
Chris Lattner5cc15e02010-03-03 19:03:45 +00004248 static const Builtin::Info BuiltinInfo[];
4249
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004250 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004251 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004252
4253 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004254 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004255
Renato Golin9ba39232015-02-27 16:35:48 +00004256 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4257 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4258 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004259 SizeType = UnsignedLong;
4260 else
4261 SizeType = UnsignedInt;
4262
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004263 switch (T.getOS()) {
4264 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004265 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004266 break;
4267 case llvm::Triple::Win32:
4268 WCharType = UnsignedShort;
4269 break;
4270 case llvm::Triple::Linux:
4271 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004272 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4273 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004274 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004275 }
4276
4277 UseBitFieldTypeAlignment = true;
4278
4279 ZeroLengthBitfieldBoundary = 0;
4280
Tim Northover147cd2f2014-10-14 22:12:21 +00004281 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4282 // so set preferred for small types to 32.
4283 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004284 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004285 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4286 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4287 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004288 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004289 DataLayoutString = "e"
4290 "-m:w"
4291 "-p:32:32"
4292 "-i64:64"
4293 "-v128:64:128"
4294 "-a:0:32"
4295 "-n32"
4296 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004297 } else if (T.isOSNaCl()) {
4298 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004299 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004300 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004301 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004302 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4303 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004304 }
4305
4306 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004307 }
4308
Tim Northover5627d392015-10-30 16:30:45 +00004309 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004310 const llvm::Triple &T = getTriple();
4311
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004312 IsAAPCS = false;
4313
Tim Northover5627d392015-10-30 16:30:45 +00004314 if (IsAAPCS16)
4315 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4316 else
4317 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004318
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004319 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004320 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004321 SizeType = UnsignedInt;
4322 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004323 SizeType = UnsignedLong;
4324
4325 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4326 WCharType = SignedInt;
4327
4328 // Do not respect the alignment of bit-field types when laying out
4329 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4330 UseBitFieldTypeAlignment = false;
4331
4332 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4333 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4334 /// gcc.
4335 ZeroLengthBitfieldBoundary = 32;
4336
Tim Northover5627d392015-10-30 16:30:45 +00004337 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4338 assert(!BigEndian && "AAPCS16 does not support big-endian");
4339 DataLayoutString = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128";
4340 } else if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004341 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004342 BigEndian
4343 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4344 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4345 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004346 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004347 BigEndian
4348 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4349 : "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 +00004350
4351 // FIXME: Override "preferred align" for double and long long.
4352 }
4353
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004354 void setArchInfo() {
4355 StringRef ArchName = getTriple().getArchName();
4356
Renato Goline84b0002015-10-08 16:43:26 +00004357 ArchISA = llvm::ARM::parseArchISA(ArchName);
4358 CPU = llvm::ARM::getDefaultCPU(ArchName);
4359 unsigned AK = llvm::ARM::parseArch(ArchName);
4360 if (AK != llvm::ARM::AK_INVALID)
4361 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004362 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004363 }
4364
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004365 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004366 StringRef SubArch;
4367
4368 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004369 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004370 SubArch = llvm::ARM::getSubArch(ArchKind);
4371 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4372 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004373
4374 // cache CPU related strings
4375 CPUAttr = getCPUAttr();
4376 CPUProfile = getCPUProfile();
4377 }
4378
4379 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004380 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004381 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004382 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004383 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4384 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004385 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004386 if (ArchProfile == llvm::ARM::PK_M) {
4387 MaxAtomicPromoteWidth = 32;
4388 if (ShouldUseInlineAtomic)
4389 MaxAtomicInlineWidth = 32;
4390 }
4391 else {
4392 MaxAtomicPromoteWidth = 64;
4393 if (ShouldUseInlineAtomic)
4394 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004395 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004396 }
4397
4398 bool isThumb() const {
4399 return (ArchISA == llvm::ARM::IK_THUMB);
4400 }
4401
4402 bool supportsThumb() const {
4403 return CPUAttr.count('T') || ArchVersion >= 6;
4404 }
4405
4406 bool supportsThumb2() const {
4407 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4408 }
4409
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004410 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004411 // For most sub-arches, the build attribute CPU name is enough.
4412 // For Cortex variants, it's slightly different.
4413 switch(ArchKind) {
4414 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004415 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004416 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004417 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004418 case llvm::ARM::AK_ARMV7S:
4419 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004420 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004421 return "7A";
4422 case llvm::ARM::AK_ARMV7R:
4423 return "7R";
4424 case llvm::ARM::AK_ARMV7M:
4425 return "7M";
4426 case llvm::ARM::AK_ARMV7EM:
4427 return "7EM";
4428 case llvm::ARM::AK_ARMV8A:
4429 return "8A";
4430 case llvm::ARM::AK_ARMV8_1A:
4431 return "8_1A";
4432 }
4433 }
4434
4435 StringRef getCPUProfile() const {
4436 switch(ArchProfile) {
4437 case llvm::ARM::PK_A:
4438 return "A";
4439 case llvm::ARM::PK_R:
4440 return "R";
4441 case llvm::ARM::PK_M:
4442 return "M";
4443 default:
4444 return "";
4445 }
4446 }
4447
Chris Lattner17df24e2008-04-21 18:56:49 +00004448public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004449 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004450 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004451 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004452 BigEndian = IsBigEndian;
4453
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004454 switch (getTriple().getOS()) {
4455 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004456 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004457 break;
4458 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004459 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004460 break;
4461 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004462
Renato Goline84b0002015-10-08 16:43:26 +00004463 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004464 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004465
Chris Lattner1a8f3942010-04-23 16:29:58 +00004466 // {} in inline assembly are neon specifiers, not assembly variant
4467 // specifiers.
4468 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004469
Eric Christopher0e261882014-12-05 01:06:59 +00004470 // FIXME: This duplicates code from the driver that sets the -target-abi
4471 // option - this code is used if -target-abi isn't passed and should
4472 // be unified in some way.
4473 if (Triple.isOSBinFormatMachO()) {
4474 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4475 // the frontend matches that.
4476 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4477 Triple.getOS() == llvm::Triple::UnknownOS ||
4478 StringRef(CPU).startswith("cortex-m")) {
4479 setABI("aapcs");
Tim Northover5627d392015-10-30 16:30:45 +00004480 } else if (Triple.isWatchOS()) {
4481 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004482 } else {
4483 setABI("apcs-gnu");
4484 }
4485 } else if (Triple.isOSWindows()) {
4486 // FIXME: this is invalid for WindowsCE
4487 setABI("aapcs");
4488 } else {
4489 // Select the default based on the platform.
4490 switch (Triple.getEnvironment()) {
4491 case llvm::Triple::Android:
4492 case llvm::Triple::GNUEABI:
4493 case llvm::Triple::GNUEABIHF:
4494 setABI("aapcs-linux");
4495 break;
4496 case llvm::Triple::EABIHF:
4497 case llvm::Triple::EABI:
4498 setABI("aapcs");
4499 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004500 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004501 setABI("apcs-gnu");
4502 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004503 default:
4504 if (Triple.getOS() == llvm::Triple::NetBSD)
4505 setABI("apcs-gnu");
4506 else
4507 setABI("aapcs");
4508 break;
4509 }
4510 }
John McCall86353412010-08-21 22:46:04 +00004511
4512 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004513 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004514
Renato Golin15b86152015-07-03 16:41:13 +00004515 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004516 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004517
James Molloya7139222012-03-12 09:14:10 +00004518 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004519 // the alignment of the zero-length bitfield is greater than the member
4520 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004521 // zero length bitfield.
4522 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004523 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004524
Alp Toker4925ba72014-06-07 23:30:42 +00004525 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004526
Craig Topper3164f332014-03-11 03:39:26 +00004527 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004528 ABI = Name;
4529
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004530 // The defaults (above) are for AAPCS, check if we need to change them.
4531 //
4532 // FIXME: We need support for -meabi... we could just mangle it into the
4533 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004534 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004535 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004536 return true;
4537 }
4538 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4539 setABIAAPCS();
4540 return true;
4541 }
4542 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004543 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004544
Renato Golinf5c4dec2015-05-27 13:33:00 +00004545 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004546 bool
4547 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4548 StringRef CPU,
4549 const std::vector<std::string> &FeaturesVec) const override {
4550
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004551 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004552 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004553
4554 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004555 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004556 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4557
4558 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004559 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004560 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4561
4562 for (const char *Feature : TargetFeatures)
4563 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004564 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004565
Eric Christopher007b0a02015-08-28 22:32:01 +00004566 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004567 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004568
Craig Topper3164f332014-03-11 03:39:26 +00004569 bool handleTargetFeatures(std::vector<std::string> &Features,
4570 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004571 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004572 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004573 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004574 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004575 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004576 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004577 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004578
Ranjeet Singhac08e532015-06-24 23:39:25 +00004579 // This does not diagnose illegal cases like having both
4580 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4581 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004582 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004583 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004584 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004585 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004586 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004587 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004588 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004589 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004590 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004591 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004592 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004593 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004594 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004595 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004596 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004597 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004598 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004599 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004600 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004601 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004602 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004603 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004604 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004605 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004606 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004607 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004608 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004609 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004610 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004611 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004612 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004613 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004614 } else if (Feature == "+strict-align") {
4615 Unaligned = 0;
4616 } else if (Feature == "+fp16") {
4617 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004618 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004619 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004620 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004621
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004622 switch (ArchVersion) {
4623 case 6:
4624 if (ArchProfile == llvm::ARM::PK_M)
4625 LDREX = 0;
4626 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4627 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4628 else
4629 LDREX = LDREX_W;
4630 break;
4631 case 7:
4632 if (ArchProfile == llvm::ARM::PK_M)
4633 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4634 else
4635 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4636 break;
4637 case 8:
4638 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4639 }
4640
Rafael Espindolaeb265472013-08-21 21:59:03 +00004641 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4642 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4643 return false;
4644 }
4645
4646 if (FPMath == FP_Neon)
4647 Features.push_back("+neonfp");
4648 else if (FPMath == FP_VFP)
4649 Features.push_back("-neonfp");
4650
Daniel Dunbar893d4752009-12-19 04:15:38 +00004651 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004652 auto Feature =
4653 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4654 if (Feature != Features.end())
4655 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004656
Rafael Espindolaeb265472013-08-21 21:59:03 +00004657 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004658 }
4659
Craig Topper3164f332014-03-11 03:39:26 +00004660 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004661 return llvm::StringSwitch<bool>(Feature)
4662 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004663 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004664 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004665 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004666 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004667 .Case("hwdiv", HWDiv & HWDivThumb)
4668 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004669 .Default(false);
4670 }
Renato Golin15b86152015-07-03 16:41:13 +00004671
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004672 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004673 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004674 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004675
Renato Golin15b86152015-07-03 16:41:13 +00004676 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004677 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004678 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004679 CPU = Name;
4680 return true;
4681 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004682
Craig Topper3164f332014-03-11 03:39:26 +00004683 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004684
Craig Topper3164f332014-03-11 03:39:26 +00004685 void getTargetDefines(const LangOptions &Opts,
4686 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004687 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004688 Builder.defineMacro("__arm");
4689 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004690
Chris Lattnerecd49032009-03-02 22:27:17 +00004691 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004692 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004693
4694 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4695 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
4696 if (getTriple().isWatchOS())
4697 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4698
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004699 if (!CPUAttr.empty())
4700 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004701
4702 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004703 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004704 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004705
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004706 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004707 // ACLE 6.5.7 Crypto Extension
4708 if (Crypto)
4709 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4710 // ACLE 6.5.8 CRC32 Extension
4711 if (CRC)
4712 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4713 // ACLE 6.5.10 Numeric Maximum and Minimum
4714 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4715 // ACLE 6.5.9 Directed Rounding
4716 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004717 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004718
4719 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4720 // is not defined for the M-profile.
4721 // NOTE that the deffault profile is assumed to be 'A'
4722 if (CPUProfile.empty() || CPUProfile != "M")
4723 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4724
4725 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4726 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4727 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004728 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004729 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004730 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004731 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4732
4733 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4734 // instruction set such as ARM or Thumb.
4735 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4736
4737 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4738
4739 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004740 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004741 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004742
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004743 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004744 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004745 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004746
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004747 // ACLE 6.4.4 LDREX/STREX
4748 if (LDREX)
4749 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4750
4751 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004752 if (ArchVersion == 5 ||
4753 (ArchVersion == 6 && CPUProfile != "M") ||
4754 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004755 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4756
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004757 // ACLE 6.5.1 Hardware Floating Point
4758 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004759 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004760
Yi Konga44c4d72014-06-27 21:25:42 +00004761 // ACLE predefines.
4762 Builder.defineMacro("__ARM_ACLE", "200");
4763
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004764 // FP16 support (we currently only support IEEE format).
4765 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4766 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4767
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004768 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4769 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4770 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4771
Mike Stump9d54bd72009-04-08 02:07:04 +00004772 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004773
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004774 // FIXME: It's more complicated than this and we don't really support
4775 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004776 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004777 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004778 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004779
David Tweed8f676532012-10-25 13:33:01 +00004780 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004781 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004782 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4783 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004784 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004785 Builder.defineMacro("__ARM_PCS", "1");
4786
David Tweed8f676532012-10-25 13:33:01 +00004787 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004788 Builder.defineMacro("__ARM_PCS_VFP", "1");
4789 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004790
Daniel Dunbar893d4752009-12-19 04:15:38 +00004791 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004792 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004793
4794 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004795 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004796
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004797 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004798 Builder.defineMacro("__THUMBEL__");
4799 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004800 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004801 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004802 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004803
4804 // ACLE 6.4.9 32-bit SIMD instructions
4805 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4806 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4807
4808 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004809 if (((HWDiv & HWDivThumb) && isThumb()) ||
4810 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004811 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004812 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004813 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004814
4815 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004816 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004817
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004818 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004819 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004820 if (FPU & VFP2FPU)
4821 Builder.defineMacro("__ARM_VFPV2__");
4822 if (FPU & VFP3FPU)
4823 Builder.defineMacro("__ARM_VFPV3__");
4824 if (FPU & VFP4FPU)
4825 Builder.defineMacro("__ARM_VFPV4__");
4826 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004827
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004828 // This only gets set when Neon instructions are actually available, unlike
4829 // the VFP define, hence the soft float and arch check. This is subtly
4830 // different from gcc, we follow the intent which was that it should be set
4831 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004832 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004833 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004834 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004835 // current AArch32 NEON implementations do not support double-precision
4836 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004837 Builder.defineMacro("__ARM_NEON_FP",
4838 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004839 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004840
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004841 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4842 Opts.ShortWChar ? "2" : "4");
4843
4844 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4845 Opts.ShortEnums ? "1" : "4");
4846
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004847 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004848 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4849 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4850 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4851 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4852 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004853
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004854 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004855 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004856 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004857 }
4858
4859 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004860 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004861 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4862 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004863 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004864 }
4865
4866 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004867 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004868 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004869
4870 if (Opts.UnsafeFPMath)
4871 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004872
4873 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4874 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004875 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004876
Craig Topper6c03a542015-10-19 04:51:35 +00004877 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4878 return llvm::makeArrayRef(BuiltinInfo,
4879 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004880 }
Craig Topper3164f332014-03-11 03:39:26 +00004881 bool isCLZForZeroUndef() const override { return false; }
4882 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004883 return IsAAPCS
4884 ? AAPCSABIBuiltinVaList
4885 : (getTriple().isWatchOS() ? TargetInfo::CharPtrBuiltinVaList
4886 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00004887 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004888 ArrayRef<const char *> getGCCRegNames() const override;
4889 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004890 bool validateAsmConstraint(const char *&Name,
4891 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004892 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004893 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004894 case 'l': // r0-r7
4895 case 'h': // r8-r15
4896 case 'w': // VFP Floating point register single precision
4897 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004898 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004899 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004900 case 'I':
4901 case 'J':
4902 case 'K':
4903 case 'L':
4904 case 'M':
4905 // FIXME
4906 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004907 case 'Q': // A memory address that is a single base register.
4908 Info.setAllowsMemory();
4909 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004910 case 'U': // a memory reference...
4911 switch (Name[1]) {
4912 case 'q': // ...ARMV4 ldrsb
4913 case 'v': // ...VFP load/store (reg+constant offset)
4914 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004915 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004916 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004917 case 'n': // valid address for Neon doubleword vector load/store
4918 case 'm': // valid address for Neon element and structure load/store
4919 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004920 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004921 Info.setAllowsMemory();
4922 Name++;
4923 return true;
4924 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004925 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004926 return false;
4927 }
Craig Topper3164f332014-03-11 03:39:26 +00004928 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004929 std::string R;
4930 switch (*Constraint) {
4931 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004932 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004933 Constraint++;
4934 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004935 case 'p': // 'p' should be translated to 'r' by default.
4936 R = std::string("r");
4937 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004938 default:
4939 return std::string(1, *Constraint);
4940 }
4941 return R;
4942 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004943 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004944 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004945 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004946 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004947 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004948
Bill Wendling9d1ee112012-10-25 23:28:48 +00004949 // Strip off constraint modifiers.
4950 while (Constraint[0] == '=' ||
4951 Constraint[0] == '+' ||
4952 Constraint[0] == '&')
4953 Constraint = Constraint.substr(1);
4954
4955 switch (Constraint[0]) {
4956 default: break;
4957 case 'r': {
4958 switch (Modifier) {
4959 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004960 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004961 case 'q':
4962 // A register of size 32 cannot fit a vector type.
4963 return false;
4964 }
4965 }
4966 }
4967
4968 return true;
4969 }
Craig Topper3164f332014-03-11 03:39:26 +00004970 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004971 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004972 return "";
4973 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004974
Craig Topper3164f332014-03-11 03:39:26 +00004975 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004976 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4977 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004978
Craig Topper3164f332014-03-11 03:39:26 +00004979 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004980 if (RegNo == 0) return 0;
4981 if (RegNo == 1) return 1;
4982 return -1;
4983 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004984
4985 bool hasSjLjLowering() const override {
4986 return true;
4987 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004988};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004989
Rafael Espindolaeb265472013-08-21 21:59:03 +00004990bool ARMTargetInfo::setFPMath(StringRef Name) {
4991 if (Name == "neon") {
4992 FPMath = FP_Neon;
4993 return true;
4994 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4995 Name == "vfp4") {
4996 FPMath = FP_VFP;
4997 return true;
4998 }
4999 return false;
5000}
5001
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005002const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005003 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005004 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005005 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5006
5007 // Float registers
5008 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5009 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5010 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005011 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005012
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005013 // Double registers
5014 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5015 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005016 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5017 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005018
5019 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005020 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5021 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005022};
5023
Craig Topperf054e3a2015-10-19 03:52:27 +00005024ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5025 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005026}
5027
5028const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005029 { { "a1" }, "r0" },
5030 { { "a2" }, "r1" },
5031 { { "a3" }, "r2" },
5032 { { "a4" }, "r3" },
5033 { { "v1" }, "r4" },
5034 { { "v2" }, "r5" },
5035 { { "v3" }, "r6" },
5036 { { "v4" }, "r7" },
5037 { { "v5" }, "r8" },
5038 { { "v6", "rfp" }, "r9" },
5039 { { "sl" }, "r10" },
5040 { { "fp" }, "r11" },
5041 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005042 { { "r13" }, "sp" },
5043 { { "r14" }, "lr" },
5044 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005045 // The S, D and Q registers overlap, but aren't really aliases; we
5046 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005047};
5048
Craig Topperf054e3a2015-10-19 03:52:27 +00005049ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5050 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005051}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005052
5053const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005054#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005055 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005056#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5057 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005058#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005059
Craig Topper07d3b622015-08-07 05:14:44 +00005060#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005061 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005062#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005063 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005064#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5065 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005066#include "clang/Basic/BuiltinsARM.def"
5067};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005068
5069class ARMleTargetInfo : public ARMTargetInfo {
5070public:
5071 ARMleTargetInfo(const llvm::Triple &Triple)
5072 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005073 void getTargetDefines(const LangOptions &Opts,
5074 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005075 Builder.defineMacro("__ARMEL__");
5076 ARMTargetInfo::getTargetDefines(Opts, Builder);
5077 }
5078};
5079
5080class ARMbeTargetInfo : public ARMTargetInfo {
5081public:
5082 ARMbeTargetInfo(const llvm::Triple &Triple)
5083 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005084 void getTargetDefines(const LangOptions &Opts,
5085 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005086 Builder.defineMacro("__ARMEB__");
5087 Builder.defineMacro("__ARM_BIG_ENDIAN");
5088 ARMTargetInfo::getTargetDefines(Opts, Builder);
5089 }
5090};
Chris Lattner17df24e2008-04-21 18:56:49 +00005091
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005092class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5093 const llvm::Triple Triple;
5094public:
5095 WindowsARMTargetInfo(const llvm::Triple &Triple)
5096 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
5097 TLSSupported = false;
5098 WCharType = UnsignedShort;
5099 SizeType = UnsignedInt;
5100 UserLabelPrefix = "";
5101 }
5102 void getVisualStudioDefines(const LangOptions &Opts,
5103 MacroBuilder &Builder) const {
5104 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5105
5106 // FIXME: this is invalid for WindowsCE
5107 Builder.defineMacro("_M_ARM_NT", "1");
5108 Builder.defineMacro("_M_ARMT", "_M_ARM");
5109 Builder.defineMacro("_M_THUMB", "_M_ARM");
5110
5111 assert((Triple.getArch() == llvm::Triple::arm ||
5112 Triple.getArch() == llvm::Triple::thumb) &&
5113 "invalid architecture for Windows ARM target info");
5114 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5115 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5116
5117 // TODO map the complete set of values
5118 // 31: VFPv3 40: VFPv4
5119 Builder.defineMacro("_M_ARM_FP", "31");
5120 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005121 BuiltinVaListKind getBuiltinVaListKind() const override {
5122 return TargetInfo::CharPtrBuiltinVaList;
5123 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005124 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5125 switch (CC) {
5126 case CC_X86StdCall:
5127 case CC_X86ThisCall:
5128 case CC_X86FastCall:
5129 case CC_X86VectorCall:
5130 return CCCR_Ignore;
5131 case CC_C:
5132 return CCCR_OK;
5133 default:
5134 return CCCR_Warning;
5135 }
5136 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005137};
5138
5139// Windows ARM + Itanium C++ ABI Target
5140class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5141public:
5142 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5143 : WindowsARMTargetInfo(Triple) {
5144 TheCXXABI.set(TargetCXXABI::GenericARM);
5145 }
5146
5147 void getTargetDefines(const LangOptions &Opts,
5148 MacroBuilder &Builder) const override {
5149 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5150
5151 if (Opts.MSVCCompat)
5152 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5153 }
5154};
5155
5156// Windows ARM, MS (C++) ABI
5157class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5158public:
5159 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5160 : WindowsARMTargetInfo(Triple) {
5161 TheCXXABI.set(TargetCXXABI::Microsoft);
5162 }
5163
5164 void getTargetDefines(const LangOptions &Opts,
5165 MacroBuilder &Builder) const override {
5166 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5167 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5168 }
5169};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005170
Yaron Keren321249c2015-07-15 13:32:23 +00005171// ARM MinGW target
5172class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5173public:
5174 MinGWARMTargetInfo(const llvm::Triple &Triple)
5175 : WindowsARMTargetInfo(Triple) {
5176 TheCXXABI.set(TargetCXXABI::GenericARM);
5177 }
5178
5179 void getTargetDefines(const LangOptions &Opts,
5180 MacroBuilder &Builder) const override {
5181 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5182 DefineStd(Builder, "WIN32", Opts);
5183 DefineStd(Builder, "WINNT", Opts);
5184 Builder.defineMacro("_ARM_");
5185 addMinGWDefines(Opts, Builder);
5186 }
5187};
5188
5189// ARM Cygwin target
5190class CygwinARMTargetInfo : public ARMleTargetInfo {
5191public:
5192 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5193 TLSSupported = false;
5194 WCharType = UnsignedShort;
5195 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005196 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005197 }
5198 void getTargetDefines(const LangOptions &Opts,
5199 MacroBuilder &Builder) const override {
5200 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5201 Builder.defineMacro("_ARM_");
5202 Builder.defineMacro("__CYGWIN__");
5203 Builder.defineMacro("__CYGWIN32__");
5204 DefineStd(Builder, "unix", Opts);
5205 if (Opts.CPlusPlus)
5206 Builder.defineMacro("_GNU_SOURCE");
5207 }
5208};
5209
Mike Stump11289f42009-09-09 15:08:12 +00005210class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005211 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005212protected:
Craig Topper3164f332014-03-11 03:39:26 +00005213 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5214 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005215 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005216 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005217
Torok Edwinb2b37c62009-06-30 17:10:35 +00005218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005219 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005220 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005221 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005222 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005223 // FIXME: This should be based off of the target features in
5224 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005225 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005226
Tim Northover5627d392015-10-30 16:30:45 +00005227 if (Triple.isWatchOS()) {
5228 // Darwin on iOS uses a variant of the ARM C++ ABI.
5229 TheCXXABI.set(TargetCXXABI::WatchOS);
5230
5231 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5232 // size_t is long, it's a bit weird for it to be int.
5233 PtrDiffType = SignedLong;
5234
5235 // BOOL should be a real boolean on the new ABI
5236 UseSignedCharForObjCBool = false;
5237 } else
5238 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005239 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005240};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005241
Tim Northover573cbee2014-05-24 12:52:07 +00005242class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005243 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005244 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5245 static const char *const GCCRegNames[];
5246
James Molloy75f5f9e2014-04-16 15:33:48 +00005247 enum FPUModeEnum {
5248 FPUMode,
5249 NeonMode
5250 };
5251
5252 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005253 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005254 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005255 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005256 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005257
Tim Northovera2ee4332014-03-29 15:09:45 +00005258 static const Builtin::Info BuiltinInfo[];
5259
5260 std::string ABI;
5261
5262public:
Tim Northover573cbee2014-05-24 12:52:07 +00005263 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005264 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005265
5266 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5267 WCharType = SignedInt;
5268
5269 // NetBSD apparently prefers consistency across ARM targets to consistency
5270 // across 64-bit targets.
5271 Int64Type = SignedLongLong;
5272 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005273 } else {
5274 WCharType = UnsignedInt;
5275 Int64Type = SignedLong;
5276 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005277 }
5278
Tim Northovera2ee4332014-03-29 15:09:45 +00005279 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005280 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005281 MaxAtomicInlineWidth = 128;
5282 MaxAtomicPromoteWidth = 128;
5283
Tim Northovera6a19f12015-02-06 01:25:07 +00005284 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005285 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5286
Tim Northovera2ee4332014-03-29 15:09:45 +00005287 // {} in inline assembly are neon specifiers, not assembly variant
5288 // specifiers.
5289 NoAsmVariants = true;
5290
Tim Northover7ad87af2015-01-16 18:44:04 +00005291 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5292 // contributes to the alignment of the containing aggregate in the same way
5293 // a plain (non bit-field) member of that type would, without exception for
5294 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005295 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005296 UseZeroLengthBitfieldAlignment = true;
5297
Tim Northover573cbee2014-05-24 12:52:07 +00005298 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005299 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5300 }
5301
Alp Toker4925ba72014-06-07 23:30:42 +00005302 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005303 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005304 if (Name != "aapcs" && Name != "darwinpcs")
5305 return false;
5306
5307 ABI = Name;
5308 return true;
5309 }
5310
David Blaikie1cbb9712014-11-14 19:09:44 +00005311 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005312 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005313 .Case("generic", true)
Christof Doumaba13ad52015-12-02 12:03:42 +00005314 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "cortex-a35", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005315 .Case("cyclone", true)
5316 .Default(false);
5317 return CPUKnown;
5318 }
5319
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005320 void getTargetDefines(const LangOptions &Opts,
5321 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005322 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005323 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005324
5325 // Target properties.
5326 Builder.defineMacro("_LP64");
5327 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005328
5329 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5330 Builder.defineMacro("__ARM_ACLE", "200");
5331 Builder.defineMacro("__ARM_ARCH", "8");
5332 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5333
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005334 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005335 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005336 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005337
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005338 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5339 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5340 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5341 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005342 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005343 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5344 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005345
5346 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5347
5348 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005349 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005350
5351 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5352 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005353 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5354 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005355
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005356 if (Opts.UnsafeFPMath)
5357 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005358
5359 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5360
5361 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5362 Opts.ShortEnums ? "1" : "4");
5363
James Molloy75f5f9e2014-04-16 15:33:48 +00005364 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005365 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005366 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005367 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005368 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005369
Bradley Smith418c5932014-05-02 15:17:51 +00005370 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005371 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005372
James Molloy75f5f9e2014-04-16 15:33:48 +00005373 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005374 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5375
5376 if (Unaligned)
5377 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005378
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005379 if (V8_1A)
5380 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5381
Reid Klecknerd167d422015-05-06 15:31:46 +00005382 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5383 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5384 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5385 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5386 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005387 }
5388
Craig Topper6c03a542015-10-19 04:51:35 +00005389 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5390 return llvm::makeArrayRef(BuiltinInfo,
5391 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005392 }
5393
David Blaikie1cbb9712014-11-14 19:09:44 +00005394 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005395 return Feature == "aarch64" ||
5396 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005397 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005398 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005399 }
5400
James Molloy5e73df52014-04-16 15:06:20 +00005401 bool handleTargetFeatures(std::vector<std::string> &Features,
5402 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005403 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005404 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005405 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005406 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005407 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005408
Eric Christopher610fe112015-08-26 08:21:55 +00005409 for (const auto &Feature : Features) {
5410 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005411 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005412 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005413 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005414 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005415 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005416 if (Feature == "+strict-align")
5417 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005418 if (Feature == "+v8.1a")
5419 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005420 }
5421
Eric Christopher964a5f32015-08-05 23:48:05 +00005422 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005423
5424 return true;
5425 }
5426
David Blaikie1cbb9712014-11-14 19:09:44 +00005427 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005428
David Blaikie1cbb9712014-11-14 19:09:44 +00005429 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005430 return TargetInfo::AArch64ABIBuiltinVaList;
5431 }
5432
Craig Topperf054e3a2015-10-19 03:52:27 +00005433 ArrayRef<const char *> getGCCRegNames() const override;
5434 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005435
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005436 bool validateAsmConstraint(const char *&Name,
5437 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005438 switch (*Name) {
5439 default:
5440 return false;
5441 case 'w': // Floating point and SIMD registers (V0-V31)
5442 Info.setAllowsRegister();
5443 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005444 case 'I': // Constant that can be used with an ADD instruction
5445 case 'J': // Constant that can be used with a SUB instruction
5446 case 'K': // Constant that can be used with a 32-bit logical instruction
5447 case 'L': // Constant that can be used with a 64-bit logical instruction
5448 case 'M': // Constant that can be used as a 32-bit MOV immediate
5449 case 'N': // Constant that can be used as a 64-bit MOV immediate
5450 case 'Y': // Floating point constant zero
5451 case 'Z': // Integer constant zero
5452 return true;
5453 case 'Q': // A memory reference with base register and no offset
5454 Info.setAllowsMemory();
5455 return true;
5456 case 'S': // A symbolic address
5457 Info.setAllowsRegister();
5458 return true;
5459 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005460 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5461 // Utf: A memory address suitable for ldp/stp in TF mode.
5462 // Usa: An absolute symbolic address.
5463 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5464 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005465 case 'z': // Zero register, wzr or xzr
5466 Info.setAllowsRegister();
5467 return true;
5468 case 'x': // Floating point and SIMD registers (V0-V15)
5469 Info.setAllowsRegister();
5470 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005471 }
5472 return false;
5473 }
5474
Akira Hatanaka987f1862014-08-22 06:05:21 +00005475 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005476 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005477 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005478 // Strip off constraint modifiers.
5479 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5480 Constraint = Constraint.substr(1);
5481
5482 switch (Constraint[0]) {
5483 default:
5484 return true;
5485 case 'z':
5486 case 'r': {
5487 switch (Modifier) {
5488 case 'x':
5489 case 'w':
5490 // For now assume that the person knows what they're
5491 // doing with the modifier.
5492 return true;
5493 default:
5494 // By default an 'r' constraint will be in the 'x'
5495 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005496 if (Size == 64)
5497 return true;
5498
5499 SuggestedModifier = "w";
5500 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005501 }
5502 }
5503 }
5504 }
5505
David Blaikie1cbb9712014-11-14 19:09:44 +00005506 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005507
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005508 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005509 if (RegNo == 0)
5510 return 0;
5511 if (RegNo == 1)
5512 return 1;
5513 return -1;
5514 }
5515};
5516
Tim Northover573cbee2014-05-24 12:52:07 +00005517const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005518 // 32-bit Integer registers
5519 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5520 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5521 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5522
5523 // 64-bit Integer registers
5524 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5525 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5526 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5527
5528 // 32-bit floating point regsisters
5529 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5530 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5531 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5532
5533 // 64-bit floating point regsisters
5534 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5535 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5536 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5537
5538 // Vector registers
5539 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5540 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5541 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5542};
5543
Craig Topperf054e3a2015-10-19 03:52:27 +00005544ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5545 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005546}
5547
Tim Northover573cbee2014-05-24 12:52:07 +00005548const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005549 { { "w31" }, "wsp" },
5550 { { "x29" }, "fp" },
5551 { { "x30" }, "lr" },
5552 { { "x31" }, "sp" },
5553 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5554 // don't want to substitute one of these for a different-sized one.
5555};
5556
Craig Topperf054e3a2015-10-19 03:52:27 +00005557ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5558 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005559}
5560
Tim Northover573cbee2014-05-24 12:52:07 +00005561const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005562#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005563 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005564#include "clang/Basic/BuiltinsNEON.def"
5565
5566#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005567 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005568#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005569};
James Molloy5e73df52014-04-16 15:06:20 +00005570
Tim Northover573cbee2014-05-24 12:52:07 +00005571class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005572 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005573 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005574 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005575 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005576 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005577 }
5578
5579public:
Tim Northover573cbee2014-05-24 12:52:07 +00005580 AArch64leTargetInfo(const llvm::Triple &Triple)
5581 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005582 BigEndian = false;
5583 }
5584 void getTargetDefines(const LangOptions &Opts,
5585 MacroBuilder &Builder) const override {
5586 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005587 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005588 }
5589};
5590
Tim Northover573cbee2014-05-24 12:52:07 +00005591class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005592 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005593 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005594 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005595 }
5596
5597public:
Tim Northover573cbee2014-05-24 12:52:07 +00005598 AArch64beTargetInfo(const llvm::Triple &Triple)
5599 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005600 void getTargetDefines(const LangOptions &Opts,
5601 MacroBuilder &Builder) const override {
5602 Builder.defineMacro("__AARCH64EB__");
5603 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5604 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005605 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005606 }
5607};
Tim Northovera2ee4332014-03-29 15:09:45 +00005608
Tim Northover573cbee2014-05-24 12:52:07 +00005609class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005610protected:
5611 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5612 MacroBuilder &Builder) const override {
5613 Builder.defineMacro("__AARCH64_SIMD__");
5614 Builder.defineMacro("__ARM64_ARCH_8__");
5615 Builder.defineMacro("__ARM_NEON__");
5616 Builder.defineMacro("__LITTLE_ENDIAN__");
5617 Builder.defineMacro("__REGISTER_PREFIX__", "");
5618 Builder.defineMacro("__arm64", "1");
5619 Builder.defineMacro("__arm64__", "1");
5620
5621 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5622 }
5623
Tim Northovera2ee4332014-03-29 15:09:45 +00005624public:
Tim Northover573cbee2014-05-24 12:52:07 +00005625 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5626 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005627 Int64Type = SignedLongLong;
5628 WCharType = SignedInt;
5629 UseSignedCharForObjCBool = false;
5630
Tim Northovera6a19f12015-02-06 01:25:07 +00005631 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005632 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5633
5634 TheCXXABI.set(TargetCXXABI::iOS64);
5635 }
5636
David Blaikie1cbb9712014-11-14 19:09:44 +00005637 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005638 return TargetInfo::CharPtrBuiltinVaList;
5639 }
5640};
Tim Northovera2ee4332014-03-29 15:09:45 +00005641
Tony Linthicum76329bf2011-12-12 21:14:55 +00005642// Hexagon abstract base class
5643class HexagonTargetInfo : public TargetInfo {
5644 static const Builtin::Info BuiltinInfo[];
5645 static const char * const GCCRegNames[];
5646 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5647 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005648 bool HasHVX, HasHVXDouble;
5649
Tony Linthicum76329bf2011-12-12 21:14:55 +00005650public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005651 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005652 BigEndian = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005653 DataLayoutString = "e-m:e-p:32:32:32-"
5654 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-"
5655 "f64:64:64-f32:32:32-v64:64:64-v32:32:32-a:0-n16:32";
5656 SizeType = UnsignedInt;
5657 PtrDiffType = SignedInt;
5658 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005659
5660 // {} in inline assembly are packet specifiers, not assembly variant
5661 // specifiers.
5662 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005663
5664 LargeArrayMinWidth = 64;
5665 LargeArrayAlign = 64;
5666 UseBitFieldTypeAlignment = true;
5667 ZeroLengthBitfieldBoundary = 32;
5668 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005669 }
5670
Craig Topper6c03a542015-10-19 04:51:35 +00005671 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5672 return llvm::makeArrayRef(BuiltinInfo,
5673 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005674 }
5675
Craig Topper3164f332014-03-11 03:39:26 +00005676 bool validateAsmConstraint(const char *&Name,
5677 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005678 return true;
5679 }
5680
Craig Topper3164f332014-03-11 03:39:26 +00005681 void getTargetDefines(const LangOptions &Opts,
5682 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005683
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005684 bool isCLZForZeroUndef() const override { return false; }
5685
Craig Topper3164f332014-03-11 03:39:26 +00005686 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005687 return llvm::StringSwitch<bool>(Feature)
5688 .Case("hexagon", true)
5689 .Case("hvx", HasHVX)
5690 .Case("hvx-double", HasHVXDouble)
5691 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005692 }
Craig Topper3164f332014-03-11 03:39:26 +00005693
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005694 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5695 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5696 const override;
5697
5698 bool handleTargetFeatures(std::vector<std::string> &Features,
5699 DiagnosticsEngine &Diags) override;
5700
Craig Topper3164f332014-03-11 03:39:26 +00005701 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005702 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005703 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005704 ArrayRef<const char *> getGCCRegNames() const override;
5705 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005706 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005707 return "";
5708 }
Sebastian Pop86500282012-01-13 20:37:10 +00005709
5710 static const char *getHexagonCPUSuffix(StringRef Name) {
5711 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005712 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005713 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005714 .Case("hexagonv55", "55")
5715 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005716 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005717 }
5718
Craig Topper3164f332014-03-11 03:39:26 +00005719 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005720 if (!getHexagonCPUSuffix(Name))
5721 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005722 CPU = Name;
5723 return true;
5724 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005725
5726 int getEHDataRegisterNumber(unsigned RegNo) const override {
5727 return RegNo < 2 ? RegNo : -1;
5728 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005729};
5730
5731void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005732 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005733 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005734 Builder.defineMacro("__hexagon__", "1");
5735
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005736 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005737 Builder.defineMacro("__HEXAGON_V4__");
5738 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005739 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005740 Builder.defineMacro("__QDSP6_V4__");
5741 Builder.defineMacro("__QDSP6_ARCH__", "4");
5742 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005743 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005744 Builder.defineMacro("__HEXAGON_V5__");
5745 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5746 if(Opts.HexagonQdsp6Compat) {
5747 Builder.defineMacro("__QDSP6_V5__");
5748 Builder.defineMacro("__QDSP6_ARCH__", "5");
5749 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005750 } else if (CPU == "hexagonv60") {
5751 Builder.defineMacro("__HEXAGON_V60__");
5752 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5753 Builder.defineMacro("__QDSP6_V60__");
5754 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005755 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005756}
5757
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005758bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5759 DiagnosticsEngine &Diags) {
5760 for (auto &F : Features) {
5761 if (F == "+hvx")
5762 HasHVX = true;
5763 else if (F == "-hvx")
5764 HasHVX = HasHVXDouble = false;
5765 else if (F == "+hvx-double")
5766 HasHVX = HasHVXDouble = true;
5767 else if (F == "-hvx-double")
5768 HasHVXDouble = false;
5769 }
5770 return true;
5771}
5772
5773bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5774 DiagnosticsEngine &Diags, StringRef CPU,
5775 const std::vector<std::string> &FeaturesVec) const {
5776 // Default for v60: -hvx, -hvx-double.
5777 Features["hvx"] = false;
5778 Features["hvx-double"] = false;
5779
5780 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5781}
5782
5783
5784const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005785 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5786 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5787 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5788 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5789 "p0", "p1", "p2", "p3",
5790 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5791};
5792
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005793ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005794 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005795}
5796
Tony Linthicum76329bf2011-12-12 21:14:55 +00005797const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5798 { { "sp" }, "r29" },
5799 { { "fp" }, "r30" },
5800 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005801};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005802
Craig Topperf054e3a2015-10-19 03:52:27 +00005803ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5804 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005805}
5806
5807
5808const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005809#define BUILTIN(ID, TYPE, ATTRS) \
5810 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5811#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5812 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005813#include "clang/Basic/BuiltinsHexagon.def"
5814};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005815
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005816// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5817class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005818 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5819 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005820 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005821public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005822 SparcTargetInfo(const llvm::Triple &Triple)
5823 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005824
Craig Topper3164f332014-03-11 03:39:26 +00005825 bool handleTargetFeatures(std::vector<std::string> &Features,
5826 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005827 // The backend doesn't actually handle soft float yet, but in case someone
5828 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005829 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5830 if (Feature != Features.end()) {
5831 SoftFloat = true;
5832 Features.erase(Feature);
5833 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005834 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005835 }
Craig Topper3164f332014-03-11 03:39:26 +00005836 void getTargetDefines(const LangOptions &Opts,
5837 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005838 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005839 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005840
5841 if (SoftFloat)
5842 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005843 }
Craig Topper3164f332014-03-11 03:39:26 +00005844
5845 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005846 return llvm::StringSwitch<bool>(Feature)
5847 .Case("softfloat", SoftFloat)
5848 .Case("sparc", true)
5849 .Default(false);
5850 }
Craig Topper3164f332014-03-11 03:39:26 +00005851
Craig Topper6c03a542015-10-19 04:51:35 +00005852 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005853 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005854 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005855 }
Craig Topper3164f332014-03-11 03:39:26 +00005856 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005857 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005858 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005859 ArrayRef<const char *> getGCCRegNames() const override;
5860 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005861 bool validateAsmConstraint(const char *&Name,
5862 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005863 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005864 switch (*Name) {
5865 case 'I': // Signed 13-bit constant
5866 case 'J': // Zero
5867 case 'K': // 32-bit constant with the low 12 bits clear
5868 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5869 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5870 case 'N': // Same as 'K' but zext (required for SIMode)
5871 case 'O': // The constant 4096
5872 return true;
5873 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005874 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005875 }
Craig Topper3164f332014-03-11 03:39:26 +00005876 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005877 // FIXME: Implement!
5878 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005879 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005880
5881 // No Sparc V7 for now, the backend doesn't support it anyway.
5882 enum CPUKind {
5883 CK_GENERIC,
5884 CK_V8,
5885 CK_SUPERSPARC,
5886 CK_SPARCLITE,
5887 CK_F934,
5888 CK_HYPERSPARC,
5889 CK_SPARCLITE86X,
5890 CK_SPARCLET,
5891 CK_TSC701,
5892 CK_V9,
5893 CK_ULTRASPARC,
5894 CK_ULTRASPARC3,
5895 CK_NIAGARA,
5896 CK_NIAGARA2,
5897 CK_NIAGARA3,
5898 CK_NIAGARA4
5899 } CPU = CK_GENERIC;
5900
5901 enum CPUGeneration {
5902 CG_V8,
5903 CG_V9,
5904 };
5905
5906 CPUGeneration getCPUGeneration(CPUKind Kind) const {
5907 switch (Kind) {
5908 case CK_GENERIC:
5909 case CK_V8:
5910 case CK_SUPERSPARC:
5911 case CK_SPARCLITE:
5912 case CK_F934:
5913 case CK_HYPERSPARC:
5914 case CK_SPARCLITE86X:
5915 case CK_SPARCLET:
5916 case CK_TSC701:
5917 return CG_V8;
5918 case CK_V9:
5919 case CK_ULTRASPARC:
5920 case CK_ULTRASPARC3:
5921 case CK_NIAGARA:
5922 case CK_NIAGARA2:
5923 case CK_NIAGARA3:
5924 case CK_NIAGARA4:
5925 return CG_V9;
5926 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00005927 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005928 }
5929
5930 CPUKind getCPUKind(StringRef Name) const {
5931 return llvm::StringSwitch<CPUKind>(Name)
5932 .Case("v8", CK_V8)
5933 .Case("supersparc", CK_SUPERSPARC)
5934 .Case("sparclite", CK_SPARCLITE)
5935 .Case("f934", CK_F934)
5936 .Case("hypersparc", CK_HYPERSPARC)
5937 .Case("sparclite86x", CK_SPARCLITE86X)
5938 .Case("sparclet", CK_SPARCLET)
5939 .Case("tsc701", CK_TSC701)
5940 .Case("v9", CK_V9)
5941 .Case("ultrasparc", CK_ULTRASPARC)
5942 .Case("ultrasparc3", CK_ULTRASPARC3)
5943 .Case("niagara", CK_NIAGARA)
5944 .Case("niagara2", CK_NIAGARA2)
5945 .Case("niagara3", CK_NIAGARA3)
5946 .Case("niagara4", CK_NIAGARA4)
5947 .Default(CK_GENERIC);
5948 }
5949
5950 bool setCPU(const std::string &Name) override {
5951 CPU = getCPUKind(Name);
5952 return CPU != CK_GENERIC;
5953 }
Gabor Greif49991682008-02-21 16:29:08 +00005954};
5955
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005956const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005957 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5958 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5959 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5960 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5961};
5962
Craig Topperf054e3a2015-10-19 03:52:27 +00005963ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
5964 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00005965}
5966
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005967const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005968 { { "g0" }, "r0" },
5969 { { "g1" }, "r1" },
5970 { { "g2" }, "r2" },
5971 { { "g3" }, "r3" },
5972 { { "g4" }, "r4" },
5973 { { "g5" }, "r5" },
5974 { { "g6" }, "r6" },
5975 { { "g7" }, "r7" },
5976 { { "o0" }, "r8" },
5977 { { "o1" }, "r9" },
5978 { { "o2" }, "r10" },
5979 { { "o3" }, "r11" },
5980 { { "o4" }, "r12" },
5981 { { "o5" }, "r13" },
5982 { { "o6", "sp" }, "r14" },
5983 { { "o7" }, "r15" },
5984 { { "l0" }, "r16" },
5985 { { "l1" }, "r17" },
5986 { { "l2" }, "r18" },
5987 { { "l3" }, "r19" },
5988 { { "l4" }, "r20" },
5989 { { "l5" }, "r21" },
5990 { { "l6" }, "r22" },
5991 { { "l7" }, "r23" },
5992 { { "i0" }, "r24" },
5993 { { "i1" }, "r25" },
5994 { { "i2" }, "r26" },
5995 { { "i3" }, "r27" },
5996 { { "i4" }, "r28" },
5997 { { "i5" }, "r29" },
5998 { { "i6", "fp" }, "r30" },
5999 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006000};
6001
Craig Topperf054e3a2015-10-19 03:52:27 +00006002ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6003 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006004}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006005
6006// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6007class SparcV8TargetInfo : public SparcTargetInfo {
6008public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006009 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006010 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00006011 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6012 switch (getTriple().getOS()) {
6013 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006014 SizeType = UnsignedInt;
6015 IntPtrType = SignedInt;
6016 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006017 break;
6018 case llvm::Triple::NetBSD:
6019 case llvm::Triple::OpenBSD:
6020 SizeType = UnsignedLong;
6021 IntPtrType = SignedLong;
6022 PtrDiffType = SignedLong;
6023 break;
Brad Smith56495d52015-08-13 22:00:53 +00006024 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006025 }
6026
Craig Topper3164f332014-03-11 03:39:26 +00006027 void getTargetDefines(const LangOptions &Opts,
6028 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006029 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006030 switch (getCPUGeneration(CPU)) {
6031 case CG_V8:
6032 Builder.defineMacro("__sparcv8");
6033 if (getTriple().getOS() != llvm::Triple::Solaris)
6034 Builder.defineMacro("__sparcv8__");
6035 break;
6036 case CG_V9:
6037 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006038 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006039 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006040 Builder.defineMacro("__sparc_v9__");
6041 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006042 break;
6043 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006044 }
6045};
6046
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006047// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6048class SparcV8elTargetInfo : public SparcV8TargetInfo {
6049 public:
6050 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006051 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006052 BigEndian = false;
6053 }
6054};
6055
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006056// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6057class SparcV9TargetInfo : public SparcTargetInfo {
6058public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006059 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006060 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00006061 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006062 // This is an LP64 platform.
6063 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006064
6065 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006066 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006067 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006068 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006069 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006070 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006071
6072 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6073 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6074 LongDoubleWidth = 128;
6075 LongDoubleAlign = 128;
6076 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006077 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006078 }
6079
Craig Topper3164f332014-03-11 03:39:26 +00006080 void getTargetDefines(const LangOptions &Opts,
6081 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006082 SparcTargetInfo::getTargetDefines(Opts, Builder);
6083 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006084 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006085 // Solaris doesn't need these variants, but the BSDs do.
6086 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006087 Builder.defineMacro("__sparc64__");
6088 Builder.defineMacro("__sparc_v9__");
6089 Builder.defineMacro("__sparcv9__");
6090 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006091 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006092
Craig Topper3164f332014-03-11 03:39:26 +00006093 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006094 if (!SparcTargetInfo::setCPU(Name))
6095 return false;
6096 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006097 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006098};
6099
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006100class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006101 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006102 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006103 std::string CPU;
6104 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006105 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006106
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006107public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006108 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006109 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6110 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006111 IntMaxType = SignedLong;
6112 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006113 TLSSupported = true;
6114 IntWidth = IntAlign = 32;
6115 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6116 PointerWidth = PointerAlign = 64;
6117 LongDoubleWidth = 128;
6118 LongDoubleAlign = 64;
6119 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006120 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006121 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00006122 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 +00006123 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6124 }
6125 void getTargetDefines(const LangOptions &Opts,
6126 MacroBuilder &Builder) const override {
6127 Builder.defineMacro("__s390__");
6128 Builder.defineMacro("__s390x__");
6129 Builder.defineMacro("__zarch__");
6130 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006131 if (HasTransactionalExecution)
6132 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006133 if (Opts.ZVector)
6134 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006135 }
Craig Topper6c03a542015-10-19 04:51:35 +00006136 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6137 return llvm::makeArrayRef(BuiltinInfo,
6138 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006139 }
6140
Craig Topperf054e3a2015-10-19 03:52:27 +00006141 ArrayRef<const char *> getGCCRegNames() const override;
6142 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006143 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006144 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006145 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006146 bool validateAsmConstraint(const char *&Name,
6147 TargetInfo::ConstraintInfo &info) const override;
6148 const char *getClobbers() const override {
6149 // FIXME: Is this really right?
6150 return "";
6151 }
6152 BuiltinVaListKind getBuiltinVaListKind() const override {
6153 return TargetInfo::SystemZBuiltinVaList;
6154 }
6155 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006156 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006157 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6158 .Case("z10", true)
6159 .Case("z196", true)
6160 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006161 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006162 .Default(false);
6163
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006164 return CPUKnown;
6165 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006166 bool
6167 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6168 StringRef CPU,
6169 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006170 if (CPU == "zEC12")
6171 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006172 if (CPU == "z13") {
6173 Features["transactional-execution"] = true;
6174 Features["vector"] = true;
6175 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006176 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006177 }
6178
6179 bool handleTargetFeatures(std::vector<std::string> &Features,
6180 DiagnosticsEngine &Diags) override {
6181 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006182 for (const auto &Feature : Features) {
6183 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006184 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006185 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006186 HasVector = true;
6187 }
6188 // If we use the vector ABI, vector types are 64-bit aligned.
6189 if (HasVector) {
6190 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006191 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6192 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006193 }
6194 return true;
6195 }
6196
6197 bool hasFeature(StringRef Feature) const override {
6198 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006199 .Case("systemz", true)
6200 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006201 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006202 .Default(false);
6203 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006204
6205 StringRef getABI() const override {
6206 if (HasVector)
6207 return "vector";
6208 return "";
6209 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006210
6211 bool useFloat128ManglingForLongDouble() const override {
6212 return true;
6213 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006214};
6215
6216const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6217#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006218 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006219#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006220};
6221
6222const char *const SystemZTargetInfo::GCCRegNames[] = {
6223 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6224 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6225 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6226 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6227};
6228
Craig Topperf054e3a2015-10-19 03:52:27 +00006229ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6230 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006231}
6232
6233bool SystemZTargetInfo::
6234validateAsmConstraint(const char *&Name,
6235 TargetInfo::ConstraintInfo &Info) const {
6236 switch (*Name) {
6237 default:
6238 return false;
6239
6240 case 'a': // Address register
6241 case 'd': // Data register (equivalent to 'r')
6242 case 'f': // Floating-point register
6243 Info.setAllowsRegister();
6244 return true;
6245
6246 case 'I': // Unsigned 8-bit constant
6247 case 'J': // Unsigned 12-bit constant
6248 case 'K': // Signed 16-bit constant
6249 case 'L': // Signed 20-bit displacement (on all targets we support)
6250 case 'M': // 0x7fffffff
6251 return true;
6252
6253 case 'Q': // Memory with base and unsigned 12-bit displacement
6254 case 'R': // Likewise, plus an index
6255 case 'S': // Memory with base and signed 20-bit displacement
6256 case 'T': // Likewise, plus an index
6257 Info.setAllowsMemory();
6258 return true;
6259 }
6260}
Ulrich Weigand47445072013-05-06 16:26:41 +00006261
Eric Christopherc48497a2015-09-18 21:26:24 +00006262class MSP430TargetInfo : public TargetInfo {
6263 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006264
Eric Christopherc48497a2015-09-18 21:26:24 +00006265public:
6266 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6267 BigEndian = false;
6268 TLSSupported = false;
6269 IntWidth = 16;
6270 IntAlign = 16;
6271 LongWidth = 32;
6272 LongLongWidth = 64;
6273 LongAlign = LongLongAlign = 16;
6274 PointerWidth = 16;
6275 PointerAlign = 16;
6276 SuitableAlign = 16;
6277 SizeType = UnsignedInt;
6278 IntMaxType = SignedLongLong;
6279 IntPtrType = SignedInt;
6280 PtrDiffType = SignedInt;
6281 SigAtomicType = SignedLong;
6282 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006283 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006284 void getTargetDefines(const LangOptions &Opts,
6285 MacroBuilder &Builder) const override {
6286 Builder.defineMacro("MSP430");
6287 Builder.defineMacro("__MSP430__");
6288 // FIXME: defines for different 'flavours' of MCU
6289 }
Craig Topper6c03a542015-10-19 04:51:35 +00006290 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006291 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006292 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006293 }
6294 bool hasFeature(StringRef Feature) const override {
6295 return Feature == "msp430";
6296 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006297 ArrayRef<const char *> getGCCRegNames() const override;
6298 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006299 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006300 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006301 }
6302 bool validateAsmConstraint(const char *&Name,
6303 TargetInfo::ConstraintInfo &info) const override {
6304 // FIXME: implement
6305 switch (*Name) {
6306 case 'K': // the constant 1
6307 case 'L': // constant -1^20 .. 1^19
6308 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006309 return true;
6310 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006311 // No target constraints for now.
6312 return false;
6313 }
6314 const char *getClobbers() const override {
6315 // FIXME: Is this really right?
6316 return "";
6317 }
6318 BuiltinVaListKind getBuiltinVaListKind() const override {
6319 // FIXME: implement
6320 return TargetInfo::CharPtrBuiltinVaList;
6321 }
6322};
6323
6324const char *const MSP430TargetInfo::GCCRegNames[] = {
6325 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6326 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6327
Craig Topperf054e3a2015-10-19 03:52:27 +00006328ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6329 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006330}
6331
6332// LLVM and Clang cannot be used directly to output native binaries for
6333// target, but is used to compile C code to llvm bitcode with correct
6334// type and alignment information.
6335//
6336// TCE uses the llvm bitcode as input and uses it for generating customized
6337// target processor and program binary. TCE co-design environment is
6338// publicly available in http://tce.cs.tut.fi
6339
6340static const unsigned TCEOpenCLAddrSpaceMap[] = {
6341 3, // opencl_global
6342 4, // opencl_local
6343 5, // opencl_constant
6344 // FIXME: generic has to be added to the target
6345 0, // opencl_generic
6346 0, // cuda_device
6347 0, // cuda_constant
6348 0 // cuda_shared
6349};
6350
6351class TCETargetInfo : public TargetInfo {
6352public:
6353 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6354 TLSSupported = false;
6355 IntWidth = 32;
6356 LongWidth = LongLongWidth = 32;
6357 PointerWidth = 32;
6358 IntAlign = 32;
6359 LongAlign = LongLongAlign = 32;
6360 PointerAlign = 32;
6361 SuitableAlign = 32;
6362 SizeType = UnsignedInt;
6363 IntMaxType = SignedLong;
6364 IntPtrType = SignedInt;
6365 PtrDiffType = SignedInt;
6366 FloatWidth = 32;
6367 FloatAlign = 32;
6368 DoubleWidth = 32;
6369 DoubleAlign = 32;
6370 LongDoubleWidth = 32;
6371 LongDoubleAlign = 32;
6372 FloatFormat = &llvm::APFloat::IEEEsingle;
6373 DoubleFormat = &llvm::APFloat::IEEEsingle;
6374 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6375 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6376 "-f64:32-v64:32-v128:32-a:0:32-n32";
6377 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6378 UseAddrSpaceMapMangling = true;
6379 }
6380
6381 void getTargetDefines(const LangOptions &Opts,
6382 MacroBuilder &Builder) const override {
6383 DefineStd(Builder, "tce", Opts);
6384 Builder.defineMacro("__TCE__");
6385 Builder.defineMacro("__TCE_V1__");
6386 }
6387 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6388
Craig Topper6c03a542015-10-19 04:51:35 +00006389 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006390 const char *getClobbers() const override { return ""; }
6391 BuiltinVaListKind getBuiltinVaListKind() const override {
6392 return TargetInfo::VoidPtrBuiltinVaList;
6393 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006394 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006395 bool validateAsmConstraint(const char *&Name,
6396 TargetInfo::ConstraintInfo &info) const override {
6397 return true;
6398 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006399 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6400 return None;
6401 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006402};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006403
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006404class BPFTargetInfo : public TargetInfo {
6405public:
6406 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6407 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6408 SizeType = UnsignedLong;
6409 PtrDiffType = SignedLong;
6410 IntPtrType = SignedLong;
6411 IntMaxType = SignedLong;
6412 Int64Type = SignedLong;
6413 RegParmMax = 5;
6414 if (Triple.getArch() == llvm::Triple::bpfeb) {
6415 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006416 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006417 } else {
6418 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006419 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006420 }
6421 MaxAtomicPromoteWidth = 64;
6422 MaxAtomicInlineWidth = 64;
6423 TLSSupported = false;
6424 }
6425 void getTargetDefines(const LangOptions &Opts,
6426 MacroBuilder &Builder) const override {
6427 DefineStd(Builder, "bpf", Opts);
6428 Builder.defineMacro("__BPF__");
6429 }
6430 bool hasFeature(StringRef Feature) const override {
6431 return Feature == "bpf";
6432 }
6433
Craig Topper6c03a542015-10-19 04:51:35 +00006434 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006435 const char *getClobbers() const override {
6436 return "";
6437 }
6438 BuiltinVaListKind getBuiltinVaListKind() const override {
6439 return TargetInfo::VoidPtrBuiltinVaList;
6440 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006441 ArrayRef<const char *> getGCCRegNames() const override {
6442 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006443 }
6444 bool validateAsmConstraint(const char *&Name,
6445 TargetInfo::ConstraintInfo &info) const override {
6446 return true;
6447 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006448 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6449 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006450 }
6451};
6452
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006453class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006454 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006455
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006456 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006457 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006458 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006459 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006460 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006461 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006462 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006463 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006464 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006465 enum DspRevEnum {
6466 NoDSP, DSP1, DSP2
6467 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006468 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006469
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006470protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006471 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006472 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006473
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006474public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006475 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6476 const std::string &CPUStr)
6477 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006478 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006479 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6480 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6481 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006482
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006483 bool isNaN2008Default() const {
6484 return CPU == "mips32r6" || CPU == "mips64r6";
6485 }
6486
6487 bool isFP64Default() const {
6488 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6489 }
6490
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006491 bool isNan2008() const override {
6492 return IsNan2008;
6493 }
6494
Alp Toker4925ba72014-06-07 23:30:42 +00006495 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006496 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006497 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6498 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006499 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006500 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006501 .Case("mips1", IsMips32)
6502 .Case("mips2", IsMips32)
6503 .Case("mips3", true)
6504 .Case("mips4", true)
6505 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006506 .Case("mips32", IsMips32)
6507 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006508 .Case("mips32r3", IsMips32)
6509 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006510 .Case("mips32r6", IsMips32)
6511 .Case("mips64", true)
6512 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006513 .Case("mips64r3", true)
6514 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006515 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006516 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006517 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006518 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006519 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006520 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006521 bool
6522 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6523 StringRef CPU,
6524 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006525 if (CPU == "octeon")
6526 Features["mips64r2"] = Features["cnmips"] = true;
6527 else
6528 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006529 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006530 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006531
Craig Topper3164f332014-03-11 03:39:26 +00006532 void getTargetDefines(const LangOptions &Opts,
6533 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006534 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006535 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006536 if (Opts.GNUMode)
6537 Builder.defineMacro("mips");
6538
Simon Atanasyan683535b2012-08-29 19:14:58 +00006539 Builder.defineMacro("__REGISTER_PREFIX__", "");
6540
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006541 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006542 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006543 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006544 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006545 case SoftFloat:
6546 Builder.defineMacro("__mips_soft_float", Twine(1));
6547 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006548 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006549
Simon Atanasyan16071912013-04-14 14:07:30 +00006550 if (IsSingleFloat)
6551 Builder.defineMacro("__mips_single_float", Twine(1));
6552
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006553 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6554 Builder.defineMacro("_MIPS_FPSET",
6555 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6556
Simon Atanasyan72244b62012-07-05 16:06:06 +00006557 if (IsMips16)
6558 Builder.defineMacro("__mips16", Twine(1));
6559
Simon Atanasyan60777612013-04-14 14:07:51 +00006560 if (IsMicromips)
6561 Builder.defineMacro("__mips_micromips", Twine(1));
6562
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006563 if (IsNan2008)
6564 Builder.defineMacro("__mips_nan2008", Twine(1));
6565
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006566 switch (DspRev) {
6567 default:
6568 break;
6569 case DSP1:
6570 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6571 Builder.defineMacro("__mips_dsp", Twine(1));
6572 break;
6573 case DSP2:
6574 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6575 Builder.defineMacro("__mips_dspr2", Twine(1));
6576 Builder.defineMacro("__mips_dsp", Twine(1));
6577 break;
6578 }
6579
Jack Carter44ff1e52013-08-12 17:20:29 +00006580 if (HasMSA)
6581 Builder.defineMacro("__mips_msa", Twine(1));
6582
Simon Atanasyan26f19672012-04-05 19:28:31 +00006583 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6584 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6585 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006586
6587 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6588 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006589 }
6590
Craig Topper6c03a542015-10-19 04:51:35 +00006591 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6592 return llvm::makeArrayRef(BuiltinInfo,
6593 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006594 }
Craig Topper3164f332014-03-11 03:39:26 +00006595 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006596 return llvm::StringSwitch<bool>(Feature)
6597 .Case("mips", true)
6598 .Case("fp64", HasFP64)
6599 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006600 }
Craig Topper3164f332014-03-11 03:39:26 +00006601 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006602 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006603 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006604 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006605 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006606 // CPU register names
6607 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006608 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6609 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6610 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006611 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6612 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006613 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6614 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6615 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6616 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006617 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006618 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006619 "$fcc5","$fcc6","$fcc7",
6620 // MSA register names
6621 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6622 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6623 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6624 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6625 // MSA control register names
6626 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6627 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006628 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006629 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006630 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006631 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006632 bool validateAsmConstraint(const char *&Name,
6633 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006634 switch (*Name) {
6635 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006636 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006637 case 'r': // CPU registers.
6638 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006639 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006640 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006641 case 'c': // $25 for indirect jumps
6642 case 'l': // lo register
6643 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006644 Info.setAllowsRegister();
6645 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006646 case 'I': // Signed 16-bit constant
6647 case 'J': // Integer 0
6648 case 'K': // Unsigned 16-bit constant
6649 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6650 case 'M': // Constants not loadable via lui, addiu, or ori
6651 case 'N': // Constant -1 to -65535
6652 case 'O': // A signed 15-bit constant
6653 case 'P': // A constant between 1 go 65535
6654 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006655 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006656 Info.setAllowsMemory();
6657 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006658 case 'Z':
6659 if (Name[1] == 'C') { // An address usable by ll, and sc.
6660 Info.setAllowsMemory();
6661 Name++; // Skip over 'Z'.
6662 return true;
6663 }
6664 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006665 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006666 }
6667
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006668 std::string convertConstraint(const char *&Constraint) const override {
6669 std::string R;
6670 switch (*Constraint) {
6671 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6672 if (Constraint[1] == 'C') {
6673 R = std::string("^") + std::string(Constraint, 2);
6674 Constraint++;
6675 return R;
6676 }
6677 break;
6678 }
6679 return TargetInfo::convertConstraint(Constraint);
6680 }
6681
Craig Topper3164f332014-03-11 03:39:26 +00006682 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006683 // In GCC, $1 is not widely used in generated code (it's used only in a few
6684 // specific situations), so there is no real need for users to add it to
6685 // the clobbers list if they want to use it in their inline assembly code.
6686 //
6687 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6688 // code generation, so using it in inline assembly without adding it to the
6689 // clobbers list can cause conflicts between the inline assembly code and
6690 // the surrounding generated code.
6691 //
6692 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6693 // operands, which will conflict with the ".set at" assembler option (which
6694 // we use only for inline assembly, in order to maintain compatibility with
6695 // GCC) and will also conflict with the user's usage of $1.
6696 //
6697 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6698 // register for generated code is to automatically clobber $1 for all inline
6699 // assembly code.
6700 //
6701 // FIXME: We should automatically clobber $1 only for inline assembly code
6702 // which actually uses it. This would allow LLVM to use $1 for inline
6703 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006704 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006705 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006706
Craig Topper3164f332014-03-11 03:39:26 +00006707 bool handleTargetFeatures(std::vector<std::string> &Features,
6708 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006709 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006710 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006711 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006712 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006713 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006714 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006715 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006716
Eric Christopher610fe112015-08-26 08:21:55 +00006717 for (const auto &Feature : Features) {
6718 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006719 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006720 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006721 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006722 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006723 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006724 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006725 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006726 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006727 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006728 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006729 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006730 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006731 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006732 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006733 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006734 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006735 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006736 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006737 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006738 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006739 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006740 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006741
Eric Christopher964a5f32015-08-05 23:48:05 +00006742 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006743
Rafael Espindolaeb265472013-08-21 21:59:03 +00006744 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006745 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006746
Craig Topper3164f332014-03-11 03:39:26 +00006747 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006748 if (RegNo == 0) return 4;
6749 if (RegNo == 1) return 5;
6750 return -1;
6751 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006752
6753 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006754};
6755
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006756const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006757#define BUILTIN(ID, TYPE, ATTRS) \
6758 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6759#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6760 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006761#include "clang/Basic/BuiltinsMips.def"
6762};
6763
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006764class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006765public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006766 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006767 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006768 SizeType = UnsignedInt;
6769 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006770 Int64Type = SignedLongLong;
6771 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006772 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006773 }
Craig Topper3164f332014-03-11 03:39:26 +00006774 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006775 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006776 ABI = Name;
6777 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006778 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006779 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006780 }
Craig Topper3164f332014-03-11 03:39:26 +00006781 void getTargetDefines(const LangOptions &Opts,
6782 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006783 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006784
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006785 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006786 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6787
6788 const std::string& CPUStr = getCPU();
6789 if (CPUStr == "mips32")
6790 Builder.defineMacro("__mips_isa_rev", "1");
6791 else if (CPUStr == "mips32r2")
6792 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006793 else if (CPUStr == "mips32r3")
6794 Builder.defineMacro("__mips_isa_rev", "3");
6795 else if (CPUStr == "mips32r5")
6796 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006797 else if (CPUStr == "mips32r6")
6798 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006799
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006800 if (ABI == "o32") {
6801 Builder.defineMacro("__mips_o32");
6802 Builder.defineMacro("_ABIO32", "1");
6803 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6804 }
6805 else if (ABI == "eabi")
6806 Builder.defineMacro("__mips_eabi");
6807 else
David Blaikie83d382b2011-09-23 05:06:16 +00006808 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006809 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006810 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006811 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6812 { { "at" }, "$1" },
6813 { { "v0" }, "$2" },
6814 { { "v1" }, "$3" },
6815 { { "a0" }, "$4" },
6816 { { "a1" }, "$5" },
6817 { { "a2" }, "$6" },
6818 { { "a3" }, "$7" },
6819 { { "t0" }, "$8" },
6820 { { "t1" }, "$9" },
6821 { { "t2" }, "$10" },
6822 { { "t3" }, "$11" },
6823 { { "t4" }, "$12" },
6824 { { "t5" }, "$13" },
6825 { { "t6" }, "$14" },
6826 { { "t7" }, "$15" },
6827 { { "s0" }, "$16" },
6828 { { "s1" }, "$17" },
6829 { { "s2" }, "$18" },
6830 { { "s3" }, "$19" },
6831 { { "s4" }, "$20" },
6832 { { "s5" }, "$21" },
6833 { { "s6" }, "$22" },
6834 { { "s7" }, "$23" },
6835 { { "t8" }, "$24" },
6836 { { "t9" }, "$25" },
6837 { { "k0" }, "$26" },
6838 { { "k1" }, "$27" },
6839 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006840 { { "sp","$sp" }, "$29" },
6841 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006842 { { "ra" }, "$31" }
6843 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006844 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006845 }
6846};
6847
6848class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006849 void setDataLayoutString() override {
6850 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006851 }
6852
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006853public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006854 Mips32EBTargetInfo(const llvm::Triple &Triple)
6855 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006856 }
Craig Topper3164f332014-03-11 03:39:26 +00006857 void getTargetDefines(const LangOptions &Opts,
6858 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006859 DefineStd(Builder, "MIPSEB", Opts);
6860 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006861 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006862 }
6863};
6864
6865class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006866 void setDataLayoutString() override {
6867 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006868 }
6869
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006870public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006871 Mips32ELTargetInfo(const llvm::Triple &Triple)
6872 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006873 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006874 }
Craig Topper3164f332014-03-11 03:39:26 +00006875 void getTargetDefines(const LangOptions &Opts,
6876 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006877 DefineStd(Builder, "MIPSEL", Opts);
6878 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006879 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006880 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006881};
Akira Hatanakabef17452011-09-20 19:21:49 +00006882
6883class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006884public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006885 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006886 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006887 LongDoubleWidth = LongDoubleAlign = 128;
6888 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006889 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6890 LongDoubleWidth = LongDoubleAlign = 64;
6891 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6892 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006893 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006894 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006895 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006896 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006897
6898 void setN64ABITypes() {
6899 LongWidth = LongAlign = 64;
6900 PointerWidth = PointerAlign = 64;
6901 SizeType = UnsignedLong;
6902 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006903 Int64Type = SignedLong;
6904 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006905 }
6906
6907 void setN32ABITypes() {
6908 LongWidth = LongAlign = 32;
6909 PointerWidth = PointerAlign = 32;
6910 SizeType = UnsignedInt;
6911 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006912 Int64Type = SignedLongLong;
6913 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006914 }
6915
Craig Topper3164f332014-03-11 03:39:26 +00006916 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006917 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006918 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006919 ABI = Name;
6920 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006921 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006922 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006923 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006924 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006925 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006926 }
6927 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006928 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006929
Craig Topper3164f332014-03-11 03:39:26 +00006930 void getTargetDefines(const LangOptions &Opts,
6931 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006932 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006933
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006934 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006935 Builder.defineMacro("__mips64");
6936 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006937 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6938
6939 const std::string& CPUStr = getCPU();
6940 if (CPUStr == "mips64")
6941 Builder.defineMacro("__mips_isa_rev", "1");
6942 else if (CPUStr == "mips64r2")
6943 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006944 else if (CPUStr == "mips64r3")
6945 Builder.defineMacro("__mips_isa_rev", "3");
6946 else if (CPUStr == "mips64r5")
6947 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006948 else if (CPUStr == "mips64r6")
6949 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006950
Akira Hatanakabef17452011-09-20 19:21:49 +00006951 if (ABI == "n32") {
6952 Builder.defineMacro("__mips_n32");
6953 Builder.defineMacro("_ABIN32", "2");
6954 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6955 }
6956 else if (ABI == "n64") {
6957 Builder.defineMacro("__mips_n64");
6958 Builder.defineMacro("_ABI64", "3");
6959 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6960 }
6961 else
David Blaikie83d382b2011-09-23 05:06:16 +00006962 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006963 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006964 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006965 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6966 { { "at" }, "$1" },
6967 { { "v0" }, "$2" },
6968 { { "v1" }, "$3" },
6969 { { "a0" }, "$4" },
6970 { { "a1" }, "$5" },
6971 { { "a2" }, "$6" },
6972 { { "a3" }, "$7" },
6973 { { "a4" }, "$8" },
6974 { { "a5" }, "$9" },
6975 { { "a6" }, "$10" },
6976 { { "a7" }, "$11" },
6977 { { "t0" }, "$12" },
6978 { { "t1" }, "$13" },
6979 { { "t2" }, "$14" },
6980 { { "t3" }, "$15" },
6981 { { "s0" }, "$16" },
6982 { { "s1" }, "$17" },
6983 { { "s2" }, "$18" },
6984 { { "s3" }, "$19" },
6985 { { "s4" }, "$20" },
6986 { { "s5" }, "$21" },
6987 { { "s6" }, "$22" },
6988 { { "s7" }, "$23" },
6989 { { "t8" }, "$24" },
6990 { { "t9" }, "$25" },
6991 { { "k0" }, "$26" },
6992 { { "k1" }, "$27" },
6993 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006994 { { "sp","$sp" }, "$29" },
6995 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006996 { { "ra" }, "$31" }
6997 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006998 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00006999 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007000
7001 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007002};
7003
7004class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007005 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007006 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007007 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 +00007008 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007009 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007010
Akira Hatanakabef17452011-09-20 19:21:49 +00007011 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007012
Akira Hatanakabef17452011-09-20 19:21:49 +00007013public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007014 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007015 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007016 void getTargetDefines(const LangOptions &Opts,
7017 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007018 DefineStd(Builder, "MIPSEB", Opts);
7019 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007020 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007021 }
7022};
7023
7024class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007025 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007026 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007027 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 +00007028 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007029 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00007030 }
7031public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007032 Mips64ELTargetInfo(const llvm::Triple &Triple)
7033 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007034 // Default ABI is n64.
7035 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007036 }
Craig Topper3164f332014-03-11 03:39:26 +00007037 void getTargetDefines(const LangOptions &Opts,
7038 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007039 DefineStd(Builder, "MIPSEL", Opts);
7040 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007041 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007042 }
7043};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007044
Ivan Krasindd7403e2011-08-24 20:22:22 +00007045class PNaClTargetInfo : public TargetInfo {
7046public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007047 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007048 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007049 this->UserLabelPrefix = "";
7050 this->LongAlign = 32;
7051 this->LongWidth = 32;
7052 this->PointerAlign = 32;
7053 this->PointerWidth = 32;
7054 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007055 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007056 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007057 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007058 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007059 this->SizeType = TargetInfo::UnsignedInt;
7060 this->PtrDiffType = TargetInfo::SignedInt;
7061 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007062 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007063 }
7064
Craig Toppere6f17d02014-03-11 04:07:52 +00007065 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007066 Builder.defineMacro("__le32__");
7067 Builder.defineMacro("__pnacl__");
7068 }
Craig Topper3164f332014-03-11 03:39:26 +00007069 void getTargetDefines(const LangOptions &Opts,
7070 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007071 getArchDefines(Opts, Builder);
7072 }
Craig Topper3164f332014-03-11 03:39:26 +00007073 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007074 return Feature == "pnacl";
7075 }
Craig Topper6c03a542015-10-19 04:51:35 +00007076 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007077 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007078 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007079 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007080 ArrayRef<const char *> getGCCRegNames() const override;
7081 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007082 bool validateAsmConstraint(const char *&Name,
7083 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007084 return false;
7085 }
7086
Craig Topper3164f332014-03-11 03:39:26 +00007087 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007088 return "";
7089 }
7090};
7091
Craig Topperf054e3a2015-10-19 03:52:27 +00007092ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7093 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007094}
7095
Craig Topperf054e3a2015-10-19 03:52:27 +00007096ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7097 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007098}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007099
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007100// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7101class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7102public:
7103 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007104 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007105 }
7106
7107 BuiltinVaListKind getBuiltinVaListKind() const override {
7108 return TargetInfo::PNaClABIBuiltinVaList;
7109 }
7110};
7111
JF Bastien643817d2014-09-12 17:52:47 +00007112class Le64TargetInfo : public TargetInfo {
7113 static const Builtin::Info BuiltinInfo[];
7114
7115public:
7116 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7117 BigEndian = false;
7118 NoAsmVariants = true;
7119 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7120 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00007121 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00007122 }
7123
7124 void getTargetDefines(const LangOptions &Opts,
7125 MacroBuilder &Builder) const override {
7126 DefineStd(Builder, "unix", Opts);
7127 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7128 Builder.defineMacro("__ELF__");
7129 }
Craig Topper6c03a542015-10-19 04:51:35 +00007130 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7131 return llvm::makeArrayRef(BuiltinInfo,
7132 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007133 }
7134 BuiltinVaListKind getBuiltinVaListKind() const override {
7135 return TargetInfo::PNaClABIBuiltinVaList;
7136 }
7137 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007138 ArrayRef<const char *> getGCCRegNames() const override {
7139 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007140 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007141 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7142 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007143 }
7144 bool validateAsmConstraint(const char *&Name,
7145 TargetInfo::ConstraintInfo &Info) const override {
7146 return false;
7147 }
7148
7149 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007150};
Dan Gohmanc2853072015-09-03 22:51:53 +00007151
7152class WebAssemblyTargetInfo : public TargetInfo {
7153 static const Builtin::Info BuiltinInfo[];
7154
7155 enum SIMDEnum {
7156 NoSIMD,
7157 SIMD128,
7158 } SIMDLevel;
7159
7160public:
7161 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7162 : TargetInfo(T), SIMDLevel(NoSIMD) {
7163 BigEndian = false;
7164 NoAsmVariants = true;
7165 SuitableAlign = 128;
7166 LargeArrayMinWidth = 128;
7167 LargeArrayAlign = 128;
7168 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007169 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007170 LongDoubleWidth = LongDoubleAlign = 128;
7171 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007172 }
7173
7174protected:
7175 void getTargetDefines(const LangOptions &Opts,
7176 MacroBuilder &Builder) const override {
7177 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7178 if (SIMDLevel >= SIMD128)
7179 Builder.defineMacro("__wasm_simd128__");
7180 }
7181
7182private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007183 bool
7184 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7185 StringRef CPU,
7186 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007187 if (CPU == "bleeding-edge")
7188 Features["simd128"] = true;
7189 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7190 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007191 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007192 return llvm::StringSwitch<bool>(Feature)
7193 .Case("simd128", SIMDLevel >= SIMD128)
7194 .Default(false);
7195 }
7196 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007197 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007198 for (const auto &Feature : Features) {
7199 if (Feature == "+simd128") {
7200 SIMDLevel = std::max(SIMDLevel, SIMD128);
7201 continue;
7202 }
7203 if (Feature == "-simd128") {
7204 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7205 continue;
7206 }
7207
7208 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7209 << "-target-feature";
7210 return false;
7211 }
7212 return true;
7213 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007214 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007215 return llvm::StringSwitch<bool>(Name)
7216 .Case("mvp", true)
7217 .Case("bleeding-edge", true)
7218 .Case("generic", true)
7219 .Default(false);
7220 }
Craig Topper6c03a542015-10-19 04:51:35 +00007221 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7222 return llvm::makeArrayRef(BuiltinInfo,
7223 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007224 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007225 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007226 return VoidPtrBuiltinVaList;
7227 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007228 ArrayRef<const char *> getGCCRegNames() const final {
7229 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007230 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007231 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7232 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007233 }
7234 bool
7235 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007236 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007237 return false;
7238 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007239 const char *getClobbers() const final { return ""; }
7240 bool isCLZForZeroUndef() const final { return false; }
7241 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007242 IntType getIntTypeByWidth(unsigned BitWidth,
7243 bool IsSigned) const final {
7244 // WebAssembly prefers long long for explicitly 64-bit integers.
7245 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7246 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7247 }
7248 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7249 bool IsSigned) const final {
7250 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7251 return BitWidth == 64
7252 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7253 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7254 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007255};
7256
7257const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7258#define BUILTIN(ID, TYPE, ATTRS) \
7259 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7260#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7261 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7262#include "clang/Basic/BuiltinsWebAssembly.def"
7263};
7264
7265class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7266public:
7267 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7268 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007269 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007270 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7271 }
7272
7273protected:
7274 void getTargetDefines(const LangOptions &Opts,
7275 MacroBuilder &Builder) const override {
7276 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7277 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7278 }
7279};
7280
7281class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7282public:
7283 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7284 : WebAssemblyTargetInfo(T) {
7285 LongAlign = LongWidth = 64;
7286 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007287 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007288 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7289 }
7290
7291protected:
7292 void getTargetDefines(const LangOptions &Opts,
7293 MacroBuilder &Builder) const override {
7294 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7295 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7296 }
7297};
7298
JF Bastien643817d2014-09-12 17:52:47 +00007299const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7300#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007301 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007302#include "clang/Basic/BuiltinsLe64.def"
7303};
7304
Eric Christopherc48497a2015-09-18 21:26:24 +00007305static const unsigned SPIRAddrSpaceMap[] = {
7306 1, // opencl_global
7307 3, // opencl_local
7308 2, // opencl_constant
7309 4, // opencl_generic
7310 0, // cuda_device
7311 0, // cuda_constant
7312 0 // cuda_shared
7313};
7314class SPIRTargetInfo : public TargetInfo {
7315public:
7316 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7317 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7318 "SPIR target must use unknown OS");
7319 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7320 "SPIR target must use unknown environment type");
7321 BigEndian = false;
7322 TLSSupported = false;
7323 LongWidth = LongAlign = 64;
7324 AddrSpaceMap = &SPIRAddrSpaceMap;
7325 UseAddrSpaceMapMangling = true;
7326 // Define available target features
7327 // These must be defined in sorted order!
7328 NoAsmVariants = true;
7329 }
7330 void getTargetDefines(const LangOptions &Opts,
7331 MacroBuilder &Builder) const override {
7332 DefineStd(Builder, "SPIR", Opts);
7333 }
7334 bool hasFeature(StringRef Feature) const override {
7335 return Feature == "spir";
7336 }
Craig Topper3164f332014-03-11 03:39:26 +00007337
Craig Topper6c03a542015-10-19 04:51:35 +00007338 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007339 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007340 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007341 bool validateAsmConstraint(const char *&Name,
7342 TargetInfo::ConstraintInfo &info) const override {
7343 return true;
7344 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007345 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7346 return None;
7347 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007348 BuiltinVaListKind getBuiltinVaListKind() const override {
7349 return TargetInfo::VoidPtrBuiltinVaList;
7350 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007351
Eric Christopherc48497a2015-09-18 21:26:24 +00007352 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7353 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7354 : CCCR_Warning;
7355 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007356
Eric Christopherc48497a2015-09-18 21:26:24 +00007357 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7358 return CC_SpirFunction;
7359 }
7360};
Guy Benyeib798fc92012-12-11 21:38:14 +00007361
Eric Christopherc48497a2015-09-18 21:26:24 +00007362class SPIR32TargetInfo : public SPIRTargetInfo {
7363public:
7364 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7365 PointerWidth = PointerAlign = 32;
7366 SizeType = TargetInfo::UnsignedInt;
7367 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7368 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7369 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7370 }
7371 void getTargetDefines(const LangOptions &Opts,
7372 MacroBuilder &Builder) const override {
7373 DefineStd(Builder, "SPIR32", Opts);
7374 }
7375};
Guy Benyeib798fc92012-12-11 21:38:14 +00007376
Eric Christopherc48497a2015-09-18 21:26:24 +00007377class SPIR64TargetInfo : public SPIRTargetInfo {
7378public:
7379 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7380 PointerWidth = PointerAlign = 64;
7381 SizeType = TargetInfo::UnsignedLong;
7382 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7383 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7384 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7385 }
7386 void getTargetDefines(const LangOptions &Opts,
7387 MacroBuilder &Builder) const override {
7388 DefineStd(Builder, "SPIR64", Opts);
7389 }
7390};
Guy Benyeib798fc92012-12-11 21:38:14 +00007391
Robert Lytton0e076492013-08-13 09:43:10 +00007392class XCoreTargetInfo : public TargetInfo {
7393 static const Builtin::Info BuiltinInfo[];
7394public:
7395 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7396 BigEndian = false;
7397 NoAsmVariants = true;
7398 LongLongAlign = 32;
7399 SuitableAlign = 32;
7400 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007401 SizeType = UnsignedInt;
7402 PtrDiffType = SignedInt;
7403 IntPtrType = SignedInt;
7404 WCharType = UnsignedChar;
7405 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007406 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007407 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7408 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007409 }
Craig Topper3164f332014-03-11 03:39:26 +00007410 void getTargetDefines(const LangOptions &Opts,
7411 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007412 Builder.defineMacro("__XS1B__");
7413 }
Craig Topper6c03a542015-10-19 04:51:35 +00007414 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7415 return llvm::makeArrayRef(BuiltinInfo,
7416 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007417 }
Craig Topper3164f332014-03-11 03:39:26 +00007418 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007419 return TargetInfo::VoidPtrBuiltinVaList;
7420 }
Craig Topper3164f332014-03-11 03:39:26 +00007421 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007422 return "";
7423 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007424 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007425 static const char * const GCCRegNames[] = {
7426 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7427 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7428 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007429 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007430 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007431 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7432 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007433 }
Craig Topper3164f332014-03-11 03:39:26 +00007434 bool validateAsmConstraint(const char *&Name,
7435 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007436 return false;
7437 }
Craig Topper3164f332014-03-11 03:39:26 +00007438 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007439 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7440 return (RegNo < 2)? RegNo : -1;
7441 }
Robert Lytton0e076492013-08-13 09:43:10 +00007442};
7443
7444const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007445#define BUILTIN(ID, TYPE, ATTRS) \
7446 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7447#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7448 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007449#include "clang/Basic/BuiltinsXCore.def"
7450};
Robert Lytton0e076492013-08-13 09:43:10 +00007451
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007452// x86_32 Android target
7453class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7454public:
7455 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7456 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7457 SuitableAlign = 32;
7458 LongDoubleWidth = 64;
7459 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7460 }
7461};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007462
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007463// x86_64 Android target
7464class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7465public:
7466 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7467 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7468 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7469 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007470
7471 bool useFloat128ManglingForLongDouble() const override {
7472 return true;
7473 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007474};
7475} // end anonymous namespace
7476
Chris Lattner5ba61f02006-10-14 07:39:34 +00007477//===----------------------------------------------------------------------===//
7478// Driver code
7479//===----------------------------------------------------------------------===//
7480
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007481static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007482 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007483
Daniel Dunbar52322032009-08-18 05:47:58 +00007484 switch (Triple.getArch()) {
7485 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007486 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007487
Tim Northover2a0783d2014-05-30 14:14:07 +00007488 case llvm::Triple::xcore:
7489 return new XCoreTargetInfo(Triple);
7490
7491 case llvm::Triple::hexagon:
7492 return new HexagonTargetInfo(Triple);
7493
7494 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007495 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007496 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007497
7498 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007499 case llvm::Triple::CloudABI:
7500 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007501 case llvm::Triple::FreeBSD:
7502 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007503 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007504 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007505 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007506 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007507 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007508 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007509 }
7510
Christian Pirker9b019ae2014-02-25 13:51:00 +00007511 case llvm::Triple::aarch64_be:
7512 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007513 case llvm::Triple::FreeBSD:
7514 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007515 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007516 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007517 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007518 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007519 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007520 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007521 }
7522
Daniel Dunbar52322032009-08-18 05:47:58 +00007523 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007524 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007525 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007526 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007527
Daniel Dunbar52322032009-08-18 05:47:58 +00007528 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007529 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007530 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007531 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007532 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007533 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007534 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007535 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007536 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007537 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007538 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007539 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007540 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007541 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007542 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007543 case llvm::Triple::Win32:
7544 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007545 case llvm::Triple::Cygnus:
7546 return new CygwinARMTargetInfo(Triple);
7547 case llvm::Triple::GNU:
7548 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007549 case llvm::Triple::Itanium:
7550 return new ItaniumWindowsARMleTargetInfo(Triple);
7551 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007552 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007553 return new MicrosoftARMleTargetInfo(Triple);
7554 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007555 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007556 return new ARMleTargetInfo(Triple);
7557 }
7558
7559 case llvm::Triple::armeb:
7560 case llvm::Triple::thumbeb:
7561 if (Triple.isOSDarwin())
7562 return new DarwinARMTargetInfo(Triple);
7563
7564 switch (os) {
7565 case llvm::Triple::Linux:
7566 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7567 case llvm::Triple::FreeBSD:
7568 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7569 case llvm::Triple::NetBSD:
7570 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7571 case llvm::Triple::OpenBSD:
7572 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7573 case llvm::Triple::Bitrig:
7574 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7575 case llvm::Triple::RTEMS:
7576 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7577 case llvm::Triple::NaCl:
7578 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7579 default:
7580 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007581 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007582
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007583 case llvm::Triple::bpfeb:
7584 case llvm::Triple::bpfel:
7585 return new BPFTargetInfo(Triple);
7586
Daniel Dunbar52322032009-08-18 05:47:58 +00007587 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007588 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007589
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007590 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007591 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007592 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007593 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007594 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007595 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007596 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007597 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007598 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007599 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007600 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007601 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007602 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007603
7604 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007605 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007606 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007607 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007608 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007609 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007610 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007611 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007612 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007613 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007614 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007615 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007616 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007617 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007618 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007619
Akira Hatanakabef17452011-09-20 19:21:49 +00007620 case llvm::Triple::mips64:
7621 switch (os) {
7622 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007623 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007624 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007625 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007626 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007627 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007628 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007629 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007630 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007631 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007632 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007633 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007634 }
7635
7636 case llvm::Triple::mips64el:
7637 switch (os) {
7638 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007639 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007640 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007641 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007642 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007643 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007644 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007645 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007646 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007647 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007648 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007649 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007650 }
7651
Ivan Krasindd7403e2011-08-24 20:22:22 +00007652 case llvm::Triple::le32:
7653 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007654 case llvm::Triple::NaCl:
7655 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7656 default:
7657 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007658 }
7659
JF Bastien643817d2014-09-12 17:52:47 +00007660 case llvm::Triple::le64:
7661 return new Le64TargetInfo(Triple);
7662
Daniel Dunbar52322032009-08-18 05:47:58 +00007663 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007664 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007665 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007666 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007667 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007668 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007669 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007670 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007671 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007672 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007673 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007674 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007675 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007676 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007677 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007678 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007679 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007680
7681 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007682 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007683 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007684 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007685 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007686 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007687 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007688 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007689 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007690 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007691 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007692 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007693 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007694 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007695 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007696
Bill Schmidt778d3872013-07-26 01:36:11 +00007697 case llvm::Triple::ppc64le:
7698 switch (os) {
7699 case llvm::Triple::Linux:
7700 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007701 case llvm::Triple::NetBSD:
7702 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007703 default:
7704 return new PPC64TargetInfo(Triple);
7705 }
7706
Peter Collingbournec947aae2012-05-20 23:28:41 +00007707 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007708 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007709 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007710 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007711
Tom Stellardd8e38a32015-01-06 20:34:47 +00007712 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007713 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007714 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007715
Daniel Dunbar52322032009-08-18 05:47:58 +00007716 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007717 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007718 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007719 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007720 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007721 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007722 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007723 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007724 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007725 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007726 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007727 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007728 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007729 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007730 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007731
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007732 // The 'sparcel' architecture copies all the above cases except for Solaris.
7733 case llvm::Triple::sparcel:
7734 switch (os) {
7735 case llvm::Triple::Linux:
7736 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7737 case llvm::Triple::NetBSD:
7738 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7739 case llvm::Triple::OpenBSD:
7740 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7741 case llvm::Triple::RTEMS:
7742 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7743 default:
7744 return new SparcV8elTargetInfo(Triple);
7745 }
7746
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007747 case llvm::Triple::sparcv9:
7748 switch (os) {
7749 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007750 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007751 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007752 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007753 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007754 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007755 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007756 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007757 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007758 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007759 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007760 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007761 }
7762
Ulrich Weigand47445072013-05-06 16:26:41 +00007763 case llvm::Triple::systemz:
7764 switch (os) {
7765 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007766 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007767 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007768 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007769 }
7770
Eli Friedmana9c3d712009-08-19 20:47:07 +00007771 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007772 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007773
Daniel Dunbar52322032009-08-18 05:47:58 +00007774 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007775 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007776 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007777
Daniel Dunbar52322032009-08-18 05:47:58 +00007778 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007779 case llvm::Triple::CloudABI:
7780 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007781 case llvm::Triple::Linux: {
7782 switch (Triple.getEnvironment()) {
7783 default:
7784 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7785 case llvm::Triple::Android:
7786 return new AndroidX86_32TargetInfo(Triple);
7787 }
7788 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007789 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007790 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007791 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007792 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007793 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007794 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007795 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007796 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007797 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007798 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007799 case llvm::Triple::KFreeBSD:
7800 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007801 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007802 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007803 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007804 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007805 case llvm::Triple::Win32: {
7806 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007807 case llvm::Triple::Cygnus:
7808 return new CygwinX86_32TargetInfo(Triple);
7809 case llvm::Triple::GNU:
7810 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007811 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007812 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007813 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007814 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007815 }
7816 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007817 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007818 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007819 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007820 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007821 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007822 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00007823 case llvm::Triple::ELFIAMCU:
7824 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007825 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007826 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007827 }
7828
7829 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007830 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007831 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007832
Daniel Dunbar52322032009-08-18 05:47:58 +00007833 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007834 case llvm::Triple::CloudABI:
7835 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007836 case llvm::Triple::Linux: {
7837 switch (Triple.getEnvironment()) {
7838 default:
7839 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7840 case llvm::Triple::Android:
7841 return new AndroidX86_64TargetInfo(Triple);
7842 }
7843 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007844 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007845 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007846 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007847 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007848 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007849 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007850 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007851 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007852 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007853 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007854 case llvm::Triple::KFreeBSD:
7855 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007856 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007857 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007858 case llvm::Triple::Win32: {
7859 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007860 case llvm::Triple::Cygnus:
7861 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007862 case llvm::Triple::GNU:
7863 return new MinGWX86_64TargetInfo(Triple);
7864 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007865 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007866 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007867 }
7868 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007869 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007870 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007871 case llvm::Triple::PS4:
7872 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007873 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007874 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007875 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007876
Douglas Katzman78d7c542015-05-12 21:18:10 +00007877 case llvm::Triple::spir: {
7878 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7879 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7880 return nullptr;
7881 return new SPIR32TargetInfo(Triple);
7882 }
7883 case llvm::Triple::spir64: {
7884 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7885 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7886 return nullptr;
7887 return new SPIR64TargetInfo(Triple);
7888 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007889 case llvm::Triple::wasm32:
7890 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7891 return nullptr;
7892 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7893 case llvm::Triple::wasm64:
7894 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7895 return nullptr;
7896 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007897 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007898}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007899
7900/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007901/// options.
Alp Toker80758082014-07-06 05:26:44 +00007902TargetInfo *
7903TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7904 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007905 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007906
7907 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007908 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007909 if (!Target) {
7910 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007911 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007912 }
Alp Toker80758082014-07-06 05:26:44 +00007913 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007914
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007915 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007916 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7917 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007918 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007919 }
7920
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007921 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007922 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7923 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007924 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007925 }
7926
Rafael Espindolaeb265472013-08-21 21:59:03 +00007927 // Set the fp math unit.
7928 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7929 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007930 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007931 }
7932
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007933 // Compute the default target features, we need the target to handle this
7934 // because features may have dependencies on one another.
7935 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007936 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7937 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007938 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007939
7940 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007941 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007942 for (const auto &F : Features)
7943 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7944
Eric Christopher3ff21b32013-10-16 21:26:26 +00007945 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007946 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007947
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007948 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007949}