blob: 319a8d93116344a2fb3dbf8af29fa3d1f34aa326 [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,
1829 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001830 return true;
1831 }
1832
Craig Topper6c03a542015-10-19 04:51:35 +00001833 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1834 return llvm::makeArrayRef(BuiltinInfo,
1835 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001836 }
1837
Craig Topper3164f332014-03-11 03:39:26 +00001838 void getTargetDefines(const LangOptions &Opts,
1839 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001840 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001841 if (hasFMAF)
1842 Builder.defineMacro("__HAS_FMAF__");
1843 if (hasLDEXPF)
1844 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001845 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001846 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001847 if (Opts.OpenCL) {
1848 if (GPU >= GK_NORTHERN_ISLANDS) {
1849 Builder.defineMacro("cl_khr_byte_addressable_store");
1850 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1851 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1852 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1853 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1854 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001855 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001856 }
1857
Craig Topper3164f332014-03-11 03:39:26 +00001858 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001859 return TargetInfo::CharPtrBuiltinVaList;
1860 }
1861
Craig Topper3164f332014-03-11 03:39:26 +00001862 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001863 GPU = llvm::StringSwitch<GPUKind>(Name)
1864 .Case("r600" , GK_R600)
1865 .Case("rv610", GK_R600)
1866 .Case("rv620", GK_R600)
1867 .Case("rv630", GK_R600)
1868 .Case("rv635", GK_R600)
1869 .Case("rs780", GK_R600)
1870 .Case("rs880", GK_R600)
1871 .Case("rv670", GK_R600_DOUBLE_OPS)
1872 .Case("rv710", GK_R700)
1873 .Case("rv730", GK_R700)
1874 .Case("rv740", GK_R700_DOUBLE_OPS)
1875 .Case("rv770", GK_R700_DOUBLE_OPS)
1876 .Case("palm", GK_EVERGREEN)
1877 .Case("cedar", GK_EVERGREEN)
1878 .Case("sumo", GK_EVERGREEN)
1879 .Case("sumo2", GK_EVERGREEN)
1880 .Case("redwood", GK_EVERGREEN)
1881 .Case("juniper", GK_EVERGREEN)
1882 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1883 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1884 .Case("barts", GK_NORTHERN_ISLANDS)
1885 .Case("turks", GK_NORTHERN_ISLANDS)
1886 .Case("caicos", GK_NORTHERN_ISLANDS)
1887 .Case("cayman", GK_CAYMAN)
1888 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001889 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001890 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1891 .Case("verde", GK_SOUTHERN_ISLANDS)
1892 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001893 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001894 .Case("bonaire", GK_SEA_ISLANDS)
1895 .Case("kabini", GK_SEA_ISLANDS)
1896 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001897 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001898 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001899 .Case("tonga", GK_VOLCANIC_ISLANDS)
1900 .Case("iceland", GK_VOLCANIC_ISLANDS)
1901 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001902 .Default(GK_NONE);
1903
1904 if (GPU == GK_NONE) {
1905 return false;
1906 }
1907
1908 // Set the correct data layout
1909 switch (GPU) {
1910 case GK_NONE:
1911 case GK_R600:
1912 case GK_R700:
1913 case GK_EVERGREEN:
1914 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001915 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001916 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001917 hasFMAF = false;
1918 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001919 break;
1920 case GK_R600_DOUBLE_OPS:
1921 case GK_R700_DOUBLE_OPS:
1922 case GK_EVERGREEN_DOUBLE_OPS:
1923 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001924 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001925 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001926 hasFMAF = true;
1927 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001928 break;
1929 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001930 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001931 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001932 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001933 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001934 hasFMAF = true;
1935 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001936 break;
1937 }
1938
1939 return true;
1940 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001941};
1942
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001943const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001944#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001945 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001946#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001947};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001948const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001949 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1950 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1951 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1952 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1953 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1954 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1955 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1956 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1957 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1958 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1959 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1960 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1961 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1962 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1963 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1964 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1965 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1966 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1967 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1968 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1969 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1970 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1971 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1972 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1973 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1974 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1975 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1976 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1977 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1978 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1979 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1980 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1981 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1982 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1983 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1984 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1985 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1986 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1987 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1988 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1989 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1990 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1991 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1992 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1993 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1994 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1995 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1996 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1997 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1998 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1999};
2000
Craig Topperf054e3a2015-10-19 03:52:27 +00002001ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2002 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002003}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002004
Eli Friedman3fd920a2008-08-20 02:34:37 +00002005// Namespace for x86 abstract base class
2006const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002007#define BUILTIN(ID, TYPE, ATTRS) \
2008 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002009#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002010 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002011#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002012 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002013#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002014};
Eli Friedmanb5366062008-05-20 14:21:01 +00002015
Nuno Lopescfca1f02009-12-23 17:49:57 +00002016static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002017 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2018 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002019 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002020 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2021 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2022 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002023 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002024 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2025 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002026};
2027
Eric Christophercdd36352011-06-21 00:05:20 +00002028const TargetInfo::AddlRegName AddlRegNames[] = {
2029 { { "al", "ah", "eax", "rax" }, 0 },
2030 { { "bl", "bh", "ebx", "rbx" }, 3 },
2031 { { "cl", "ch", "ecx", "rcx" }, 2 },
2032 { { "dl", "dh", "edx", "rdx" }, 1 },
2033 { { "esi", "rsi" }, 4 },
2034 { { "edi", "rdi" }, 5 },
2035 { { "esp", "rsp" }, 7 },
2036 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002037 { { "r8d", "r8w", "r8b" }, 38 },
2038 { { "r9d", "r9w", "r9b" }, 39 },
2039 { { "r10d", "r10w", "r10b" }, 40 },
2040 { { "r11d", "r11w", "r11b" }, 41 },
2041 { { "r12d", "r12w", "r12b" }, 42 },
2042 { { "r13d", "r13w", "r13b" }, 43 },
2043 { { "r14d", "r14w", "r14b" }, 44 },
2044 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002045};
2046
2047// X86 target abstract base class; x86-32 and x86-64 are very close, so
2048// most of the implementation can be shared.
2049class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002050 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002051 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002052 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002053 enum MMX3DNowEnum {
2054 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002055 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002056 enum XOPEnum {
2057 NoXOP,
2058 SSE4A,
2059 FMA4,
2060 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002061 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002062
Craig Topper543f3bd2015-10-14 23:47:57 +00002063 bool HasAES = false;
2064 bool HasPCLMUL = false;
2065 bool HasLZCNT = false;
2066 bool HasRDRND = false;
2067 bool HasFSGSBASE = false;
2068 bool HasBMI = false;
2069 bool HasBMI2 = false;
2070 bool HasPOPCNT = false;
2071 bool HasRTM = false;
2072 bool HasPRFCHW = false;
2073 bool HasRDSEED = false;
2074 bool HasADX = false;
2075 bool HasTBM = false;
2076 bool HasFMA = false;
2077 bool HasF16C = false;
2078 bool HasAVX512CD = false;
2079 bool HasAVX512ER = false;
2080 bool HasAVX512PF = false;
2081 bool HasAVX512DQ = false;
2082 bool HasAVX512BW = false;
2083 bool HasAVX512VL = false;
2084 bool HasSHA = false;
2085 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002086 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002087 bool HasXSAVE = false;
2088 bool HasXSAVEOPT = false;
2089 bool HasXSAVEC = false;
2090 bool HasXSAVES = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002091
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002092 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2093 ///
2094 /// Each enumeration represents a particular CPU supported by Clang. These
2095 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2096 enum CPUKind {
2097 CK_Generic,
2098
2099 /// \name i386
2100 /// i386-generation processors.
2101 //@{
2102 CK_i386,
2103 //@}
2104
2105 /// \name i486
2106 /// i486-generation processors.
2107 //@{
2108 CK_i486,
2109 CK_WinChipC6,
2110 CK_WinChip2,
2111 CK_C3,
2112 //@}
2113
2114 /// \name i586
2115 /// i586-generation processors, P5 microarchitecture based.
2116 //@{
2117 CK_i586,
2118 CK_Pentium,
2119 CK_PentiumMMX,
2120 //@}
2121
2122 /// \name i686
2123 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2124 //@{
2125 CK_i686,
2126 CK_PentiumPro,
2127 CK_Pentium2,
2128 CK_Pentium3,
2129 CK_Pentium3M,
2130 CK_PentiumM,
2131 CK_C3_2,
2132
2133 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2134 /// Clang however has some logic to suport this.
2135 // FIXME: Warn, deprecate, and potentially remove this.
2136 CK_Yonah,
2137 //@}
2138
2139 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002140 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002141 //@{
2142 CK_Pentium4,
2143 CK_Pentium4M,
2144 CK_Prescott,
2145 CK_Nocona,
2146 //@}
2147
2148 /// \name Core
2149 /// Core microarchitecture based processors.
2150 //@{
2151 CK_Core2,
2152
2153 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2154 /// codename which GCC no longer accepts as an option to -march, but Clang
2155 /// has some logic for recognizing it.
2156 // FIXME: Warn, deprecate, and potentially remove this.
2157 CK_Penryn,
2158 //@}
2159
2160 /// \name Atom
2161 /// Atom processors
2162 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002163 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002164 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002165 //@}
2166
2167 /// \name Nehalem
2168 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002169 CK_Nehalem,
2170
2171 /// \name Westmere
2172 /// Westmere microarchitecture based processors.
2173 CK_Westmere,
2174
2175 /// \name Sandy Bridge
2176 /// Sandy Bridge microarchitecture based processors.
2177 CK_SandyBridge,
2178
2179 /// \name Ivy Bridge
2180 /// Ivy Bridge microarchitecture based processors.
2181 CK_IvyBridge,
2182
2183 /// \name Haswell
2184 /// Haswell microarchitecture based processors.
2185 CK_Haswell,
2186
2187 /// \name Broadwell
2188 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002189 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002190
2191 /// \name Skylake
2192 /// Skylake microarchitecture based processors.
2193 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002194
Craig Topper449314e2013-08-20 07:09:39 +00002195 /// \name Knights Landing
2196 /// Knights Landing processor.
2197 CK_KNL,
2198
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002199 /// \name K6
2200 /// K6 architecture processors.
2201 //@{
2202 CK_K6,
2203 CK_K6_2,
2204 CK_K6_3,
2205 //@}
2206
2207 /// \name K7
2208 /// K7 architecture processors.
2209 //@{
2210 CK_Athlon,
2211 CK_AthlonThunderbird,
2212 CK_Athlon4,
2213 CK_AthlonXP,
2214 CK_AthlonMP,
2215 //@}
2216
2217 /// \name K8
2218 /// K8 architecture processors.
2219 //@{
2220 CK_Athlon64,
2221 CK_Athlon64SSE3,
2222 CK_AthlonFX,
2223 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002224 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002225 CK_Opteron,
2226 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002227 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002228 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002229
Benjamin Kramer569f2152012-01-10 11:50:18 +00002230 /// \name Bobcat
2231 /// Bobcat architecture processors.
2232 //@{
2233 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002234 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002235 //@}
2236
2237 /// \name Bulldozer
2238 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002239 //@{
2240 CK_BDVER1,
2241 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002242 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002243 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002244 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002245
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002246 /// This specification is deprecated and will be removed in the future.
2247 /// Users should prefer \see CK_K8.
2248 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002249 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002250 CK_x86_64,
2251 //@}
2252
2253 /// \name Geode
2254 /// Geode processors.
2255 //@{
2256 CK_Geode
2257 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002258 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002259
Eric Christopherc50738f2015-08-27 00:05:50 +00002260 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002261 return llvm::StringSwitch<CPUKind>(CPU)
2262 .Case("i386", CK_i386)
2263 .Case("i486", CK_i486)
2264 .Case("winchip-c6", CK_WinChipC6)
2265 .Case("winchip2", CK_WinChip2)
2266 .Case("c3", CK_C3)
2267 .Case("i586", CK_i586)
2268 .Case("pentium", CK_Pentium)
2269 .Case("pentium-mmx", CK_PentiumMMX)
2270 .Case("i686", CK_i686)
2271 .Case("pentiumpro", CK_PentiumPro)
2272 .Case("pentium2", CK_Pentium2)
2273 .Case("pentium3", CK_Pentium3)
2274 .Case("pentium3m", CK_Pentium3M)
2275 .Case("pentium-m", CK_PentiumM)
2276 .Case("c3-2", CK_C3_2)
2277 .Case("yonah", CK_Yonah)
2278 .Case("pentium4", CK_Pentium4)
2279 .Case("pentium4m", CK_Pentium4M)
2280 .Case("prescott", CK_Prescott)
2281 .Case("nocona", CK_Nocona)
2282 .Case("core2", CK_Core2)
2283 .Case("penryn", CK_Penryn)
2284 .Case("bonnell", CK_Bonnell)
2285 .Case("atom", CK_Bonnell) // Legacy name.
2286 .Case("silvermont", CK_Silvermont)
2287 .Case("slm", CK_Silvermont) // Legacy name.
2288 .Case("nehalem", CK_Nehalem)
2289 .Case("corei7", CK_Nehalem) // Legacy name.
2290 .Case("westmere", CK_Westmere)
2291 .Case("sandybridge", CK_SandyBridge)
2292 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2293 .Case("ivybridge", CK_IvyBridge)
2294 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2295 .Case("haswell", CK_Haswell)
2296 .Case("core-avx2", CK_Haswell) // Legacy name.
2297 .Case("broadwell", CK_Broadwell)
2298 .Case("skylake", CK_Skylake)
2299 .Case("skx", CK_Skylake) // Legacy name.
2300 .Case("knl", CK_KNL)
2301 .Case("k6", CK_K6)
2302 .Case("k6-2", CK_K6_2)
2303 .Case("k6-3", CK_K6_3)
2304 .Case("athlon", CK_Athlon)
2305 .Case("athlon-tbird", CK_AthlonThunderbird)
2306 .Case("athlon-4", CK_Athlon4)
2307 .Case("athlon-xp", CK_AthlonXP)
2308 .Case("athlon-mp", CK_AthlonMP)
2309 .Case("athlon64", CK_Athlon64)
2310 .Case("athlon64-sse3", CK_Athlon64SSE3)
2311 .Case("athlon-fx", CK_AthlonFX)
2312 .Case("k8", CK_K8)
2313 .Case("k8-sse3", CK_K8SSE3)
2314 .Case("opteron", CK_Opteron)
2315 .Case("opteron-sse3", CK_OpteronSSE3)
2316 .Case("barcelona", CK_AMDFAM10)
2317 .Case("amdfam10", CK_AMDFAM10)
2318 .Case("btver1", CK_BTVER1)
2319 .Case("btver2", CK_BTVER2)
2320 .Case("bdver1", CK_BDVER1)
2321 .Case("bdver2", CK_BDVER2)
2322 .Case("bdver3", CK_BDVER3)
2323 .Case("bdver4", CK_BDVER4)
2324 .Case("x86-64", CK_x86_64)
2325 .Case("geode", CK_Geode)
2326 .Default(CK_Generic);
2327 }
2328
Rafael Espindolaeb265472013-08-21 21:59:03 +00002329 enum FPMathKind {
2330 FP_Default,
2331 FP_SSE,
2332 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002333 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002334
Eli Friedman3fd920a2008-08-20 02:34:37 +00002335public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002336 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002337 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002338 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002339 }
Craig Topper3164f332014-03-11 03:39:26 +00002340 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002341 // X87 evaluates with 80 bits "long double" precision.
2342 return SSELevel == NoSSE ? 2 : 0;
2343 }
Craig Topper6c03a542015-10-19 04:51:35 +00002344 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2345 return llvm::makeArrayRef(BuiltinInfo,
2346 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002347 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002348 ArrayRef<const char *> getGCCRegNames() const override {
2349 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002350 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002351 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2352 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002353 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002354 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2355 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002356 }
Eric Christopherd9832702015-06-29 21:00:05 +00002357 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002358 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002359 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002360
Akira Hatanaka974131e2014-09-18 18:17:18 +00002361 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2362
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002363 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2364
Akira Hatanaka974131e2014-09-18 18:17:18 +00002365 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2366
Craig Topper3164f332014-03-11 03:39:26 +00002367 std::string convertConstraint(const char *&Constraint) const override;
2368 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002369 return "~{dirflag},~{fpsr},~{flags}";
2370 }
Craig Topper3164f332014-03-11 03:39:26 +00002371 void getTargetDefines(const LangOptions &Opts,
2372 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002373 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2374 bool Enabled);
2375 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2376 bool Enabled);
2377 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2378 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002379 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2380 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002381 setFeatureEnabledImpl(Features, Name, Enabled);
2382 }
2383 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002384 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002385 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2386 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002387 bool
2388 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2389 StringRef CPU,
2390 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002391 bool hasFeature(StringRef Feature) const override;
2392 bool handleTargetFeatures(std::vector<std::string> &Features,
2393 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002394 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002395 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2396 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002397 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002398 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002399 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002400 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002401 return "no-mmx";
2402 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002403 }
Craig Topper3164f332014-03-11 03:39:26 +00002404 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002405 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002406
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002407 // Perform any per-CPU checks necessary to determine if this CPU is
2408 // acceptable.
2409 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2410 // invalid without explaining *why*.
2411 switch (CPU) {
2412 case CK_Generic:
2413 // No processor selected!
2414 return false;
2415
2416 case CK_i386:
2417 case CK_i486:
2418 case CK_WinChipC6:
2419 case CK_WinChip2:
2420 case CK_C3:
2421 case CK_i586:
2422 case CK_Pentium:
2423 case CK_PentiumMMX:
2424 case CK_i686:
2425 case CK_PentiumPro:
2426 case CK_Pentium2:
2427 case CK_Pentium3:
2428 case CK_Pentium3M:
2429 case CK_PentiumM:
2430 case CK_Yonah:
2431 case CK_C3_2:
2432 case CK_Pentium4:
2433 case CK_Pentium4M:
2434 case CK_Prescott:
2435 case CK_K6:
2436 case CK_K6_2:
2437 case CK_K6_3:
2438 case CK_Athlon:
2439 case CK_AthlonThunderbird:
2440 case CK_Athlon4:
2441 case CK_AthlonXP:
2442 case CK_AthlonMP:
2443 case CK_Geode:
2444 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002445 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002446 return false;
2447
2448 // Fallthrough
2449 case CK_Nocona:
2450 case CK_Core2:
2451 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002452 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002453 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002454 case CK_Nehalem:
2455 case CK_Westmere:
2456 case CK_SandyBridge:
2457 case CK_IvyBridge:
2458 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002459 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002460 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002461 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002462 case CK_Athlon64:
2463 case CK_Athlon64SSE3:
2464 case CK_AthlonFX:
2465 case CK_K8:
2466 case CK_K8SSE3:
2467 case CK_Opteron:
2468 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002469 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002470 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002471 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002472 case CK_BDVER1:
2473 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002474 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002475 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002476 case CK_x86_64:
2477 return true;
2478 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002479 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002480 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002481
Craig Topper3164f332014-03-11 03:39:26 +00002482 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002483
Craig Topper3164f332014-03-11 03:39:26 +00002484 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002485 // We accept all non-ARM calling conventions
2486 return (CC == CC_X86ThisCall ||
2487 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002488 CC == CC_X86StdCall ||
2489 CC == CC_X86VectorCall ||
2490 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002491 CC == CC_X86Pascal ||
2492 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002493 }
2494
Craig Topper3164f332014-03-11 03:39:26 +00002495 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002496 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002497 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002498
2499 bool hasSjLjLowering() const override {
2500 return true;
2501 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002502};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002503
Rafael Espindolaeb265472013-08-21 21:59:03 +00002504bool X86TargetInfo::setFPMath(StringRef Name) {
2505 if (Name == "387") {
2506 FPMath = FP_387;
2507 return true;
2508 }
2509 if (Name == "sse") {
2510 FPMath = FP_SSE;
2511 return true;
2512 }
2513 return false;
2514}
2515
Eric Christopher007b0a02015-08-28 22:32:01 +00002516bool X86TargetInfo::initFeatureMap(
2517 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002518 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002519 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002520 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002521 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002522 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002523
Eric Christopher2b4a7252015-08-27 00:05:52 +00002524 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002525 case CK_Generic:
2526 case CK_i386:
2527 case CK_i486:
2528 case CK_i586:
2529 case CK_Pentium:
2530 case CK_i686:
2531 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002532 break;
2533 case CK_PentiumMMX:
2534 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002535 case CK_K6:
2536 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002537 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002538 break;
2539 case CK_Pentium3:
2540 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002541 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002542 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002543 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002544 break;
2545 case CK_PentiumM:
2546 case CK_Pentium4:
2547 case CK_Pentium4M:
2548 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002549 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002550 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002551 break;
2552 case CK_Yonah:
2553 case CK_Prescott:
2554 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002555 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002556 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002557 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002558 break;
2559 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002560 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002561 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002562 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002563 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002564 break;
2565 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002566 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002567 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002568 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002569 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002570 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002571 setFeatureEnabledImpl(Features, "avx512f", true);
2572 setFeatureEnabledImpl(Features, "avx512cd", true);
2573 setFeatureEnabledImpl(Features, "avx512dq", true);
2574 setFeatureEnabledImpl(Features, "avx512bw", true);
2575 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002576 setFeatureEnabledImpl(Features, "xsavec", true);
2577 setFeatureEnabledImpl(Features, "xsaves", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002578 // FALLTHROUGH
2579 case CK_Broadwell:
2580 setFeatureEnabledImpl(Features, "rdseed", true);
2581 setFeatureEnabledImpl(Features, "adx", true);
2582 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002583 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002584 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002585 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002586 setFeatureEnabledImpl(Features, "bmi", true);
2587 setFeatureEnabledImpl(Features, "bmi2", true);
2588 setFeatureEnabledImpl(Features, "rtm", true);
2589 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002590 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002591 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002592 setFeatureEnabledImpl(Features, "rdrnd", true);
2593 setFeatureEnabledImpl(Features, "f16c", true);
2594 setFeatureEnabledImpl(Features, "fsgsbase", true);
2595 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002596 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002597 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002598 setFeatureEnabledImpl(Features, "xsave", true);
2599 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002600 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002601 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002602 case CK_Silvermont:
2603 setFeatureEnabledImpl(Features, "aes", true);
2604 setFeatureEnabledImpl(Features, "pclmul", true);
2605 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002606 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002607 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002608 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002609 setFeatureEnabledImpl(Features, "cx16", true);
2610 break;
2611 case CK_KNL:
2612 setFeatureEnabledImpl(Features, "avx512f", true);
2613 setFeatureEnabledImpl(Features, "avx512cd", true);
2614 setFeatureEnabledImpl(Features, "avx512er", true);
2615 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002616 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002617 setFeatureEnabledImpl(Features, "rdseed", true);
2618 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002619 setFeatureEnabledImpl(Features, "lzcnt", true);
2620 setFeatureEnabledImpl(Features, "bmi", true);
2621 setFeatureEnabledImpl(Features, "bmi2", true);
2622 setFeatureEnabledImpl(Features, "rtm", true);
2623 setFeatureEnabledImpl(Features, "fma", true);
2624 setFeatureEnabledImpl(Features, "rdrnd", true);
2625 setFeatureEnabledImpl(Features, "f16c", true);
2626 setFeatureEnabledImpl(Features, "fsgsbase", true);
2627 setFeatureEnabledImpl(Features, "aes", true);
2628 setFeatureEnabledImpl(Features, "pclmul", true);
2629 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002630 setFeatureEnabledImpl(Features, "xsaveopt", true);
2631 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002632 break;
2633 case CK_K6_2:
2634 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002635 case CK_WinChip2:
2636 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002637 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002638 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002639 case CK_Athlon:
2640 case CK_AthlonThunderbird:
2641 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002642 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002643 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002644 case CK_Athlon4:
2645 case CK_AthlonXP:
2646 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002647 setFeatureEnabledImpl(Features, "sse", true);
2648 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002649 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002650 break;
2651 case CK_K8:
2652 case CK_Opteron:
2653 case CK_Athlon64:
2654 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002655 setFeatureEnabledImpl(Features, "sse2", true);
2656 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002657 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002658 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002659 case CK_AMDFAM10:
2660 setFeatureEnabledImpl(Features, "sse4a", true);
2661 setFeatureEnabledImpl(Features, "lzcnt", true);
2662 setFeatureEnabledImpl(Features, "popcnt", true);
2663 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002664 case CK_K8SSE3:
2665 case CK_OpteronSSE3:
2666 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002667 setFeatureEnabledImpl(Features, "sse3", true);
2668 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002669 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002670 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002671 case CK_BTVER2:
2672 setFeatureEnabledImpl(Features, "avx", true);
2673 setFeatureEnabledImpl(Features, "aes", true);
2674 setFeatureEnabledImpl(Features, "pclmul", true);
2675 setFeatureEnabledImpl(Features, "bmi", true);
2676 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002677 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002678 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002679 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002680 setFeatureEnabledImpl(Features, "ssse3", true);
2681 setFeatureEnabledImpl(Features, "sse4a", true);
2682 setFeatureEnabledImpl(Features, "lzcnt", true);
2683 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002684 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002685 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002686 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002687 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002688 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002689 case CK_BDVER4:
2690 setFeatureEnabledImpl(Features, "avx2", true);
2691 setFeatureEnabledImpl(Features, "bmi2", true);
2692 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002693 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002694 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002695 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002696 // FALLTHROUGH
2697 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002698 setFeatureEnabledImpl(Features, "bmi", true);
2699 setFeatureEnabledImpl(Features, "fma", true);
2700 setFeatureEnabledImpl(Features, "f16c", true);
2701 setFeatureEnabledImpl(Features, "tbm", true);
2702 // FALLTHROUGH
2703 case CK_BDVER1:
2704 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002705 setFeatureEnabledImpl(Features, "xop", true);
2706 setFeatureEnabledImpl(Features, "lzcnt", true);
2707 setFeatureEnabledImpl(Features, "aes", true);
2708 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002709 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002710 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002711 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002712 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002713 break;
Eli Friedman33465822011-07-08 23:31:17 +00002714 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002715 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2716 return false;
2717
2718 // Can't do this earlier because we need to be able to explicitly enable
2719 // or disable these features and the things that they depend upon.
2720
2721 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2722 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002723 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002724 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2725 FeaturesVec.end())
2726 Features["popcnt"] = true;
2727
2728 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2729 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002730 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002731 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2732 FeaturesVec.end())
2733 Features["prfchw"] = true;
2734
Eric Christophera7260af2015-10-08 20:10:18 +00002735 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2736 // then enable MMX.
2737 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002738 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002739 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2740 FeaturesVec.end())
2741 Features["mmx"] = true;
2742
Eric Christopherbbd746d2015-10-08 20:10:14 +00002743 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002744}
2745
Rafael Espindolae62e2792013-08-20 13:44:29 +00002746void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002747 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002748 if (Enabled) {
2749 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002750 case AVX512F:
2751 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002752 case AVX2:
2753 Features["avx2"] = true;
2754 case AVX:
2755 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002756 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002757 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002758 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002759 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002760 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002761 case SSSE3:
2762 Features["ssse3"] = true;
2763 case SSE3:
2764 Features["sse3"] = true;
2765 case SSE2:
2766 Features["sse2"] = true;
2767 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002768 Features["sse"] = true;
2769 case NoSSE:
2770 break;
2771 }
2772 return;
2773 }
2774
2775 switch (Level) {
2776 case NoSSE:
2777 case SSE1:
2778 Features["sse"] = false;
2779 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002780 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2781 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002782 case SSE3:
2783 Features["sse3"] = false;
2784 setXOPLevel(Features, NoXOP, false);
2785 case SSSE3:
2786 Features["ssse3"] = false;
2787 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002788 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002789 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002790 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002791 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002792 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2793 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002794 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002795 case AVX2:
2796 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002797 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002798 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002799 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2800 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002801 }
2802}
2803
2804void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002805 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002806 if (Enabled) {
2807 switch (Level) {
2808 case AMD3DNowAthlon:
2809 Features["3dnowa"] = true;
2810 case AMD3DNow:
2811 Features["3dnow"] = true;
2812 case MMX:
2813 Features["mmx"] = true;
2814 case NoMMX3DNow:
2815 break;
2816 }
2817 return;
2818 }
2819
2820 switch (Level) {
2821 case NoMMX3DNow:
2822 case MMX:
2823 Features["mmx"] = false;
2824 case AMD3DNow:
2825 Features["3dnow"] = false;
2826 case AMD3DNowAthlon:
2827 Features["3dnowa"] = false;
2828 }
2829}
2830
2831void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002832 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002833 if (Enabled) {
2834 switch (Level) {
2835 case XOP:
2836 Features["xop"] = true;
2837 case FMA4:
2838 Features["fma4"] = true;
2839 setSSELevel(Features, AVX, true);
2840 case SSE4A:
2841 Features["sse4a"] = true;
2842 setSSELevel(Features, SSE3, true);
2843 case NoXOP:
2844 break;
2845 }
2846 return;
2847 }
2848
2849 switch (Level) {
2850 case NoXOP:
2851 case SSE4A:
2852 Features["sse4a"] = false;
2853 case FMA4:
2854 Features["fma4"] = false;
2855 case XOP:
2856 Features["xop"] = false;
2857 }
2858}
2859
Craig Topper86d79ef2013-09-17 04:51:29 +00002860void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2861 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002862 // This is a bit of a hack to deal with the sse4 target feature when used
2863 // as part of the target attribute. We handle sse4 correctly everywhere
2864 // else. See below for more information on how we handle the sse4 options.
2865 if (Name != "sse4")
2866 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002867
Craig Topper29561122013-09-19 01:13:07 +00002868 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002870 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002871 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002872 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002873 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002874 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002875 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002876 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002877 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002878 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002879 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002880 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002881 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002882 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002883 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002884 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002885 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002886 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 if (Enabled)
2888 setSSELevel(Features, SSE2, Enabled);
2889 } else if (Name == "pclmul") {
2890 if (Enabled)
2891 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002892 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002893 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002894 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002895 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002896 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002897 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002898 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2899 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002900 if (Enabled)
2901 setSSELevel(Features, AVX512F, Enabled);
2902 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002903 if (Enabled)
2904 setSSELevel(Features, AVX, Enabled);
2905 } else if (Name == "fma4") {
2906 setXOPLevel(Features, FMA4, Enabled);
2907 } else if (Name == "xop") {
2908 setXOPLevel(Features, XOP, Enabled);
2909 } else if (Name == "sse4a") {
2910 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002911 } else if (Name == "f16c") {
2912 if (Enabled)
2913 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002914 } else if (Name == "sha") {
2915 if (Enabled)
2916 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002917 } else if (Name == "sse4") {
2918 // We can get here via the __target__ attribute since that's not controlled
2919 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2920 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2921 // disabled.
2922 if (Enabled)
2923 setSSELevel(Features, SSE42, Enabled);
2924 else
2925 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002926 } else if (Name == "xsave") {
2927 if (Enabled)
2928 setSSELevel(Features, AVX, Enabled);
2929 else
2930 Features["xsaveopt"] = false;
2931 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2932 if (Enabled) {
2933 Features["xsave"] = true;
2934 setSSELevel(Features, AVX, Enabled);
2935 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002936 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002937}
2938
Eric Christopher3ff21b32013-10-16 21:26:26 +00002939/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002940/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002941bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002942 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002943 for (const auto &Feature : Features) {
2944 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002945 continue;
2946
Eric Christopher610fe112015-08-26 08:21:55 +00002947 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002948 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002949 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002950 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002951 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002952 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002953 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002954 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002955 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002956 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002957 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002958 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002959 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002960 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002961 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002962 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002963 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002964 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002965 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002966 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002967 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002968 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002969 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002970 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002971 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002972 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002973 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002974 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002975 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002976 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002977 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002978 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002979 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002980 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002981 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002982 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002983 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002984 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002985 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002986 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002987 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002988 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002989 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002990 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002991 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002992 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00002993 } else if (Feature == "+fxsr") {
2994 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002995 } else if (Feature == "+xsave") {
2996 HasXSAVE = true;
2997 } else if (Feature == "+xsaveopt") {
2998 HasXSAVEOPT = true;
2999 } else if (Feature == "+xsavec") {
3000 HasXSAVEC = true;
3001 } else if (Feature == "+xsaves") {
3002 HasXSAVES = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003003 }
3004
Benjamin Kramer27402c62012-03-05 15:10:44 +00003005 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003006 .Case("+avx512f", AVX512F)
3007 .Case("+avx2", AVX2)
3008 .Case("+avx", AVX)
3009 .Case("+sse4.2", SSE42)
3010 .Case("+sse4.1", SSE41)
3011 .Case("+ssse3", SSSE3)
3012 .Case("+sse3", SSE3)
3013 .Case("+sse2", SSE2)
3014 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003015 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003016 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003017
Eli Friedman33465822011-07-08 23:31:17 +00003018 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003019 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003020 .Case("+3dnowa", AMD3DNowAthlon)
3021 .Case("+3dnow", AMD3DNow)
3022 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003023 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003024 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003025
3026 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003027 .Case("+xop", XOP)
3028 .Case("+fma4", FMA4)
3029 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003030 .Default(NoXOP);
3031 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003032 }
Eli Friedman33465822011-07-08 23:31:17 +00003033
Rafael Espindolaeb265472013-08-21 21:59:03 +00003034 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3035 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003036 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3037 (FPMath == FP_387 && SSELevel >= SSE1)) {
3038 Diags.Report(diag::err_target_unsupported_fpmath) <<
3039 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003040 return false;
3041 }
3042
Alexey Bataev00396512015-07-02 03:40:19 +00003043 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003044 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003045 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003046}
Chris Lattnerecd49032009-03-02 22:27:17 +00003047
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003048/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3049/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003050void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003051 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003052 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003053 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003054 Builder.defineMacro("__amd64__");
3055 Builder.defineMacro("__amd64");
3056 Builder.defineMacro("__x86_64");
3057 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003058 if (getTriple().getArchName() == "x86_64h") {
3059 Builder.defineMacro("__x86_64h");
3060 Builder.defineMacro("__x86_64h__");
3061 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003062 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003063 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003064 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003065
Chris Lattnerecd49032009-03-02 22:27:17 +00003066 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003067 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3068 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003069 switch (CPU) {
3070 case CK_Generic:
3071 break;
3072 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003073 // The rest are coming from the i386 define above.
3074 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003075 break;
3076 case CK_i486:
3077 case CK_WinChipC6:
3078 case CK_WinChip2:
3079 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003080 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003081 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003082 case CK_PentiumMMX:
3083 Builder.defineMacro("__pentium_mmx__");
3084 Builder.defineMacro("__tune_pentium_mmx__");
3085 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003086 case CK_i586:
3087 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003088 defineCPUMacros(Builder, "i586");
3089 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003090 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003091 case CK_Pentium3:
3092 case CK_Pentium3M:
3093 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003094 Builder.defineMacro("__tune_pentium3__");
3095 // Fallthrough
3096 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003097 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003098 Builder.defineMacro("__tune_pentium2__");
3099 // Fallthrough
3100 case CK_PentiumPro:
3101 Builder.defineMacro("__tune_i686__");
3102 Builder.defineMacro("__tune_pentiumpro__");
3103 // Fallthrough
3104 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003105 Builder.defineMacro("__i686");
3106 Builder.defineMacro("__i686__");
3107 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3108 Builder.defineMacro("__pentiumpro");
3109 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003110 break;
3111 case CK_Pentium4:
3112 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003113 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003114 break;
3115 case CK_Yonah:
3116 case CK_Prescott:
3117 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003118 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003119 break;
3120 case CK_Core2:
3121 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003122 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003123 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003124 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003125 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003126 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003127 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003128 defineCPUMacros(Builder, "slm");
3129 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003130 case CK_Nehalem:
3131 case CK_Westmere:
3132 case CK_SandyBridge:
3133 case CK_IvyBridge:
3134 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003135 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003136 // FIXME: Historically, we defined this legacy name, it would be nice to
3137 // remove it at some point. We've never exposed fine-grained names for
3138 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003139 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003140 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003141 case CK_Skylake:
3142 // FIXME: Historically, we defined this legacy name, it would be nice to
3143 // remove it at some point. This is the only fine-grained CPU macro in the
3144 // main intel CPU line, and it would be better to not have these and force
3145 // people to use ISA macros.
3146 defineCPUMacros(Builder, "skx");
3147 break;
Craig Topper449314e2013-08-20 07:09:39 +00003148 case CK_KNL:
3149 defineCPUMacros(Builder, "knl");
3150 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003151 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003152 Builder.defineMacro("__k6_2__");
3153 Builder.defineMacro("__tune_k6_2__");
3154 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003155 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003156 if (CPU != CK_K6_2) { // In case of fallthrough
3157 // FIXME: GCC may be enabling these in cases where some other k6
3158 // architecture is specified but -m3dnow is explicitly provided. The
3159 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003160 Builder.defineMacro("__k6_3__");
3161 Builder.defineMacro("__tune_k6_3__");
3162 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003163 // Fallthrough
3164 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003165 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003166 break;
3167 case CK_Athlon:
3168 case CK_AthlonThunderbird:
3169 case CK_Athlon4:
3170 case CK_AthlonXP:
3171 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003172 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003173 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003174 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003175 Builder.defineMacro("__tune_athlon_sse__");
3176 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003177 break;
3178 case CK_K8:
3179 case CK_K8SSE3:
3180 case CK_x86_64:
3181 case CK_Opteron:
3182 case CK_OpteronSSE3:
3183 case CK_Athlon64:
3184 case CK_Athlon64SSE3:
3185 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003186 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003187 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003188 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003189 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003190 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003191 case CK_BTVER1:
3192 defineCPUMacros(Builder, "btver1");
3193 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003194 case CK_BTVER2:
3195 defineCPUMacros(Builder, "btver2");
3196 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003197 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003198 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003199 break;
3200 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003201 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003202 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003203 case CK_BDVER3:
3204 defineCPUMacros(Builder, "bdver3");
3205 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003206 case CK_BDVER4:
3207 defineCPUMacros(Builder, "bdver4");
3208 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003209 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003210 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003211 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003212 }
Chris Lattner96e43572009-03-02 22:40:39 +00003213
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003214 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003215 Builder.defineMacro("__REGISTER_PREFIX__", "");
3216
Chris Lattner6df41af2009-04-19 17:32:33 +00003217 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3218 // functions in glibc header files that use FP Stack inline asm which the
3219 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003220 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003221
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003222 if (HasAES)
3223 Builder.defineMacro("__AES__");
3224
Craig Topper3f122a72012-05-31 05:18:48 +00003225 if (HasPCLMUL)
3226 Builder.defineMacro("__PCLMUL__");
3227
Craig Topper22967d42011-12-25 05:06:45 +00003228 if (HasLZCNT)
3229 Builder.defineMacro("__LZCNT__");
3230
Benjamin Kramer1e250392012-07-07 09:39:18 +00003231 if (HasRDRND)
3232 Builder.defineMacro("__RDRND__");
3233
Craig Topper8c7f2512014-11-03 06:51:41 +00003234 if (HasFSGSBASE)
3235 Builder.defineMacro("__FSGSBASE__");
3236
Craig Topper22967d42011-12-25 05:06:45 +00003237 if (HasBMI)
3238 Builder.defineMacro("__BMI__");
3239
3240 if (HasBMI2)
3241 Builder.defineMacro("__BMI2__");
3242
Craig Topper1de83482011-12-29 16:10:46 +00003243 if (HasPOPCNT)
3244 Builder.defineMacro("__POPCNT__");
3245
Michael Liao625a8752012-11-10 05:17:46 +00003246 if (HasRTM)
3247 Builder.defineMacro("__RTM__");
3248
Michael Liao74f4eaf2013-03-26 17:52:08 +00003249 if (HasPRFCHW)
3250 Builder.defineMacro("__PRFCHW__");
3251
Michael Liaoffaae352013-03-29 05:17:55 +00003252 if (HasRDSEED)
3253 Builder.defineMacro("__RDSEED__");
3254
Robert Khasanov50e6f582014-09-19 09:53:48 +00003255 if (HasADX)
3256 Builder.defineMacro("__ADX__");
3257
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003258 if (HasTBM)
3259 Builder.defineMacro("__TBM__");
3260
Rafael Espindolae62e2792013-08-20 13:44:29 +00003261 switch (XOPLevel) {
3262 case XOP:
3263 Builder.defineMacro("__XOP__");
3264 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003265 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003266 case SSE4A:
3267 Builder.defineMacro("__SSE4A__");
3268 case NoXOP:
3269 break;
3270 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003271
Craig Topperbba778b2012-06-03 21:46:30 +00003272 if (HasFMA)
3273 Builder.defineMacro("__FMA__");
3274
Manman Rena45358c2012-10-11 00:59:55 +00003275 if (HasF16C)
3276 Builder.defineMacro("__F16C__");
3277
Craig Topper679b53a2013-08-21 05:29:10 +00003278 if (HasAVX512CD)
3279 Builder.defineMacro("__AVX512CD__");
3280 if (HasAVX512ER)
3281 Builder.defineMacro("__AVX512ER__");
3282 if (HasAVX512PF)
3283 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003284 if (HasAVX512DQ)
3285 Builder.defineMacro("__AVX512DQ__");
3286 if (HasAVX512BW)
3287 Builder.defineMacro("__AVX512BW__");
3288 if (HasAVX512VL)
3289 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003290
Ben Langmuir58078d02013-09-19 13:22:04 +00003291 if (HasSHA)
3292 Builder.defineMacro("__SHA__");
3293
Craig Toppere33f51f2015-10-16 06:22:36 +00003294 if (HasFXSR)
3295 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003296 if (HasXSAVE)
3297 Builder.defineMacro("__XSAVE__");
3298 if (HasXSAVEOPT)
3299 Builder.defineMacro("__XSAVEOPT__");
3300 if (HasXSAVEC)
3301 Builder.defineMacro("__XSAVEC__");
3302 if (HasXSAVES)
3303 Builder.defineMacro("__XSAVES__");
3304
Nick Lewycky50e8f482013-10-05 20:14:27 +00003305 if (HasCX16)
3306 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3307
Chris Lattner96e43572009-03-02 22:40:39 +00003308 // Each case falls through to the previous one here.
3309 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003310 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003311 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003312 case AVX2:
3313 Builder.defineMacro("__AVX2__");
3314 case AVX:
3315 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003316 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003317 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003318 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003319 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003320 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003321 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003322 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003323 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003324 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003325 Builder.defineMacro("__SSE2__");
3326 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003327 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003328 Builder.defineMacro("__SSE__");
3329 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003330 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003331 break;
3332 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003333
Derek Schuffc7dd7222012-10-11 15:52:22 +00003334 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003335 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003336 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003337 case AVX2:
3338 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003339 case SSE42:
3340 case SSE41:
3341 case SSSE3:
3342 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003343 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003344 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003345 break;
3346 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003347 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003348 break;
3349 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003350 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003351 }
3352 }
3353
Anders Carlssone437c682010-01-27 03:47:49 +00003354 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003355 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003356 case AMD3DNowAthlon:
3357 Builder.defineMacro("__3dNOW_A__");
3358 case AMD3DNow:
3359 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003360 case MMX:
3361 Builder.defineMacro("__MMX__");
3362 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003363 break;
3364 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003365
3366 if (CPU >= CK_i486) {
3367 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3368 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3369 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3370 }
3371 if (CPU >= CK_i586)
3372 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Andrey Bokhanko158b8b82015-11-02 09:54:17 +00003373
3374 if (getTriple().isOSIAMCU()) {
3375 Builder.defineMacro("__iamcu");
3376 Builder.defineMacro("__iamcu__");
3377 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003378}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003379
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003380bool X86TargetInfo::hasFeature(StringRef Feature) const {
3381 return llvm::StringSwitch<bool>(Feature)
3382 .Case("aes", HasAES)
3383 .Case("avx", SSELevel >= AVX)
3384 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003385 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003386 .Case("avx512cd", HasAVX512CD)
3387 .Case("avx512er", HasAVX512ER)
3388 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003389 .Case("avx512dq", HasAVX512DQ)
3390 .Case("avx512bw", HasAVX512BW)
3391 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003392 .Case("bmi", HasBMI)
3393 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003394 .Case("cx16", HasCX16)
3395 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003396 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003397 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003398 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003399 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003400 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003401 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3402 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3403 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003404 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003405 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003406 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003407 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003408 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003409 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003410 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003411 .Case("sse", SSELevel >= SSE1)
3412 .Case("sse2", SSELevel >= SSE2)
3413 .Case("sse3", SSELevel >= SSE3)
3414 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003415 .Case("sse4.1", SSELevel >= SSE41)
3416 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003417 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003418 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003419 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003420 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3421 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003422 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003423 .Case("xsave", HasXSAVE)
3424 .Case("xsavec", HasXSAVEC)
3425 .Case("xsaves", HasXSAVES)
3426 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003427 .Default(false);
3428}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003429
Eric Christopherd9832702015-06-29 21:00:05 +00003430// We can't use a generic validation scheme for the features accepted here
3431// versus subtarget features accepted in the target attribute because the
3432// bitfield structure that's initialized in the runtime only supports the
3433// below currently rather than the full range of subtarget features. (See
3434// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3435bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3436 return llvm::StringSwitch<bool>(FeatureStr)
3437 .Case("cmov", true)
3438 .Case("mmx", true)
3439 .Case("popcnt", true)
3440 .Case("sse", true)
3441 .Case("sse2", true)
3442 .Case("sse3", true)
3443 .Case("sse4.1", true)
3444 .Case("sse4.2", true)
3445 .Case("avx", true)
3446 .Case("avx2", true)
3447 .Case("sse4a", true)
3448 .Case("fma4", true)
3449 .Case("xop", true)
3450 .Case("fma", true)
3451 .Case("avx512f", true)
3452 .Case("bmi", true)
3453 .Case("bmi2", true)
3454 .Default(false);
3455}
3456
Eli Friedman3fd920a2008-08-20 02:34:37 +00003457bool
Anders Carlsson58436352009-02-28 17:11:49 +00003458X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003459 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003460 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003461 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003462 // Constant constraints.
3463 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3464 // instructions.
3465 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3466 // x86_64 instructions.
3467 case 's':
3468 Info.setRequiresImmediate();
3469 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003470 case 'I':
3471 Info.setRequiresImmediate(0, 31);
3472 return true;
3473 case 'J':
3474 Info.setRequiresImmediate(0, 63);
3475 return true;
3476 case 'K':
3477 Info.setRequiresImmediate(-128, 127);
3478 return true;
3479 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003480 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003481 return true;
3482 case 'M':
3483 Info.setRequiresImmediate(0, 3);
3484 return true;
3485 case 'N':
3486 Info.setRequiresImmediate(0, 255);
3487 return true;
3488 case 'O':
3489 Info.setRequiresImmediate(0, 127);
3490 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003491 // Register constraints.
3492 case 'Y': // 'Y' is the first character for several 2-character constraints.
3493 // Shift the pointer to the second character of the constraint.
3494 Name++;
3495 switch (*Name) {
3496 default:
3497 return false;
3498 case '0': // First SSE register.
3499 case 't': // Any SSE register, when SSE2 is enabled.
3500 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3501 case 'm': // Any MMX register, when inter-unit moves enabled.
3502 Info.setAllowsRegister();
3503 return true;
3504 }
3505 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003506 // Constraint 'f' cannot be used for output operands.
3507 if (Info.ConstraintStr[0] == '=')
3508 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003509 Info.setAllowsRegister();
3510 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003511 case 'a': // eax.
3512 case 'b': // ebx.
3513 case 'c': // ecx.
3514 case 'd': // edx.
3515 case 'S': // esi.
3516 case 'D': // edi.
3517 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003518 case 't': // Top of floating point stack.
3519 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003520 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003521 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003522 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003523 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003524 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3525 case 'l': // "Index" registers: any general register that can be used as an
3526 // index in a base+index memory access.
3527 Info.setAllowsRegister();
3528 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003529 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003530 case 'C': // SSE floating point constant.
3531 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003532 return true;
3533 }
3534}
3535
Akira Hatanaka974131e2014-09-18 18:17:18 +00003536bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3537 unsigned Size) const {
3538 // Strip off constraint modifiers.
3539 while (Constraint[0] == '=' ||
3540 Constraint[0] == '+' ||
3541 Constraint[0] == '&')
3542 Constraint = Constraint.substr(1);
3543
3544 return validateOperandSize(Constraint, Size);
3545}
3546
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003547bool X86TargetInfo::validateInputSize(StringRef Constraint,
3548 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003549 return validateOperandSize(Constraint, Size);
3550}
3551
3552bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3553 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003554 switch (Constraint[0]) {
3555 default: break;
3556 case 'y':
3557 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003558 case 'f':
3559 case 't':
3560 case 'u':
3561 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003562 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003563 if (SSELevel >= AVX512F)
3564 // 512-bit zmm registers can be used if target supports AVX512F.
3565 return Size <= 512U;
3566 else if (SSELevel >= AVX)
3567 // 256-bit ymm registers can be used if target supports AVX.
3568 return Size <= 256U;
3569 return Size <= 128U;
3570 case 'Y':
3571 // 'Y' is the first character for several 2-character constraints.
3572 switch (Constraint[1]) {
3573 default: break;
3574 case 'm':
3575 // 'Ym' is synonymous with 'y'.
3576 return Size <= 64;
3577 case 'i':
3578 case 't':
3579 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3580 if (SSELevel >= AVX512F)
3581 return Size <= 512U;
3582 else if (SSELevel >= AVX)
3583 return Size <= 256U;
3584 return SSELevel >= SSE2 && Size <= 128U;
3585 }
3586
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003587 }
3588
3589 return true;
3590}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003591
Eli Friedman3fd920a2008-08-20 02:34:37 +00003592std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003593X86TargetInfo::convertConstraint(const char *&Constraint) const {
3594 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003595 case 'a': return std::string("{ax}");
3596 case 'b': return std::string("{bx}");
3597 case 'c': return std::string("{cx}");
3598 case 'd': return std::string("{dx}");
3599 case 'S': return std::string("{si}");
3600 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003601 case 'p': // address
3602 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003603 case 't': // top of floating point stack.
3604 return std::string("{st}");
3605 case 'u': // second from top of floating point stack.
3606 return std::string("{st(1)}"); // second from top of floating point stack.
3607 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003608 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003609 }
3610}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003611
Eli Friedman3fd920a2008-08-20 02:34:37 +00003612// X86-32 generic target
3613class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003614public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003615 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003616 DoubleAlign = LongLongAlign = 32;
3617 LongDoubleWidth = 96;
3618 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003619 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003620 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003621 SizeType = UnsignedInt;
3622 PtrDiffType = SignedInt;
3623 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003624 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003625
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00003626 if (getTriple().isOSIAMCU()) {
3627 LongDoubleWidth = 64;
3628 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3629 }
3630
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003631 // Use fpret for all types.
3632 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3633 (1 << TargetInfo::Double) |
3634 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003635
3636 // x86-32 has atomics up to 8 bytes
3637 // FIXME: Check that we actually have cmpxchg8b before setting
3638 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3639 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003640 }
Craig Topper3164f332014-03-11 03:39:26 +00003641 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003642 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003643 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003644
Craig Topper3164f332014-03-11 03:39:26 +00003645 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003646 if (RegNo == 0) return 0;
3647 if (RegNo == 1) return 2;
3648 return -1;
3649 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003650 bool validateOperandSize(StringRef Constraint,
3651 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003652 switch (Constraint[0]) {
3653 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003654 case 'R':
3655 case 'q':
3656 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003657 case 'a':
3658 case 'b':
3659 case 'c':
3660 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003661 case 'S':
3662 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003663 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003664 case 'A':
3665 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003666 }
3667
Akira Hatanaka974131e2014-09-18 18:17:18 +00003668 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003669 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003670};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003671
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003672class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3673public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003674 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3675 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003676
Craig Topper3164f332014-03-11 03:39:26 +00003677 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003678 unsigned Major, Minor, Micro;
3679 getTriple().getOSVersion(Major, Minor, Micro);
3680 // New NetBSD uses the default rounding mode.
3681 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3682 return X86_32TargetInfo::getFloatEvalMethod();
3683 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003684 return 1;
3685 }
3686};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003687
Eli Friedmane3aa4542009-07-05 18:47:56 +00003688class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3689public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003690 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3691 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003692 SizeType = UnsignedLong;
3693 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003694 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003695 }
3696};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003697
Eli Friedman9fa28852012-08-08 23:57:20 +00003698class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3699public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003700 BitrigI386TargetInfo(const llvm::Triple &Triple)
3701 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003702 SizeType = UnsignedLong;
3703 IntPtrType = SignedLong;
3704 PtrDiffType = SignedLong;
3705 }
3706};
Eli Friedman9fa28852012-08-08 23:57:20 +00003707
Torok Edwinb2b37c62009-06-30 17:10:35 +00003708class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003709public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003710 DarwinI386TargetInfo(const llvm::Triple &Triple)
3711 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003712 LongDoubleWidth = 128;
3713 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003714 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003715 MaxVectorAlign = 256;
3716 // The watchOS simulator uses the builtin bool type for Objective-C.
3717 llvm::Triple T = llvm::Triple(Triple);
3718 if (T.isWatchOS())
3719 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003720 SizeType = UnsignedLong;
3721 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003722 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003723 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003724 }
3725
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003726 bool handleTargetFeatures(std::vector<std::string> &Features,
3727 DiagnosticsEngine &Diags) override {
3728 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3729 Diags))
3730 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003731 // We now know the features we have: we can decide how to align vectors.
3732 MaxVectorAlign =
3733 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003734 return true;
3735 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003736};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003737
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003738// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003739class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003740public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003741 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3742 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003743 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003744 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003745 bool IsWinCOFF =
3746 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003747 DataLayoutString = IsWinCOFF
3748 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3749 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003750 }
Craig Topper3164f332014-03-11 03:39:26 +00003751 void getTargetDefines(const LangOptions &Opts,
3752 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003753 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3754 }
3755};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003756
3757// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003758class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003759public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003760 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003761 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003762 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003763 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3764 }
Craig Topper3164f332014-03-11 03:39:26 +00003765 void getTargetDefines(const LangOptions &Opts,
3766 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003767 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3768 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3769 // The value of the following reflects processor type.
3770 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3771 // We lost the original triple, so we use the default.
3772 Builder.defineMacro("_M_IX86", "600");
3773 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003774};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003775
David Majnemerae1ed0e2015-05-28 04:36:18 +00003776static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003777 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3778 // supports __declspec natively under -fms-extensions, but we define a no-op
3779 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003780 if (Opts.MicrosoftExt)
3781 Builder.defineMacro("__declspec", "__declspec");
3782 else
3783 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3784
3785 if (!Opts.MicrosoftExt) {
3786 // Provide macros for all the calling convention keywords. Provide both
3787 // single and double underscore prefixed variants. These are available on
3788 // x64 as well as x86, even though they have no effect.
3789 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3790 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003791 std::string GCCSpelling = "__attribute__((__";
3792 GCCSpelling += CC;
3793 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003794 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3795 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3796 }
3797 }
3798}
3799
David Majnemerae1ed0e2015-05-28 04:36:18 +00003800static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3801 Builder.defineMacro("__MSVCRT__");
3802 Builder.defineMacro("__MINGW32__");
3803 addCygMingDefines(Opts, Builder);
3804}
3805
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003806// x86-32 MinGW target
3807class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3808public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003809 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003810 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003811 void getTargetDefines(const LangOptions &Opts,
3812 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003813 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003814 DefineStd(Builder, "WIN32", Opts);
3815 DefineStd(Builder, "WINNT", Opts);
3816 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003817 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003818 }
3819};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003820
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003821// x86-32 Cygwin target
3822class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3823public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003824 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3825 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003826 TLSSupported = false;
3827 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003828 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003829 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 +00003830 }
Craig Topper3164f332014-03-11 03:39:26 +00003831 void getTargetDefines(const LangOptions &Opts,
3832 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003833 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003834 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003835 Builder.defineMacro("__CYGWIN__");
3836 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003837 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003838 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003839 if (Opts.CPlusPlus)
3840 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003841 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003842};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003843
Chris Lattnerb986aba2010-04-11 19:29:39 +00003844// x86-32 Haiku target
3845class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3846public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003847 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003848 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003849 IntPtrType = SignedLong;
3850 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003851 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003852 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003853 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003854 }
Craig Topper3164f332014-03-11 03:39:26 +00003855 void getTargetDefines(const LangOptions &Opts,
3856 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003857 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3858 Builder.defineMacro("__INTEL__");
3859 Builder.defineMacro("__HAIKU__");
3860 }
3861};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003862
Douglas Gregor9fabd852011-07-01 22:41:14 +00003863// RTEMS Target
3864template<typename Target>
3865class RTEMSTargetInfo : public OSTargetInfo<Target> {
3866protected:
Craig Topper3164f332014-03-11 03:39:26 +00003867 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3868 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003869 // RTEMS defines; list based off of gcc output
3870
Douglas Gregor9fabd852011-07-01 22:41:14 +00003871 Builder.defineMacro("__rtems__");
3872 Builder.defineMacro("__ELF__");
3873 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003874
Douglas Gregor9fabd852011-07-01 22:41:14 +00003875public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003876 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3877 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003878
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003879 switch (Triple.getArch()) {
3880 default:
3881 case llvm::Triple::x86:
3882 // this->MCountName = ".mcount";
3883 break;
3884 case llvm::Triple::mips:
3885 case llvm::Triple::mipsel:
3886 case llvm::Triple::ppc:
3887 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003888 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003889 // this->MCountName = "_mcount";
3890 break;
3891 case llvm::Triple::arm:
3892 // this->MCountName = "__mcount";
3893 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003894 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003895 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003896};
3897
Douglas Gregor9fabd852011-07-01 22:41:14 +00003898// x86-32 RTEMS target
3899class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3900public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003901 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003902 SizeType = UnsignedLong;
3903 IntPtrType = SignedLong;
3904 PtrDiffType = SignedLong;
3905 this->UserLabelPrefix = "";
3906 }
Craig Topper3164f332014-03-11 03:39:26 +00003907 void getTargetDefines(const LangOptions &Opts,
3908 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003909 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3910 Builder.defineMacro("__INTEL__");
3911 Builder.defineMacro("__rtems__");
3912 }
3913};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003914
Eli Friedman3fd920a2008-08-20 02:34:37 +00003915// x86-64 generic target
3916class X86_64TargetInfo : public X86TargetInfo {
3917public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003918 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003919 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003920 bool IsWinCOFF =
3921 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003922 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003923 LongDoubleWidth = 128;
3924 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003925 LargeArrayMinWidth = 128;
3926 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003927 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003928 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3929 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3930 IntPtrType = IsX32 ? SignedInt : SignedLong;
3931 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003932 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003933 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003934
Eric Christopher917e9522014-11-18 22:36:15 +00003935 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003936 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3937 : IsWinCOFF
3938 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3939 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003940
3941 // Use fpret only for long double.
3942 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003943
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003944 // Use fp2ret for _Complex long double.
3945 ComplexLongDoubleUsesFP2Ret = true;
3946
Charles Davisc7d5c942015-09-17 20:55:33 +00003947 // Make __builtin_ms_va_list available.
3948 HasBuiltinMSVaList = true;
3949
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003950 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003951 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003952 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003953 }
Craig Topper3164f332014-03-11 03:39:26 +00003954 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003955 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003956 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003957
Craig Topper3164f332014-03-11 03:39:26 +00003958 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003959 if (RegNo == 0) return 0;
3960 if (RegNo == 1) return 1;
3961 return -1;
3962 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003963
Craig Topper3164f332014-03-11 03:39:26 +00003964 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003965 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003966 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003967 CC == CC_IntelOclBicc ||
3968 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003969 }
3970
Craig Topper3164f332014-03-11 03:39:26 +00003971 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003972 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003973 }
3974
Pavel Chupinfd223e12014-08-04 12:39:43 +00003975 // for x32 we need it here explicitly
3976 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003977};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003978
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003979// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003980class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003981public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003982 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3983 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003984 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003985 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003986 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003987 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003988 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003989 SizeType = UnsignedLongLong;
3990 PtrDiffType = SignedLongLong;
3991 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003992 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003993 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003994
Craig Topper3164f332014-03-11 03:39:26 +00003995 void getTargetDefines(const LangOptions &Opts,
3996 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003997 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003998 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003999 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004000
Craig Topper3164f332014-03-11 03:39:26 +00004001 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004002 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004003 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004004
Craig Topper3164f332014-03-11 03:39:26 +00004005 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004006 switch (CC) {
4007 case CC_X86StdCall:
4008 case CC_X86ThisCall:
4009 case CC_X86FastCall:
4010 return CCCR_Ignore;
4011 case CC_C:
4012 case CC_X86VectorCall:
4013 case CC_IntelOclBicc:
4014 case CC_X86_64SysV:
4015 return CCCR_OK;
4016 default:
4017 return CCCR_Warning;
4018 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004019 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004020};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004021
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004022// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004023class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004024public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004025 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004026 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004027 LongDoubleWidth = LongDoubleAlign = 64;
4028 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004029 }
Craig Topper3164f332014-03-11 03:39:26 +00004030 void getTargetDefines(const LangOptions &Opts,
4031 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004032 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4033 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004034 Builder.defineMacro("_M_X64", "100");
4035 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004036 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004037};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004038
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004039// x86-64 MinGW target
4040class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4041public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004042 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004043 : WindowsX86_64TargetInfo(Triple) {
4044 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4045 // with x86 FP ops. Weird.
4046 LongDoubleWidth = LongDoubleAlign = 128;
4047 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4048 }
4049
Craig Topper3164f332014-03-11 03:39:26 +00004050 void getTargetDefines(const LangOptions &Opts,
4051 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004052 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004053 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004054 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004055 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004056
4057 // GCC defines this macro when it is using __gxx_personality_seh0.
4058 if (!Opts.SjLjExceptions)
4059 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004060 }
4061};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004062
Yaron Kerend030d112015-07-22 17:38:19 +00004063// x86-64 Cygwin target
4064class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4065public:
4066 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4067 : X86_64TargetInfo(Triple) {
4068 TLSSupported = false;
4069 WCharType = UnsignedShort;
4070 }
4071 void getTargetDefines(const LangOptions &Opts,
4072 MacroBuilder &Builder) const override {
4073 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4074 Builder.defineMacro("__x86_64__");
4075 Builder.defineMacro("__CYGWIN__");
4076 Builder.defineMacro("__CYGWIN64__");
4077 addCygMingDefines(Opts, Builder);
4078 DefineStd(Builder, "unix", Opts);
4079 if (Opts.CPlusPlus)
4080 Builder.defineMacro("_GNU_SOURCE");
4081
4082 // GCC defines this macro when it is using __gxx_personality_seh0.
4083 if (!Opts.SjLjExceptions)
4084 Builder.defineMacro("__SEH__");
4085 }
4086};
4087
Eli Friedman2857ccb2009-07-01 03:36:11 +00004088class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4089public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004090 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4091 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004092 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004093 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4094 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004095 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004096 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004097 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004098 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004099
4100 bool handleTargetFeatures(std::vector<std::string> &Features,
4101 DiagnosticsEngine &Diags) override {
4102 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4103 Diags))
4104 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004105 // We now know the features we have: we can decide how to align vectors.
4106 MaxVectorAlign =
4107 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004108 return true;
4109 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004110};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004111
Eli Friedman245f2292009-07-05 22:31:18 +00004112class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4113public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004114 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4115 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004116 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004117 Int64Type = SignedLongLong;
4118 }
4119};
Eli Friedman245f2292009-07-05 22:31:18 +00004120
Eli Friedman9fa28852012-08-08 23:57:20 +00004121class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4122public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004123 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4124 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4125 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004126 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004127 }
4128};
Tim Northover9bb857a2013-01-31 12:13:10 +00004129
Eli Friedmanf05b7722008-08-20 07:44:10 +00004130class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004131 // Possible FPU choices.
4132 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004133 VFP2FPU = (1 << 0),
4134 VFP3FPU = (1 << 1),
4135 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004136 NeonFPU = (1 << 3),
4137 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004138 };
4139
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004140 // Possible HWDiv features.
4141 enum HWDivMode {
4142 HWDivThumb = (1 << 0),
4143 HWDivARM = (1 << 1)
4144 };
4145
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004146 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004147 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004148 }
4149
4150 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4151 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004152
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004153 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004154
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004155 StringRef CPUProfile;
4156 StringRef CPUAttr;
4157
Rafael Espindolaeb265472013-08-21 21:59:03 +00004158 enum {
4159 FP_Default,
4160 FP_VFP,
4161 FP_Neon
4162 } FPMath;
4163
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004164 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004165 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004166 unsigned ArchProfile;
4167 unsigned ArchVersion;
4168
Bernard Ogdenda13af32013-10-24 18:32:51 +00004169 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004170
Logan Chien57086ce2012-10-10 06:56:20 +00004171 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004172 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004173
4174 // Initialized via features.
4175 unsigned SoftFloat : 1;
4176 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004177
Bernard Ogden18b57012013-10-29 09:47:51 +00004178 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004179 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004180 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004181 unsigned Unaligned : 1;
4182
4183 enum {
4184 LDREX_B = (1 << 0), /// byte (8-bit)
4185 LDREX_H = (1 << 1), /// half (16-bit)
4186 LDREX_W = (1 << 2), /// word (32-bit)
4187 LDREX_D = (1 << 3), /// double (64-bit)
4188 };
4189
4190 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004191
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004192 // ACLE 6.5.1 Hardware floating point
4193 enum {
4194 HW_FP_HP = (1 << 1), /// half (16-bit)
4195 HW_FP_SP = (1 << 2), /// single (32-bit)
4196 HW_FP_DP = (1 << 3), /// double (64-bit)
4197 };
4198 uint32_t HW_FP;
4199
Chris Lattner5cc15e02010-03-03 19:03:45 +00004200 static const Builtin::Info BuiltinInfo[];
4201
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004202 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004203 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004204
4205 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004206 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004207
Renato Golin9ba39232015-02-27 16:35:48 +00004208 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4209 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4210 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004211 SizeType = UnsignedLong;
4212 else
4213 SizeType = UnsignedInt;
4214
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004215 switch (T.getOS()) {
4216 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004217 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004218 break;
4219 case llvm::Triple::Win32:
4220 WCharType = UnsignedShort;
4221 break;
4222 case llvm::Triple::Linux:
4223 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004224 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4225 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004226 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004227 }
4228
4229 UseBitFieldTypeAlignment = true;
4230
4231 ZeroLengthBitfieldBoundary = 0;
4232
Tim Northover147cd2f2014-10-14 22:12:21 +00004233 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4234 // so set preferred for small types to 32.
4235 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004236 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004237 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4238 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4239 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004240 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004241 DataLayoutString = "e"
4242 "-m:w"
4243 "-p:32:32"
4244 "-i64:64"
4245 "-v128:64:128"
4246 "-a:0:32"
4247 "-n32"
4248 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004249 } else if (T.isOSNaCl()) {
4250 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004251 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004252 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004253 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004254 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4255 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004256 }
4257
4258 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004259 }
4260
Tim Northover5627d392015-10-30 16:30:45 +00004261 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004262 const llvm::Triple &T = getTriple();
4263
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004264 IsAAPCS = false;
4265
Tim Northover5627d392015-10-30 16:30:45 +00004266 if (IsAAPCS16)
4267 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4268 else
4269 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004270
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004271 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004272 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004273 SizeType = UnsignedInt;
4274 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004275 SizeType = UnsignedLong;
4276
4277 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4278 WCharType = SignedInt;
4279
4280 // Do not respect the alignment of bit-field types when laying out
4281 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4282 UseBitFieldTypeAlignment = false;
4283
4284 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4285 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4286 /// gcc.
4287 ZeroLengthBitfieldBoundary = 32;
4288
Tim Northover5627d392015-10-30 16:30:45 +00004289 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4290 assert(!BigEndian && "AAPCS16 does not support big-endian");
4291 DataLayoutString = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128";
4292 } else if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004293 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004294 BigEndian
4295 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4296 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4297 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004298 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004299 BigEndian
4300 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4301 : "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 +00004302
4303 // FIXME: Override "preferred align" for double and long long.
4304 }
4305
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004306 void setArchInfo() {
4307 StringRef ArchName = getTriple().getArchName();
4308
Renato Goline84b0002015-10-08 16:43:26 +00004309 ArchISA = llvm::ARM::parseArchISA(ArchName);
4310 CPU = llvm::ARM::getDefaultCPU(ArchName);
4311 unsigned AK = llvm::ARM::parseArch(ArchName);
4312 if (AK != llvm::ARM::AK_INVALID)
4313 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004314 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004315 }
4316
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004317 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004318 StringRef SubArch;
4319
4320 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004321 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004322 SubArch = llvm::ARM::getSubArch(ArchKind);
4323 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4324 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004325
4326 // cache CPU related strings
4327 CPUAttr = getCPUAttr();
4328 CPUProfile = getCPUProfile();
4329 }
4330
4331 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004332 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004333 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004334 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004335 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4336 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004337 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004338 if (ArchProfile == llvm::ARM::PK_M) {
4339 MaxAtomicPromoteWidth = 32;
4340 if (ShouldUseInlineAtomic)
4341 MaxAtomicInlineWidth = 32;
4342 }
4343 else {
4344 MaxAtomicPromoteWidth = 64;
4345 if (ShouldUseInlineAtomic)
4346 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004347 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004348 }
4349
4350 bool isThumb() const {
4351 return (ArchISA == llvm::ARM::IK_THUMB);
4352 }
4353
4354 bool supportsThumb() const {
4355 return CPUAttr.count('T') || ArchVersion >= 6;
4356 }
4357
4358 bool supportsThumb2() const {
4359 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4360 }
4361
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004362 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004363 // For most sub-arches, the build attribute CPU name is enough.
4364 // For Cortex variants, it's slightly different.
4365 switch(ArchKind) {
4366 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004367 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004368 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004369 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004370 case llvm::ARM::AK_ARMV7S:
4371 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004372 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004373 return "7A";
4374 case llvm::ARM::AK_ARMV7R:
4375 return "7R";
4376 case llvm::ARM::AK_ARMV7M:
4377 return "7M";
4378 case llvm::ARM::AK_ARMV7EM:
4379 return "7EM";
4380 case llvm::ARM::AK_ARMV8A:
4381 return "8A";
4382 case llvm::ARM::AK_ARMV8_1A:
4383 return "8_1A";
4384 }
4385 }
4386
4387 StringRef getCPUProfile() const {
4388 switch(ArchProfile) {
4389 case llvm::ARM::PK_A:
4390 return "A";
4391 case llvm::ARM::PK_R:
4392 return "R";
4393 case llvm::ARM::PK_M:
4394 return "M";
4395 default:
4396 return "";
4397 }
4398 }
4399
Chris Lattner17df24e2008-04-21 18:56:49 +00004400public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004401 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004402 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004403 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004404 BigEndian = IsBigEndian;
4405
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004406 switch (getTriple().getOS()) {
4407 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004408 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004409 break;
4410 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004411 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004412 break;
4413 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004414
Renato Goline84b0002015-10-08 16:43:26 +00004415 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004416 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004417
Chris Lattner1a8f3942010-04-23 16:29:58 +00004418 // {} in inline assembly are neon specifiers, not assembly variant
4419 // specifiers.
4420 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004421
Eric Christopher0e261882014-12-05 01:06:59 +00004422 // FIXME: This duplicates code from the driver that sets the -target-abi
4423 // option - this code is used if -target-abi isn't passed and should
4424 // be unified in some way.
4425 if (Triple.isOSBinFormatMachO()) {
4426 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4427 // the frontend matches that.
4428 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4429 Triple.getOS() == llvm::Triple::UnknownOS ||
4430 StringRef(CPU).startswith("cortex-m")) {
4431 setABI("aapcs");
Tim Northover5627d392015-10-30 16:30:45 +00004432 } else if (Triple.isWatchOS()) {
4433 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004434 } else {
4435 setABI("apcs-gnu");
4436 }
4437 } else if (Triple.isOSWindows()) {
4438 // FIXME: this is invalid for WindowsCE
4439 setABI("aapcs");
4440 } else {
4441 // Select the default based on the platform.
4442 switch (Triple.getEnvironment()) {
4443 case llvm::Triple::Android:
4444 case llvm::Triple::GNUEABI:
4445 case llvm::Triple::GNUEABIHF:
4446 setABI("aapcs-linux");
4447 break;
4448 case llvm::Triple::EABIHF:
4449 case llvm::Triple::EABI:
4450 setABI("aapcs");
4451 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004452 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004453 setABI("apcs-gnu");
4454 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004455 default:
4456 if (Triple.getOS() == llvm::Triple::NetBSD)
4457 setABI("apcs-gnu");
4458 else
4459 setABI("aapcs");
4460 break;
4461 }
4462 }
John McCall86353412010-08-21 22:46:04 +00004463
4464 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004465 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004466
Renato Golin15b86152015-07-03 16:41:13 +00004467 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004468 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004469
James Molloya7139222012-03-12 09:14:10 +00004470 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004471 // the alignment of the zero-length bitfield is greater than the member
4472 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004473 // zero length bitfield.
4474 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004475 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004476
Alp Toker4925ba72014-06-07 23:30:42 +00004477 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004478
Craig Topper3164f332014-03-11 03:39:26 +00004479 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004480 ABI = Name;
4481
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004482 // The defaults (above) are for AAPCS, check if we need to change them.
4483 //
4484 // FIXME: We need support for -meabi... we could just mangle it into the
4485 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004486 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004487 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004488 return true;
4489 }
4490 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4491 setABIAAPCS();
4492 return true;
4493 }
4494 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004495 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004496
Renato Golinf5c4dec2015-05-27 13:33:00 +00004497 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004498 bool
4499 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4500 StringRef CPU,
4501 const std::vector<std::string> &FeaturesVec) const override {
4502
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004503 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004504 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004505
4506 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004507 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004508 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4509
4510 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004511 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004512 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4513
4514 for (const char *Feature : TargetFeatures)
4515 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004516 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004517
Eric Christopher007b0a02015-08-28 22:32:01 +00004518 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004519 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004520
Craig Topper3164f332014-03-11 03:39:26 +00004521 bool handleTargetFeatures(std::vector<std::string> &Features,
4522 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004523 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004524 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004525 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004526 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004527 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004528 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004529 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004530
Ranjeet Singhac08e532015-06-24 23:39:25 +00004531 // This does not diagnose illegal cases like having both
4532 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4533 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004534 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004535 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004536 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004537 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004538 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004539 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004540 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004541 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004542 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004543 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004544 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004545 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004546 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004547 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004548 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004549 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004550 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004551 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004552 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004553 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004554 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004555 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004556 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004557 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004558 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004559 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004560 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004561 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004562 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004563 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004564 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004565 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004566 } else if (Feature == "+strict-align") {
4567 Unaligned = 0;
4568 } else if (Feature == "+fp16") {
4569 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004570 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004571 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004572 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004573
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004574 switch (ArchVersion) {
4575 case 6:
4576 if (ArchProfile == llvm::ARM::PK_M)
4577 LDREX = 0;
4578 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4579 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4580 else
4581 LDREX = LDREX_W;
4582 break;
4583 case 7:
4584 if (ArchProfile == llvm::ARM::PK_M)
4585 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4586 else
4587 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4588 break;
4589 case 8:
4590 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4591 }
4592
Rafael Espindolaeb265472013-08-21 21:59:03 +00004593 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4594 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4595 return false;
4596 }
4597
4598 if (FPMath == FP_Neon)
4599 Features.push_back("+neonfp");
4600 else if (FPMath == FP_VFP)
4601 Features.push_back("-neonfp");
4602
Daniel Dunbar893d4752009-12-19 04:15:38 +00004603 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004604 auto Feature =
4605 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4606 if (Feature != Features.end())
4607 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004608
Rafael Espindolaeb265472013-08-21 21:59:03 +00004609 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004610 }
4611
Craig Topper3164f332014-03-11 03:39:26 +00004612 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004613 return llvm::StringSwitch<bool>(Feature)
4614 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004615 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004616 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004617 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004618 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004619 .Case("hwdiv", HWDiv & HWDivThumb)
4620 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004621 .Default(false);
4622 }
Renato Golin15b86152015-07-03 16:41:13 +00004623
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004624 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004625 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004626 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004627
Renato Golin15b86152015-07-03 16:41:13 +00004628 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004629 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004630 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004631 CPU = Name;
4632 return true;
4633 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004634
Craig Topper3164f332014-03-11 03:39:26 +00004635 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004636
Craig Topper3164f332014-03-11 03:39:26 +00004637 void getTargetDefines(const LangOptions &Opts,
4638 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004639 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004640 Builder.defineMacro("__arm");
4641 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004642
Chris Lattnerecd49032009-03-02 22:27:17 +00004643 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004644 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004645
4646 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4647 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
4648 if (getTriple().isWatchOS())
4649 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4650
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004651 if (!CPUAttr.empty())
4652 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004653
4654 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004655 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004656 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004657
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004658 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004659 // ACLE 6.5.7 Crypto Extension
4660 if (Crypto)
4661 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4662 // ACLE 6.5.8 CRC32 Extension
4663 if (CRC)
4664 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4665 // ACLE 6.5.10 Numeric Maximum and Minimum
4666 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4667 // ACLE 6.5.9 Directed Rounding
4668 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004669 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004670
4671 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4672 // is not defined for the M-profile.
4673 // NOTE that the deffault profile is assumed to be 'A'
4674 if (CPUProfile.empty() || CPUProfile != "M")
4675 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4676
4677 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4678 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4679 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004680 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004681 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004682 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004683 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4684
4685 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4686 // instruction set such as ARM or Thumb.
4687 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4688
4689 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4690
4691 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004692 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004693 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004694
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004695 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004696 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004697 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004698
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004699 // ACLE 6.4.4 LDREX/STREX
4700 if (LDREX)
4701 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4702
4703 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004704 if (ArchVersion == 5 ||
4705 (ArchVersion == 6 && CPUProfile != "M") ||
4706 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004707 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4708
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004709 // ACLE 6.5.1 Hardware Floating Point
4710 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004711 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004712
Yi Konga44c4d72014-06-27 21:25:42 +00004713 // ACLE predefines.
4714 Builder.defineMacro("__ARM_ACLE", "200");
4715
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004716 // FP16 support (we currently only support IEEE format).
4717 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4718 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4719
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004720 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4721 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4722 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4723
Mike Stump9d54bd72009-04-08 02:07:04 +00004724 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004725
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004726 // FIXME: It's more complicated than this and we don't really support
4727 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004728 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004729 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004730 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004731
David Tweed8f676532012-10-25 13:33:01 +00004732 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004733 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004734 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4735 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004736 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004737 Builder.defineMacro("__ARM_PCS", "1");
4738
David Tweed8f676532012-10-25 13:33:01 +00004739 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004740 Builder.defineMacro("__ARM_PCS_VFP", "1");
4741 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004742
Daniel Dunbar893d4752009-12-19 04:15:38 +00004743 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004744 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004745
4746 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004747 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004748
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004749 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004750 Builder.defineMacro("__THUMBEL__");
4751 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004752 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004753 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004754 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004755
4756 // ACLE 6.4.9 32-bit SIMD instructions
4757 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4758 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4759
4760 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004761 if (((HWDiv & HWDivThumb) && isThumb()) ||
4762 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004763 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004764 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004765 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004766
4767 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004768 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004769
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004770 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004771 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004772 if (FPU & VFP2FPU)
4773 Builder.defineMacro("__ARM_VFPV2__");
4774 if (FPU & VFP3FPU)
4775 Builder.defineMacro("__ARM_VFPV3__");
4776 if (FPU & VFP4FPU)
4777 Builder.defineMacro("__ARM_VFPV4__");
4778 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004779
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004780 // This only gets set when Neon instructions are actually available, unlike
4781 // the VFP define, hence the soft float and arch check. This is subtly
4782 // different from gcc, we follow the intent which was that it should be set
4783 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004784 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004785 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004786 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004787 // current AArch32 NEON implementations do not support double-precision
4788 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004789 Builder.defineMacro("__ARM_NEON_FP",
4790 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004791 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004792
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004793 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4794 Opts.ShortWChar ? "2" : "4");
4795
4796 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4797 Opts.ShortEnums ? "1" : "4");
4798
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004799 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004800 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4801 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4802 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4803 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4804 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004805
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004806 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004807 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004808 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004809 }
4810
4811 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004812 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004813 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4814 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004815 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004816 }
4817
4818 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004819 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004820 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004821
4822 if (Opts.UnsafeFPMath)
4823 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004824 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004825
Craig Topper6c03a542015-10-19 04:51:35 +00004826 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4827 return llvm::makeArrayRef(BuiltinInfo,
4828 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004829 }
Craig Topper3164f332014-03-11 03:39:26 +00004830 bool isCLZForZeroUndef() const override { return false; }
4831 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004832 return IsAAPCS
4833 ? AAPCSABIBuiltinVaList
4834 : (getTriple().isWatchOS() ? TargetInfo::CharPtrBuiltinVaList
4835 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00004836 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004837 ArrayRef<const char *> getGCCRegNames() const override;
4838 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004839 bool validateAsmConstraint(const char *&Name,
4840 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004841 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004842 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004843 case 'l': // r0-r7
4844 case 'h': // r8-r15
4845 case 'w': // VFP Floating point register single precision
4846 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004847 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004848 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004849 case 'I':
4850 case 'J':
4851 case 'K':
4852 case 'L':
4853 case 'M':
4854 // FIXME
4855 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004856 case 'Q': // A memory address that is a single base register.
4857 Info.setAllowsMemory();
4858 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004859 case 'U': // a memory reference...
4860 switch (Name[1]) {
4861 case 'q': // ...ARMV4 ldrsb
4862 case 'v': // ...VFP load/store (reg+constant offset)
4863 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004864 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004865 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004866 case 'n': // valid address for Neon doubleword vector load/store
4867 case 'm': // valid address for Neon element and structure load/store
4868 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004869 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004870 Info.setAllowsMemory();
4871 Name++;
4872 return true;
4873 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004874 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004875 return false;
4876 }
Craig Topper3164f332014-03-11 03:39:26 +00004877 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004878 std::string R;
4879 switch (*Constraint) {
4880 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004881 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004882 Constraint++;
4883 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004884 case 'p': // 'p' should be translated to 'r' by default.
4885 R = std::string("r");
4886 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004887 default:
4888 return std::string(1, *Constraint);
4889 }
4890 return R;
4891 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004892 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004893 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004894 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004895 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004896 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004897
Bill Wendling9d1ee112012-10-25 23:28:48 +00004898 // Strip off constraint modifiers.
4899 while (Constraint[0] == '=' ||
4900 Constraint[0] == '+' ||
4901 Constraint[0] == '&')
4902 Constraint = Constraint.substr(1);
4903
4904 switch (Constraint[0]) {
4905 default: break;
4906 case 'r': {
4907 switch (Modifier) {
4908 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004909 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004910 case 'q':
4911 // A register of size 32 cannot fit a vector type.
4912 return false;
4913 }
4914 }
4915 }
4916
4917 return true;
4918 }
Craig Topper3164f332014-03-11 03:39:26 +00004919 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004920 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004921 return "";
4922 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004923
Craig Topper3164f332014-03-11 03:39:26 +00004924 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004925 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4926 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004927
Craig Topper3164f332014-03-11 03:39:26 +00004928 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004929 if (RegNo == 0) return 0;
4930 if (RegNo == 1) return 1;
4931 return -1;
4932 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004933
4934 bool hasSjLjLowering() const override {
4935 return true;
4936 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004937};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004938
Rafael Espindolaeb265472013-08-21 21:59:03 +00004939bool ARMTargetInfo::setFPMath(StringRef Name) {
4940 if (Name == "neon") {
4941 FPMath = FP_Neon;
4942 return true;
4943 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4944 Name == "vfp4") {
4945 FPMath = FP_VFP;
4946 return true;
4947 }
4948 return false;
4949}
4950
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004951const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004952 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004953 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004954 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4955
4956 // Float registers
4957 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4958 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4959 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004960 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004961
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004962 // Double registers
4963 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4964 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004965 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4966 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004967
4968 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004969 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4970 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004971};
4972
Craig Topperf054e3a2015-10-19 03:52:27 +00004973ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
4974 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004975}
4976
4977const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004978 { { "a1" }, "r0" },
4979 { { "a2" }, "r1" },
4980 { { "a3" }, "r2" },
4981 { { "a4" }, "r3" },
4982 { { "v1" }, "r4" },
4983 { { "v2" }, "r5" },
4984 { { "v3" }, "r6" },
4985 { { "v4" }, "r7" },
4986 { { "v5" }, "r8" },
4987 { { "v6", "rfp" }, "r9" },
4988 { { "sl" }, "r10" },
4989 { { "fp" }, "r11" },
4990 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004991 { { "r13" }, "sp" },
4992 { { "r14" }, "lr" },
4993 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004994 // The S, D and Q registers overlap, but aren't really aliases; we
4995 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004996};
4997
Craig Topperf054e3a2015-10-19 03:52:27 +00004998ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
4999 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005000}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005001
5002const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005003#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005004 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005005#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5006 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005007#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005008
Craig Topper07d3b622015-08-07 05:14:44 +00005009#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005010 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005011#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005012 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005013#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5014 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005015#include "clang/Basic/BuiltinsARM.def"
5016};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005017
5018class ARMleTargetInfo : public ARMTargetInfo {
5019public:
5020 ARMleTargetInfo(const llvm::Triple &Triple)
5021 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005022 void getTargetDefines(const LangOptions &Opts,
5023 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005024 Builder.defineMacro("__ARMEL__");
5025 ARMTargetInfo::getTargetDefines(Opts, Builder);
5026 }
5027};
5028
5029class ARMbeTargetInfo : public ARMTargetInfo {
5030public:
5031 ARMbeTargetInfo(const llvm::Triple &Triple)
5032 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005033 void getTargetDefines(const LangOptions &Opts,
5034 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005035 Builder.defineMacro("__ARMEB__");
5036 Builder.defineMacro("__ARM_BIG_ENDIAN");
5037 ARMTargetInfo::getTargetDefines(Opts, Builder);
5038 }
5039};
Chris Lattner17df24e2008-04-21 18:56:49 +00005040
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005041class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5042 const llvm::Triple Triple;
5043public:
5044 WindowsARMTargetInfo(const llvm::Triple &Triple)
5045 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
5046 TLSSupported = false;
5047 WCharType = UnsignedShort;
5048 SizeType = UnsignedInt;
5049 UserLabelPrefix = "";
5050 }
5051 void getVisualStudioDefines(const LangOptions &Opts,
5052 MacroBuilder &Builder) const {
5053 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5054
5055 // FIXME: this is invalid for WindowsCE
5056 Builder.defineMacro("_M_ARM_NT", "1");
5057 Builder.defineMacro("_M_ARMT", "_M_ARM");
5058 Builder.defineMacro("_M_THUMB", "_M_ARM");
5059
5060 assert((Triple.getArch() == llvm::Triple::arm ||
5061 Triple.getArch() == llvm::Triple::thumb) &&
5062 "invalid architecture for Windows ARM target info");
5063 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5064 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5065
5066 // TODO map the complete set of values
5067 // 31: VFPv3 40: VFPv4
5068 Builder.defineMacro("_M_ARM_FP", "31");
5069 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005070 BuiltinVaListKind getBuiltinVaListKind() const override {
5071 return TargetInfo::CharPtrBuiltinVaList;
5072 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005073 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5074 switch (CC) {
5075 case CC_X86StdCall:
5076 case CC_X86ThisCall:
5077 case CC_X86FastCall:
5078 case CC_X86VectorCall:
5079 return CCCR_Ignore;
5080 case CC_C:
5081 return CCCR_OK;
5082 default:
5083 return CCCR_Warning;
5084 }
5085 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005086};
5087
5088// Windows ARM + Itanium C++ ABI Target
5089class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5090public:
5091 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5092 : WindowsARMTargetInfo(Triple) {
5093 TheCXXABI.set(TargetCXXABI::GenericARM);
5094 }
5095
5096 void getTargetDefines(const LangOptions &Opts,
5097 MacroBuilder &Builder) const override {
5098 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5099
5100 if (Opts.MSVCCompat)
5101 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5102 }
5103};
5104
5105// Windows ARM, MS (C++) ABI
5106class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5107public:
5108 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5109 : WindowsARMTargetInfo(Triple) {
5110 TheCXXABI.set(TargetCXXABI::Microsoft);
5111 }
5112
5113 void getTargetDefines(const LangOptions &Opts,
5114 MacroBuilder &Builder) const override {
5115 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5116 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5117 }
5118};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005119
Yaron Keren321249c2015-07-15 13:32:23 +00005120// ARM MinGW target
5121class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5122public:
5123 MinGWARMTargetInfo(const llvm::Triple &Triple)
5124 : WindowsARMTargetInfo(Triple) {
5125 TheCXXABI.set(TargetCXXABI::GenericARM);
5126 }
5127
5128 void getTargetDefines(const LangOptions &Opts,
5129 MacroBuilder &Builder) const override {
5130 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5131 DefineStd(Builder, "WIN32", Opts);
5132 DefineStd(Builder, "WINNT", Opts);
5133 Builder.defineMacro("_ARM_");
5134 addMinGWDefines(Opts, Builder);
5135 }
5136};
5137
5138// ARM Cygwin target
5139class CygwinARMTargetInfo : public ARMleTargetInfo {
5140public:
5141 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5142 TLSSupported = false;
5143 WCharType = UnsignedShort;
5144 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005145 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005146 }
5147 void getTargetDefines(const LangOptions &Opts,
5148 MacroBuilder &Builder) const override {
5149 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5150 Builder.defineMacro("_ARM_");
5151 Builder.defineMacro("__CYGWIN__");
5152 Builder.defineMacro("__CYGWIN32__");
5153 DefineStd(Builder, "unix", Opts);
5154 if (Opts.CPlusPlus)
5155 Builder.defineMacro("_GNU_SOURCE");
5156 }
5157};
5158
Mike Stump11289f42009-09-09 15:08:12 +00005159class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005160 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005161protected:
Craig Topper3164f332014-03-11 03:39:26 +00005162 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5163 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005164 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005165 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005166
Torok Edwinb2b37c62009-06-30 17:10:35 +00005167public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005168 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005169 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005170 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005171 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005172 // FIXME: This should be based off of the target features in
5173 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005174 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005175
Tim Northover5627d392015-10-30 16:30:45 +00005176 if (Triple.isWatchOS()) {
5177 // Darwin on iOS uses a variant of the ARM C++ ABI.
5178 TheCXXABI.set(TargetCXXABI::WatchOS);
5179
5180 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5181 // size_t is long, it's a bit weird for it to be int.
5182 PtrDiffType = SignedLong;
5183
5184 // BOOL should be a real boolean on the new ABI
5185 UseSignedCharForObjCBool = false;
5186 } else
5187 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005188 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005189};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005190
Tim Northover573cbee2014-05-24 12:52:07 +00005191class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005192 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005193 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5194 static const char *const GCCRegNames[];
5195
James Molloy75f5f9e2014-04-16 15:33:48 +00005196 enum FPUModeEnum {
5197 FPUMode,
5198 NeonMode
5199 };
5200
5201 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005202 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005203 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005204 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005205
Tim Northovera2ee4332014-03-29 15:09:45 +00005206 static const Builtin::Info BuiltinInfo[];
5207
5208 std::string ABI;
5209
5210public:
Tim Northover573cbee2014-05-24 12:52:07 +00005211 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005212 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005213
5214 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5215 WCharType = SignedInt;
5216
5217 // NetBSD apparently prefers consistency across ARM targets to consistency
5218 // across 64-bit targets.
5219 Int64Type = SignedLongLong;
5220 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005221 } else {
5222 WCharType = UnsignedInt;
5223 Int64Type = SignedLong;
5224 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005225 }
5226
Tim Northovera2ee4332014-03-29 15:09:45 +00005227 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005228 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005229 MaxAtomicInlineWidth = 128;
5230 MaxAtomicPromoteWidth = 128;
5231
Tim Northovera6a19f12015-02-06 01:25:07 +00005232 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005233 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5234
Tim Northovera2ee4332014-03-29 15:09:45 +00005235 // {} in inline assembly are neon specifiers, not assembly variant
5236 // specifiers.
5237 NoAsmVariants = true;
5238
Tim Northover7ad87af2015-01-16 18:44:04 +00005239 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5240 // contributes to the alignment of the containing aggregate in the same way
5241 // a plain (non bit-field) member of that type would, without exception for
5242 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005243 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005244 UseZeroLengthBitfieldAlignment = true;
5245
Tim Northover573cbee2014-05-24 12:52:07 +00005246 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005247 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5248 }
5249
Alp Toker4925ba72014-06-07 23:30:42 +00005250 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005251 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005252 if (Name != "aapcs" && Name != "darwinpcs")
5253 return false;
5254
5255 ABI = Name;
5256 return true;
5257 }
5258
David Blaikie1cbb9712014-11-14 19:09:44 +00005259 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005260 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005261 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005262 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005263 .Case("cyclone", true)
5264 .Default(false);
5265 return CPUKnown;
5266 }
5267
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005268 void getTargetDefines(const LangOptions &Opts,
5269 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005270 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005271 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005272
5273 // Target properties.
5274 Builder.defineMacro("_LP64");
5275 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005276
5277 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5278 Builder.defineMacro("__ARM_ACLE", "200");
5279 Builder.defineMacro("__ARM_ARCH", "8");
5280 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5281
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005282 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005283 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005284 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005285
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005286 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5287 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5288 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5289 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005290 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005291 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5292 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005293
5294 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5295
5296 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005297 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005298
5299 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5300 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005301 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5302 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005303
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005304 if (Opts.UnsafeFPMath)
5305 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005306
5307 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5308
5309 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5310 Opts.ShortEnums ? "1" : "4");
5311
James Molloy75f5f9e2014-04-16 15:33:48 +00005312 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005313 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005314 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005315 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005316 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005317
Bradley Smith418c5932014-05-02 15:17:51 +00005318 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005319 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005320
James Molloy75f5f9e2014-04-16 15:33:48 +00005321 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005322 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5323
5324 if (Unaligned)
5325 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005326
5327 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5328 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5329 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005332 }
5333
Craig Topper6c03a542015-10-19 04:51:35 +00005334 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5335 return llvm::makeArrayRef(BuiltinInfo,
5336 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005337 }
5338
David Blaikie1cbb9712014-11-14 19:09:44 +00005339 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005340 return Feature == "aarch64" ||
5341 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005342 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005343 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005344 }
5345
James Molloy5e73df52014-04-16 15:06:20 +00005346 bool handleTargetFeatures(std::vector<std::string> &Features,
5347 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005348 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005349 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005350 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005351 Unaligned = 1;
5352
Eric Christopher610fe112015-08-26 08:21:55 +00005353 for (const auto &Feature : Features) {
5354 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005355 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005356 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005357 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005358 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005359 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005360 if (Feature == "+strict-align")
5361 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005362 }
5363
Eric Christopher964a5f32015-08-05 23:48:05 +00005364 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005365
5366 return true;
5367 }
5368
David Blaikie1cbb9712014-11-14 19:09:44 +00005369 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005370
David Blaikie1cbb9712014-11-14 19:09:44 +00005371 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005372 return TargetInfo::AArch64ABIBuiltinVaList;
5373 }
5374
Craig Topperf054e3a2015-10-19 03:52:27 +00005375 ArrayRef<const char *> getGCCRegNames() const override;
5376 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005377
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005378 bool validateAsmConstraint(const char *&Name,
5379 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005380 switch (*Name) {
5381 default:
5382 return false;
5383 case 'w': // Floating point and SIMD registers (V0-V31)
5384 Info.setAllowsRegister();
5385 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005386 case 'I': // Constant that can be used with an ADD instruction
5387 case 'J': // Constant that can be used with a SUB instruction
5388 case 'K': // Constant that can be used with a 32-bit logical instruction
5389 case 'L': // Constant that can be used with a 64-bit logical instruction
5390 case 'M': // Constant that can be used as a 32-bit MOV immediate
5391 case 'N': // Constant that can be used as a 64-bit MOV immediate
5392 case 'Y': // Floating point constant zero
5393 case 'Z': // Integer constant zero
5394 return true;
5395 case 'Q': // A memory reference with base register and no offset
5396 Info.setAllowsMemory();
5397 return true;
5398 case 'S': // A symbolic address
5399 Info.setAllowsRegister();
5400 return true;
5401 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005402 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5403 // Utf: A memory address suitable for ldp/stp in TF mode.
5404 // Usa: An absolute symbolic address.
5405 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5406 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005407 case 'z': // Zero register, wzr or xzr
5408 Info.setAllowsRegister();
5409 return true;
5410 case 'x': // Floating point and SIMD registers (V0-V15)
5411 Info.setAllowsRegister();
5412 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005413 }
5414 return false;
5415 }
5416
Akira Hatanaka987f1862014-08-22 06:05:21 +00005417 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005418 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005419 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005420 // Strip off constraint modifiers.
5421 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5422 Constraint = Constraint.substr(1);
5423
5424 switch (Constraint[0]) {
5425 default:
5426 return true;
5427 case 'z':
5428 case 'r': {
5429 switch (Modifier) {
5430 case 'x':
5431 case 'w':
5432 // For now assume that the person knows what they're
5433 // doing with the modifier.
5434 return true;
5435 default:
5436 // By default an 'r' constraint will be in the 'x'
5437 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005438 if (Size == 64)
5439 return true;
5440
5441 SuggestedModifier = "w";
5442 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005443 }
5444 }
5445 }
5446 }
5447
David Blaikie1cbb9712014-11-14 19:09:44 +00005448 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005449
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005450 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005451 if (RegNo == 0)
5452 return 0;
5453 if (RegNo == 1)
5454 return 1;
5455 return -1;
5456 }
5457};
5458
Tim Northover573cbee2014-05-24 12:52:07 +00005459const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005460 // 32-bit Integer registers
5461 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5462 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5463 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5464
5465 // 64-bit Integer registers
5466 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5467 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5468 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5469
5470 // 32-bit floating point regsisters
5471 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5472 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5473 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5474
5475 // 64-bit floating point regsisters
5476 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5477 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5478 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5479
5480 // Vector registers
5481 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5482 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5483 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5484};
5485
Craig Topperf054e3a2015-10-19 03:52:27 +00005486ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5487 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005488}
5489
Tim Northover573cbee2014-05-24 12:52:07 +00005490const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005491 { { "w31" }, "wsp" },
5492 { { "x29" }, "fp" },
5493 { { "x30" }, "lr" },
5494 { { "x31" }, "sp" },
5495 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5496 // don't want to substitute one of these for a different-sized one.
5497};
5498
Craig Topperf054e3a2015-10-19 03:52:27 +00005499ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5500 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005501}
5502
Tim Northover573cbee2014-05-24 12:52:07 +00005503const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005504#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005505 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005506#include "clang/Basic/BuiltinsNEON.def"
5507
5508#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005509 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005510#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005511};
James Molloy5e73df52014-04-16 15:06:20 +00005512
Tim Northover573cbee2014-05-24 12:52:07 +00005513class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005514 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005515 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005516 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005517 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005518 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005519 }
5520
5521public:
Tim Northover573cbee2014-05-24 12:52:07 +00005522 AArch64leTargetInfo(const llvm::Triple &Triple)
5523 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005524 BigEndian = false;
5525 }
5526 void getTargetDefines(const LangOptions &Opts,
5527 MacroBuilder &Builder) const override {
5528 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005529 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005530 }
5531};
5532
Tim Northover573cbee2014-05-24 12:52:07 +00005533class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005534 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005535 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005536 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005537 }
5538
5539public:
Tim Northover573cbee2014-05-24 12:52:07 +00005540 AArch64beTargetInfo(const llvm::Triple &Triple)
5541 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005542 void getTargetDefines(const LangOptions &Opts,
5543 MacroBuilder &Builder) const override {
5544 Builder.defineMacro("__AARCH64EB__");
5545 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5546 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005547 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005548 }
5549};
Tim Northovera2ee4332014-03-29 15:09:45 +00005550
Tim Northover573cbee2014-05-24 12:52:07 +00005551class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005552protected:
5553 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5554 MacroBuilder &Builder) const override {
5555 Builder.defineMacro("__AARCH64_SIMD__");
5556 Builder.defineMacro("__ARM64_ARCH_8__");
5557 Builder.defineMacro("__ARM_NEON__");
5558 Builder.defineMacro("__LITTLE_ENDIAN__");
5559 Builder.defineMacro("__REGISTER_PREFIX__", "");
5560 Builder.defineMacro("__arm64", "1");
5561 Builder.defineMacro("__arm64__", "1");
5562
5563 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5564 }
5565
Tim Northovera2ee4332014-03-29 15:09:45 +00005566public:
Tim Northover573cbee2014-05-24 12:52:07 +00005567 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5568 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005569 Int64Type = SignedLongLong;
5570 WCharType = SignedInt;
5571 UseSignedCharForObjCBool = false;
5572
Tim Northovera6a19f12015-02-06 01:25:07 +00005573 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005574 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5575
5576 TheCXXABI.set(TargetCXXABI::iOS64);
5577 }
5578
David Blaikie1cbb9712014-11-14 19:09:44 +00005579 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005580 return TargetInfo::CharPtrBuiltinVaList;
5581 }
5582};
Tim Northovera2ee4332014-03-29 15:09:45 +00005583
Tony Linthicum76329bf2011-12-12 21:14:55 +00005584// Hexagon abstract base class
5585class HexagonTargetInfo : public TargetInfo {
5586 static const Builtin::Info BuiltinInfo[];
5587 static const char * const GCCRegNames[];
5588 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5589 std::string CPU;
5590public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005591 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005592 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005593 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005594
5595 // {} in inline assembly are packet specifiers, not assembly variant
5596 // specifiers.
5597 NoAsmVariants = true;
5598 }
5599
Craig Topper6c03a542015-10-19 04:51:35 +00005600 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5601 return llvm::makeArrayRef(BuiltinInfo,
5602 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005603 }
5604
Craig Topper3164f332014-03-11 03:39:26 +00005605 bool validateAsmConstraint(const char *&Name,
5606 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005607 return true;
5608 }
5609
Craig Topper3164f332014-03-11 03:39:26 +00005610 void getTargetDefines(const LangOptions &Opts,
5611 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005612
Craig Topper3164f332014-03-11 03:39:26 +00005613 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005614 return Feature == "hexagon";
5615 }
Craig Topper3164f332014-03-11 03:39:26 +00005616
5617 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005618 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005619 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005620 ArrayRef<const char *> getGCCRegNames() const override;
5621 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005622 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005623 return "";
5624 }
Sebastian Pop86500282012-01-13 20:37:10 +00005625
5626 static const char *getHexagonCPUSuffix(StringRef Name) {
5627 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005628 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005629 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005630 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005631 }
5632
Craig Topper3164f332014-03-11 03:39:26 +00005633 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005634 if (!getHexagonCPUSuffix(Name))
5635 return false;
5636
Tony Linthicum76329bf2011-12-12 21:14:55 +00005637 CPU = Name;
5638 return true;
5639 }
5640};
5641
5642void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5643 MacroBuilder &Builder) const {
5644 Builder.defineMacro("qdsp6");
5645 Builder.defineMacro("__qdsp6", "1");
5646 Builder.defineMacro("__qdsp6__", "1");
5647
5648 Builder.defineMacro("hexagon");
5649 Builder.defineMacro("__hexagon", "1");
5650 Builder.defineMacro("__hexagon__", "1");
5651
5652 if(CPU == "hexagonv1") {
5653 Builder.defineMacro("__HEXAGON_V1__");
5654 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5655 if(Opts.HexagonQdsp6Compat) {
5656 Builder.defineMacro("__QDSP6_V1__");
5657 Builder.defineMacro("__QDSP6_ARCH__", "1");
5658 }
5659 }
5660 else if(CPU == "hexagonv2") {
5661 Builder.defineMacro("__HEXAGON_V2__");
5662 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5663 if(Opts.HexagonQdsp6Compat) {
5664 Builder.defineMacro("__QDSP6_V2__");
5665 Builder.defineMacro("__QDSP6_ARCH__", "2");
5666 }
5667 }
5668 else if(CPU == "hexagonv3") {
5669 Builder.defineMacro("__HEXAGON_V3__");
5670 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5671 if(Opts.HexagonQdsp6Compat) {
5672 Builder.defineMacro("__QDSP6_V3__");
5673 Builder.defineMacro("__QDSP6_ARCH__", "3");
5674 }
5675 }
5676 else if(CPU == "hexagonv4") {
5677 Builder.defineMacro("__HEXAGON_V4__");
5678 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5679 if(Opts.HexagonQdsp6Compat) {
5680 Builder.defineMacro("__QDSP6_V4__");
5681 Builder.defineMacro("__QDSP6_ARCH__", "4");
5682 }
5683 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005684 else if(CPU == "hexagonv5") {
5685 Builder.defineMacro("__HEXAGON_V5__");
5686 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5687 if(Opts.HexagonQdsp6Compat) {
5688 Builder.defineMacro("__QDSP6_V5__");
5689 Builder.defineMacro("__QDSP6_ARCH__", "5");
5690 }
5691 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005692}
5693
5694const char * const HexagonTargetInfo::GCCRegNames[] = {
5695 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5696 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5697 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5698 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5699 "p0", "p1", "p2", "p3",
5700 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5701};
5702
Craig Topperf054e3a2015-10-19 03:52:27 +00005703ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const {
5704 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005705}
5706
5707
5708const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5709 { { "sp" }, "r29" },
5710 { { "fp" }, "r30" },
5711 { { "lr" }, "r31" },
5712 };
5713
Craig Topperf054e3a2015-10-19 03:52:27 +00005714ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5715 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005716}
5717
5718
5719const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005720#define BUILTIN(ID, TYPE, ATTRS) \
5721 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5722#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5723 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005724#include "clang/Basic/BuiltinsHexagon.def"
5725};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005726
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005727// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5728class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005729 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5730 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005731 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005732public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005733 SparcTargetInfo(const llvm::Triple &Triple)
5734 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005735
Craig Topper3164f332014-03-11 03:39:26 +00005736 bool handleTargetFeatures(std::vector<std::string> &Features,
5737 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005738 // The backend doesn't actually handle soft float yet, but in case someone
5739 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005740 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5741 if (Feature != Features.end()) {
5742 SoftFloat = true;
5743 Features.erase(Feature);
5744 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005745 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005746 }
Craig Topper3164f332014-03-11 03:39:26 +00005747 void getTargetDefines(const LangOptions &Opts,
5748 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005749 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005750 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005751
5752 if (SoftFloat)
5753 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005754 }
Craig Topper3164f332014-03-11 03:39:26 +00005755
5756 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005757 return llvm::StringSwitch<bool>(Feature)
5758 .Case("softfloat", SoftFloat)
5759 .Case("sparc", true)
5760 .Default(false);
5761 }
Craig Topper3164f332014-03-11 03:39:26 +00005762
Craig Topper6c03a542015-10-19 04:51:35 +00005763 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005764 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005765 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005766 }
Craig Topper3164f332014-03-11 03:39:26 +00005767 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005768 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005769 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005770 ArrayRef<const char *> getGCCRegNames() const override;
5771 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005772 bool validateAsmConstraint(const char *&Name,
5773 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005774 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005775 switch (*Name) {
5776 case 'I': // Signed 13-bit constant
5777 case 'J': // Zero
5778 case 'K': // 32-bit constant with the low 12 bits clear
5779 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5780 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5781 case 'N': // Same as 'K' but zext (required for SIMode)
5782 case 'O': // The constant 4096
5783 return true;
5784 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005785 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005786 }
Craig Topper3164f332014-03-11 03:39:26 +00005787 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005788 // FIXME: Implement!
5789 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005790 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005791
5792 // No Sparc V7 for now, the backend doesn't support it anyway.
5793 enum CPUKind {
5794 CK_GENERIC,
5795 CK_V8,
5796 CK_SUPERSPARC,
5797 CK_SPARCLITE,
5798 CK_F934,
5799 CK_HYPERSPARC,
5800 CK_SPARCLITE86X,
5801 CK_SPARCLET,
5802 CK_TSC701,
5803 CK_V9,
5804 CK_ULTRASPARC,
5805 CK_ULTRASPARC3,
5806 CK_NIAGARA,
5807 CK_NIAGARA2,
5808 CK_NIAGARA3,
5809 CK_NIAGARA4
5810 } CPU = CK_GENERIC;
5811
5812 enum CPUGeneration {
5813 CG_V8,
5814 CG_V9,
5815 };
5816
5817 CPUGeneration getCPUGeneration(CPUKind Kind) const {
5818 switch (Kind) {
5819 case CK_GENERIC:
5820 case CK_V8:
5821 case CK_SUPERSPARC:
5822 case CK_SPARCLITE:
5823 case CK_F934:
5824 case CK_HYPERSPARC:
5825 case CK_SPARCLITE86X:
5826 case CK_SPARCLET:
5827 case CK_TSC701:
5828 return CG_V8;
5829 case CK_V9:
5830 case CK_ULTRASPARC:
5831 case CK_ULTRASPARC3:
5832 case CK_NIAGARA:
5833 case CK_NIAGARA2:
5834 case CK_NIAGARA3:
5835 case CK_NIAGARA4:
5836 return CG_V9;
5837 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00005838 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005839 }
5840
5841 CPUKind getCPUKind(StringRef Name) const {
5842 return llvm::StringSwitch<CPUKind>(Name)
5843 .Case("v8", CK_V8)
5844 .Case("supersparc", CK_SUPERSPARC)
5845 .Case("sparclite", CK_SPARCLITE)
5846 .Case("f934", CK_F934)
5847 .Case("hypersparc", CK_HYPERSPARC)
5848 .Case("sparclite86x", CK_SPARCLITE86X)
5849 .Case("sparclet", CK_SPARCLET)
5850 .Case("tsc701", CK_TSC701)
5851 .Case("v9", CK_V9)
5852 .Case("ultrasparc", CK_ULTRASPARC)
5853 .Case("ultrasparc3", CK_ULTRASPARC3)
5854 .Case("niagara", CK_NIAGARA)
5855 .Case("niagara2", CK_NIAGARA2)
5856 .Case("niagara3", CK_NIAGARA3)
5857 .Case("niagara4", CK_NIAGARA4)
5858 .Default(CK_GENERIC);
5859 }
5860
5861 bool setCPU(const std::string &Name) override {
5862 CPU = getCPUKind(Name);
5863 return CPU != CK_GENERIC;
5864 }
Gabor Greif49991682008-02-21 16:29:08 +00005865};
5866
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005867const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005868 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5869 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5870 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5871 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5872};
5873
Craig Topperf054e3a2015-10-19 03:52:27 +00005874ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
5875 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00005876}
5877
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005878const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005879 { { "g0" }, "r0" },
5880 { { "g1" }, "r1" },
5881 { { "g2" }, "r2" },
5882 { { "g3" }, "r3" },
5883 { { "g4" }, "r4" },
5884 { { "g5" }, "r5" },
5885 { { "g6" }, "r6" },
5886 { { "g7" }, "r7" },
5887 { { "o0" }, "r8" },
5888 { { "o1" }, "r9" },
5889 { { "o2" }, "r10" },
5890 { { "o3" }, "r11" },
5891 { { "o4" }, "r12" },
5892 { { "o5" }, "r13" },
5893 { { "o6", "sp" }, "r14" },
5894 { { "o7" }, "r15" },
5895 { { "l0" }, "r16" },
5896 { { "l1" }, "r17" },
5897 { { "l2" }, "r18" },
5898 { { "l3" }, "r19" },
5899 { { "l4" }, "r20" },
5900 { { "l5" }, "r21" },
5901 { { "l6" }, "r22" },
5902 { { "l7" }, "r23" },
5903 { { "i0" }, "r24" },
5904 { { "i1" }, "r25" },
5905 { { "i2" }, "r26" },
5906 { { "i3" }, "r27" },
5907 { { "i4" }, "r28" },
5908 { { "i5" }, "r29" },
5909 { { "i6", "fp" }, "r30" },
5910 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005911};
5912
Craig Topperf054e3a2015-10-19 03:52:27 +00005913ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
5914 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00005915}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005916
5917// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5918class SparcV8TargetInfo : public SparcTargetInfo {
5919public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005920 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005921 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005922 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5923 switch (getTriple().getOS()) {
5924 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005925 SizeType = UnsignedInt;
5926 IntPtrType = SignedInt;
5927 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005928 break;
5929 case llvm::Triple::NetBSD:
5930 case llvm::Triple::OpenBSD:
5931 SizeType = UnsignedLong;
5932 IntPtrType = SignedLong;
5933 PtrDiffType = SignedLong;
5934 break;
Brad Smith56495d52015-08-13 22:00:53 +00005935 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005936 }
5937
Craig Topper3164f332014-03-11 03:39:26 +00005938 void getTargetDefines(const LangOptions &Opts,
5939 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005940 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005941 switch (getCPUGeneration(CPU)) {
5942 case CG_V8:
5943 Builder.defineMacro("__sparcv8");
5944 if (getTriple().getOS() != llvm::Triple::Solaris)
5945 Builder.defineMacro("__sparcv8__");
5946 break;
5947 case CG_V9:
5948 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00005949 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005950 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00005951 Builder.defineMacro("__sparc_v9__");
5952 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005953 break;
5954 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005955 }
5956};
5957
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005958// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5959class SparcV8elTargetInfo : public SparcV8TargetInfo {
5960 public:
5961 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005962 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005963 BigEndian = false;
5964 }
5965};
5966
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005967// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5968class SparcV9TargetInfo : public SparcTargetInfo {
5969public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005970 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005971 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005972 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005973 // This is an LP64 platform.
5974 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005975
5976 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005977 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005978 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005979 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005980 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005981 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005982
5983 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5984 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5985 LongDoubleWidth = 128;
5986 LongDoubleAlign = 128;
5987 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005988 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005989 }
5990
Craig Topper3164f332014-03-11 03:39:26 +00005991 void getTargetDefines(const LangOptions &Opts,
5992 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005993 SparcTargetInfo::getTargetDefines(Opts, Builder);
5994 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005995 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005996 // Solaris doesn't need these variants, but the BSDs do.
5997 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005998 Builder.defineMacro("__sparc64__");
5999 Builder.defineMacro("__sparc_v9__");
6000 Builder.defineMacro("__sparcv9__");
6001 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006002 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006003
Craig Topper3164f332014-03-11 03:39:26 +00006004 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006005 if (!SparcTargetInfo::setCPU(Name))
6006 return false;
6007 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006008 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006009};
6010
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006011class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006012 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006013 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006014 std::string CPU;
6015 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006016 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006017
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006018public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006019 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006020 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6021 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006022 IntMaxType = SignedLong;
6023 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006024 TLSSupported = true;
6025 IntWidth = IntAlign = 32;
6026 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6027 PointerWidth = PointerAlign = 64;
6028 LongDoubleWidth = 128;
6029 LongDoubleAlign = 64;
6030 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006031 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006032 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00006033 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 +00006034 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6035 }
6036 void getTargetDefines(const LangOptions &Opts,
6037 MacroBuilder &Builder) const override {
6038 Builder.defineMacro("__s390__");
6039 Builder.defineMacro("__s390x__");
6040 Builder.defineMacro("__zarch__");
6041 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006042 if (HasTransactionalExecution)
6043 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006044 if (Opts.ZVector)
6045 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006046 }
Craig Topper6c03a542015-10-19 04:51:35 +00006047 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6048 return llvm::makeArrayRef(BuiltinInfo,
6049 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006050 }
6051
Craig Topperf054e3a2015-10-19 03:52:27 +00006052 ArrayRef<const char *> getGCCRegNames() const override;
6053 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006054 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006055 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006056 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006057 bool validateAsmConstraint(const char *&Name,
6058 TargetInfo::ConstraintInfo &info) const override;
6059 const char *getClobbers() const override {
6060 // FIXME: Is this really right?
6061 return "";
6062 }
6063 BuiltinVaListKind getBuiltinVaListKind() const override {
6064 return TargetInfo::SystemZBuiltinVaList;
6065 }
6066 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006067 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006068 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6069 .Case("z10", true)
6070 .Case("z196", true)
6071 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006072 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006073 .Default(false);
6074
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006075 return CPUKnown;
6076 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006077 bool
6078 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6079 StringRef CPU,
6080 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006081 if (CPU == "zEC12")
6082 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006083 if (CPU == "z13") {
6084 Features["transactional-execution"] = true;
6085 Features["vector"] = true;
6086 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006087 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006088 }
6089
6090 bool handleTargetFeatures(std::vector<std::string> &Features,
6091 DiagnosticsEngine &Diags) override {
6092 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006093 for (const auto &Feature : Features) {
6094 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006095 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006096 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006097 HasVector = true;
6098 }
6099 // If we use the vector ABI, vector types are 64-bit aligned.
6100 if (HasVector) {
6101 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006102 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6103 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006104 }
6105 return true;
6106 }
6107
6108 bool hasFeature(StringRef Feature) const override {
6109 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006110 .Case("systemz", true)
6111 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006112 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006113 .Default(false);
6114 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006115
6116 StringRef getABI() const override {
6117 if (HasVector)
6118 return "vector";
6119 return "";
6120 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006121
6122 bool useFloat128ManglingForLongDouble() const override {
6123 return true;
6124 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006125};
6126
6127const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6128#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006129 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006130#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006131};
6132
6133const char *const SystemZTargetInfo::GCCRegNames[] = {
6134 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6135 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6136 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6137 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6138};
6139
Craig Topperf054e3a2015-10-19 03:52:27 +00006140ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6141 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006142}
6143
6144bool SystemZTargetInfo::
6145validateAsmConstraint(const char *&Name,
6146 TargetInfo::ConstraintInfo &Info) const {
6147 switch (*Name) {
6148 default:
6149 return false;
6150
6151 case 'a': // Address register
6152 case 'd': // Data register (equivalent to 'r')
6153 case 'f': // Floating-point register
6154 Info.setAllowsRegister();
6155 return true;
6156
6157 case 'I': // Unsigned 8-bit constant
6158 case 'J': // Unsigned 12-bit constant
6159 case 'K': // Signed 16-bit constant
6160 case 'L': // Signed 20-bit displacement (on all targets we support)
6161 case 'M': // 0x7fffffff
6162 return true;
6163
6164 case 'Q': // Memory with base and unsigned 12-bit displacement
6165 case 'R': // Likewise, plus an index
6166 case 'S': // Memory with base and signed 20-bit displacement
6167 case 'T': // Likewise, plus an index
6168 Info.setAllowsMemory();
6169 return true;
6170 }
6171}
Ulrich Weigand47445072013-05-06 16:26:41 +00006172
Eric Christopherc48497a2015-09-18 21:26:24 +00006173class MSP430TargetInfo : public TargetInfo {
6174 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006175
Eric Christopherc48497a2015-09-18 21:26:24 +00006176public:
6177 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6178 BigEndian = false;
6179 TLSSupported = false;
6180 IntWidth = 16;
6181 IntAlign = 16;
6182 LongWidth = 32;
6183 LongLongWidth = 64;
6184 LongAlign = LongLongAlign = 16;
6185 PointerWidth = 16;
6186 PointerAlign = 16;
6187 SuitableAlign = 16;
6188 SizeType = UnsignedInt;
6189 IntMaxType = SignedLongLong;
6190 IntPtrType = SignedInt;
6191 PtrDiffType = SignedInt;
6192 SigAtomicType = SignedLong;
6193 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006194 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006195 void getTargetDefines(const LangOptions &Opts,
6196 MacroBuilder &Builder) const override {
6197 Builder.defineMacro("MSP430");
6198 Builder.defineMacro("__MSP430__");
6199 // FIXME: defines for different 'flavours' of MCU
6200 }
Craig Topper6c03a542015-10-19 04:51:35 +00006201 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006202 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006203 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006204 }
6205 bool hasFeature(StringRef Feature) const override {
6206 return Feature == "msp430";
6207 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006208 ArrayRef<const char *> getGCCRegNames() const override;
6209 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006210 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006211 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006212 }
6213 bool validateAsmConstraint(const char *&Name,
6214 TargetInfo::ConstraintInfo &info) const override {
6215 // FIXME: implement
6216 switch (*Name) {
6217 case 'K': // the constant 1
6218 case 'L': // constant -1^20 .. 1^19
6219 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006220 return true;
6221 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006222 // No target constraints for now.
6223 return false;
6224 }
6225 const char *getClobbers() const override {
6226 // FIXME: Is this really right?
6227 return "";
6228 }
6229 BuiltinVaListKind getBuiltinVaListKind() const override {
6230 // FIXME: implement
6231 return TargetInfo::CharPtrBuiltinVaList;
6232 }
6233};
6234
6235const char *const MSP430TargetInfo::GCCRegNames[] = {
6236 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6237 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6238
Craig Topperf054e3a2015-10-19 03:52:27 +00006239ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6240 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006241}
6242
6243// LLVM and Clang cannot be used directly to output native binaries for
6244// target, but is used to compile C code to llvm bitcode with correct
6245// type and alignment information.
6246//
6247// TCE uses the llvm bitcode as input and uses it for generating customized
6248// target processor and program binary. TCE co-design environment is
6249// publicly available in http://tce.cs.tut.fi
6250
6251static const unsigned TCEOpenCLAddrSpaceMap[] = {
6252 3, // opencl_global
6253 4, // opencl_local
6254 5, // opencl_constant
6255 // FIXME: generic has to be added to the target
6256 0, // opencl_generic
6257 0, // cuda_device
6258 0, // cuda_constant
6259 0 // cuda_shared
6260};
6261
6262class TCETargetInfo : public TargetInfo {
6263public:
6264 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6265 TLSSupported = false;
6266 IntWidth = 32;
6267 LongWidth = LongLongWidth = 32;
6268 PointerWidth = 32;
6269 IntAlign = 32;
6270 LongAlign = LongLongAlign = 32;
6271 PointerAlign = 32;
6272 SuitableAlign = 32;
6273 SizeType = UnsignedInt;
6274 IntMaxType = SignedLong;
6275 IntPtrType = SignedInt;
6276 PtrDiffType = SignedInt;
6277 FloatWidth = 32;
6278 FloatAlign = 32;
6279 DoubleWidth = 32;
6280 DoubleAlign = 32;
6281 LongDoubleWidth = 32;
6282 LongDoubleAlign = 32;
6283 FloatFormat = &llvm::APFloat::IEEEsingle;
6284 DoubleFormat = &llvm::APFloat::IEEEsingle;
6285 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6286 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6287 "-f64:32-v64:32-v128:32-a:0:32-n32";
6288 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6289 UseAddrSpaceMapMangling = true;
6290 }
6291
6292 void getTargetDefines(const LangOptions &Opts,
6293 MacroBuilder &Builder) const override {
6294 DefineStd(Builder, "tce", Opts);
6295 Builder.defineMacro("__TCE__");
6296 Builder.defineMacro("__TCE_V1__");
6297 }
6298 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6299
Craig Topper6c03a542015-10-19 04:51:35 +00006300 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006301 const char *getClobbers() const override { return ""; }
6302 BuiltinVaListKind getBuiltinVaListKind() const override {
6303 return TargetInfo::VoidPtrBuiltinVaList;
6304 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006305 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006306 bool validateAsmConstraint(const char *&Name,
6307 TargetInfo::ConstraintInfo &info) const override {
6308 return true;
6309 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006310 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6311 return None;
6312 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006313};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006314
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006315class BPFTargetInfo : public TargetInfo {
6316public:
6317 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6318 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6319 SizeType = UnsignedLong;
6320 PtrDiffType = SignedLong;
6321 IntPtrType = SignedLong;
6322 IntMaxType = SignedLong;
6323 Int64Type = SignedLong;
6324 RegParmMax = 5;
6325 if (Triple.getArch() == llvm::Triple::bpfeb) {
6326 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006327 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006328 } else {
6329 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006330 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006331 }
6332 MaxAtomicPromoteWidth = 64;
6333 MaxAtomicInlineWidth = 64;
6334 TLSSupported = false;
6335 }
6336 void getTargetDefines(const LangOptions &Opts,
6337 MacroBuilder &Builder) const override {
6338 DefineStd(Builder, "bpf", Opts);
6339 Builder.defineMacro("__BPF__");
6340 }
6341 bool hasFeature(StringRef Feature) const override {
6342 return Feature == "bpf";
6343 }
6344
Craig Topper6c03a542015-10-19 04:51:35 +00006345 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006346 const char *getClobbers() const override {
6347 return "";
6348 }
6349 BuiltinVaListKind getBuiltinVaListKind() const override {
6350 return TargetInfo::VoidPtrBuiltinVaList;
6351 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006352 ArrayRef<const char *> getGCCRegNames() const override {
6353 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006354 }
6355 bool validateAsmConstraint(const char *&Name,
6356 TargetInfo::ConstraintInfo &info) const override {
6357 return true;
6358 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006359 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6360 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006361 }
6362};
6363
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006364class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006365 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006366
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006367 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006368 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006369 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006370 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006371 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006372 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006373 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006374 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006375 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006376 enum DspRevEnum {
6377 NoDSP, DSP1, DSP2
6378 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006379 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006380
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006381protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006382 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006383 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006384
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006385public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006386 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6387 const std::string &CPUStr)
6388 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006389 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006390 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6391 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6392 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006393
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006394 bool isNaN2008Default() const {
6395 return CPU == "mips32r6" || CPU == "mips64r6";
6396 }
6397
6398 bool isFP64Default() const {
6399 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6400 }
6401
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006402 bool isNan2008() const override {
6403 return IsNan2008;
6404 }
6405
Alp Toker4925ba72014-06-07 23:30:42 +00006406 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006407 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006408 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6409 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006410 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006411 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006412 .Case("mips1", IsMips32)
6413 .Case("mips2", IsMips32)
6414 .Case("mips3", true)
6415 .Case("mips4", true)
6416 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006417 .Case("mips32", IsMips32)
6418 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006419 .Case("mips32r3", IsMips32)
6420 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006421 .Case("mips32r6", IsMips32)
6422 .Case("mips64", true)
6423 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006424 .Case("mips64r3", true)
6425 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006426 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006427 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006428 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006429 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006430 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006431 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006432 bool
6433 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6434 StringRef CPU,
6435 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006436 if (CPU == "octeon")
6437 Features["mips64r2"] = Features["cnmips"] = true;
6438 else
6439 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006440 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006441 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006442
Craig Topper3164f332014-03-11 03:39:26 +00006443 void getTargetDefines(const LangOptions &Opts,
6444 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006445 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006446 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006447 if (Opts.GNUMode)
6448 Builder.defineMacro("mips");
6449
Simon Atanasyan683535b2012-08-29 19:14:58 +00006450 Builder.defineMacro("__REGISTER_PREFIX__", "");
6451
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006452 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006453 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006454 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006455 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006456 case SoftFloat:
6457 Builder.defineMacro("__mips_soft_float", Twine(1));
6458 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006459 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006460
Simon Atanasyan16071912013-04-14 14:07:30 +00006461 if (IsSingleFloat)
6462 Builder.defineMacro("__mips_single_float", Twine(1));
6463
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006464 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6465 Builder.defineMacro("_MIPS_FPSET",
6466 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6467
Simon Atanasyan72244b62012-07-05 16:06:06 +00006468 if (IsMips16)
6469 Builder.defineMacro("__mips16", Twine(1));
6470
Simon Atanasyan60777612013-04-14 14:07:51 +00006471 if (IsMicromips)
6472 Builder.defineMacro("__mips_micromips", Twine(1));
6473
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006474 if (IsNan2008)
6475 Builder.defineMacro("__mips_nan2008", Twine(1));
6476
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006477 switch (DspRev) {
6478 default:
6479 break;
6480 case DSP1:
6481 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6482 Builder.defineMacro("__mips_dsp", Twine(1));
6483 break;
6484 case DSP2:
6485 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6486 Builder.defineMacro("__mips_dspr2", Twine(1));
6487 Builder.defineMacro("__mips_dsp", Twine(1));
6488 break;
6489 }
6490
Jack Carter44ff1e52013-08-12 17:20:29 +00006491 if (HasMSA)
6492 Builder.defineMacro("__mips_msa", Twine(1));
6493
Simon Atanasyan26f19672012-04-05 19:28:31 +00006494 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6495 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6496 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006497
6498 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6499 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006500 }
6501
Craig Topper6c03a542015-10-19 04:51:35 +00006502 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6503 return llvm::makeArrayRef(BuiltinInfo,
6504 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006505 }
Craig Topper3164f332014-03-11 03:39:26 +00006506 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006507 return llvm::StringSwitch<bool>(Feature)
6508 .Case("mips", true)
6509 .Case("fp64", HasFP64)
6510 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006511 }
Craig Topper3164f332014-03-11 03:39:26 +00006512 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006513 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006514 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006515 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006516 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006517 // CPU register names
6518 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006519 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6520 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6521 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006522 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6523 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006524 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6525 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6526 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6527 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006528 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006529 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006530 "$fcc5","$fcc6","$fcc7",
6531 // MSA register names
6532 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6533 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6534 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6535 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6536 // MSA control register names
6537 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6538 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006539 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006540 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006541 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006542 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006543 bool validateAsmConstraint(const char *&Name,
6544 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006545 switch (*Name) {
6546 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006547 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006548 case 'r': // CPU registers.
6549 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006550 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006551 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006552 case 'c': // $25 for indirect jumps
6553 case 'l': // lo register
6554 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006555 Info.setAllowsRegister();
6556 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006557 case 'I': // Signed 16-bit constant
6558 case 'J': // Integer 0
6559 case 'K': // Unsigned 16-bit constant
6560 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6561 case 'M': // Constants not loadable via lui, addiu, or ori
6562 case 'N': // Constant -1 to -65535
6563 case 'O': // A signed 15-bit constant
6564 case 'P': // A constant between 1 go 65535
6565 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006566 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006567 Info.setAllowsMemory();
6568 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006569 case 'Z':
6570 if (Name[1] == 'C') { // An address usable by ll, and sc.
6571 Info.setAllowsMemory();
6572 Name++; // Skip over 'Z'.
6573 return true;
6574 }
6575 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006576 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006577 }
6578
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006579 std::string convertConstraint(const char *&Constraint) const override {
6580 std::string R;
6581 switch (*Constraint) {
6582 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6583 if (Constraint[1] == 'C') {
6584 R = std::string("^") + std::string(Constraint, 2);
6585 Constraint++;
6586 return R;
6587 }
6588 break;
6589 }
6590 return TargetInfo::convertConstraint(Constraint);
6591 }
6592
Craig Topper3164f332014-03-11 03:39:26 +00006593 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006594 // In GCC, $1 is not widely used in generated code (it's used only in a few
6595 // specific situations), so there is no real need for users to add it to
6596 // the clobbers list if they want to use it in their inline assembly code.
6597 //
6598 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6599 // code generation, so using it in inline assembly without adding it to the
6600 // clobbers list can cause conflicts between the inline assembly code and
6601 // the surrounding generated code.
6602 //
6603 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6604 // operands, which will conflict with the ".set at" assembler option (which
6605 // we use only for inline assembly, in order to maintain compatibility with
6606 // GCC) and will also conflict with the user's usage of $1.
6607 //
6608 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6609 // register for generated code is to automatically clobber $1 for all inline
6610 // assembly code.
6611 //
6612 // FIXME: We should automatically clobber $1 only for inline assembly code
6613 // which actually uses it. This would allow LLVM to use $1 for inline
6614 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006615 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006616 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006617
Craig Topper3164f332014-03-11 03:39:26 +00006618 bool handleTargetFeatures(std::vector<std::string> &Features,
6619 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006620 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006621 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006622 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006623 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006624 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006625 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006626 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006627
Eric Christopher610fe112015-08-26 08:21:55 +00006628 for (const auto &Feature : Features) {
6629 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006630 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006631 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006632 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006633 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006634 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006635 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006636 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006637 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006638 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006639 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006640 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006641 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006642 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006643 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006644 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006645 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006646 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006647 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006648 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006649 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006650 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006651 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006652
Eric Christopher964a5f32015-08-05 23:48:05 +00006653 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006654
Rafael Espindolaeb265472013-08-21 21:59:03 +00006655 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006656 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006657
Craig Topper3164f332014-03-11 03:39:26 +00006658 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006659 if (RegNo == 0) return 4;
6660 if (RegNo == 1) return 5;
6661 return -1;
6662 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006663
6664 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006665};
6666
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006667const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006668#define BUILTIN(ID, TYPE, ATTRS) \
6669 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6670#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6671 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006672#include "clang/Basic/BuiltinsMips.def"
6673};
6674
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006675class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006676public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006677 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006678 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006679 SizeType = UnsignedInt;
6680 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006681 Int64Type = SignedLongLong;
6682 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006683 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006684 }
Craig Topper3164f332014-03-11 03:39:26 +00006685 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006686 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006687 ABI = Name;
6688 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006689 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006690 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006691 }
Craig Topper3164f332014-03-11 03:39:26 +00006692 void getTargetDefines(const LangOptions &Opts,
6693 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006694 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006695
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006696 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006697 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6698
6699 const std::string& CPUStr = getCPU();
6700 if (CPUStr == "mips32")
6701 Builder.defineMacro("__mips_isa_rev", "1");
6702 else if (CPUStr == "mips32r2")
6703 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006704 else if (CPUStr == "mips32r3")
6705 Builder.defineMacro("__mips_isa_rev", "3");
6706 else if (CPUStr == "mips32r5")
6707 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006708 else if (CPUStr == "mips32r6")
6709 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006710
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006711 if (ABI == "o32") {
6712 Builder.defineMacro("__mips_o32");
6713 Builder.defineMacro("_ABIO32", "1");
6714 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6715 }
6716 else if (ABI == "eabi")
6717 Builder.defineMacro("__mips_eabi");
6718 else
David Blaikie83d382b2011-09-23 05:06:16 +00006719 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006720 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006721 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006722 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6723 { { "at" }, "$1" },
6724 { { "v0" }, "$2" },
6725 { { "v1" }, "$3" },
6726 { { "a0" }, "$4" },
6727 { { "a1" }, "$5" },
6728 { { "a2" }, "$6" },
6729 { { "a3" }, "$7" },
6730 { { "t0" }, "$8" },
6731 { { "t1" }, "$9" },
6732 { { "t2" }, "$10" },
6733 { { "t3" }, "$11" },
6734 { { "t4" }, "$12" },
6735 { { "t5" }, "$13" },
6736 { { "t6" }, "$14" },
6737 { { "t7" }, "$15" },
6738 { { "s0" }, "$16" },
6739 { { "s1" }, "$17" },
6740 { { "s2" }, "$18" },
6741 { { "s3" }, "$19" },
6742 { { "s4" }, "$20" },
6743 { { "s5" }, "$21" },
6744 { { "s6" }, "$22" },
6745 { { "s7" }, "$23" },
6746 { { "t8" }, "$24" },
6747 { { "t9" }, "$25" },
6748 { { "k0" }, "$26" },
6749 { { "k1" }, "$27" },
6750 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006751 { { "sp","$sp" }, "$29" },
6752 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006753 { { "ra" }, "$31" }
6754 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006755 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006756 }
6757};
6758
6759class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006760 void setDataLayoutString() override {
6761 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006762 }
6763
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006764public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 Mips32EBTargetInfo(const llvm::Triple &Triple)
6766 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006767 }
Craig Topper3164f332014-03-11 03:39:26 +00006768 void getTargetDefines(const LangOptions &Opts,
6769 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006770 DefineStd(Builder, "MIPSEB", Opts);
6771 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006772 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006773 }
6774};
6775
6776class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006777 void setDataLayoutString() override {
6778 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006779 }
6780
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006781public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006782 Mips32ELTargetInfo(const llvm::Triple &Triple)
6783 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006784 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006785 }
Craig Topper3164f332014-03-11 03:39:26 +00006786 void getTargetDefines(const LangOptions &Opts,
6787 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006788 DefineStd(Builder, "MIPSEL", Opts);
6789 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006790 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006791 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006792};
Akira Hatanakabef17452011-09-20 19:21:49 +00006793
6794class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006795public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006797 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006798 LongDoubleWidth = LongDoubleAlign = 128;
6799 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006800 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6801 LongDoubleWidth = LongDoubleAlign = 64;
6802 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6803 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006804 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006805 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006806 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006807 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006808
6809 void setN64ABITypes() {
6810 LongWidth = LongAlign = 64;
6811 PointerWidth = PointerAlign = 64;
6812 SizeType = UnsignedLong;
6813 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006814 Int64Type = SignedLong;
6815 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006816 }
6817
6818 void setN32ABITypes() {
6819 LongWidth = LongAlign = 32;
6820 PointerWidth = PointerAlign = 32;
6821 SizeType = UnsignedInt;
6822 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006823 Int64Type = SignedLongLong;
6824 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006825 }
6826
Craig Topper3164f332014-03-11 03:39:26 +00006827 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006828 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006829 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006830 ABI = Name;
6831 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006832 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006833 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006834 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006835 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006836 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006837 }
6838 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006839 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006840
Craig Topper3164f332014-03-11 03:39:26 +00006841 void getTargetDefines(const LangOptions &Opts,
6842 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006843 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006844
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006845 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006846 Builder.defineMacro("__mips64");
6847 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006848 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6849
6850 const std::string& CPUStr = getCPU();
6851 if (CPUStr == "mips64")
6852 Builder.defineMacro("__mips_isa_rev", "1");
6853 else if (CPUStr == "mips64r2")
6854 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006855 else if (CPUStr == "mips64r3")
6856 Builder.defineMacro("__mips_isa_rev", "3");
6857 else if (CPUStr == "mips64r5")
6858 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006859 else if (CPUStr == "mips64r6")
6860 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006861
Akira Hatanakabef17452011-09-20 19:21:49 +00006862 if (ABI == "n32") {
6863 Builder.defineMacro("__mips_n32");
6864 Builder.defineMacro("_ABIN32", "2");
6865 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6866 }
6867 else if (ABI == "n64") {
6868 Builder.defineMacro("__mips_n64");
6869 Builder.defineMacro("_ABI64", "3");
6870 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6871 }
6872 else
David Blaikie83d382b2011-09-23 05:06:16 +00006873 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006874 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006875 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006876 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6877 { { "at" }, "$1" },
6878 { { "v0" }, "$2" },
6879 { { "v1" }, "$3" },
6880 { { "a0" }, "$4" },
6881 { { "a1" }, "$5" },
6882 { { "a2" }, "$6" },
6883 { { "a3" }, "$7" },
6884 { { "a4" }, "$8" },
6885 { { "a5" }, "$9" },
6886 { { "a6" }, "$10" },
6887 { { "a7" }, "$11" },
6888 { { "t0" }, "$12" },
6889 { { "t1" }, "$13" },
6890 { { "t2" }, "$14" },
6891 { { "t3" }, "$15" },
6892 { { "s0" }, "$16" },
6893 { { "s1" }, "$17" },
6894 { { "s2" }, "$18" },
6895 { { "s3" }, "$19" },
6896 { { "s4" }, "$20" },
6897 { { "s5" }, "$21" },
6898 { { "s6" }, "$22" },
6899 { { "s7" }, "$23" },
6900 { { "t8" }, "$24" },
6901 { { "t9" }, "$25" },
6902 { { "k0" }, "$26" },
6903 { { "k1" }, "$27" },
6904 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006905 { { "sp","$sp" }, "$29" },
6906 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006907 { { "ra" }, "$31" }
6908 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006909 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00006910 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006911
6912 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006913};
6914
6915class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006916 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006917 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006918 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 +00006919 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006920 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006921
Akira Hatanakabef17452011-09-20 19:21:49 +00006922 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006923
Akira Hatanakabef17452011-09-20 19:21:49 +00006924public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006925 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006926 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006927 void getTargetDefines(const LangOptions &Opts,
6928 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006929 DefineStd(Builder, "MIPSEB", Opts);
6930 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006931 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006932 }
6933};
6934
6935class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006936 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006937 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006938 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 +00006939 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006940 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006941 }
6942public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006943 Mips64ELTargetInfo(const llvm::Triple &Triple)
6944 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006945 // Default ABI is n64.
6946 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006947 }
Craig Topper3164f332014-03-11 03:39:26 +00006948 void getTargetDefines(const LangOptions &Opts,
6949 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006950 DefineStd(Builder, "MIPSEL", Opts);
6951 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006952 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006953 }
6954};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006955
Ivan Krasindd7403e2011-08-24 20:22:22 +00006956class PNaClTargetInfo : public TargetInfo {
6957public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006958 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006959 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006960 this->UserLabelPrefix = "";
6961 this->LongAlign = 32;
6962 this->LongWidth = 32;
6963 this->PointerAlign = 32;
6964 this->PointerWidth = 32;
6965 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006966 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006967 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006968 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006969 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006970 this->SizeType = TargetInfo::UnsignedInt;
6971 this->PtrDiffType = TargetInfo::SignedInt;
6972 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006973 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006974 }
6975
Craig Toppere6f17d02014-03-11 04:07:52 +00006976 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006977 Builder.defineMacro("__le32__");
6978 Builder.defineMacro("__pnacl__");
6979 }
Craig Topper3164f332014-03-11 03:39:26 +00006980 void getTargetDefines(const LangOptions &Opts,
6981 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006982 getArchDefines(Opts, Builder);
6983 }
Craig Topper3164f332014-03-11 03:39:26 +00006984 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006985 return Feature == "pnacl";
6986 }
Craig Topper6c03a542015-10-19 04:51:35 +00006987 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00006988 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006989 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006990 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006991 ArrayRef<const char *> getGCCRegNames() const override;
6992 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006993 bool validateAsmConstraint(const char *&Name,
6994 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006995 return false;
6996 }
6997
Craig Topper3164f332014-03-11 03:39:26 +00006998 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006999 return "";
7000 }
7001};
7002
Craig Topperf054e3a2015-10-19 03:52:27 +00007003ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7004 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007005}
7006
Craig Topperf054e3a2015-10-19 03:52:27 +00007007ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7008 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007009}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007010
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007011// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7012class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7013public:
7014 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007015 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007016 }
7017
7018 BuiltinVaListKind getBuiltinVaListKind() const override {
7019 return TargetInfo::PNaClABIBuiltinVaList;
7020 }
7021};
7022
JF Bastien643817d2014-09-12 17:52:47 +00007023class Le64TargetInfo : public TargetInfo {
7024 static const Builtin::Info BuiltinInfo[];
7025
7026public:
7027 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7028 BigEndian = false;
7029 NoAsmVariants = true;
7030 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7031 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00007032 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00007033 }
7034
7035 void getTargetDefines(const LangOptions &Opts,
7036 MacroBuilder &Builder) const override {
7037 DefineStd(Builder, "unix", Opts);
7038 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7039 Builder.defineMacro("__ELF__");
7040 }
Craig Topper6c03a542015-10-19 04:51:35 +00007041 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7042 return llvm::makeArrayRef(BuiltinInfo,
7043 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007044 }
7045 BuiltinVaListKind getBuiltinVaListKind() const override {
7046 return TargetInfo::PNaClABIBuiltinVaList;
7047 }
7048 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007049 ArrayRef<const char *> getGCCRegNames() const override {
7050 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007051 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007052 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7053 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007054 }
7055 bool validateAsmConstraint(const char *&Name,
7056 TargetInfo::ConstraintInfo &Info) const override {
7057 return false;
7058 }
7059
7060 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007061};
Dan Gohmanc2853072015-09-03 22:51:53 +00007062
7063class WebAssemblyTargetInfo : public TargetInfo {
7064 static const Builtin::Info BuiltinInfo[];
7065
7066 enum SIMDEnum {
7067 NoSIMD,
7068 SIMD128,
7069 } SIMDLevel;
7070
7071public:
7072 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7073 : TargetInfo(T), SIMDLevel(NoSIMD) {
7074 BigEndian = false;
7075 NoAsmVariants = true;
7076 SuitableAlign = 128;
7077 LargeArrayMinWidth = 128;
7078 LargeArrayAlign = 128;
7079 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007080 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007081 LongDoubleWidth = LongDoubleAlign = 128;
7082 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007083 }
7084
7085protected:
7086 void getTargetDefines(const LangOptions &Opts,
7087 MacroBuilder &Builder) const override {
7088 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7089 if (SIMDLevel >= SIMD128)
7090 Builder.defineMacro("__wasm_simd128__");
7091 }
7092
7093private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007094 bool
7095 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7096 StringRef CPU,
7097 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007098 if (CPU == "bleeding-edge")
7099 Features["simd128"] = true;
7100 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7101 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007102 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007103 return llvm::StringSwitch<bool>(Feature)
7104 .Case("simd128", SIMDLevel >= SIMD128)
7105 .Default(false);
7106 }
7107 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007108 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007109 for (const auto &Feature : Features) {
7110 if (Feature == "+simd128") {
7111 SIMDLevel = std::max(SIMDLevel, SIMD128);
7112 continue;
7113 }
7114 if (Feature == "-simd128") {
7115 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7116 continue;
7117 }
7118
7119 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7120 << "-target-feature";
7121 return false;
7122 }
7123 return true;
7124 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007125 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007126 return llvm::StringSwitch<bool>(Name)
7127 .Case("mvp", true)
7128 .Case("bleeding-edge", true)
7129 .Case("generic", true)
7130 .Default(false);
7131 }
Craig Topper6c03a542015-10-19 04:51:35 +00007132 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7133 return llvm::makeArrayRef(BuiltinInfo,
7134 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007135 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007136 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007137 // TODO: Implement va_list properly.
7138 return VoidPtrBuiltinVaList;
7139 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007140 ArrayRef<const char *> getGCCRegNames() const final {
7141 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007142 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007143 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7144 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007145 }
7146 bool
7147 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007148 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007149 return false;
7150 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007151 const char *getClobbers() const final { return ""; }
7152 bool isCLZForZeroUndef() const final { return false; }
7153 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007154 IntType getIntTypeByWidth(unsigned BitWidth,
7155 bool IsSigned) const final {
7156 // WebAssembly prefers long long for explicitly 64-bit integers.
7157 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7158 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7159 }
7160 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7161 bool IsSigned) const final {
7162 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7163 return BitWidth == 64
7164 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7165 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7166 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007167};
7168
7169const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7170#define BUILTIN(ID, TYPE, ATTRS) \
7171 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7172#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7173 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7174#include "clang/Basic/BuiltinsWebAssembly.def"
7175};
7176
7177class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7178public:
7179 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7180 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007181 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007182 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7183 }
7184
7185protected:
7186 void getTargetDefines(const LangOptions &Opts,
7187 MacroBuilder &Builder) const override {
7188 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7189 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7190 }
7191};
7192
7193class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7194public:
7195 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7196 : WebAssemblyTargetInfo(T) {
7197 LongAlign = LongWidth = 64;
7198 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007199 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007200 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7201 }
7202
7203protected:
7204 void getTargetDefines(const LangOptions &Opts,
7205 MacroBuilder &Builder) const override {
7206 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7207 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7208 }
7209};
7210
JF Bastien643817d2014-09-12 17:52:47 +00007211const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7212#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007213 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007214#include "clang/Basic/BuiltinsLe64.def"
7215};
7216
Eric Christopherc48497a2015-09-18 21:26:24 +00007217static const unsigned SPIRAddrSpaceMap[] = {
7218 1, // opencl_global
7219 3, // opencl_local
7220 2, // opencl_constant
7221 4, // opencl_generic
7222 0, // cuda_device
7223 0, // cuda_constant
7224 0 // cuda_shared
7225};
7226class SPIRTargetInfo : public TargetInfo {
7227public:
7228 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7229 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7230 "SPIR target must use unknown OS");
7231 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7232 "SPIR target must use unknown environment type");
7233 BigEndian = false;
7234 TLSSupported = false;
7235 LongWidth = LongAlign = 64;
7236 AddrSpaceMap = &SPIRAddrSpaceMap;
7237 UseAddrSpaceMapMangling = true;
7238 // Define available target features
7239 // These must be defined in sorted order!
7240 NoAsmVariants = true;
7241 }
7242 void getTargetDefines(const LangOptions &Opts,
7243 MacroBuilder &Builder) const override {
7244 DefineStd(Builder, "SPIR", Opts);
7245 }
7246 bool hasFeature(StringRef Feature) const override {
7247 return Feature == "spir";
7248 }
Craig Topper3164f332014-03-11 03:39:26 +00007249
Craig Topper6c03a542015-10-19 04:51:35 +00007250 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007251 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007252 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007253 bool validateAsmConstraint(const char *&Name,
7254 TargetInfo::ConstraintInfo &info) const override {
7255 return true;
7256 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007257 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7258 return None;
7259 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007260 BuiltinVaListKind getBuiltinVaListKind() const override {
7261 return TargetInfo::VoidPtrBuiltinVaList;
7262 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007263
Eric Christopherc48497a2015-09-18 21:26:24 +00007264 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7265 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7266 : CCCR_Warning;
7267 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007268
Eric Christopherc48497a2015-09-18 21:26:24 +00007269 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7270 return CC_SpirFunction;
7271 }
7272};
Guy Benyeib798fc92012-12-11 21:38:14 +00007273
Eric Christopherc48497a2015-09-18 21:26:24 +00007274class SPIR32TargetInfo : public SPIRTargetInfo {
7275public:
7276 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7277 PointerWidth = PointerAlign = 32;
7278 SizeType = TargetInfo::UnsignedInt;
7279 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7280 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7281 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7282 }
7283 void getTargetDefines(const LangOptions &Opts,
7284 MacroBuilder &Builder) const override {
7285 DefineStd(Builder, "SPIR32", Opts);
7286 }
7287};
Guy Benyeib798fc92012-12-11 21:38:14 +00007288
Eric Christopherc48497a2015-09-18 21:26:24 +00007289class SPIR64TargetInfo : public SPIRTargetInfo {
7290public:
7291 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7292 PointerWidth = PointerAlign = 64;
7293 SizeType = TargetInfo::UnsignedLong;
7294 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7295 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7296 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7297 }
7298 void getTargetDefines(const LangOptions &Opts,
7299 MacroBuilder &Builder) const override {
7300 DefineStd(Builder, "SPIR64", Opts);
7301 }
7302};
Guy Benyeib798fc92012-12-11 21:38:14 +00007303
Robert Lytton0e076492013-08-13 09:43:10 +00007304class XCoreTargetInfo : public TargetInfo {
7305 static const Builtin::Info BuiltinInfo[];
7306public:
7307 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7308 BigEndian = false;
7309 NoAsmVariants = true;
7310 LongLongAlign = 32;
7311 SuitableAlign = 32;
7312 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007313 SizeType = UnsignedInt;
7314 PtrDiffType = SignedInt;
7315 IntPtrType = SignedInt;
7316 WCharType = UnsignedChar;
7317 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007318 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007319 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7320 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007321 }
Craig Topper3164f332014-03-11 03:39:26 +00007322 void getTargetDefines(const LangOptions &Opts,
7323 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007324 Builder.defineMacro("__XS1B__");
7325 }
Craig Topper6c03a542015-10-19 04:51:35 +00007326 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7327 return llvm::makeArrayRef(BuiltinInfo,
7328 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007329 }
Craig Topper3164f332014-03-11 03:39:26 +00007330 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007331 return TargetInfo::VoidPtrBuiltinVaList;
7332 }
Craig Topper3164f332014-03-11 03:39:26 +00007333 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007334 return "";
7335 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007336 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007337 static const char * const GCCRegNames[] = {
7338 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7339 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7340 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007341 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007342 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007343 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7344 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007345 }
Craig Topper3164f332014-03-11 03:39:26 +00007346 bool validateAsmConstraint(const char *&Name,
7347 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007348 return false;
7349 }
Craig Topper3164f332014-03-11 03:39:26 +00007350 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007351 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7352 return (RegNo < 2)? RegNo : -1;
7353 }
Robert Lytton0e076492013-08-13 09:43:10 +00007354};
7355
7356const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007357#define BUILTIN(ID, TYPE, ATTRS) \
7358 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7359#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7360 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007361#include "clang/Basic/BuiltinsXCore.def"
7362};
Robert Lytton0e076492013-08-13 09:43:10 +00007363
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007364// x86_32 Android target
7365class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7366public:
7367 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7368 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7369 SuitableAlign = 32;
7370 LongDoubleWidth = 64;
7371 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7372 }
7373};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007374
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007375// x86_64 Android target
7376class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7377public:
7378 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7379 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7380 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7381 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007382
7383 bool useFloat128ManglingForLongDouble() const override {
7384 return true;
7385 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007386};
7387} // end anonymous namespace
7388
Chris Lattner5ba61f02006-10-14 07:39:34 +00007389//===----------------------------------------------------------------------===//
7390// Driver code
7391//===----------------------------------------------------------------------===//
7392
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007393static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007394 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007395
Daniel Dunbar52322032009-08-18 05:47:58 +00007396 switch (Triple.getArch()) {
7397 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007398 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007399
Tim Northover2a0783d2014-05-30 14:14:07 +00007400 case llvm::Triple::xcore:
7401 return new XCoreTargetInfo(Triple);
7402
7403 case llvm::Triple::hexagon:
7404 return new HexagonTargetInfo(Triple);
7405
7406 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007407 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007408 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007409
7410 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007411 case llvm::Triple::CloudABI:
7412 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007413 case llvm::Triple::FreeBSD:
7414 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007415 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007416 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007417 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007418 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007419 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007420 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007421 }
7422
Christian Pirker9b019ae2014-02-25 13:51:00 +00007423 case llvm::Triple::aarch64_be:
7424 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007425 case llvm::Triple::FreeBSD:
7426 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007427 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007428 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007429 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007430 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007431 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007432 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007433 }
7434
Daniel Dunbar52322032009-08-18 05:47:58 +00007435 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007436 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007437 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007438 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007439
Daniel Dunbar52322032009-08-18 05:47:58 +00007440 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007441 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007442 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007443 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007444 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007445 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007446 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007447 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007448 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007449 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007450 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007451 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007452 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007453 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007454 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007455 case llvm::Triple::Win32:
7456 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007457 case llvm::Triple::Cygnus:
7458 return new CygwinARMTargetInfo(Triple);
7459 case llvm::Triple::GNU:
7460 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007461 case llvm::Triple::Itanium:
7462 return new ItaniumWindowsARMleTargetInfo(Triple);
7463 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007464 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007465 return new MicrosoftARMleTargetInfo(Triple);
7466 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007467 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007468 return new ARMleTargetInfo(Triple);
7469 }
7470
7471 case llvm::Triple::armeb:
7472 case llvm::Triple::thumbeb:
7473 if (Triple.isOSDarwin())
7474 return new DarwinARMTargetInfo(Triple);
7475
7476 switch (os) {
7477 case llvm::Triple::Linux:
7478 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7479 case llvm::Triple::FreeBSD:
7480 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7481 case llvm::Triple::NetBSD:
7482 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7483 case llvm::Triple::OpenBSD:
7484 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7485 case llvm::Triple::Bitrig:
7486 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7487 case llvm::Triple::RTEMS:
7488 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7489 case llvm::Triple::NaCl:
7490 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7491 default:
7492 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007493 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007494
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007495 case llvm::Triple::bpfeb:
7496 case llvm::Triple::bpfel:
7497 return new BPFTargetInfo(Triple);
7498
Daniel Dunbar52322032009-08-18 05:47:58 +00007499 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007500 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007501
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007502 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007503 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007504 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007505 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007506 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007507 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007508 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007509 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007510 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007511 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007512 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007513 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007514 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007515
7516 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007517 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007518 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007519 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007520 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007521 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007522 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007523 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007524 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007525 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007526 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007527 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007528 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007529 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007530 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007531
Akira Hatanakabef17452011-09-20 19:21:49 +00007532 case llvm::Triple::mips64:
7533 switch (os) {
7534 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007535 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007536 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007537 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007538 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007539 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007540 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007541 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007542 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007543 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007544 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007545 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007546 }
7547
7548 case llvm::Triple::mips64el:
7549 switch (os) {
7550 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007551 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007552 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007553 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007554 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007555 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007556 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007557 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007558 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007559 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007560 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007561 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007562 }
7563
Ivan Krasindd7403e2011-08-24 20:22:22 +00007564 case llvm::Triple::le32:
7565 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007566 case llvm::Triple::NaCl:
7567 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7568 default:
7569 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007570 }
7571
JF Bastien643817d2014-09-12 17:52:47 +00007572 case llvm::Triple::le64:
7573 return new Le64TargetInfo(Triple);
7574
Daniel Dunbar52322032009-08-18 05:47:58 +00007575 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007576 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007578 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007579 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007580 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007581 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007582 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007583 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007584 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007585 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007586 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007587 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007588 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007589 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007590 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007591 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007592
7593 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007594 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007595 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007596 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007597 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007598 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007599 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007600 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007601 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007602 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007603 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007604 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007605 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007606 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007607 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007608
Bill Schmidt778d3872013-07-26 01:36:11 +00007609 case llvm::Triple::ppc64le:
7610 switch (os) {
7611 case llvm::Triple::Linux:
7612 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007613 case llvm::Triple::NetBSD:
7614 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007615 default:
7616 return new PPC64TargetInfo(Triple);
7617 }
7618
Peter Collingbournec947aae2012-05-20 23:28:41 +00007619 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007620 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007621 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007622 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007623
Tom Stellardd8e38a32015-01-06 20:34:47 +00007624 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007625 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007626 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007627
Daniel Dunbar52322032009-08-18 05:47:58 +00007628 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007629 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007630 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007631 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007632 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007633 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007634 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007635 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007636 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007637 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007638 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007639 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007640 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007641 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007642 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007643
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007644 // The 'sparcel' architecture copies all the above cases except for Solaris.
7645 case llvm::Triple::sparcel:
7646 switch (os) {
7647 case llvm::Triple::Linux:
7648 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7649 case llvm::Triple::NetBSD:
7650 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7651 case llvm::Triple::OpenBSD:
7652 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7653 case llvm::Triple::RTEMS:
7654 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7655 default:
7656 return new SparcV8elTargetInfo(Triple);
7657 }
7658
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007659 case llvm::Triple::sparcv9:
7660 switch (os) {
7661 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007662 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007663 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007664 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007665 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007666 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007667 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007668 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007669 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007670 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007671 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007672 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007673 }
7674
Ulrich Weigand47445072013-05-06 16:26:41 +00007675 case llvm::Triple::systemz:
7676 switch (os) {
7677 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007678 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007679 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007680 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007681 }
7682
Eli Friedmana9c3d712009-08-19 20:47:07 +00007683 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007684 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007685
Daniel Dunbar52322032009-08-18 05:47:58 +00007686 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007687 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007688 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007689
Daniel Dunbar52322032009-08-18 05:47:58 +00007690 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007691 case llvm::Triple::CloudABI:
7692 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007693 case llvm::Triple::Linux: {
7694 switch (Triple.getEnvironment()) {
7695 default:
7696 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7697 case llvm::Triple::Android:
7698 return new AndroidX86_32TargetInfo(Triple);
7699 }
7700 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007701 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007702 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007703 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007704 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007705 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007706 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007707 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007708 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007709 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007710 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007711 case llvm::Triple::KFreeBSD:
7712 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007713 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007714 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007715 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007716 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007717 case llvm::Triple::Win32: {
7718 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007719 case llvm::Triple::Cygnus:
7720 return new CygwinX86_32TargetInfo(Triple);
7721 case llvm::Triple::GNU:
7722 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007723 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007724 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007725 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007726 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007727 }
7728 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007729 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007730 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007731 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007732 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007733 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007734 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007735 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007736 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007737 }
7738
7739 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007740 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007741 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007742
Daniel Dunbar52322032009-08-18 05:47:58 +00007743 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007744 case llvm::Triple::CloudABI:
7745 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007746 case llvm::Triple::Linux: {
7747 switch (Triple.getEnvironment()) {
7748 default:
7749 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7750 case llvm::Triple::Android:
7751 return new AndroidX86_64TargetInfo(Triple);
7752 }
7753 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007754 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007755 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007756 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007757 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007758 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007759 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007760 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007761 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007762 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007763 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007764 case llvm::Triple::KFreeBSD:
7765 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007766 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007767 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007768 case llvm::Triple::Win32: {
7769 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007770 case llvm::Triple::Cygnus:
7771 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007772 case llvm::Triple::GNU:
7773 return new MinGWX86_64TargetInfo(Triple);
7774 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007775 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007776 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007777 }
7778 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007779 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007780 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007781 case llvm::Triple::PS4:
7782 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007783 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007784 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007785 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007786
Douglas Katzman78d7c542015-05-12 21:18:10 +00007787 case llvm::Triple::spir: {
7788 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7789 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7790 return nullptr;
7791 return new SPIR32TargetInfo(Triple);
7792 }
7793 case llvm::Triple::spir64: {
7794 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7795 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7796 return nullptr;
7797 return new SPIR64TargetInfo(Triple);
7798 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007799 case llvm::Triple::wasm32:
7800 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7801 return nullptr;
7802 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7803 case llvm::Triple::wasm64:
7804 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7805 return nullptr;
7806 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007807 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007808}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007809
7810/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007811/// options.
Alp Toker80758082014-07-06 05:26:44 +00007812TargetInfo *
7813TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7814 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007815 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007816
7817 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007818 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007819 if (!Target) {
7820 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007821 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007822 }
Alp Toker80758082014-07-06 05:26:44 +00007823 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007824
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007825 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007826 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7827 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007828 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007829 }
7830
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007831 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007832 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7833 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007834 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007835 }
7836
Rafael Espindolaeb265472013-08-21 21:59:03 +00007837 // Set the fp math unit.
7838 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7839 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007840 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007841 }
7842
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007843 // Compute the default target features, we need the target to handle this
7844 // because features may have dependencies on one another.
7845 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007846 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7847 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007848 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007849
7850 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007851 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007852 for (const auto &F : Features)
7853 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7854
Eric Christopher3ff21b32013-10-16 21:26:26 +00007855 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007856 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007857
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007858 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007859}