blob: 51ebd81871d83ae8cabdd35cfdddf64306b47fbc [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068//===----------------------------------------------------------------------===//
69// Defines specific to certain operating systems.
70//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000071
Torok Edwinb2b37c62009-06-30 17:10:35 +000072namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000073template<typename TgtInfo>
74class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000075protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000076 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000077 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000079 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000080 void getTargetDefines(const LangOptions &Opts,
81 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 TgtInfo::getTargetDefines(Opts, Builder);
83 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000084 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000085
86};
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Eric Christopher7d0c7252015-09-24 21:17:04 +000088// CloudABI Target
89template <typename Target>
90class CloudABITargetInfo : public OSTargetInfo<Target> {
91protected:
92 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
93 MacroBuilder &Builder) const override {
94 Builder.defineMacro("__CloudABI__");
95 Builder.defineMacro("__ELF__");
96
97 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
98 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
99 Builder.defineMacro("__STDC_UTF_16__");
100 Builder.defineMacro("__STDC_UTF_32__");
101 }
102
103public:
104 CloudABITargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000105 : OSTargetInfo<Target>(Triple) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000106};
107
Daniel Dunbard86666f2010-01-26 01:44:04 +0000108static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000109 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000110 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000111 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000112 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000115 // AddressSanitizer doesn't play well with source fortification, which is on
116 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000117 if (Opts.Sanitize.has(SanitizerKind::Address))
118 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000119
John McCall460ce582015-10-22 18:38:17 +0000120 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
121 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000124 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000125 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000126 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000127
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000128 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000129 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000130 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000131 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000132
133 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000134 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000135
Daniel Dunbarecf13562011-04-19 21:40:34 +0000136 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000138 if (Triple.isMacOSX()) {
139 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 Triple.getOSVersion(Maj, Min, Rev);
143 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000145
Sebastian Pop422377c2012-01-20 22:01:23 +0000146 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000147 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000148 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
149 if (PlatformName == "win32") {
150 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
151 return;
152 }
153
Evan Cheng31dd9a62014-01-26 23:12:43 +0000154 // Set the appropriate OS version define.
155 if (Triple.isiOS()) {
156 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
157 char Str[6];
158 Str[0] = '0' + Maj;
159 Str[1] = '0' + (Min / 10);
160 Str[2] = '0' + (Min % 10);
161 Str[3] = '0' + (Rev / 10);
162 Str[4] = '0' + (Rev % 10);
163 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000164 if (Triple.isTvOS())
165 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
166 else
167 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
168 Str);
169
170 } else if (Triple.isWatchOS()) {
171 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
172 char Str[6];
173 Str[0] = '0' + Maj;
174 Str[1] = '0' + (Min / 10);
175 Str[2] = '0' + (Min % 10);
176 Str[3] = '0' + (Rev / 10);
177 Str[4] = '0' + (Rev % 10);
178 Str[5] = '\0';
179 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000180 } else if (Triple.isMacOSX()) {
181 // Note that the Driver allows versions which aren't representable in the
182 // define (because we only get a single digit for the minor and micro
183 // revision numbers). So, we limit them to the maximum representable
184 // version.
185 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000186 char Str[7];
187 if (Maj < 10 || (Maj == 10 && Min < 10)) {
188 Str[0] = '0' + (Maj / 10);
189 Str[1] = '0' + (Maj % 10);
190 Str[2] = '0' + std::min(Min, 9U);
191 Str[3] = '0' + std::min(Rev, 9U);
192 Str[4] = '\0';
193 } else {
194 // Handle versions > 10.9.
195 Str[0] = '0' + (Maj / 10);
196 Str[1] = '0' + (Maj % 10);
197 Str[2] = '0' + (Min / 10);
198 Str[3] = '0' + (Min % 10);
199 Str[4] = '0' + (Rev / 10);
200 Str[5] = '0' + (Rev % 10);
201 Str[6] = '\0';
202 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000203 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000204 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000205
Tim Northover157d9112014-01-16 08:48:16 +0000206 // Tell users about the kernel if there is one.
207 if (Triple.isOSDarwin())
208 Builder.defineMacro("__MACH__");
209
Daniel Dunbarecf13562011-04-19 21:40:34 +0000210 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000211}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213template<typename Target>
214class DarwinTargetInfo : public OSTargetInfo<Target> {
215protected:
Craig Topper3164f332014-03-11 03:39:26 +0000216 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
217 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000218 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000219 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220 }
Mike Stump11289f42009-09-09 15:08:12 +0000221
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000223 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000224 // By default, no TLS, and we whitelist permitted architecture/OS
225 // combinations.
226 this->TLSSupported = false;
227
228 if (Triple.isMacOSX())
229 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
230 else if (Triple.isiOS()) {
231 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
232 if (Triple.getArch() == llvm::Triple::x86_64 ||
233 Triple.getArch() == llvm::Triple::aarch64)
234 this->TLSSupported = !Triple.isOSVersionLT(8);
235 else if (Triple.getArch() == llvm::Triple::x86 ||
236 Triple.getArch() == llvm::Triple::arm ||
237 Triple.getArch() == llvm::Triple::thumb)
238 this->TLSSupported = !Triple.isOSVersionLT(9);
239 } else if (Triple.isWatchOS())
240 this->TLSSupported = !Triple.isOSVersionLT(2);
241
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000242 this->MCountName = "\01mcount";
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244
Craig Topper3164f332014-03-11 03:39:26 +0000245 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000246 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000247 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000248 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000249 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000250 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000251 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000255 // FIXME: We should return 0 when building kexts.
256 return "__TEXT,__StaticInit,regular,pure_instructions";
257 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000258
John McCalleed64c72012-01-29 01:20:30 +0000259 /// Darwin does not support protected visibility. Darwin's "default"
260 /// is very similar to ELF's "protected"; Darwin requires a "weak"
261 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000262 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000263 return false;
264 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000265
266 unsigned getExnObjectAlignment() const override {
267 // The alignment of an exception object is 8-bytes for darwin since
268 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
269 // and therefore doesn't guarantee 16-byte alignment.
270 return 64;
271 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272};
273
Chris Lattner30ba6742009-08-10 19:03:04 +0000274
Torok Edwinb2b37c62009-06-30 17:10:35 +0000275// DragonFlyBSD Target
276template<typename Target>
277class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
278protected:
Craig Topper3164f332014-03-11 03:39:26 +0000279 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
280 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000282 Builder.defineMacro("__DragonFly__");
283 Builder.defineMacro("__DragonFly_cc_version", "100001");
284 Builder.defineMacro("__ELF__");
285 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
286 Builder.defineMacro("__tune_i386__");
287 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000288 }
289public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000290 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
291 : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000292 switch (Triple.getArch()) {
293 default:
294 case llvm::Triple::x86:
295 case llvm::Triple::x86_64:
296 this->MCountName = ".mcount";
297 break;
298 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000299 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000300};
301
302// FreeBSD Target
303template<typename Target>
304class FreeBSDTargetInfo : public OSTargetInfo<Target> {
305protected:
Craig Topper3164f332014-03-11 03:39:26 +0000306 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
307 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000308 // FreeBSD defines; list based off of gcc output
309
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000310 unsigned Release = Triple.getOSMajorVersion();
311 if (Release == 0U)
312 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000313
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000314 Builder.defineMacro("__FreeBSD__", Twine(Release));
315 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000316 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
317 DefineStd(Builder, "unix", Opts);
318 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000319
320 // On FreeBSD, wchar_t contains the number of the code point as
321 // used by the character set of the locale. These character sets are
322 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000323 //
324 // FIXME: This is wrong; the macro refers to the numerical values
325 // of wchar_t *literals*, which are not locale-dependent. However,
326 // FreeBSD systems apparently depend on us getting this wrong, and
327 // setting this to 1 is conforming even if all the basic source
328 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000329 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000330 }
331public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000332 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000333 switch (Triple.getArch()) {
334 default:
335 case llvm::Triple::x86:
336 case llvm::Triple::x86_64:
337 this->MCountName = ".mcount";
338 break;
339 case llvm::Triple::mips:
340 case llvm::Triple::mipsel:
341 case llvm::Triple::ppc:
342 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000343 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000344 this->MCountName = "_mcount";
345 break;
346 case llvm::Triple::arm:
347 this->MCountName = "__mcount";
348 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000349 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000350 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000351};
352
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000353// GNU/kFreeBSD Target
354template<typename Target>
355class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
356protected:
Craig Topper3164f332014-03-11 03:39:26 +0000357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000359 // GNU/kFreeBSD defines; list based off of gcc output
360
361 DefineStd(Builder, "unix", Opts);
362 Builder.defineMacro("__FreeBSD_kernel__");
363 Builder.defineMacro("__GLIBC__");
364 Builder.defineMacro("__ELF__");
365 if (Opts.POSIXThreads)
366 Builder.defineMacro("_REENTRANT");
367 if (Opts.CPlusPlus)
368 Builder.defineMacro("_GNU_SOURCE");
369 }
370public:
Eric Christopher917e9522014-11-18 22:36:15 +0000371 KFreeBSDTargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000372 : OSTargetInfo<Target>(Triple) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000373};
374
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375// Minix Target
376template<typename Target>
377class MinixTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000381 // Minix defines
382
383 Builder.defineMacro("__minix", "3");
384 Builder.defineMacro("_EM_WSIZE", "4");
385 Builder.defineMacro("_EM_PSIZE", "4");
386 Builder.defineMacro("_EM_SSIZE", "2");
387 Builder.defineMacro("_EM_LSIZE", "4");
388 Builder.defineMacro("_EM_FSIZE", "4");
389 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000390 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000391 DefineStd(Builder, "unix", Opts);
392 }
393public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000394 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000395};
396
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397// Linux target
398template<typename Target>
399class LinuxTargetInfo : public OSTargetInfo<Target> {
400protected:
Craig Topper3164f332014-03-11 03:39:26 +0000401 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
402 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000403 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000404 DefineStd(Builder, "unix", Opts);
405 DefineStd(Builder, "linux", Opts);
406 Builder.defineMacro("__gnu_linux__");
407 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000408 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000409 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000410 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000411 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000412 this->PlatformName = "android";
413 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
414 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000415 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000416 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000417 if (Opts.CPlusPlus)
418 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419 }
420public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000421 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000422 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000423
424 switch (Triple.getArch()) {
425 default:
426 break;
427 case llvm::Triple::ppc:
428 case llvm::Triple::ppc64:
429 case llvm::Triple::ppc64le:
430 this->MCountName = "_mcount";
431 break;
432 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000433 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000434
Craig Topper3164f332014-03-11 03:39:26 +0000435 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000436 return ".text.startup";
437 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438};
439
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000440// NetBSD Target
441template<typename Target>
442class NetBSDTargetInfo : public OSTargetInfo<Target> {
443protected:
Craig Topper3164f332014-03-11 03:39:26 +0000444 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
445 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000446 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000447 Builder.defineMacro("__NetBSD__");
448 Builder.defineMacro("__unix__");
449 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000450 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000451 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000452
453 switch (Triple.getArch()) {
454 default:
455 break;
456 case llvm::Triple::arm:
457 case llvm::Triple::armeb:
458 case llvm::Triple::thumb:
459 case llvm::Triple::thumbeb:
460 Builder.defineMacro("__ARM_DWARF_EH__");
461 break;
462 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000466 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000467 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000468};
469
Torok Edwinb2b37c62009-06-30 17:10:35 +0000470// OpenBSD Target
471template<typename Target>
472class OpenBSDTargetInfo : public OSTargetInfo<Target> {
473protected:
Craig Topper3164f332014-03-11 03:39:26 +0000474 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
475 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000476 // OpenBSD defines; list based off of gcc output
477
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000478 Builder.defineMacro("__OpenBSD__");
479 DefineStd(Builder, "unix", Opts);
480 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000481 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000482 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000483 }
484public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000485 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000486 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000487
Eli Friedman3715d1f2011-12-15 02:15:56 +0000488 switch (Triple.getArch()) {
489 default:
490 case llvm::Triple::x86:
491 case llvm::Triple::x86_64:
492 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000493 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000494 this->MCountName = "__mcount";
495 break;
496 case llvm::Triple::mips64:
497 case llvm::Triple::mips64el:
498 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000499 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000500 this->MCountName = "_mcount";
501 break;
502 }
503 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000504};
505
Eli Friedman9fa28852012-08-08 23:57:20 +0000506// Bitrig Target
507template<typename Target>
508class BitrigTargetInfo : public OSTargetInfo<Target> {
509protected:
Craig Topper3164f332014-03-11 03:39:26 +0000510 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
511 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000512 // Bitrig defines; list based off of gcc output
513
514 Builder.defineMacro("__Bitrig__");
515 DefineStd(Builder, "unix", Opts);
516 Builder.defineMacro("__ELF__");
517 if (Opts.POSIXThreads)
518 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000519
520 switch (Triple.getArch()) {
521 default:
522 break;
523 case llvm::Triple::arm:
524 case llvm::Triple::armeb:
525 case llvm::Triple::thumb:
526 case llvm::Triple::thumbeb:
527 Builder.defineMacro("__ARM_DWARF_EH__");
528 break;
529 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000530 }
531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000533 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000534 }
535};
536
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000537// PSP Target
538template<typename Target>
539class PSPTargetInfo : public OSTargetInfo<Target> {
540protected:
Craig Topper3164f332014-03-11 03:39:26 +0000541 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
542 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000543 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000544 Builder.defineMacro("PSP");
545 Builder.defineMacro("_PSP");
546 Builder.defineMacro("__psp__");
547 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000548 }
549public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000550 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000551};
552
John Thompsone467e192009-11-19 17:18:50 +0000553// PS3 PPU Target
554template<typename Target>
555class PS3PPUTargetInfo : public OSTargetInfo<Target> {
556protected:
Craig Topper3164f332014-03-11 03:39:26 +0000557 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
558 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000559 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000560 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000561 Builder.defineMacro("__PPU__");
562 Builder.defineMacro("__CELLOS_LV2__");
563 Builder.defineMacro("__ELF__");
564 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000565 Builder.defineMacro("_ARCH_PPC64");
566 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000567 }
568public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000569 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000570 this->LongWidth = this->LongAlign = 32;
571 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000572 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000573 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000574 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000575 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000576 }
577};
578
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000579template <typename Target>
580class PS4OSTargetInfo : public OSTargetInfo<Target> {
581protected:
582 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
583 MacroBuilder &Builder) const override {
584 Builder.defineMacro("__FreeBSD__", "9");
585 Builder.defineMacro("__FreeBSD_cc_version", "900001");
586 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
587 DefineStd(Builder, "unix", Opts);
588 Builder.defineMacro("__ELF__");
589 Builder.defineMacro("__PS4__");
590 }
591public:
592 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
593 this->WCharType = this->UnsignedShort;
594
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000595 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
596 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000597
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000598 // On PS4, do not honor explicit bit field alignment,
599 // as in "__attribute__((aligned(2))) int b : 1;".
600 this->UseExplicitBitFieldAlignment = false;
601
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000602 switch (Triple.getArch()) {
603 default:
604 case llvm::Triple::x86_64:
605 this->MCountName = ".mcount";
606 break;
607 }
608 }
609};
610
Torok Edwinb2b37c62009-06-30 17:10:35 +0000611// Solaris target
612template<typename Target>
613class SolarisTargetInfo : public OSTargetInfo<Target> {
614protected:
Craig Topper3164f332014-03-11 03:39:26 +0000615 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
616 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000617 DefineStd(Builder, "sun", Opts);
618 DefineStd(Builder, "unix", Opts);
619 Builder.defineMacro("__ELF__");
620 Builder.defineMacro("__svr4__");
621 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000622 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
623 // newer, but to 500 for everything else. feature_test.h has a check to
624 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000625 // with a new version.
626 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000627 Builder.defineMacro("_XOPEN_SOURCE", "600");
628 else
629 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000630 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000631 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000632 Builder.defineMacro("_LARGEFILE_SOURCE");
633 Builder.defineMacro("_LARGEFILE64_SOURCE");
634 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000635 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000636 }
637public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000638 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
David Chisnallb526e932012-03-28 18:04:14 +0000639 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000640 // FIXME: WIntType should be SignedLong
641 }
642};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000643
644// Windows target
645template<typename Target>
646class WindowsTargetInfo : public OSTargetInfo<Target> {
647protected:
Craig Topper3164f332014-03-11 03:39:26 +0000648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000650 Builder.defineMacro("_WIN32");
651 }
652 void getVisualStudioDefines(const LangOptions &Opts,
653 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000654 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000655 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000656 Builder.defineMacro("_CPPRTTI");
657
Reid Kleckner16514352015-01-30 21:42:55 +0000658 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000659 Builder.defineMacro("_CPPUNWIND");
660 }
661
David Majnemer6a658902015-07-22 22:36:26 +0000662 if (Opts.Bool)
663 Builder.defineMacro("__BOOL_DEFINED");
664
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000665 if (!Opts.CharIsSigned)
666 Builder.defineMacro("_CHAR_UNSIGNED");
667
668 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
669 // but it works for now.
670 if (Opts.POSIXThreads)
671 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000672
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000673 if (Opts.MSCompatibilityVersion) {
674 Builder.defineMacro("_MSC_VER",
675 Twine(Opts.MSCompatibilityVersion / 100000));
676 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000677 // FIXME We cannot encode the revision information into 32-bits
678 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000679
David Majnemerb710a932015-05-11 03:57:49 +0000680 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000681 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000682 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000683
684 if (Opts.MicrosoftExt) {
685 Builder.defineMacro("_MSC_EXTENSIONS");
686
687 if (Opts.CPlusPlus11) {
688 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
689 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
690 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
691 }
692 }
693
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000694 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000695 }
696
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000697public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000698 WindowsTargetInfo(const llvm::Triple &Triple)
699 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000700};
701
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000702template <typename Target>
703class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000704protected:
Craig Topper3164f332014-03-11 03:39:26 +0000705 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
706 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000707 if (Opts.POSIXThreads)
708 Builder.defineMacro("_REENTRANT");
709 if (Opts.CPlusPlus)
710 Builder.defineMacro("_GNU_SOURCE");
711
712 DefineStd(Builder, "unix", Opts);
713 Builder.defineMacro("__ELF__");
714 Builder.defineMacro("__native_client__");
715 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000716
717public:
718 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000719 this->LongAlign = 32;
720 this->LongWidth = 32;
721 this->PointerAlign = 32;
722 this->PointerWidth = 32;
723 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000724 this->Int64Type = TargetInfo::SignedLongLong;
725 this->DoubleAlign = 64;
726 this->LongDoubleWidth = 64;
727 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000728 this->LongLongWidth = 64;
729 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000730 this->SizeType = TargetInfo::UnsignedInt;
731 this->PtrDiffType = TargetInfo::SignedInt;
732 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000733 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000734 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000735 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000736 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000737 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000738 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000739 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000740 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000741 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000742 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000743 } else {
744 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000745 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000746 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000747 }
748};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000749
Dan Gohmanc2853072015-09-03 22:51:53 +0000750// WebAssembly target
751template <typename Target>
752class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
753 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000754 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000755 // A common platform macro.
756 if (Opts.POSIXThreads)
757 Builder.defineMacro("_REENTRANT");
758 // Follow g++ convention and predefine _GNU_SOURCE for C++.
759 if (Opts.CPlusPlus)
760 Builder.defineMacro("_GNU_SOURCE");
761 }
762
763 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000764 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000765 return ".text.__startup";
766 }
767
768public:
769 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
770 : OSTargetInfo<Target>(Triple) {
771 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000772 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
773 }
774};
Dan Gohmanc2853072015-09-03 22:51:53 +0000775
Chris Lattner09d98f52008-10-05 21:50:58 +0000776//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000777// Specific target implementations.
778//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000779
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000780// PPC abstract base class
781class PPCTargetInfo : public TargetInfo {
782 static const Builtin::Info BuiltinInfo[];
783 static const char * const GCCRegNames[];
784 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000785 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000786
787 // Target cpu features.
788 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000789 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000790 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000791 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000792 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000793 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000794 bool HasBPERMD;
795 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000796
Ulrich Weigand8afad612014-07-28 13:17:52 +0000797protected:
798 std::string ABI;
799
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000800public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000801 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000802 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000803 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000804 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000805 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000806 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000807 LongDoubleWidth = LongDoubleAlign = 128;
808 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
809 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000810
Hal Finkel6b984f02012-07-03 16:51:04 +0000811 /// \brief Flags for architecture specific defines.
812 typedef enum {
813 ArchDefineNone = 0,
814 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
815 ArchDefinePpcgr = 1 << 1,
816 ArchDefinePpcsq = 1 << 2,
817 ArchDefine440 = 1 << 3,
818 ArchDefine603 = 1 << 4,
819 ArchDefine604 = 1 << 5,
820 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000821 ArchDefinePwr5 = 1 << 7,
822 ArchDefinePwr5x = 1 << 8,
823 ArchDefinePwr6 = 1 << 9,
824 ArchDefinePwr6x = 1 << 10,
825 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000826 ArchDefinePwr8 = 1 << 12,
827 ArchDefineA2 = 1 << 13,
828 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000829 } ArchDefineTypes;
830
Bill Schmidt38378a02013-02-01 20:23:10 +0000831 // Note: GCC recognizes the following additional cpus:
832 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
833 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
834 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000835 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000836 bool CPUKnown = llvm::StringSwitch<bool>(Name)
837 .Case("generic", true)
838 .Case("440", true)
839 .Case("450", true)
840 .Case("601", true)
841 .Case("602", true)
842 .Case("603", true)
843 .Case("603e", true)
844 .Case("603ev", true)
845 .Case("604", true)
846 .Case("604e", true)
847 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000848 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000849 .Case("g3", true)
850 .Case("7400", true)
851 .Case("g4", true)
852 .Case("7450", true)
853 .Case("g4+", true)
854 .Case("750", true)
855 .Case("970", true)
856 .Case("g5", true)
857 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000858 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000859 .Case("e500mc", true)
860 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000861 .Case("power3", true)
862 .Case("pwr3", true)
863 .Case("power4", true)
864 .Case("pwr4", true)
865 .Case("power5", true)
866 .Case("pwr5", true)
867 .Case("power5x", true)
868 .Case("pwr5x", true)
869 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000870 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000871 .Case("power6x", true)
872 .Case("pwr6x", true)
873 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000874 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000875 .Case("power8", true)
876 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000877 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000878 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000879 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000880 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000881 .Case("powerpc64le", true)
882 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000883 .Default(false);
884
885 if (CPUKnown)
886 CPU = Name;
887
888 return CPUKnown;
889 }
890
Ulrich Weigand8afad612014-07-28 13:17:52 +0000891
892 StringRef getABI() const override { return ABI; }
893
Craig Topper6c03a542015-10-19 04:51:35 +0000894 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
895 return llvm::makeArrayRef(BuiltinInfo,
896 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000897 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000898
Craig Topper3164f332014-03-11 03:39:26 +0000899 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000900
Craig Topper3164f332014-03-11 03:39:26 +0000901 void getTargetDefines(const LangOptions &Opts,
902 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000903
Eric Christopher8c47b422015-10-09 18:39:55 +0000904 bool
905 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
906 StringRef CPU,
907 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000908
Craig Topper3164f332014-03-11 03:39:26 +0000909 bool handleTargetFeatures(std::vector<std::string> &Features,
910 DiagnosticsEngine &Diags) override;
911 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000912 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
913 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000914
Craig Topperf054e3a2015-10-19 03:52:27 +0000915 ArrayRef<const char *> getGCCRegNames() const override;
916 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000917 bool validateAsmConstraint(const char *&Name,
918 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000919 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000920 default: return false;
921 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000922 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000923 case 'b': // Base register
924 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000925 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000926 break;
927 // FIXME: The following are added to allow parsing.
928 // I just took a guess at what the actions should be.
929 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000930 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000931 case 'v': // Altivec vector register
932 Info.setAllowsRegister();
933 break;
934 case 'w':
935 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000936 case 'd':// VSX vector register to hold vector double data
937 case 'f':// VSX vector register to hold vector float data
938 case 's':// VSX vector register to hold scalar float data
939 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000940 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000941 break;
942 default:
943 return false;
944 }
945 Info.setAllowsRegister();
946 Name++; // Skip over 'w'.
947 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000948 case 'h': // `MQ', `CTR', or `LINK' register
949 case 'q': // `MQ' register
950 case 'c': // `CTR' register
951 case 'l': // `LINK' register
952 case 'x': // `CR' register (condition register) number 0
953 case 'y': // `CR' register (condition register)
954 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000955 Info.setAllowsRegister();
956 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000957 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // (use `L' instead for SImode constants)
960 case 'K': // Unsigned 16-bit constant
961 case 'L': // Signed 16-bit constant shifted left 16 bits
962 case 'M': // Constant larger than 31
963 case 'N': // Exact power of 2
964 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000965 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000966 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000967 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000968 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000969 break;
970 case 'm': // Memory operand. Note that on PowerPC targets, m can
971 // include addresses that update the base register. It
972 // is therefore only safe to use `m' in an asm statement
973 // if that asm statement accesses the operand exactly once.
974 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000975 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000976 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000977 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000978 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000979 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
980 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000981 // register to be updated.
982 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000983 if (Name[1] != 's')
984 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000985 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000986 // include any automodification of the base register. Unlike
987 // `m', this constraint can be used in asm statements that
988 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000989 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000990 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000991 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000992 break;
993 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'Z': // Memory operand that is an indexed or indirect from a
996 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000997 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000998 Info.setAllowsMemory();
999 Info.setAllowsRegister();
1000 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001002 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001003 // register (`p' is preferable for asm statements)
1004 case 'S': // Constant suitable as a 64-bit mask operand
1005 case 'T': // Constant suitable as a 32-bit mask operand
1006 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001007 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 // instructions
1009 case 'W': // Vector constant that does not require memory
1010 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001011 break;
1012 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001013 }
John Thompson07a61a42010-06-24 22:44:13 +00001014 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001015 }
Craig Topper3164f332014-03-11 03:39:26 +00001016 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001017 std::string R;
1018 switch (*Constraint) {
1019 case 'e':
1020 case 'w':
1021 // Two-character constraint; add "^" hint for later parsing.
1022 R = std::string("^") + std::string(Constraint, 2);
1023 Constraint++;
1024 break;
1025 default:
1026 return TargetInfo::convertConstraint(Constraint);
1027 }
1028 return R;
1029 }
Craig Topper3164f332014-03-11 03:39:26 +00001030 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001031 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001032 }
Craig Topper3164f332014-03-11 03:39:26 +00001033 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001034 if (RegNo == 0) return 3;
1035 if (RegNo == 1) return 4;
1036 return -1;
1037 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001038
1039 bool hasSjLjLowering() const override {
1040 return true;
1041 }
David Majnemer2617ea62015-06-09 18:05:33 +00001042
1043 bool useFloat128ManglingForLongDouble() const override {
1044 return LongDoubleWidth == 128 &&
1045 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1046 getTriple().isOSBinFormatELF();
1047 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001048};
Anders Carlssonf511f642007-11-27 04:11:28 +00001049
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001050const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001051#define BUILTIN(ID, TYPE, ATTRS) \
1052 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1053#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1054 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001055#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001056};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001057
Eric Christopher917e9522014-11-18 22:36:15 +00001058/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001059/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001060bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001061 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001062 for (const auto &Feature : Features) {
1063 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001064 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001065 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001066 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001067 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001068 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001069 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001070 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001071 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001072 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001073 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001074 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001075 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001076 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001077 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001078 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001079 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001080 // TODO: Finish this list and add an assert that we've handled them
1081 // all.
1082 }
Eric Christopher02c33352015-08-25 00:59:11 +00001083
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001084 return true;
1085}
1086
Chris Lattnerecd49032009-03-02 22:27:17 +00001087/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1088/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001089void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001090 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001091 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001092 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001093 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001094 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001095 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001096 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001098 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001099 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001100 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001101 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001102 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001103
Chris Lattnerecd49032009-03-02 22:27:17 +00001104 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001105 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1106 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001107 } else {
1108 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1109 getTriple().getOS() != llvm::Triple::OpenBSD)
1110 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001111 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001112
Ulrich Weigand8afad612014-07-28 13:17:52 +00001113 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001114 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001115 Builder.defineMacro("_CALL_ELF", "1");
1116 if (ABI == "elfv2")
1117 Builder.defineMacro("_CALL_ELF", "2");
1118
Chris Lattnerecd49032009-03-02 22:27:17 +00001119 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001120 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1121 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001122
Chris Lattnerecd49032009-03-02 22:27:17 +00001123 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001124 if (LongDoubleWidth == 128)
1125 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001126
John Thompsone467e192009-11-19 17:18:50 +00001127 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001128 Builder.defineMacro("__VEC__", "10206");
1129 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001130 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001131
1132 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001133 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1134 .Case("440", ArchDefineName)
1135 .Case("450", ArchDefineName | ArchDefine440)
1136 .Case("601", ArchDefineName)
1137 .Case("602", ArchDefineName | ArchDefinePpcgr)
1138 .Case("603", ArchDefineName | ArchDefinePpcgr)
1139 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1140 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1141 .Case("604", ArchDefineName | ArchDefinePpcgr)
1142 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1143 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001144 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001145 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1146 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1147 .Case("750", ArchDefineName | ArchDefinePpcgr)
1148 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1149 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001150 .Case("a2", ArchDefineA2)
1151 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001152 .Case("pwr3", ArchDefinePpcgr)
1153 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1157 | ArchDefinePpcgr | ArchDefinePpcsq)
1158 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1159 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1160 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1161 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1162 | ArchDefinePpcsq)
1163 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1164 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001165 | ArchDefinePpcgr | ArchDefinePpcsq)
1166 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1167 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1168 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001169 .Case("power3", ArchDefinePpcgr)
1170 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1171 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1174 | ArchDefinePpcgr | ArchDefinePpcsq)
1175 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1176 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1177 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1178 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1179 | ArchDefinePpcsq)
1180 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1181 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001182 | ArchDefinePpcgr | ArchDefinePpcsq)
1183 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1184 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1185 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001186 .Default(ArchDefineNone);
1187
1188 if (defs & ArchDefineName)
1189 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1190 if (defs & ArchDefinePpcgr)
1191 Builder.defineMacro("_ARCH_PPCGR");
1192 if (defs & ArchDefinePpcsq)
1193 Builder.defineMacro("_ARCH_PPCSQ");
1194 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001195 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 if (defs & ArchDefine603)
1197 Builder.defineMacro("_ARCH_603");
1198 if (defs & ArchDefine604)
1199 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001200 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001201 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001202 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001203 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001204 if (defs & ArchDefinePwr5x)
1205 Builder.defineMacro("_ARCH_PWR5X");
1206 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001207 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001208 if (defs & ArchDefinePwr6x)
1209 Builder.defineMacro("_ARCH_PWR6X");
1210 if (defs & ArchDefinePwr7)
1211 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001212 if (defs & ArchDefinePwr8)
1213 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001214 if (defs & ArchDefineA2)
1215 Builder.defineMacro("_ARCH_A2");
1216 if (defs & ArchDefineA2q) {
1217 Builder.defineMacro("_ARCH_A2Q");
1218 Builder.defineMacro("_ARCH_QP");
1219 }
1220
1221 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1222 Builder.defineMacro("__bg__");
1223 Builder.defineMacro("__THW_BLUEGENE__");
1224 Builder.defineMacro("__bgq__");
1225 Builder.defineMacro("__TOS_BGQ__");
1226 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001227
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001228 if (HasVSX)
1229 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001230 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001231 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001232 if (HasP8Crypto)
1233 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001234 if (HasHTM)
1235 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001236
1237 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1238 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1239 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1240 if (PointerWidth == 64)
1241 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001242
Bill Schmidt38378a02013-02-01 20:23:10 +00001243 // FIXME: The following are not yet generated here by Clang, but are
1244 // generated by GCC:
1245 //
1246 // _SOFT_FLOAT_
1247 // __RECIP_PRECISION__
1248 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001249 // __RECIP__
1250 // __RECIPF__
1251 // __RSQRTE__
1252 // __RSQRTEF__
1253 // _SOFT_DOUBLE_
1254 // __NO_LWSYNC__
1255 // __HAVE_BSWAP__
1256 // __LONGDOUBLE128
1257 // __CMODEL_MEDIUM__
1258 // __CMODEL_LARGE__
1259 // _CALL_SYSV
1260 // _CALL_DARWIN
1261 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001262}
1263
Eric Christophera8a14c32015-08-31 18:39:16 +00001264// Handle explicit options being passed to the compiler here: if we've
1265// explicitly turned off vsx and turned on power8-vector or direct-move then
1266// go ahead and error since the customer has expressed a somewhat incompatible
1267// set of options.
1268static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001269 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001270
1271 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1272 FeaturesVec.end()) {
1273 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1274 FeaturesVec.end()) {
1275 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1276 << "-mno-vsx";
1277 return false;
1278 }
1279
1280 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1281 FeaturesVec.end()) {
1282 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1283 << "-mno-vsx";
1284 return false;
1285 }
1286 }
1287
1288 return true;
1289}
1290
Eric Christopher8c47b422015-10-09 18:39:55 +00001291bool PPCTargetInfo::initFeatureMap(
1292 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1293 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001294 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1295 .Case("7400", true)
1296 .Case("g4", true)
1297 .Case("7450", true)
1298 .Case("g4+", true)
1299 .Case("970", true)
1300 .Case("g5", true)
1301 .Case("pwr6", true)
1302 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001303 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001304 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001305 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001306 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001307
1308 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001309 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1310 .Case("ppc64le", true)
1311 .Case("pwr8", true)
1312 .Default(false);
1313 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1314 .Case("ppc64le", true)
1315 .Case("pwr8", true)
1316 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001317 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1318 .Case("ppc64le", true)
1319 .Case("pwr8", true)
1320 .Case("pwr7", true)
1321 .Default(false);
1322 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1323 .Case("ppc64le", true)
1324 .Case("pwr8", true)
1325 .Case("pwr7", true)
1326 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001327 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1328 .Case("ppc64le", true)
1329 .Case("pwr8", true)
1330 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001331 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1332 .Case("ppc64le", true)
1333 .Case("pwr8", true)
1334 .Case("pwr7", true)
1335 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001336
Eric Christophera8a14c32015-08-31 18:39:16 +00001337 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1338 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001339
Eric Christopher007b0a02015-08-28 22:32:01 +00001340 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001341}
1342
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001343bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001344 return llvm::StringSwitch<bool>(Feature)
1345 .Case("powerpc", true)
1346 .Case("vsx", HasVSX)
1347 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001348 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001349 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001350 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001351 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001352 .Case("bpermd", HasBPERMD)
1353 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001354 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001355}
Chris Lattner17df24e2008-04-21 18:56:49 +00001356
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001357void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1358 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001359 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1360 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1361 // incompatible options.
1362 if (Enabled) {
1363 if (Name == "vsx") {
1364 Features[Name] = true;
1365 } else if (Name == "direct-move") {
1366 Features[Name] = Features["vsx"] = true;
1367 } else if (Name == "power8-vector") {
1368 Features[Name] = Features["vsx"] = true;
1369 } else {
1370 Features[Name] = true;
1371 }
1372 } else {
1373 if (Name == "vsx") {
1374 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1375 false;
1376 } else {
1377 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001378 }
1379 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001380}
1381
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001382const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001383 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1384 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1385 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1386 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1387 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1388 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1389 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1390 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001391 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001392 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001393 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001394 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1395 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1396 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1397 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001398 "vrsave", "vscr",
1399 "spe_acc", "spefscr",
1400 "sfp"
1401};
Chris Lattner10a5b382007-01-29 05:24:35 +00001402
Craig Topperf054e3a2015-10-19 03:52:27 +00001403ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1404 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001405}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001406
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001407const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1408 // While some of these aliases do map to different registers
1409 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001410 { { "0" }, "r0" },
1411 { { "1"}, "r1" },
1412 { { "2" }, "r2" },
1413 { { "3" }, "r3" },
1414 { { "4" }, "r4" },
1415 { { "5" }, "r5" },
1416 { { "6" }, "r6" },
1417 { { "7" }, "r7" },
1418 { { "8" }, "r8" },
1419 { { "9" }, "r9" },
1420 { { "10" }, "r10" },
1421 { { "11" }, "r11" },
1422 { { "12" }, "r12" },
1423 { { "13" }, "r13" },
1424 { { "14" }, "r14" },
1425 { { "15" }, "r15" },
1426 { { "16" }, "r16" },
1427 { { "17" }, "r17" },
1428 { { "18" }, "r18" },
1429 { { "19" }, "r19" },
1430 { { "20" }, "r20" },
1431 { { "21" }, "r21" },
1432 { { "22" }, "r22" },
1433 { { "23" }, "r23" },
1434 { { "24" }, "r24" },
1435 { { "25" }, "r25" },
1436 { { "26" }, "r26" },
1437 { { "27" }, "r27" },
1438 { { "28" }, "r28" },
1439 { { "29" }, "r29" },
1440 { { "30" }, "r30" },
1441 { { "31" }, "r31" },
1442 { { "fr0" }, "f0" },
1443 { { "fr1" }, "f1" },
1444 { { "fr2" }, "f2" },
1445 { { "fr3" }, "f3" },
1446 { { "fr4" }, "f4" },
1447 { { "fr5" }, "f5" },
1448 { { "fr6" }, "f6" },
1449 { { "fr7" }, "f7" },
1450 { { "fr8" }, "f8" },
1451 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001452 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001453 { { "fr11" }, "f11" },
1454 { { "fr12" }, "f12" },
1455 { { "fr13" }, "f13" },
1456 { { "fr14" }, "f14" },
1457 { { "fr15" }, "f15" },
1458 { { "fr16" }, "f16" },
1459 { { "fr17" }, "f17" },
1460 { { "fr18" }, "f18" },
1461 { { "fr19" }, "f19" },
1462 { { "fr20" }, "f20" },
1463 { { "fr21" }, "f21" },
1464 { { "fr22" }, "f22" },
1465 { { "fr23" }, "f23" },
1466 { { "fr24" }, "f24" },
1467 { { "fr25" }, "f25" },
1468 { { "fr26" }, "f26" },
1469 { { "fr27" }, "f27" },
1470 { { "fr28" }, "f28" },
1471 { { "fr29" }, "f29" },
1472 { { "fr30" }, "f30" },
1473 { { "fr31" }, "f31" },
1474 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001475};
1476
Craig Topperf054e3a2015-10-19 03:52:27 +00001477ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1478 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001479}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001480
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001481class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001483 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001484 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001485
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001486 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001487 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001488 case llvm::Triple::FreeBSD:
1489 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001490 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001491 PtrDiffType = SignedInt;
1492 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001493 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001494 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001495 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001496 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001497
Roman Divacky3ffe7462012-03-13 19:20:17 +00001498 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1499 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001500 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001501 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001502
1503 // PPC32 supports atomics up to 4 bytes.
1504 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001505 }
1506
Craig Topper3164f332014-03-11 03:39:26 +00001507 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001508 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001509 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001510 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001511};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001512
Bill Schmidt778d3872013-07-26 01:36:11 +00001513// Note: ABI differences may eventually require us to have a separate
1514// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001515class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001517 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001518 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001519 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001520 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001521
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001522 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001523 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001524 ABI = "elfv2";
1525 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001526 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001527 ABI = "elfv1";
1528 }
1529
1530 switch (getTriple().getOS()) {
1531 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001532 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001533 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001534 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001535 case llvm::Triple::NetBSD:
1536 IntMaxType = SignedLongLong;
1537 Int64Type = SignedLongLong;
1538 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001539 default:
1540 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001541 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001542
1543 // PPC64 supports atomics up to 8 bytes.
1544 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001545 }
Craig Topper3164f332014-03-11 03:39:26 +00001546 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001547 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001548 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001549 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001550 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001551 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001552 ABI = Name;
1553 return true;
1554 }
1555 return false;
1556 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001558
Roman Divacky965b0b72011-01-06 08:27:10 +00001559class DarwinPPC32TargetInfo :
1560 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001561public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001562 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1563 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001564 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001565 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001566 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001567 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001568 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001569 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001570 }
Craig Topper3164f332014-03-11 03:39:26 +00001571 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001572 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001573 }
1574};
1575
1576class DarwinPPC64TargetInfo :
1577 public DarwinTargetInfo<PPC64TargetInfo> {
1578public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001579 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1580 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001581 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001582 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001583 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001584 }
1585};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001586
Eric Christopherc48497a2015-09-18 21:26:24 +00001587static const unsigned NVPTXAddrSpaceMap[] = {
1588 1, // opencl_global
1589 3, // opencl_local
1590 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001591 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001592 0, // opencl_generic
1593 1, // cuda_device
1594 4, // cuda_constant
1595 3, // cuda_shared
1596};
1597
1598class NVPTXTargetInfo : public TargetInfo {
1599 static const char *const GCCRegNames[];
1600 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001601
1602 // The GPU profiles supported by the NVPTX backend
1603 enum GPUKind {
1604 GK_NONE,
1605 GK_SM20,
1606 GK_SM21,
1607 GK_SM30,
1608 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001609 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001610 } GPU;
1611
Eric Christopherc48497a2015-09-18 21:26:24 +00001612public:
1613 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1614 BigEndian = false;
1615 TLSSupported = false;
1616 LongWidth = LongAlign = 64;
1617 AddrSpaceMap = &NVPTXAddrSpaceMap;
1618 UseAddrSpaceMapMangling = true;
1619 // Define available target features
1620 // These must be defined in sorted order!
1621 NoAsmVariants = true;
1622 // Set the default GPU to sm20
1623 GPU = GK_SM20;
1624 }
1625 void getTargetDefines(const LangOptions &Opts,
1626 MacroBuilder &Builder) const override {
1627 Builder.defineMacro("__PTX__");
1628 Builder.defineMacro("__NVPTX__");
1629 if (Opts.CUDAIsDevice) {
1630 // Set __CUDA_ARCH__ for the GPU specified.
1631 std::string CUDAArchCode;
1632 switch (GPU) {
1633 case GK_SM20:
1634 CUDAArchCode = "200";
1635 break;
1636 case GK_SM21:
1637 CUDAArchCode = "210";
1638 break;
1639 case GK_SM30:
1640 CUDAArchCode = "300";
1641 break;
1642 case GK_SM35:
1643 CUDAArchCode = "350";
1644 break;
1645 case GK_SM37:
1646 CUDAArchCode = "370";
1647 break;
1648 default:
1649 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001650 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001651 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001652 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001653 }
Craig Topper6c03a542015-10-19 04:51:35 +00001654 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1655 return llvm::makeArrayRef(BuiltinInfo,
1656 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001657 }
1658 bool hasFeature(StringRef Feature) const override {
1659 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001660 }
1661
Craig Topperf054e3a2015-10-19 03:52:27 +00001662 ArrayRef<const char *> getGCCRegNames() const override;
1663 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001664 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001665 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001666 }
1667 bool validateAsmConstraint(const char *&Name,
1668 TargetInfo::ConstraintInfo &Info) const override {
1669 switch (*Name) {
1670 default:
1671 return false;
1672 case 'c':
1673 case 'h':
1674 case 'r':
1675 case 'l':
1676 case 'f':
1677 case 'd':
1678 Info.setAllowsRegister();
1679 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001680 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001681 }
1682 const char *getClobbers() const override {
1683 // FIXME: Is this really right?
1684 return "";
1685 }
1686 BuiltinVaListKind getBuiltinVaListKind() const override {
1687 // FIXME: implement
1688 return TargetInfo::CharPtrBuiltinVaList;
1689 }
1690 bool setCPU(const std::string &Name) override {
1691 GPU = llvm::StringSwitch<GPUKind>(Name)
1692 .Case("sm_20", GK_SM20)
1693 .Case("sm_21", GK_SM21)
1694 .Case("sm_30", GK_SM30)
1695 .Case("sm_35", GK_SM35)
1696 .Case("sm_37", GK_SM37)
1697 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001698
Eric Christopherc48497a2015-09-18 21:26:24 +00001699 return GPU != GK_NONE;
1700 }
1701};
1702
1703const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1704#define BUILTIN(ID, TYPE, ATTRS) \
1705 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1706#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1707 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1708#include "clang/Basic/BuiltinsNVPTX.def"
1709};
1710
1711const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1712
Craig Topperf054e3a2015-10-19 03:52:27 +00001713ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1714 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001715}
1716
1717class NVPTX32TargetInfo : public NVPTXTargetInfo {
1718public:
1719 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001720 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001721 PointerWidth = PointerAlign = 32;
1722 SizeType = TargetInfo::UnsignedInt;
1723 PtrDiffType = TargetInfo::SignedInt;
1724 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001725 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001726 }
1727};
1728
1729class NVPTX64TargetInfo : public NVPTXTargetInfo {
1730public:
1731 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1732 PointerWidth = PointerAlign = 64;
1733 SizeType = TargetInfo::UnsignedLong;
1734 PtrDiffType = TargetInfo::SignedLong;
1735 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001736 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001737 }
1738};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001739
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001740static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001741 1, // opencl_global
1742 3, // opencl_local
1743 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001744 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001745 1, // cuda_device
1746 2, // cuda_constant
1747 3 // cuda_shared
1748};
1749
Tom Stellarda96344b2014-08-21 13:58:40 +00001750// If you edit the description strings, make sure you update
1751// getPointerWidthV().
1752
Craig Topper273dbc62015-10-18 05:29:26 +00001753static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001754 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1755 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001756
Craig Topper273dbc62015-10-18 05:29:26 +00001757static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001758 "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 +00001759 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1760 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001761
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001762class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001763 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001764 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001765
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001766 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001767 enum GPUKind {
1768 GK_NONE,
1769 GK_R600,
1770 GK_R600_DOUBLE_OPS,
1771 GK_R700,
1772 GK_R700_DOUBLE_OPS,
1773 GK_EVERGREEN,
1774 GK_EVERGREEN_DOUBLE_OPS,
1775 GK_NORTHERN_ISLANDS,
1776 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001777 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001778 GK_SEA_ISLANDS,
1779 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001780 } GPU;
1781
Jan Veselyeebeaea2015-05-04 19:53:36 +00001782 bool hasFP64:1;
1783 bool hasFMAF:1;
1784 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001785
Eli Friedmand13b41e2012-10-12 23:32:00 +00001786public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001787 AMDGPUTargetInfo(const llvm::Triple &Triple)
1788 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001789
1790 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001791 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001792 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001793 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001794 hasFMAF = true;
1795 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001796 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001797 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001798 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001799 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001800 hasFMAF = false;
1801 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001802 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001803 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001804 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001805 }
1806
Tom Stellarda96344b2014-08-21 13:58:40 +00001807 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1808 if (GPU <= GK_CAYMAN)
1809 return 32;
1810
1811 switch(AddrSpace) {
1812 default:
1813 return 64;
1814 case 0:
1815 case 3:
1816 case 5:
1817 return 32;
1818 }
1819 }
1820
Craig Topper3164f332014-03-11 03:39:26 +00001821 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001822 return "";
1823 }
1824
Craig Topperf054e3a2015-10-19 03:52:27 +00001825 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001826
Craig Topperf054e3a2015-10-19 03:52:27 +00001827 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1828 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001829 }
1830
Craig Topper3164f332014-03-11 03:39:26 +00001831 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001832 TargetInfo::ConstraintInfo &Info) const override {
1833 switch (*Name) {
1834 default: break;
1835 case 'v': // vgpr
1836 case 's': // sgpr
1837 Info.setAllowsRegister();
1838 return true;
1839 }
1840 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001841 }
1842
Craig Topper6c03a542015-10-19 04:51:35 +00001843 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1844 return llvm::makeArrayRef(BuiltinInfo,
1845 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001846 }
1847
Craig Topper3164f332014-03-11 03:39:26 +00001848 void getTargetDefines(const LangOptions &Opts,
1849 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001850 if (getTriple().getArch() == llvm::Triple::amdgcn)
1851 Builder.defineMacro("__AMDGCN__");
1852 else
1853 Builder.defineMacro("__R600__");
1854
Jan Veselyeebeaea2015-05-04 19:53:36 +00001855 if (hasFMAF)
1856 Builder.defineMacro("__HAS_FMAF__");
1857 if (hasLDEXPF)
1858 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001859 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001860 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001861 if (Opts.OpenCL) {
1862 if (GPU >= GK_NORTHERN_ISLANDS) {
1863 Builder.defineMacro("cl_khr_byte_addressable_store");
1864 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1865 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1866 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1867 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1868 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001869 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001870 }
1871
Craig Topper3164f332014-03-11 03:39:26 +00001872 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001873 return TargetInfo::CharPtrBuiltinVaList;
1874 }
1875
Craig Topper3164f332014-03-11 03:39:26 +00001876 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001877 GPU = llvm::StringSwitch<GPUKind>(Name)
1878 .Case("r600" , GK_R600)
1879 .Case("rv610", GK_R600)
1880 .Case("rv620", GK_R600)
1881 .Case("rv630", GK_R600)
1882 .Case("rv635", GK_R600)
1883 .Case("rs780", GK_R600)
1884 .Case("rs880", GK_R600)
1885 .Case("rv670", GK_R600_DOUBLE_OPS)
1886 .Case("rv710", GK_R700)
1887 .Case("rv730", GK_R700)
1888 .Case("rv740", GK_R700_DOUBLE_OPS)
1889 .Case("rv770", GK_R700_DOUBLE_OPS)
1890 .Case("palm", GK_EVERGREEN)
1891 .Case("cedar", GK_EVERGREEN)
1892 .Case("sumo", GK_EVERGREEN)
1893 .Case("sumo2", GK_EVERGREEN)
1894 .Case("redwood", GK_EVERGREEN)
1895 .Case("juniper", GK_EVERGREEN)
1896 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1897 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1898 .Case("barts", GK_NORTHERN_ISLANDS)
1899 .Case("turks", GK_NORTHERN_ISLANDS)
1900 .Case("caicos", GK_NORTHERN_ISLANDS)
1901 .Case("cayman", GK_CAYMAN)
1902 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001903 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001904 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1905 .Case("verde", GK_SOUTHERN_ISLANDS)
1906 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001907 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001908 .Case("bonaire", GK_SEA_ISLANDS)
1909 .Case("kabini", GK_SEA_ISLANDS)
1910 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001911 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001912 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001913 .Case("tonga", GK_VOLCANIC_ISLANDS)
1914 .Case("iceland", GK_VOLCANIC_ISLANDS)
1915 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001916 .Case("fiji", GK_VOLCANIC_ISLANDS)
1917 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001918 .Default(GK_NONE);
1919
1920 if (GPU == GK_NONE) {
1921 return false;
1922 }
1923
1924 // Set the correct data layout
1925 switch (GPU) {
1926 case GK_NONE:
1927 case GK_R600:
1928 case GK_R700:
1929 case GK_EVERGREEN:
1930 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001931 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001932 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001933 hasFMAF = false;
1934 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935 break;
1936 case GK_R600_DOUBLE_OPS:
1937 case GK_R700_DOUBLE_OPS:
1938 case GK_EVERGREEN_DOUBLE_OPS:
1939 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00001940 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001941 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001942 hasFMAF = true;
1943 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944 break;
1945 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001946 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001947 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001948 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001949 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001950 hasFMAF = true;
1951 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001952 break;
1953 }
1954
1955 return true;
1956 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001957};
1958
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001959const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001960#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001961 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001962#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001963};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001964const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001965 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1966 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1967 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1968 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1969 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1970 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1971 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1972 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1973 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1974 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1975 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1976 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1977 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1978 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1979 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1980 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1981 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1982 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1983 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1984 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1985 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1986 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1987 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1988 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1989 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1990 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1991 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1992 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1993 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1994 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1995 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1996 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1997 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1998 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1999 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2000 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2001 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2002 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2003 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2004 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2005 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2006 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2007 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2008 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2009 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2010 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2011 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002012 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002013 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2014 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002015};
2016
Craig Topperf054e3a2015-10-19 03:52:27 +00002017ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2018 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002019}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002020
Eli Friedman3fd920a2008-08-20 02:34:37 +00002021// Namespace for x86 abstract base class
2022const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002023#define BUILTIN(ID, TYPE, ATTRS) \
2024 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002025#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002026 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002027#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002028 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002029#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002030};
Eli Friedmanb5366062008-05-20 14:21:01 +00002031
Nuno Lopescfca1f02009-12-23 17:49:57 +00002032static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002033 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2034 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002035 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002036 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2037 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2038 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002039 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002040 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2041 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002042 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2043 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2044 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2045 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2046 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2047 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2048 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2049 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002050};
2051
Eric Christophercdd36352011-06-21 00:05:20 +00002052const TargetInfo::AddlRegName AddlRegNames[] = {
2053 { { "al", "ah", "eax", "rax" }, 0 },
2054 { { "bl", "bh", "ebx", "rbx" }, 3 },
2055 { { "cl", "ch", "ecx", "rcx" }, 2 },
2056 { { "dl", "dh", "edx", "rdx" }, 1 },
2057 { { "esi", "rsi" }, 4 },
2058 { { "edi", "rdi" }, 5 },
2059 { { "esp", "rsp" }, 7 },
2060 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002061 { { "r8d", "r8w", "r8b" }, 38 },
2062 { { "r9d", "r9w", "r9b" }, 39 },
2063 { { "r10d", "r10w", "r10b" }, 40 },
2064 { { "r11d", "r11w", "r11b" }, 41 },
2065 { { "r12d", "r12w", "r12b" }, 42 },
2066 { { "r13d", "r13w", "r13b" }, 43 },
2067 { { "r14d", "r14w", "r14b" }, 44 },
2068 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002069};
2070
2071// X86 target abstract base class; x86-32 and x86-64 are very close, so
2072// most of the implementation can be shared.
2073class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002074 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002075 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002076 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002077 enum MMX3DNowEnum {
2078 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002079 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002080 enum XOPEnum {
2081 NoXOP,
2082 SSE4A,
2083 FMA4,
2084 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002085 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002086
Craig Topper543f3bd2015-10-14 23:47:57 +00002087 bool HasAES = false;
2088 bool HasPCLMUL = false;
2089 bool HasLZCNT = false;
2090 bool HasRDRND = false;
2091 bool HasFSGSBASE = false;
2092 bool HasBMI = false;
2093 bool HasBMI2 = false;
2094 bool HasPOPCNT = false;
2095 bool HasRTM = false;
2096 bool HasPRFCHW = false;
2097 bool HasRDSEED = false;
2098 bool HasADX = false;
2099 bool HasTBM = false;
2100 bool HasFMA = false;
2101 bool HasF16C = false;
2102 bool HasAVX512CD = false;
2103 bool HasAVX512ER = false;
2104 bool HasAVX512PF = false;
2105 bool HasAVX512DQ = false;
2106 bool HasAVX512BW = false;
2107 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002108 bool HasAVX512VBMI = false;
2109 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002110 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002111 bool HasMPX = false;
2112 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002113 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002114 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002115 bool HasXSAVE = false;
2116 bool HasXSAVEOPT = false;
2117 bool HasXSAVEC = false;
2118 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002119 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002120 bool HasCLFLUSHOPT = false;
2121 bool HasPCOMMIT = false;
2122 bool HasCLWB = false;
2123 bool HasUMIP = false;
2124 bool HasMOVBE = false;
2125 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002126
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002127 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2128 ///
2129 /// Each enumeration represents a particular CPU supported by Clang. These
2130 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2131 enum CPUKind {
2132 CK_Generic,
2133
2134 /// \name i386
2135 /// i386-generation processors.
2136 //@{
2137 CK_i386,
2138 //@}
2139
2140 /// \name i486
2141 /// i486-generation processors.
2142 //@{
2143 CK_i486,
2144 CK_WinChipC6,
2145 CK_WinChip2,
2146 CK_C3,
2147 //@}
2148
2149 /// \name i586
2150 /// i586-generation processors, P5 microarchitecture based.
2151 //@{
2152 CK_i586,
2153 CK_Pentium,
2154 CK_PentiumMMX,
2155 //@}
2156
2157 /// \name i686
2158 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2159 //@{
2160 CK_i686,
2161 CK_PentiumPro,
2162 CK_Pentium2,
2163 CK_Pentium3,
2164 CK_Pentium3M,
2165 CK_PentiumM,
2166 CK_C3_2,
2167
2168 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2169 /// Clang however has some logic to suport this.
2170 // FIXME: Warn, deprecate, and potentially remove this.
2171 CK_Yonah,
2172 //@}
2173
2174 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002175 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002176 //@{
2177 CK_Pentium4,
2178 CK_Pentium4M,
2179 CK_Prescott,
2180 CK_Nocona,
2181 //@}
2182
2183 /// \name Core
2184 /// Core microarchitecture based processors.
2185 //@{
2186 CK_Core2,
2187
2188 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2189 /// codename which GCC no longer accepts as an option to -march, but Clang
2190 /// has some logic for recognizing it.
2191 // FIXME: Warn, deprecate, and potentially remove this.
2192 CK_Penryn,
2193 //@}
2194
2195 /// \name Atom
2196 /// Atom processors
2197 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002198 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002199 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002200 //@}
2201
2202 /// \name Nehalem
2203 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002204 CK_Nehalem,
2205
2206 /// \name Westmere
2207 /// Westmere microarchitecture based processors.
2208 CK_Westmere,
2209
2210 /// \name Sandy Bridge
2211 /// Sandy Bridge microarchitecture based processors.
2212 CK_SandyBridge,
2213
2214 /// \name Ivy Bridge
2215 /// Ivy Bridge microarchitecture based processors.
2216 CK_IvyBridge,
2217
2218 /// \name Haswell
2219 /// Haswell microarchitecture based processors.
2220 CK_Haswell,
2221
2222 /// \name Broadwell
2223 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002224 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002225
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002226 /// \name Skylake Client
2227 /// Skylake client microarchitecture based processors.
2228 CK_SkylakeClient,
2229
2230 /// \name Skylake Server
2231 /// Skylake server microarchitecture based processors.
2232 CK_SkylakeServer,
2233
2234 /// \name Cannonlake Client
2235 /// Cannonlake client microarchitecture based processors.
2236 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002237
Craig Topper449314e2013-08-20 07:09:39 +00002238 /// \name Knights Landing
2239 /// Knights Landing processor.
2240 CK_KNL,
2241
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002242 /// \name Lakemont
2243 /// Lakemont microarchitecture based processors.
2244 CK_Lakemont,
2245
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002246 /// \name K6
2247 /// K6 architecture processors.
2248 //@{
2249 CK_K6,
2250 CK_K6_2,
2251 CK_K6_3,
2252 //@}
2253
2254 /// \name K7
2255 /// K7 architecture processors.
2256 //@{
2257 CK_Athlon,
2258 CK_AthlonThunderbird,
2259 CK_Athlon4,
2260 CK_AthlonXP,
2261 CK_AthlonMP,
2262 //@}
2263
2264 /// \name K8
2265 /// K8 architecture processors.
2266 //@{
2267 CK_Athlon64,
2268 CK_Athlon64SSE3,
2269 CK_AthlonFX,
2270 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002271 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002272 CK_Opteron,
2273 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002274 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002275 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002276
Benjamin Kramer569f2152012-01-10 11:50:18 +00002277 /// \name Bobcat
2278 /// Bobcat architecture processors.
2279 //@{
2280 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002281 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002282 //@}
2283
2284 /// \name Bulldozer
2285 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002286 //@{
2287 CK_BDVER1,
2288 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002289 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002290 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002291 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002292
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002293 /// This specification is deprecated and will be removed in the future.
2294 /// Users should prefer \see CK_K8.
2295 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002296 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002297 CK_x86_64,
2298 //@}
2299
2300 /// \name Geode
2301 /// Geode processors.
2302 //@{
2303 CK_Geode
2304 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002305 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002306
Eric Christopherc50738f2015-08-27 00:05:50 +00002307 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002308 return llvm::StringSwitch<CPUKind>(CPU)
2309 .Case("i386", CK_i386)
2310 .Case("i486", CK_i486)
2311 .Case("winchip-c6", CK_WinChipC6)
2312 .Case("winchip2", CK_WinChip2)
2313 .Case("c3", CK_C3)
2314 .Case("i586", CK_i586)
2315 .Case("pentium", CK_Pentium)
2316 .Case("pentium-mmx", CK_PentiumMMX)
2317 .Case("i686", CK_i686)
2318 .Case("pentiumpro", CK_PentiumPro)
2319 .Case("pentium2", CK_Pentium2)
2320 .Case("pentium3", CK_Pentium3)
2321 .Case("pentium3m", CK_Pentium3M)
2322 .Case("pentium-m", CK_PentiumM)
2323 .Case("c3-2", CK_C3_2)
2324 .Case("yonah", CK_Yonah)
2325 .Case("pentium4", CK_Pentium4)
2326 .Case("pentium4m", CK_Pentium4M)
2327 .Case("prescott", CK_Prescott)
2328 .Case("nocona", CK_Nocona)
2329 .Case("core2", CK_Core2)
2330 .Case("penryn", CK_Penryn)
2331 .Case("bonnell", CK_Bonnell)
2332 .Case("atom", CK_Bonnell) // Legacy name.
2333 .Case("silvermont", CK_Silvermont)
2334 .Case("slm", CK_Silvermont) // Legacy name.
2335 .Case("nehalem", CK_Nehalem)
2336 .Case("corei7", CK_Nehalem) // Legacy name.
2337 .Case("westmere", CK_Westmere)
2338 .Case("sandybridge", CK_SandyBridge)
2339 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2340 .Case("ivybridge", CK_IvyBridge)
2341 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2342 .Case("haswell", CK_Haswell)
2343 .Case("core-avx2", CK_Haswell) // Legacy name.
2344 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002345 .Case("skylake", CK_SkylakeClient)
2346 .Case("skylake-avx512", CK_SkylakeServer)
2347 .Case("skx", CK_SkylakeServer) // Legacy name.
2348 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002349 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002350 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002351 .Case("k6", CK_K6)
2352 .Case("k6-2", CK_K6_2)
2353 .Case("k6-3", CK_K6_3)
2354 .Case("athlon", CK_Athlon)
2355 .Case("athlon-tbird", CK_AthlonThunderbird)
2356 .Case("athlon-4", CK_Athlon4)
2357 .Case("athlon-xp", CK_AthlonXP)
2358 .Case("athlon-mp", CK_AthlonMP)
2359 .Case("athlon64", CK_Athlon64)
2360 .Case("athlon64-sse3", CK_Athlon64SSE3)
2361 .Case("athlon-fx", CK_AthlonFX)
2362 .Case("k8", CK_K8)
2363 .Case("k8-sse3", CK_K8SSE3)
2364 .Case("opteron", CK_Opteron)
2365 .Case("opteron-sse3", CK_OpteronSSE3)
2366 .Case("barcelona", CK_AMDFAM10)
2367 .Case("amdfam10", CK_AMDFAM10)
2368 .Case("btver1", CK_BTVER1)
2369 .Case("btver2", CK_BTVER2)
2370 .Case("bdver1", CK_BDVER1)
2371 .Case("bdver2", CK_BDVER2)
2372 .Case("bdver3", CK_BDVER3)
2373 .Case("bdver4", CK_BDVER4)
2374 .Case("x86-64", CK_x86_64)
2375 .Case("geode", CK_Geode)
2376 .Default(CK_Generic);
2377 }
2378
Rafael Espindolaeb265472013-08-21 21:59:03 +00002379 enum FPMathKind {
2380 FP_Default,
2381 FP_SSE,
2382 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002383 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002384
Eli Friedman3fd920a2008-08-20 02:34:37 +00002385public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002386 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002387 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002388 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002389 }
Craig Topper3164f332014-03-11 03:39:26 +00002390 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002391 // X87 evaluates with 80 bits "long double" precision.
2392 return SSELevel == NoSSE ? 2 : 0;
2393 }
Craig Topper6c03a542015-10-19 04:51:35 +00002394 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2395 return llvm::makeArrayRef(BuiltinInfo,
2396 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002397 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002398 ArrayRef<const char *> getGCCRegNames() const override {
2399 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002400 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002401 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2402 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002403 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002404 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2405 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002406 }
Eric Christopherd9832702015-06-29 21:00:05 +00002407 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002408 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002409 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002410
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002411 bool validateGlobalRegisterVariable(StringRef RegName,
2412 unsigned RegSize,
2413 bool &HasSizeMismatch) const override {
2414 // esp and ebp are the only 32-bit registers the x86 backend can currently
2415 // handle.
2416 if (RegName.equals("esp") || RegName.equals("ebp")) {
2417 // Check that the register size is 32-bit.
2418 HasSizeMismatch = RegSize != 32;
2419 return true;
2420 }
2421
2422 return false;
2423 }
2424
Akira Hatanaka974131e2014-09-18 18:17:18 +00002425 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2426
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002427 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2428
Akira Hatanaka974131e2014-09-18 18:17:18 +00002429 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2430
Craig Topper3164f332014-03-11 03:39:26 +00002431 std::string convertConstraint(const char *&Constraint) const override;
2432 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002433 return "~{dirflag},~{fpsr},~{flags}";
2434 }
Craig Topper3164f332014-03-11 03:39:26 +00002435 void getTargetDefines(const LangOptions &Opts,
2436 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002437 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2438 bool Enabled);
2439 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2440 bool Enabled);
2441 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2442 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002443 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2444 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002445 setFeatureEnabledImpl(Features, Name, Enabled);
2446 }
2447 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002448 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002449 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2450 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002451 bool
2452 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2453 StringRef CPU,
2454 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002455 bool hasFeature(StringRef Feature) const override;
2456 bool handleTargetFeatures(std::vector<std::string> &Features,
2457 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002458 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002459 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2460 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002461 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002462 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002463 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002464 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002465 return "no-mmx";
2466 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002467 }
Craig Topper3164f332014-03-11 03:39:26 +00002468 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002469 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002470
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002471 // Perform any per-CPU checks necessary to determine if this CPU is
2472 // acceptable.
2473 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2474 // invalid without explaining *why*.
2475 switch (CPU) {
2476 case CK_Generic:
2477 // No processor selected!
2478 return false;
2479
2480 case CK_i386:
2481 case CK_i486:
2482 case CK_WinChipC6:
2483 case CK_WinChip2:
2484 case CK_C3:
2485 case CK_i586:
2486 case CK_Pentium:
2487 case CK_PentiumMMX:
2488 case CK_i686:
2489 case CK_PentiumPro:
2490 case CK_Pentium2:
2491 case CK_Pentium3:
2492 case CK_Pentium3M:
2493 case CK_PentiumM:
2494 case CK_Yonah:
2495 case CK_C3_2:
2496 case CK_Pentium4:
2497 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002498 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002499 case CK_Prescott:
2500 case CK_K6:
2501 case CK_K6_2:
2502 case CK_K6_3:
2503 case CK_Athlon:
2504 case CK_AthlonThunderbird:
2505 case CK_Athlon4:
2506 case CK_AthlonXP:
2507 case CK_AthlonMP:
2508 case CK_Geode:
2509 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002510 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002511 return false;
2512
2513 // Fallthrough
2514 case CK_Nocona:
2515 case CK_Core2:
2516 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002517 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002518 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002519 case CK_Nehalem:
2520 case CK_Westmere:
2521 case CK_SandyBridge:
2522 case CK_IvyBridge:
2523 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002524 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002525 case CK_SkylakeClient:
2526 case CK_SkylakeServer:
2527 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002528 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002529 case CK_Athlon64:
2530 case CK_Athlon64SSE3:
2531 case CK_AthlonFX:
2532 case CK_K8:
2533 case CK_K8SSE3:
2534 case CK_Opteron:
2535 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002536 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002537 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002538 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002539 case CK_BDVER1:
2540 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002541 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002542 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002543 case CK_x86_64:
2544 return true;
2545 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002546 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002547 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002548
Craig Topper3164f332014-03-11 03:39:26 +00002549 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002550
Craig Topper3164f332014-03-11 03:39:26 +00002551 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002552 // Most of the non-ARM calling conventions are i386 conventions.
2553 switch (CC) {
2554 case CC_X86ThisCall:
2555 case CC_X86FastCall:
2556 case CC_X86StdCall:
2557 case CC_X86VectorCall:
2558 case CC_C:
2559 case CC_Swift:
2560 case CC_X86Pascal:
2561 case CC_IntelOclBicc:
2562 return CCCR_OK;
2563 default:
2564 return CCCR_Warning;
2565 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002566 }
2567
Craig Topper3164f332014-03-11 03:39:26 +00002568 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002569 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002570 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002571
2572 bool hasSjLjLowering() const override {
2573 return true;
2574 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002575};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002576
Rafael Espindolaeb265472013-08-21 21:59:03 +00002577bool X86TargetInfo::setFPMath(StringRef Name) {
2578 if (Name == "387") {
2579 FPMath = FP_387;
2580 return true;
2581 }
2582 if (Name == "sse") {
2583 FPMath = FP_SSE;
2584 return true;
2585 }
2586 return false;
2587}
2588
Eric Christopher007b0a02015-08-28 22:32:01 +00002589bool X86TargetInfo::initFeatureMap(
2590 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002591 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002592 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002593 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002594 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002595 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002596
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002597 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002598
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002599 // Enable X87 for all X86 processors but Lakemont.
2600 if (Kind != CK_Lakemont)
2601 setFeatureEnabledImpl(Features, "x87", true);
2602
2603 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002604 case CK_Generic:
2605 case CK_i386:
2606 case CK_i486:
2607 case CK_i586:
2608 case CK_Pentium:
2609 case CK_i686:
2610 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002611 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002612 break;
2613 case CK_PentiumMMX:
2614 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002615 case CK_K6:
2616 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002617 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002618 break;
2619 case CK_Pentium3:
2620 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002621 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002622 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002623 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 break;
2625 case CK_PentiumM:
2626 case CK_Pentium4:
2627 case CK_Pentium4M:
2628 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002629 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002630 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002631 break;
2632 case CK_Yonah:
2633 case CK_Prescott:
2634 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002635 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002636 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002637 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002638 break;
2639 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002640 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002641 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002642 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002643 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002644 break;
2645 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002646 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002647 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002648 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002649 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002650 case CK_Cannonlake:
2651 setFeatureEnabledImpl(Features, "avx512ifma", true);
2652 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2653 setFeatureEnabledImpl(Features, "sha", true);
2654 setFeatureEnabledImpl(Features, "umip", true);
2655 // FALLTHROUGH
2656 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002657 setFeatureEnabledImpl(Features, "avx512f", true);
2658 setFeatureEnabledImpl(Features, "avx512cd", true);
2659 setFeatureEnabledImpl(Features, "avx512dq", true);
2660 setFeatureEnabledImpl(Features, "avx512bw", true);
2661 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002662 setFeatureEnabledImpl(Features, "pku", true);
2663 setFeatureEnabledImpl(Features, "pcommit", true);
2664 setFeatureEnabledImpl(Features, "clwb", true);
2665 // FALLTHROUGH
2666 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002667 setFeatureEnabledImpl(Features, "xsavec", true);
2668 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002669 setFeatureEnabledImpl(Features, "mpx", true);
2670 setFeatureEnabledImpl(Features, "sgx", true);
2671 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002672 // FALLTHROUGH
2673 case CK_Broadwell:
2674 setFeatureEnabledImpl(Features, "rdseed", true);
2675 setFeatureEnabledImpl(Features, "adx", true);
2676 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002677 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002678 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002679 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002680 setFeatureEnabledImpl(Features, "bmi", true);
2681 setFeatureEnabledImpl(Features, "bmi2", true);
2682 setFeatureEnabledImpl(Features, "rtm", true);
2683 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002684 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002685 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002686 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002687 setFeatureEnabledImpl(Features, "rdrnd", true);
2688 setFeatureEnabledImpl(Features, "f16c", true);
2689 setFeatureEnabledImpl(Features, "fsgsbase", true);
2690 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002691 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002692 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002693 setFeatureEnabledImpl(Features, "xsave", true);
2694 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002695 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002696 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002697 case CK_Silvermont:
2698 setFeatureEnabledImpl(Features, "aes", true);
2699 setFeatureEnabledImpl(Features, "pclmul", true);
2700 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002701 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002702 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002703 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002704 setFeatureEnabledImpl(Features, "cx16", true);
2705 break;
2706 case CK_KNL:
2707 setFeatureEnabledImpl(Features, "avx512f", true);
2708 setFeatureEnabledImpl(Features, "avx512cd", true);
2709 setFeatureEnabledImpl(Features, "avx512er", true);
2710 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002711 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002712 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002713 setFeatureEnabledImpl(Features, "rdseed", true);
2714 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002715 setFeatureEnabledImpl(Features, "lzcnt", true);
2716 setFeatureEnabledImpl(Features, "bmi", true);
2717 setFeatureEnabledImpl(Features, "bmi2", true);
2718 setFeatureEnabledImpl(Features, "rtm", true);
2719 setFeatureEnabledImpl(Features, "fma", true);
2720 setFeatureEnabledImpl(Features, "rdrnd", true);
2721 setFeatureEnabledImpl(Features, "f16c", true);
2722 setFeatureEnabledImpl(Features, "fsgsbase", true);
2723 setFeatureEnabledImpl(Features, "aes", true);
2724 setFeatureEnabledImpl(Features, "pclmul", true);
2725 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002726 setFeatureEnabledImpl(Features, "xsaveopt", true);
2727 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002728 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002729 break;
2730 case CK_K6_2:
2731 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002732 case CK_WinChip2:
2733 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002734 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002735 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002736 case CK_Athlon:
2737 case CK_AthlonThunderbird:
2738 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002739 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002740 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002741 case CK_Athlon4:
2742 case CK_AthlonXP:
2743 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002744 setFeatureEnabledImpl(Features, "sse", true);
2745 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002746 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002747 break;
2748 case CK_K8:
2749 case CK_Opteron:
2750 case CK_Athlon64:
2751 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002752 setFeatureEnabledImpl(Features, "sse2", true);
2753 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002754 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002755 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002756 case CK_AMDFAM10:
2757 setFeatureEnabledImpl(Features, "sse4a", true);
2758 setFeatureEnabledImpl(Features, "lzcnt", true);
2759 setFeatureEnabledImpl(Features, "popcnt", true);
2760 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002761 case CK_K8SSE3:
2762 case CK_OpteronSSE3:
2763 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002764 setFeatureEnabledImpl(Features, "sse3", true);
2765 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002766 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002767 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002768 case CK_BTVER2:
2769 setFeatureEnabledImpl(Features, "avx", true);
2770 setFeatureEnabledImpl(Features, "aes", true);
2771 setFeatureEnabledImpl(Features, "pclmul", true);
2772 setFeatureEnabledImpl(Features, "bmi", true);
2773 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002774 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002775 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002776 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002777 setFeatureEnabledImpl(Features, "ssse3", true);
2778 setFeatureEnabledImpl(Features, "sse4a", true);
2779 setFeatureEnabledImpl(Features, "lzcnt", true);
2780 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002781 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002782 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002783 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002784 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002785 case CK_BDVER4:
2786 setFeatureEnabledImpl(Features, "avx2", true);
2787 setFeatureEnabledImpl(Features, "bmi2", true);
2788 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002789 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002790 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002791 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002792 // FALLTHROUGH
2793 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002794 setFeatureEnabledImpl(Features, "bmi", true);
2795 setFeatureEnabledImpl(Features, "fma", true);
2796 setFeatureEnabledImpl(Features, "f16c", true);
2797 setFeatureEnabledImpl(Features, "tbm", true);
2798 // FALLTHROUGH
2799 case CK_BDVER1:
2800 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002801 setFeatureEnabledImpl(Features, "xop", true);
2802 setFeatureEnabledImpl(Features, "lzcnt", true);
2803 setFeatureEnabledImpl(Features, "aes", true);
2804 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002805 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002806 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002807 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002808 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002809 break;
Eli Friedman33465822011-07-08 23:31:17 +00002810 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002811 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2812 return false;
2813
2814 // Can't do this earlier because we need to be able to explicitly enable
2815 // or disable these features and the things that they depend upon.
2816
2817 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2818 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002819 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002820 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2821 FeaturesVec.end())
2822 Features["popcnt"] = true;
2823
2824 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2825 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002826 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002827 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2828 FeaturesVec.end())
2829 Features["prfchw"] = true;
2830
Eric Christophera7260af2015-10-08 20:10:18 +00002831 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2832 // then enable MMX.
2833 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002834 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002835 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2836 FeaturesVec.end())
2837 Features["mmx"] = true;
2838
Eric Christopherbbd746d2015-10-08 20:10:14 +00002839 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002840}
2841
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002843 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002844 if (Enabled) {
2845 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002846 case AVX512F:
2847 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002848 case AVX2:
2849 Features["avx2"] = true;
2850 case AVX:
2851 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002852 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002853 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002854 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002855 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002856 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002857 case SSSE3:
2858 Features["ssse3"] = true;
2859 case SSE3:
2860 Features["sse3"] = true;
2861 case SSE2:
2862 Features["sse2"] = true;
2863 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 Features["sse"] = true;
2865 case NoSSE:
2866 break;
2867 }
2868 return;
2869 }
2870
2871 switch (Level) {
2872 case NoSSE:
2873 case SSE1:
2874 Features["sse"] = false;
2875 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002876 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2877 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002878 case SSE3:
2879 Features["sse3"] = false;
2880 setXOPLevel(Features, NoXOP, false);
2881 case SSSE3:
2882 Features["ssse3"] = false;
2883 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002884 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002885 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002886 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002888 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2889 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002890 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002891 case AVX2:
2892 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002893 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002894 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002895 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002896 Features["avx512vl"] = Features["avx512vbmi"] =
2897 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002898 }
2899}
2900
2901void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002902 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002903 if (Enabled) {
2904 switch (Level) {
2905 case AMD3DNowAthlon:
2906 Features["3dnowa"] = true;
2907 case AMD3DNow:
2908 Features["3dnow"] = true;
2909 case MMX:
2910 Features["mmx"] = true;
2911 case NoMMX3DNow:
2912 break;
2913 }
2914 return;
2915 }
2916
2917 switch (Level) {
2918 case NoMMX3DNow:
2919 case MMX:
2920 Features["mmx"] = false;
2921 case AMD3DNow:
2922 Features["3dnow"] = false;
2923 case AMD3DNowAthlon:
2924 Features["3dnowa"] = false;
2925 }
2926}
2927
2928void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002929 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002930 if (Enabled) {
2931 switch (Level) {
2932 case XOP:
2933 Features["xop"] = true;
2934 case FMA4:
2935 Features["fma4"] = true;
2936 setSSELevel(Features, AVX, true);
2937 case SSE4A:
2938 Features["sse4a"] = true;
2939 setSSELevel(Features, SSE3, true);
2940 case NoXOP:
2941 break;
2942 }
2943 return;
2944 }
2945
2946 switch (Level) {
2947 case NoXOP:
2948 case SSE4A:
2949 Features["sse4a"] = false;
2950 case FMA4:
2951 Features["fma4"] = false;
2952 case XOP:
2953 Features["xop"] = false;
2954 }
2955}
2956
Craig Topper86d79ef2013-09-17 04:51:29 +00002957void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2958 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002959 // This is a bit of a hack to deal with the sse4 target feature when used
2960 // as part of the target attribute. We handle sse4 correctly everywhere
2961 // else. See below for more information on how we handle the sse4 options.
2962 if (Name != "sse4")
2963 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002964
Craig Topper29561122013-09-19 01:13:07 +00002965 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002966 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002967 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002968 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002969 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002970 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002971 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002972 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002973 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002974 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002975 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002976 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002977 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002978 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002979 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002980 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002981 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002982 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002983 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002984 if (Enabled)
2985 setSSELevel(Features, SSE2, Enabled);
2986 } else if (Name == "pclmul") {
2987 if (Enabled)
2988 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002989 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002990 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002991 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002992 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002993 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002994 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00002995 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
2996 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
2997 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00002998 if (Enabled)
2999 setSSELevel(Features, AVX512F, Enabled);
3000 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003001 if (Enabled)
3002 setSSELevel(Features, AVX, Enabled);
3003 } else if (Name == "fma4") {
3004 setXOPLevel(Features, FMA4, Enabled);
3005 } else if (Name == "xop") {
3006 setXOPLevel(Features, XOP, Enabled);
3007 } else if (Name == "sse4a") {
3008 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003009 } else if (Name == "f16c") {
3010 if (Enabled)
3011 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003012 } else if (Name == "sha") {
3013 if (Enabled)
3014 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003015 } else if (Name == "sse4") {
3016 // We can get here via the __target__ attribute since that's not controlled
3017 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3018 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3019 // disabled.
3020 if (Enabled)
3021 setSSELevel(Features, SSE42, Enabled);
3022 else
3023 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003024 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003025 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003026 Features["xsaveopt"] = false;
3027 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003028 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003029 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003030 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003031}
3032
Eric Christopher3ff21b32013-10-16 21:26:26 +00003033/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003034/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003035bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003036 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003037 for (const auto &Feature : Features) {
3038 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003039 continue;
3040
Eric Christopher610fe112015-08-26 08:21:55 +00003041 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003042 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003043 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003044 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003045 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003046 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003047 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003048 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003049 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003050 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003051 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003052 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003053 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003054 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003055 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003056 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003057 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003058 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003059 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003060 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003061 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003062 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003063 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003064 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003065 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003066 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003067 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003068 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003069 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003070 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003071 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003072 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003073 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003074 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003075 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003076 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003077 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003078 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003079 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003080 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003081 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003082 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003083 } else if (Feature == "+avx512vbmi") {
3084 HasAVX512VBMI = true;
3085 } else if (Feature == "+avx512ifma") {
3086 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003087 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003088 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003089 } else if (Feature == "+mpx") {
3090 HasMPX = true;
3091 } else if (Feature == "+movbe") {
3092 HasMOVBE = true;
3093 } else if (Feature == "+sgx") {
3094 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003095 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003096 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003097 } else if (Feature == "+fxsr") {
3098 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003099 } else if (Feature == "+xsave") {
3100 HasXSAVE = true;
3101 } else if (Feature == "+xsaveopt") {
3102 HasXSAVEOPT = true;
3103 } else if (Feature == "+xsavec") {
3104 HasXSAVEC = true;
3105 } else if (Feature == "+xsaves") {
3106 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003107 } else if (Feature == "+pku") {
3108 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003109 } else if (Feature == "+clflushopt") {
3110 HasCLFLUSHOPT = true;
3111 } else if (Feature == "+pcommit") {
3112 HasPCOMMIT = true;
3113 } else if (Feature == "+clwb") {
3114 HasCLWB = true;
3115 } else if (Feature == "+umip") {
3116 HasUMIP = true;
3117 } else if (Feature == "+prefetchwt1") {
3118 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003119 }
3120
Benjamin Kramer27402c62012-03-05 15:10:44 +00003121 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003122 .Case("+avx512f", AVX512F)
3123 .Case("+avx2", AVX2)
3124 .Case("+avx", AVX)
3125 .Case("+sse4.2", SSE42)
3126 .Case("+sse4.1", SSE41)
3127 .Case("+ssse3", SSSE3)
3128 .Case("+sse3", SSE3)
3129 .Case("+sse2", SSE2)
3130 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003131 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003132 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003133
Eli Friedman33465822011-07-08 23:31:17 +00003134 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003135 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003136 .Case("+3dnowa", AMD3DNowAthlon)
3137 .Case("+3dnow", AMD3DNow)
3138 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003139 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003140 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003141
3142 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003143 .Case("+xop", XOP)
3144 .Case("+fma4", FMA4)
3145 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003146 .Default(NoXOP);
3147 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003148 }
Eli Friedman33465822011-07-08 23:31:17 +00003149
Rafael Espindolaeb265472013-08-21 21:59:03 +00003150 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3151 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003152 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3153 (FPMath == FP_387 && SSELevel >= SSE1)) {
3154 Diags.Report(diag::err_target_unsupported_fpmath) <<
3155 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003156 return false;
3157 }
3158
Alexey Bataev00396512015-07-02 03:40:19 +00003159 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003160 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003161 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003162}
Chris Lattnerecd49032009-03-02 22:27:17 +00003163
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003164/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3165/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003166void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003167 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003168 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003169 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003170 Builder.defineMacro("__amd64__");
3171 Builder.defineMacro("__amd64");
3172 Builder.defineMacro("__x86_64");
3173 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003174 if (getTriple().getArchName() == "x86_64h") {
3175 Builder.defineMacro("__x86_64h");
3176 Builder.defineMacro("__x86_64h__");
3177 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003178 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003179 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003180 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003181
Chris Lattnerecd49032009-03-02 22:27:17 +00003182 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003183 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3184 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003185 switch (CPU) {
3186 case CK_Generic:
3187 break;
3188 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003189 // The rest are coming from the i386 define above.
3190 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003191 break;
3192 case CK_i486:
3193 case CK_WinChipC6:
3194 case CK_WinChip2:
3195 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003196 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003197 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003198 case CK_PentiumMMX:
3199 Builder.defineMacro("__pentium_mmx__");
3200 Builder.defineMacro("__tune_pentium_mmx__");
3201 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003202 case CK_i586:
3203 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003204 defineCPUMacros(Builder, "i586");
3205 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003206 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003207 case CK_Pentium3:
3208 case CK_Pentium3M:
3209 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003210 Builder.defineMacro("__tune_pentium3__");
3211 // Fallthrough
3212 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003213 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003214 Builder.defineMacro("__tune_pentium2__");
3215 // Fallthrough
3216 case CK_PentiumPro:
3217 Builder.defineMacro("__tune_i686__");
3218 Builder.defineMacro("__tune_pentiumpro__");
3219 // Fallthrough
3220 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003221 Builder.defineMacro("__i686");
3222 Builder.defineMacro("__i686__");
3223 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3224 Builder.defineMacro("__pentiumpro");
3225 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003226 break;
3227 case CK_Pentium4:
3228 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003229 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003230 break;
3231 case CK_Yonah:
3232 case CK_Prescott:
3233 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003234 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003235 break;
3236 case CK_Core2:
3237 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003238 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003239 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003240 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003241 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003242 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003243 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003244 defineCPUMacros(Builder, "slm");
3245 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003246 case CK_Nehalem:
3247 case CK_Westmere:
3248 case CK_SandyBridge:
3249 case CK_IvyBridge:
3250 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003251 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003252 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003253 // FIXME: Historically, we defined this legacy name, it would be nice to
3254 // remove it at some point. We've never exposed fine-grained names for
3255 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003256 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003257 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003258 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003259 defineCPUMacros(Builder, "skx");
3260 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003261 case CK_Cannonlake:
3262 break;
Craig Topper449314e2013-08-20 07:09:39 +00003263 case CK_KNL:
3264 defineCPUMacros(Builder, "knl");
3265 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003266 case CK_Lakemont:
3267 Builder.defineMacro("__tune_lakemont__");
3268 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003269 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003270 Builder.defineMacro("__k6_2__");
3271 Builder.defineMacro("__tune_k6_2__");
3272 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003273 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003274 if (CPU != CK_K6_2) { // In case of fallthrough
3275 // FIXME: GCC may be enabling these in cases where some other k6
3276 // architecture is specified but -m3dnow is explicitly provided. The
3277 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003278 Builder.defineMacro("__k6_3__");
3279 Builder.defineMacro("__tune_k6_3__");
3280 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003281 // Fallthrough
3282 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003283 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003284 break;
3285 case CK_Athlon:
3286 case CK_AthlonThunderbird:
3287 case CK_Athlon4:
3288 case CK_AthlonXP:
3289 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003290 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003291 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003292 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003293 Builder.defineMacro("__tune_athlon_sse__");
3294 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003295 break;
3296 case CK_K8:
3297 case CK_K8SSE3:
3298 case CK_x86_64:
3299 case CK_Opteron:
3300 case CK_OpteronSSE3:
3301 case CK_Athlon64:
3302 case CK_Athlon64SSE3:
3303 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003304 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003305 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003306 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003307 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003308 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003309 case CK_BTVER1:
3310 defineCPUMacros(Builder, "btver1");
3311 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003312 case CK_BTVER2:
3313 defineCPUMacros(Builder, "btver2");
3314 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003315 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003316 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003317 break;
3318 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003319 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003320 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003321 case CK_BDVER3:
3322 defineCPUMacros(Builder, "bdver3");
3323 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003324 case CK_BDVER4:
3325 defineCPUMacros(Builder, "bdver4");
3326 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003327 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003328 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003329 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003330 }
Chris Lattner96e43572009-03-02 22:40:39 +00003331
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003332 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003333 Builder.defineMacro("__REGISTER_PREFIX__", "");
3334
Chris Lattner6df41af2009-04-19 17:32:33 +00003335 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3336 // functions in glibc header files that use FP Stack inline asm which the
3337 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003338 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003339
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003340 if (HasAES)
3341 Builder.defineMacro("__AES__");
3342
Craig Topper3f122a72012-05-31 05:18:48 +00003343 if (HasPCLMUL)
3344 Builder.defineMacro("__PCLMUL__");
3345
Craig Topper22967d42011-12-25 05:06:45 +00003346 if (HasLZCNT)
3347 Builder.defineMacro("__LZCNT__");
3348
Benjamin Kramer1e250392012-07-07 09:39:18 +00003349 if (HasRDRND)
3350 Builder.defineMacro("__RDRND__");
3351
Craig Topper8c7f2512014-11-03 06:51:41 +00003352 if (HasFSGSBASE)
3353 Builder.defineMacro("__FSGSBASE__");
3354
Craig Topper22967d42011-12-25 05:06:45 +00003355 if (HasBMI)
3356 Builder.defineMacro("__BMI__");
3357
3358 if (HasBMI2)
3359 Builder.defineMacro("__BMI2__");
3360
Craig Topper1de83482011-12-29 16:10:46 +00003361 if (HasPOPCNT)
3362 Builder.defineMacro("__POPCNT__");
3363
Michael Liao625a8752012-11-10 05:17:46 +00003364 if (HasRTM)
3365 Builder.defineMacro("__RTM__");
3366
Michael Liao74f4eaf2013-03-26 17:52:08 +00003367 if (HasPRFCHW)
3368 Builder.defineMacro("__PRFCHW__");
3369
Michael Liaoffaae352013-03-29 05:17:55 +00003370 if (HasRDSEED)
3371 Builder.defineMacro("__RDSEED__");
3372
Robert Khasanov50e6f582014-09-19 09:53:48 +00003373 if (HasADX)
3374 Builder.defineMacro("__ADX__");
3375
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003376 if (HasTBM)
3377 Builder.defineMacro("__TBM__");
3378
Rafael Espindolae62e2792013-08-20 13:44:29 +00003379 switch (XOPLevel) {
3380 case XOP:
3381 Builder.defineMacro("__XOP__");
3382 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003383 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003384 case SSE4A:
3385 Builder.defineMacro("__SSE4A__");
3386 case NoXOP:
3387 break;
3388 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003389
Craig Topperbba778b2012-06-03 21:46:30 +00003390 if (HasFMA)
3391 Builder.defineMacro("__FMA__");
3392
Manman Rena45358c2012-10-11 00:59:55 +00003393 if (HasF16C)
3394 Builder.defineMacro("__F16C__");
3395
Craig Topper679b53a2013-08-21 05:29:10 +00003396 if (HasAVX512CD)
3397 Builder.defineMacro("__AVX512CD__");
3398 if (HasAVX512ER)
3399 Builder.defineMacro("__AVX512ER__");
3400 if (HasAVX512PF)
3401 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003402 if (HasAVX512DQ)
3403 Builder.defineMacro("__AVX512DQ__");
3404 if (HasAVX512BW)
3405 Builder.defineMacro("__AVX512BW__");
3406 if (HasAVX512VL)
3407 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003408 if (HasAVX512VBMI)
3409 Builder.defineMacro("__AVX512VBMI__");
3410 if (HasAVX512IFMA)
3411 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003412
Ben Langmuir58078d02013-09-19 13:22:04 +00003413 if (HasSHA)
3414 Builder.defineMacro("__SHA__");
3415
Craig Toppere33f51f2015-10-16 06:22:36 +00003416 if (HasFXSR)
3417 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003418 if (HasXSAVE)
3419 Builder.defineMacro("__XSAVE__");
3420 if (HasXSAVEOPT)
3421 Builder.defineMacro("__XSAVEOPT__");
3422 if (HasXSAVEC)
3423 Builder.defineMacro("__XSAVEC__");
3424 if (HasXSAVES)
3425 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003426 if (HasPKU)
3427 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003428 if (HasCX16)
3429 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3430
Chris Lattner96e43572009-03-02 22:40:39 +00003431 // Each case falls through to the previous one here.
3432 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003433 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003434 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003435 case AVX2:
3436 Builder.defineMacro("__AVX2__");
3437 case AVX:
3438 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003439 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003440 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003441 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003442 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003443 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003444 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003445 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003446 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003447 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003448 Builder.defineMacro("__SSE2__");
3449 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003450 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003451 Builder.defineMacro("__SSE__");
3452 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003453 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003454 break;
3455 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003456
Derek Schuffc7dd7222012-10-11 15:52:22 +00003457 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003458 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003459 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003460 case AVX2:
3461 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003462 case SSE42:
3463 case SSE41:
3464 case SSSE3:
3465 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003466 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003467 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003468 break;
3469 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003470 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003471 break;
3472 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003473 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003474 }
3475 }
3476
Anders Carlssone437c682010-01-27 03:47:49 +00003477 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003478 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003479 case AMD3DNowAthlon:
3480 Builder.defineMacro("__3dNOW_A__");
3481 case AMD3DNow:
3482 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003483 case MMX:
3484 Builder.defineMacro("__MMX__");
3485 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003486 break;
3487 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003488
3489 if (CPU >= CK_i486) {
3490 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3491 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3492 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3493 }
3494 if (CPU >= CK_i586)
3495 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003496}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003497
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003498bool X86TargetInfo::hasFeature(StringRef Feature) const {
3499 return llvm::StringSwitch<bool>(Feature)
3500 .Case("aes", HasAES)
3501 .Case("avx", SSELevel >= AVX)
3502 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003503 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003504 .Case("avx512cd", HasAVX512CD)
3505 .Case("avx512er", HasAVX512ER)
3506 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003507 .Case("avx512dq", HasAVX512DQ)
3508 .Case("avx512bw", HasAVX512BW)
3509 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003510 .Case("avx512vbmi", HasAVX512VBMI)
3511 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003512 .Case("bmi", HasBMI)
3513 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003514 .Case("clflushopt", HasCLFLUSHOPT)
3515 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003516 .Case("cx16", HasCX16)
3517 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003518 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003519 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003520 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003521 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003522 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003523 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3524 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3525 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003526 .Case("movbe", HasMOVBE)
3527 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003528 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003529 .Case("pcommit", HasPCOMMIT)
3530 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003531 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003532 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003533 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003534 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003535 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003536 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003537 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003538 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003539 .Case("sse", SSELevel >= SSE1)
3540 .Case("sse2", SSELevel >= SSE2)
3541 .Case("sse3", SSELevel >= SSE3)
3542 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003543 .Case("sse4.1", SSELevel >= SSE41)
3544 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003545 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003546 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003547 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003548 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003549 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3550 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003551 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003552 .Case("xsave", HasXSAVE)
3553 .Case("xsavec", HasXSAVEC)
3554 .Case("xsaves", HasXSAVES)
3555 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003556 .Default(false);
3557}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003558
Eric Christopherd9832702015-06-29 21:00:05 +00003559// We can't use a generic validation scheme for the features accepted here
3560// versus subtarget features accepted in the target attribute because the
3561// bitfield structure that's initialized in the runtime only supports the
3562// below currently rather than the full range of subtarget features. (See
3563// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3564bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3565 return llvm::StringSwitch<bool>(FeatureStr)
3566 .Case("cmov", true)
3567 .Case("mmx", true)
3568 .Case("popcnt", true)
3569 .Case("sse", true)
3570 .Case("sse2", true)
3571 .Case("sse3", true)
3572 .Case("sse4.1", true)
3573 .Case("sse4.2", true)
3574 .Case("avx", true)
3575 .Case("avx2", true)
3576 .Case("sse4a", true)
3577 .Case("fma4", true)
3578 .Case("xop", true)
3579 .Case("fma", true)
3580 .Case("avx512f", true)
3581 .Case("bmi", true)
3582 .Case("bmi2", true)
3583 .Default(false);
3584}
3585
Eli Friedman3fd920a2008-08-20 02:34:37 +00003586bool
Anders Carlsson58436352009-02-28 17:11:49 +00003587X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003588 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003589 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003590 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003591 // Constant constraints.
3592 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3593 // instructions.
3594 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3595 // x86_64 instructions.
3596 case 's':
3597 Info.setRequiresImmediate();
3598 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003599 case 'I':
3600 Info.setRequiresImmediate(0, 31);
3601 return true;
3602 case 'J':
3603 Info.setRequiresImmediate(0, 63);
3604 return true;
3605 case 'K':
3606 Info.setRequiresImmediate(-128, 127);
3607 return true;
3608 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003609 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003610 return true;
3611 case 'M':
3612 Info.setRequiresImmediate(0, 3);
3613 return true;
3614 case 'N':
3615 Info.setRequiresImmediate(0, 255);
3616 return true;
3617 case 'O':
3618 Info.setRequiresImmediate(0, 127);
3619 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003620 // Register constraints.
3621 case 'Y': // 'Y' is the first character for several 2-character constraints.
3622 // Shift the pointer to the second character of the constraint.
3623 Name++;
3624 switch (*Name) {
3625 default:
3626 return false;
3627 case '0': // First SSE register.
3628 case 't': // Any SSE register, when SSE2 is enabled.
3629 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3630 case 'm': // Any MMX register, when inter-unit moves enabled.
3631 Info.setAllowsRegister();
3632 return true;
3633 }
3634 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003635 // Constraint 'f' cannot be used for output operands.
3636 if (Info.ConstraintStr[0] == '=')
3637 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003638 Info.setAllowsRegister();
3639 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003640 case 'a': // eax.
3641 case 'b': // ebx.
3642 case 'c': // ecx.
3643 case 'd': // edx.
3644 case 'S': // esi.
3645 case 'D': // edi.
3646 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003647 case 't': // Top of floating point stack.
3648 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003649 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003650 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003651 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003652 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003653 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3654 case 'l': // "Index" registers: any general register that can be used as an
3655 // index in a base+index memory access.
3656 Info.setAllowsRegister();
3657 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003658 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003659 case 'C': // SSE floating point constant.
3660 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003661 return true;
3662 }
3663}
3664
Akira Hatanaka974131e2014-09-18 18:17:18 +00003665bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3666 unsigned Size) const {
3667 // Strip off constraint modifiers.
3668 while (Constraint[0] == '=' ||
3669 Constraint[0] == '+' ||
3670 Constraint[0] == '&')
3671 Constraint = Constraint.substr(1);
3672
3673 return validateOperandSize(Constraint, Size);
3674}
3675
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003676bool X86TargetInfo::validateInputSize(StringRef Constraint,
3677 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003678 return validateOperandSize(Constraint, Size);
3679}
3680
3681bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3682 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003683 switch (Constraint[0]) {
3684 default: break;
3685 case 'y':
3686 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003687 case 'f':
3688 case 't':
3689 case 'u':
3690 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003691 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003692 if (SSELevel >= AVX512F)
3693 // 512-bit zmm registers can be used if target supports AVX512F.
3694 return Size <= 512U;
3695 else if (SSELevel >= AVX)
3696 // 256-bit ymm registers can be used if target supports AVX.
3697 return Size <= 256U;
3698 return Size <= 128U;
3699 case 'Y':
3700 // 'Y' is the first character for several 2-character constraints.
3701 switch (Constraint[1]) {
3702 default: break;
3703 case 'm':
3704 // 'Ym' is synonymous with 'y'.
3705 return Size <= 64;
3706 case 'i':
3707 case 't':
3708 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3709 if (SSELevel >= AVX512F)
3710 return Size <= 512U;
3711 else if (SSELevel >= AVX)
3712 return Size <= 256U;
3713 return SSELevel >= SSE2 && Size <= 128U;
3714 }
3715
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003716 }
3717
3718 return true;
3719}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003720
Eli Friedman3fd920a2008-08-20 02:34:37 +00003721std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003722X86TargetInfo::convertConstraint(const char *&Constraint) const {
3723 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003724 case 'a': return std::string("{ax}");
3725 case 'b': return std::string("{bx}");
3726 case 'c': return std::string("{cx}");
3727 case 'd': return std::string("{dx}");
3728 case 'S': return std::string("{si}");
3729 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003730 case 'p': // address
3731 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003732 case 't': // top of floating point stack.
3733 return std::string("{st}");
3734 case 'u': // second from top of floating point stack.
3735 return std::string("{st(1)}"); // second from top of floating point stack.
3736 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003737 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003738 }
3739}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003740
Eli Friedman3fd920a2008-08-20 02:34:37 +00003741// X86-32 generic target
3742class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003743public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003744 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003745 DoubleAlign = LongLongAlign = 32;
3746 LongDoubleWidth = 96;
3747 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003748 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003749 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003750 SizeType = UnsignedInt;
3751 PtrDiffType = SignedInt;
3752 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003753 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003754
3755 // Use fpret for all types.
3756 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3757 (1 << TargetInfo::Double) |
3758 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003759
3760 // x86-32 has atomics up to 8 bytes
3761 // FIXME: Check that we actually have cmpxchg8b before setting
3762 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3763 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003764 }
Craig Topper3164f332014-03-11 03:39:26 +00003765 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003766 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003767 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003768
Craig Topper3164f332014-03-11 03:39:26 +00003769 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003770 if (RegNo == 0) return 0;
3771 if (RegNo == 1) return 2;
3772 return -1;
3773 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003774 bool validateOperandSize(StringRef Constraint,
3775 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003776 switch (Constraint[0]) {
3777 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003778 case 'R':
3779 case 'q':
3780 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003781 case 'a':
3782 case 'b':
3783 case 'c':
3784 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003785 case 'S':
3786 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003787 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003788 case 'A':
3789 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003790 }
3791
Akira Hatanaka974131e2014-09-18 18:17:18 +00003792 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003793 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003794};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003795
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003796class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3797public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003798 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3799 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003800
Craig Topper3164f332014-03-11 03:39:26 +00003801 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003802 unsigned Major, Minor, Micro;
3803 getTriple().getOSVersion(Major, Minor, Micro);
3804 // New NetBSD uses the default rounding mode.
3805 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3806 return X86_32TargetInfo::getFloatEvalMethod();
3807 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003808 return 1;
3809 }
3810};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003811
Eli Friedmane3aa4542009-07-05 18:47:56 +00003812class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3813public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003814 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3815 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003816 SizeType = UnsignedLong;
3817 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003818 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003819 }
3820};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003821
Eli Friedman9fa28852012-08-08 23:57:20 +00003822class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3823public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003824 BitrigI386TargetInfo(const llvm::Triple &Triple)
3825 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003826 SizeType = UnsignedLong;
3827 IntPtrType = SignedLong;
3828 PtrDiffType = SignedLong;
3829 }
3830};
Eli Friedman9fa28852012-08-08 23:57:20 +00003831
Torok Edwinb2b37c62009-06-30 17:10:35 +00003832class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003833public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003834 DarwinI386TargetInfo(const llvm::Triple &Triple)
3835 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003836 LongDoubleWidth = 128;
3837 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003838 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003839 MaxVectorAlign = 256;
3840 // The watchOS simulator uses the builtin bool type for Objective-C.
3841 llvm::Triple T = llvm::Triple(Triple);
3842 if (T.isWatchOS())
3843 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003844 SizeType = UnsignedLong;
3845 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003846 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003847 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003848 }
3849
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003850 bool handleTargetFeatures(std::vector<std::string> &Features,
3851 DiagnosticsEngine &Diags) override {
3852 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3853 Diags))
3854 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003855 // We now know the features we have: we can decide how to align vectors.
3856 MaxVectorAlign =
3857 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003858 return true;
3859 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003860};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003861
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003862// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003863class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003864public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003865 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3866 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003867 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003868 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003869 bool IsWinCOFF =
3870 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003871 resetDataLayout(IsWinCOFF
3872 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3873 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003874 }
Craig Topper3164f332014-03-11 03:39:26 +00003875 void getTargetDefines(const LangOptions &Opts,
3876 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003877 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3878 }
3879};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003880
3881// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003882class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003883public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003884 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003885 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003886 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003887 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3888 }
Craig Topper3164f332014-03-11 03:39:26 +00003889 void getTargetDefines(const LangOptions &Opts,
3890 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003891 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3892 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3893 // The value of the following reflects processor type.
3894 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3895 // We lost the original triple, so we use the default.
3896 Builder.defineMacro("_M_IX86", "600");
3897 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003898};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003899
David Majnemerae1ed0e2015-05-28 04:36:18 +00003900static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003901 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3902 // supports __declspec natively under -fms-extensions, but we define a no-op
3903 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003904 if (Opts.MicrosoftExt)
3905 Builder.defineMacro("__declspec", "__declspec");
3906 else
3907 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3908
3909 if (!Opts.MicrosoftExt) {
3910 // Provide macros for all the calling convention keywords. Provide both
3911 // single and double underscore prefixed variants. These are available on
3912 // x64 as well as x86, even though they have no effect.
3913 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3914 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003915 std::string GCCSpelling = "__attribute__((__";
3916 GCCSpelling += CC;
3917 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003918 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3919 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3920 }
3921 }
3922}
3923
David Majnemerae1ed0e2015-05-28 04:36:18 +00003924static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3925 Builder.defineMacro("__MSVCRT__");
3926 Builder.defineMacro("__MINGW32__");
3927 addCygMingDefines(Opts, Builder);
3928}
3929
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003930// x86-32 MinGW target
3931class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3932public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003933 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003934 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003935 void getTargetDefines(const LangOptions &Opts,
3936 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003937 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003938 DefineStd(Builder, "WIN32", Opts);
3939 DefineStd(Builder, "WINNT", Opts);
3940 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003941 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003942 }
3943};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003944
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003945// x86-32 Cygwin target
3946class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3947public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003948 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3949 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003950 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003951 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00003952 resetDataLayout("e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003953 }
Craig Topper3164f332014-03-11 03:39:26 +00003954 void getTargetDefines(const LangOptions &Opts,
3955 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003956 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003957 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003958 Builder.defineMacro("__CYGWIN__");
3959 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003960 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003961 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003962 if (Opts.CPlusPlus)
3963 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003964 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003965};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003966
Chris Lattnerb986aba2010-04-11 19:29:39 +00003967// x86-32 Haiku target
3968class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3969public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003970 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003971 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003972 IntPtrType = SignedLong;
3973 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003974 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003975 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003976 }
Craig Topper3164f332014-03-11 03:39:26 +00003977 void getTargetDefines(const LangOptions &Opts,
3978 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003979 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3980 Builder.defineMacro("__INTEL__");
3981 Builder.defineMacro("__HAIKU__");
3982 }
3983};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003984
Alexey Bataevc99b0492015-11-25 09:24:26 +00003985// X86-32 MCU target
3986class MCUX86_32TargetInfo : public X86_32TargetInfo {
3987public:
3988 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3989 LongDoubleWidth = 64;
3990 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00003991 resetDataLayout("e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32");
Andrey Bokhanko6e34c1d2016-02-04 11:54:45 +00003992 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003993 }
3994
3995 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3996 // On MCU we support only C calling convention.
3997 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3998 }
3999
4000 void getTargetDefines(const LangOptions &Opts,
4001 MacroBuilder &Builder) const override {
4002 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4003 Builder.defineMacro("__iamcu");
4004 Builder.defineMacro("__iamcu__");
4005 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004006
4007 bool allowsLargerPreferedTypeAlignment() const override {
4008 return false;
4009 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004010};
4011
Douglas Gregor9fabd852011-07-01 22:41:14 +00004012// RTEMS Target
4013template<typename Target>
4014class RTEMSTargetInfo : public OSTargetInfo<Target> {
4015protected:
Craig Topper3164f332014-03-11 03:39:26 +00004016 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4017 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004018 // RTEMS defines; list based off of gcc output
4019
Douglas Gregor9fabd852011-07-01 22:41:14 +00004020 Builder.defineMacro("__rtems__");
4021 Builder.defineMacro("__ELF__");
4022 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004023
Douglas Gregor9fabd852011-07-01 22:41:14 +00004024public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004025 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004026 switch (Triple.getArch()) {
4027 default:
4028 case llvm::Triple::x86:
4029 // this->MCountName = ".mcount";
4030 break;
4031 case llvm::Triple::mips:
4032 case llvm::Triple::mipsel:
4033 case llvm::Triple::ppc:
4034 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004035 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004036 // this->MCountName = "_mcount";
4037 break;
4038 case llvm::Triple::arm:
4039 // this->MCountName = "__mcount";
4040 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004041 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004042 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004043};
4044
Douglas Gregor9fabd852011-07-01 22:41:14 +00004045// x86-32 RTEMS target
4046class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4047public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004048 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004049 SizeType = UnsignedLong;
4050 IntPtrType = SignedLong;
4051 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004052 }
Craig Topper3164f332014-03-11 03:39:26 +00004053 void getTargetDefines(const LangOptions &Opts,
4054 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004055 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4056 Builder.defineMacro("__INTEL__");
4057 Builder.defineMacro("__rtems__");
4058 }
4059};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004060
Eli Friedman3fd920a2008-08-20 02:34:37 +00004061// x86-64 generic target
4062class X86_64TargetInfo : public X86TargetInfo {
4063public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004064 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00004065 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004066 bool IsWinCOFF =
4067 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004068 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004069 LongDoubleWidth = 128;
4070 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004071 LargeArrayMinWidth = 128;
4072 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004073 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004074 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4075 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4076 IntPtrType = IsX32 ? SignedInt : SignedLong;
4077 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004078 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004079 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004080
Eric Christopher917e9522014-11-18 22:36:15 +00004081 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004082 resetDataLayout(IsX32
4083 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4084 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4085 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004086
4087 // Use fpret only for long double.
4088 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004089
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004090 // Use fp2ret for _Complex long double.
4091 ComplexLongDoubleUsesFP2Ret = true;
4092
Charles Davisc7d5c942015-09-17 20:55:33 +00004093 // Make __builtin_ms_va_list available.
4094 HasBuiltinMSVaList = true;
4095
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004096 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004097 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004098 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004099 }
Craig Topper3164f332014-03-11 03:39:26 +00004100 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004101 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004102 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004103
Craig Topper3164f332014-03-11 03:39:26 +00004104 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004105 if (RegNo == 0) return 0;
4106 if (RegNo == 1) return 1;
4107 return -1;
4108 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004109
Craig Topper3164f332014-03-11 03:39:26 +00004110 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004111 switch (CC) {
4112 case CC_C:
4113 case CC_Swift:
4114 case CC_X86VectorCall:
4115 case CC_IntelOclBicc:
4116 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004117 case CC_PreserveMost:
4118 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004119 return CCCR_OK;
4120 default:
4121 return CCCR_Warning;
4122 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004123 }
4124
Craig Topper3164f332014-03-11 03:39:26 +00004125 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004126 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004127 }
4128
Pavel Chupinfd223e12014-08-04 12:39:43 +00004129 // for x32 we need it here explicitly
4130 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004131 unsigned getUnwindWordWidth() const override { return 64; }
4132 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004133
4134 bool validateGlobalRegisterVariable(StringRef RegName,
4135 unsigned RegSize,
4136 bool &HasSizeMismatch) const override {
4137 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4138 // handle.
4139 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4140 // Check that the register size is 64-bit.
4141 HasSizeMismatch = RegSize != 64;
4142 return true;
4143 }
4144
4145 // Check if the register is a 32-bit register the backend can handle.
4146 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4147 HasSizeMismatch);
4148 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004149};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004150
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004151// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004152class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004153public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004154 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4155 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004156 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004157 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004158 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004159 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004160 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004161 SizeType = UnsignedLongLong;
4162 PtrDiffType = SignedLongLong;
4163 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004164 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004165
Craig Topper3164f332014-03-11 03:39:26 +00004166 void getTargetDefines(const LangOptions &Opts,
4167 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004168 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004169 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004170 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004171
Craig Topper3164f332014-03-11 03:39:26 +00004172 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004173 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004174 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004175
Craig Topper3164f332014-03-11 03:39:26 +00004176 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004177 switch (CC) {
4178 case CC_X86StdCall:
4179 case CC_X86ThisCall:
4180 case CC_X86FastCall:
4181 return CCCR_Ignore;
4182 case CC_C:
4183 case CC_X86VectorCall:
4184 case CC_IntelOclBicc:
4185 case CC_X86_64SysV:
4186 return CCCR_OK;
4187 default:
4188 return CCCR_Warning;
4189 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004190 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004191};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004192
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004193// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004194class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004195public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004196 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004197 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004198 LongDoubleWidth = LongDoubleAlign = 64;
4199 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004200 }
Craig Topper3164f332014-03-11 03:39:26 +00004201 void getTargetDefines(const LangOptions &Opts,
4202 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004203 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4204 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004205 Builder.defineMacro("_M_X64", "100");
4206 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004207 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004208};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004209
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004210// x86-64 MinGW target
4211class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4212public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004213 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004214 : WindowsX86_64TargetInfo(Triple) {
4215 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4216 // with x86 FP ops. Weird.
4217 LongDoubleWidth = LongDoubleAlign = 128;
4218 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4219 }
4220
Craig Topper3164f332014-03-11 03:39:26 +00004221 void getTargetDefines(const LangOptions &Opts,
4222 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004223 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004224 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004225 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004226 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004227
4228 // GCC defines this macro when it is using __gxx_personality_seh0.
4229 if (!Opts.SjLjExceptions)
4230 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004231 }
4232};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004233
Yaron Kerend030d112015-07-22 17:38:19 +00004234// x86-64 Cygwin target
4235class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4236public:
4237 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4238 : X86_64TargetInfo(Triple) {
4239 TLSSupported = false;
4240 WCharType = UnsignedShort;
4241 }
4242 void getTargetDefines(const LangOptions &Opts,
4243 MacroBuilder &Builder) const override {
4244 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4245 Builder.defineMacro("__x86_64__");
4246 Builder.defineMacro("__CYGWIN__");
4247 Builder.defineMacro("__CYGWIN64__");
4248 addCygMingDefines(Opts, Builder);
4249 DefineStd(Builder, "unix", Opts);
4250 if (Opts.CPlusPlus)
4251 Builder.defineMacro("_GNU_SOURCE");
4252
4253 // GCC defines this macro when it is using __gxx_personality_seh0.
4254 if (!Opts.SjLjExceptions)
4255 Builder.defineMacro("__SEH__");
4256 }
4257};
4258
Eli Friedman2857ccb2009-07-01 03:36:11 +00004259class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4260public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004261 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4262 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004263 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004264 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4265 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004266 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004267 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004268 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004269 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004270
4271 bool handleTargetFeatures(std::vector<std::string> &Features,
4272 DiagnosticsEngine &Diags) override {
4273 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4274 Diags))
4275 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004276 // We now know the features we have: we can decide how to align vectors.
4277 MaxVectorAlign =
4278 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004279 return true;
4280 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004281};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004282
Eli Friedman245f2292009-07-05 22:31:18 +00004283class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4284public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004285 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4286 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004287 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004288 Int64Type = SignedLongLong;
4289 }
4290};
Eli Friedman245f2292009-07-05 22:31:18 +00004291
Eli Friedman9fa28852012-08-08 23:57:20 +00004292class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4293public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004294 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4295 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4296 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004297 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004298 }
4299};
Tim Northover9bb857a2013-01-31 12:13:10 +00004300
Eli Friedmanf05b7722008-08-20 07:44:10 +00004301class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004302 // Possible FPU choices.
4303 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004304 VFP2FPU = (1 << 0),
4305 VFP3FPU = (1 << 1),
4306 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004307 NeonFPU = (1 << 3),
4308 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004309 };
4310
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004311 // Possible HWDiv features.
4312 enum HWDivMode {
4313 HWDivThumb = (1 << 0),
4314 HWDivARM = (1 << 1)
4315 };
4316
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004317 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004318 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004319 }
4320
4321 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4322 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004323
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004324 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004325
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004326 StringRef CPUProfile;
4327 StringRef CPUAttr;
4328
Rafael Espindolaeb265472013-08-21 21:59:03 +00004329 enum {
4330 FP_Default,
4331 FP_VFP,
4332 FP_Neon
4333 } FPMath;
4334
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004335 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004336 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004337 unsigned ArchProfile;
4338 unsigned ArchVersion;
4339
Bernard Ogdenda13af32013-10-24 18:32:51 +00004340 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004341
Logan Chien57086ce2012-10-10 06:56:20 +00004342 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004343 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004344
4345 // Initialized via features.
4346 unsigned SoftFloat : 1;
4347 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004348
Bernard Ogden18b57012013-10-29 09:47:51 +00004349 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004350 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004351 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004352 unsigned Unaligned : 1;
4353
4354 enum {
4355 LDREX_B = (1 << 0), /// byte (8-bit)
4356 LDREX_H = (1 << 1), /// half (16-bit)
4357 LDREX_W = (1 << 2), /// word (32-bit)
4358 LDREX_D = (1 << 3), /// double (64-bit)
4359 };
4360
4361 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004362
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004363 // ACLE 6.5.1 Hardware floating point
4364 enum {
4365 HW_FP_HP = (1 << 1), /// half (16-bit)
4366 HW_FP_SP = (1 << 2), /// single (32-bit)
4367 HW_FP_DP = (1 << 3), /// double (64-bit)
4368 };
4369 uint32_t HW_FP;
4370
Chris Lattner5cc15e02010-03-03 19:03:45 +00004371 static const Builtin::Info BuiltinInfo[];
4372
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004373 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004374 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004375
4376 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004377 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004378
Renato Golin9ba39232015-02-27 16:35:48 +00004379 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4380 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4381 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004382 SizeType = UnsignedLong;
4383 else
4384 SizeType = UnsignedInt;
4385
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004386 switch (T.getOS()) {
4387 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004388 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004389 break;
4390 case llvm::Triple::Win32:
4391 WCharType = UnsignedShort;
4392 break;
4393 case llvm::Triple::Linux:
4394 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004395 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4396 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004397 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004398 }
4399
4400 UseBitFieldTypeAlignment = true;
4401
4402 ZeroLengthBitfieldBoundary = 0;
4403
Tim Northover147cd2f2014-10-14 22:12:21 +00004404 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4405 // so set preferred for small types to 32.
4406 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004407 resetDataLayout(BigEndian
4408 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4409 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004410 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004411 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004412 resetDataLayout("e"
4413 "-m:w"
4414 "-p:32:32"
4415 "-i64:64"
4416 "-v128:64:128"
4417 "-a:0:32"
4418 "-n32"
4419 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004420 } else if (T.isOSNaCl()) {
4421 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004422 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004423 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004424 resetDataLayout(BigEndian
4425 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4426 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004427 }
4428
4429 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004430 }
4431
Tim Northover5627d392015-10-30 16:30:45 +00004432 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004433 const llvm::Triple &T = getTriple();
4434
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004435 IsAAPCS = false;
4436
Tim Northover5627d392015-10-30 16:30:45 +00004437 if (IsAAPCS16)
4438 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4439 else
4440 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004441
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004442 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004443 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004444 SizeType = UnsignedInt;
4445 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004446 SizeType = UnsignedLong;
4447
4448 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4449 WCharType = SignedInt;
4450
4451 // Do not respect the alignment of bit-field types when laying out
4452 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4453 UseBitFieldTypeAlignment = false;
4454
4455 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4456 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4457 /// gcc.
4458 ZeroLengthBitfieldBoundary = 32;
4459
Tim Northover5627d392015-10-30 16:30:45 +00004460 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4461 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004462 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004463 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004464 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004465 BigEndian
4466 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
James Y Knightb214cbc2016-03-04 19:00:41 +00004467 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
Tim Northover147cd2f2014-10-14 22:12:21 +00004468 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004469 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004470 BigEndian
4471 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
James Y Knightb214cbc2016-03-04 19:00:41 +00004472 : "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 +00004473
4474 // FIXME: Override "preferred align" for double and long long.
4475 }
4476
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004477 void setArchInfo() {
4478 StringRef ArchName = getTriple().getArchName();
4479
Renato Goline84b0002015-10-08 16:43:26 +00004480 ArchISA = llvm::ARM::parseArchISA(ArchName);
4481 CPU = llvm::ARM::getDefaultCPU(ArchName);
4482 unsigned AK = llvm::ARM::parseArch(ArchName);
4483 if (AK != llvm::ARM::AK_INVALID)
4484 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004485 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004486 }
4487
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004488 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004489 StringRef SubArch;
4490
4491 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004492 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004493 SubArch = llvm::ARM::getSubArch(ArchKind);
4494 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4495 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004496
4497 // cache CPU related strings
4498 CPUAttr = getCPUAttr();
4499 CPUProfile = getCPUProfile();
4500 }
4501
4502 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004503 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004504 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004505 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004506 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4507 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004508 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004509 if (ArchProfile == llvm::ARM::PK_M) {
4510 MaxAtomicPromoteWidth = 32;
4511 if (ShouldUseInlineAtomic)
4512 MaxAtomicInlineWidth = 32;
4513 }
4514 else {
4515 MaxAtomicPromoteWidth = 64;
4516 if (ShouldUseInlineAtomic)
4517 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004518 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004519 }
4520
4521 bool isThumb() const {
4522 return (ArchISA == llvm::ARM::IK_THUMB);
4523 }
4524
4525 bool supportsThumb() const {
4526 return CPUAttr.count('T') || ArchVersion >= 6;
4527 }
4528
4529 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004530 return CPUAttr.equals("6T2") ||
4531 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004532 }
4533
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004534 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004535 // For most sub-arches, the build attribute CPU name is enough.
4536 // For Cortex variants, it's slightly different.
4537 switch(ArchKind) {
4538 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004539 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004540 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004541 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004542 case llvm::ARM::AK_ARMV7S:
4543 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004544 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004545 return "7A";
4546 case llvm::ARM::AK_ARMV7R:
4547 return "7R";
4548 case llvm::ARM::AK_ARMV7M:
4549 return "7M";
4550 case llvm::ARM::AK_ARMV7EM:
4551 return "7EM";
4552 case llvm::ARM::AK_ARMV8A:
4553 return "8A";
4554 case llvm::ARM::AK_ARMV8_1A:
4555 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004556 case llvm::ARM::AK_ARMV8_2A:
4557 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004558 case llvm::ARM::AK_ARMV8MBaseline:
4559 return "8M_BASE";
4560 case llvm::ARM::AK_ARMV8MMainline:
4561 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004562 }
4563 }
4564
4565 StringRef getCPUProfile() const {
4566 switch(ArchProfile) {
4567 case llvm::ARM::PK_A:
4568 return "A";
4569 case llvm::ARM::PK_R:
4570 return "R";
4571 case llvm::ARM::PK_M:
4572 return "M";
4573 default:
4574 return "";
4575 }
4576 }
4577
Chris Lattner17df24e2008-04-21 18:56:49 +00004578public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004579 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004580 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004581 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004582 BigEndian = IsBigEndian;
4583
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004584 switch (getTriple().getOS()) {
4585 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004586 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004587 break;
4588 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004589 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004590 break;
4591 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004592
Renato Goline84b0002015-10-08 16:43:26 +00004593 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004594 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004595
Chris Lattner1a8f3942010-04-23 16:29:58 +00004596 // {} in inline assembly are neon specifiers, not assembly variant
4597 // specifiers.
4598 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004599
Eric Christopher0e261882014-12-05 01:06:59 +00004600 // FIXME: This duplicates code from the driver that sets the -target-abi
4601 // option - this code is used if -target-abi isn't passed and should
4602 // be unified in some way.
4603 if (Triple.isOSBinFormatMachO()) {
4604 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4605 // the frontend matches that.
4606 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4607 Triple.getOS() == llvm::Triple::UnknownOS ||
4608 StringRef(CPU).startswith("cortex-m")) {
4609 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004610 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004611 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004612 } else {
4613 setABI("apcs-gnu");
4614 }
4615 } else if (Triple.isOSWindows()) {
4616 // FIXME: this is invalid for WindowsCE
4617 setABI("aapcs");
4618 } else {
4619 // Select the default based on the platform.
4620 switch (Triple.getEnvironment()) {
4621 case llvm::Triple::Android:
4622 case llvm::Triple::GNUEABI:
4623 case llvm::Triple::GNUEABIHF:
4624 setABI("aapcs-linux");
4625 break;
4626 case llvm::Triple::EABIHF:
4627 case llvm::Triple::EABI:
4628 setABI("aapcs");
4629 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004630 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004631 setABI("apcs-gnu");
4632 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004633 default:
4634 if (Triple.getOS() == llvm::Triple::NetBSD)
4635 setABI("apcs-gnu");
4636 else
4637 setABI("aapcs");
4638 break;
4639 }
4640 }
John McCall86353412010-08-21 22:46:04 +00004641
4642 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004643 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004644
Renato Golin15b86152015-07-03 16:41:13 +00004645 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004646 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004647
James Molloya7139222012-03-12 09:14:10 +00004648 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004649 // the alignment of the zero-length bitfield is greater than the member
4650 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004651 // zero length bitfield.
4652 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004653 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004654
Alp Toker4925ba72014-06-07 23:30:42 +00004655 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004656
Craig Topper3164f332014-03-11 03:39:26 +00004657 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004658 ABI = Name;
4659
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004660 // The defaults (above) are for AAPCS, check if we need to change them.
4661 //
4662 // FIXME: We need support for -meabi... we could just mangle it into the
4663 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004664 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004665 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004666 return true;
4667 }
4668 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4669 setABIAAPCS();
4670 return true;
4671 }
4672 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004673 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004674
Renato Golinf5c4dec2015-05-27 13:33:00 +00004675 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004676 bool
4677 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4678 StringRef CPU,
4679 const std::vector<std::string> &FeaturesVec) const override {
4680
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004681 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004682 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004683
4684 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004685 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004686 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4687
4688 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004689 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004690 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4691
4692 for (const char *Feature : TargetFeatures)
4693 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004694 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004695
Eric Christopher007b0a02015-08-28 22:32:01 +00004696 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004697 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004698
Craig Topper3164f332014-03-11 03:39:26 +00004699 bool handleTargetFeatures(std::vector<std::string> &Features,
4700 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004701 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004702 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004703 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004704 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004705 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004706 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004707 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004708
Ranjeet Singhac08e532015-06-24 23:39:25 +00004709 // This does not diagnose illegal cases like having both
4710 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4711 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004712 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004713 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004714 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004715 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004716 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004717 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004718 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004719 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004720 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004721 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004722 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004723 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004724 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004725 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004726 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004727 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004728 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004729 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004730 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004731 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004732 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004733 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004734 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004735 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004736 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004737 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004738 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004739 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004740 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004741 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004742 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004743 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004744 } else if (Feature == "+strict-align") {
4745 Unaligned = 0;
4746 } else if (Feature == "+fp16") {
4747 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004748 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004749 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004750 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004751
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004752 switch (ArchVersion) {
4753 case 6:
4754 if (ArchProfile == llvm::ARM::PK_M)
4755 LDREX = 0;
4756 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4757 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4758 else
4759 LDREX = LDREX_W;
4760 break;
4761 case 7:
4762 if (ArchProfile == llvm::ARM::PK_M)
4763 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4764 else
4765 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4766 break;
4767 case 8:
4768 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4769 }
4770
Rafael Espindolaeb265472013-08-21 21:59:03 +00004771 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4772 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4773 return false;
4774 }
4775
4776 if (FPMath == FP_Neon)
4777 Features.push_back("+neonfp");
4778 else if (FPMath == FP_VFP)
4779 Features.push_back("-neonfp");
4780
Daniel Dunbar893d4752009-12-19 04:15:38 +00004781 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004782 auto Feature =
4783 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4784 if (Feature != Features.end())
4785 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004786
Rafael Espindolaeb265472013-08-21 21:59:03 +00004787 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004788 }
4789
Craig Topper3164f332014-03-11 03:39:26 +00004790 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004791 return llvm::StringSwitch<bool>(Feature)
4792 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004793 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004794 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004796 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004797 .Case("hwdiv", HWDiv & HWDivThumb)
4798 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004799 .Default(false);
4800 }
Renato Golin15b86152015-07-03 16:41:13 +00004801
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004802 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004803 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004804 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004805
Renato Golin15b86152015-07-03 16:41:13 +00004806 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004807 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004808 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004809 CPU = Name;
4810 return true;
4811 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004812
Craig Topper3164f332014-03-11 03:39:26 +00004813 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004814
Craig Topper3164f332014-03-11 03:39:26 +00004815 void getTargetDefines(const LangOptions &Opts,
4816 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004817 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004818 Builder.defineMacro("__arm");
4819 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004820
Chris Lattnerecd49032009-03-02 22:27:17 +00004821 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004822 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004823
4824 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4825 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004826 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004827 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4828
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004829 if (!CPUAttr.empty())
4830 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004831
4832 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004833 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004834 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004835
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004836 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004837 // ACLE 6.5.7 Crypto Extension
4838 if (Crypto)
4839 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4840 // ACLE 6.5.8 CRC32 Extension
4841 if (CRC)
4842 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4843 // ACLE 6.5.10 Numeric Maximum and Minimum
4844 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4845 // ACLE 6.5.9 Directed Rounding
4846 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004847 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004848
4849 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4850 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004851 // NOTE that the default profile is assumed to be 'A'
4852 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004853 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4854
Bradley Smithf4affc12016-03-03 13:52:22 +00004855 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4856 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4857 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4858 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004859 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004860 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004861 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004862 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4863
4864 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4865 // instruction set such as ARM or Thumb.
4866 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4867
4868 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4869
4870 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004871 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004872 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004873
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004874 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004875 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004876 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004877
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004878 // ACLE 6.4.4 LDREX/STREX
4879 if (LDREX)
4880 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4881
4882 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004883 if (ArchVersion == 5 ||
4884 (ArchVersion == 6 && CPUProfile != "M") ||
4885 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004886 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4887
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004888 // ACLE 6.5.1 Hardware Floating Point
4889 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004890 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004891
Yi Konga44c4d72014-06-27 21:25:42 +00004892 // ACLE predefines.
4893 Builder.defineMacro("__ARM_ACLE", "200");
4894
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004895 // FP16 support (we currently only support IEEE format).
4896 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4897 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4898
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004899 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4900 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4901 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4902
Mike Stump9d54bd72009-04-08 02:07:04 +00004903 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004904
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004905 // FIXME: It's more complicated than this and we don't really support
4906 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004907 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004908 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004909 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004910
David Tweed8f676532012-10-25 13:33:01 +00004911 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004912 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004913 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4914 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004915 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004916 Builder.defineMacro("__ARM_PCS", "1");
4917
David Tweed8f676532012-10-25 13:33:01 +00004918 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004919 Builder.defineMacro("__ARM_PCS_VFP", "1");
4920 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004921
Daniel Dunbar893d4752009-12-19 04:15:38 +00004922 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004923 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004924
4925 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004926 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004927
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004928 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004929 Builder.defineMacro("__THUMBEL__");
4930 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004931 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004932 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004933 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004934
4935 // ACLE 6.4.9 32-bit SIMD instructions
4936 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4937 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4938
4939 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004940 if (((HWDiv & HWDivThumb) && isThumb()) ||
4941 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004942 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004943 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004944 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004945
4946 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004947 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004948
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004949 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004950 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004951 if (FPU & VFP2FPU)
4952 Builder.defineMacro("__ARM_VFPV2__");
4953 if (FPU & VFP3FPU)
4954 Builder.defineMacro("__ARM_VFPV3__");
4955 if (FPU & VFP4FPU)
4956 Builder.defineMacro("__ARM_VFPV4__");
4957 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004958
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004959 // This only gets set when Neon instructions are actually available, unlike
4960 // the VFP define, hence the soft float and arch check. This is subtly
4961 // different from gcc, we follow the intent which was that it should be set
4962 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004963 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004964 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004965 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004966 // current AArch32 NEON implementations do not support double-precision
4967 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004968 Builder.defineMacro("__ARM_NEON_FP",
4969 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004970 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004971
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004972 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4973 Opts.ShortWChar ? "2" : "4");
4974
4975 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4976 Opts.ShortEnums ? "1" : "4");
4977
Bradley Smithf4affc12016-03-03 13:52:22 +00004978 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004979 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4980 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4981 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4982 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4983 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004984
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004985 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004986 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004987 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004988 }
4989
4990 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004991 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004992 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4993 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004994 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004995 }
4996
4997 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004998 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004999 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005000
5001 if (Opts.UnsafeFPMath)
5002 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005003
5004 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5005 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005006 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005007
Craig Topper6c03a542015-10-19 04:51:35 +00005008 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5009 return llvm::makeArrayRef(BuiltinInfo,
5010 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005011 }
Craig Topper3164f332014-03-11 03:39:26 +00005012 bool isCLZForZeroUndef() const override { return false; }
5013 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005014 return IsAAPCS
5015 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005016 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5017 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005018 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005019 ArrayRef<const char *> getGCCRegNames() const override;
5020 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005021 bool validateAsmConstraint(const char *&Name,
5022 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005023 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005024 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005025 case 'l': // r0-r7
5026 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005027 case 't': // VFP Floating point register single precision
5028 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005029 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005030 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005031 case 'I':
5032 case 'J':
5033 case 'K':
5034 case 'L':
5035 case 'M':
5036 // FIXME
5037 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005038 case 'Q': // A memory address that is a single base register.
5039 Info.setAllowsMemory();
5040 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005041 case 'U': // a memory reference...
5042 switch (Name[1]) {
5043 case 'q': // ...ARMV4 ldrsb
5044 case 'v': // ...VFP load/store (reg+constant offset)
5045 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005046 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005047 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005048 case 'n': // valid address for Neon doubleword vector load/store
5049 case 'm': // valid address for Neon element and structure load/store
5050 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005051 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005052 Info.setAllowsMemory();
5053 Name++;
5054 return true;
5055 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005056 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005057 return false;
5058 }
Craig Topper3164f332014-03-11 03:39:26 +00005059 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005060 std::string R;
5061 switch (*Constraint) {
5062 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005063 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005064 Constraint++;
5065 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005066 case 'p': // 'p' should be translated to 'r' by default.
5067 R = std::string("r");
5068 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005069 default:
5070 return std::string(1, *Constraint);
5071 }
5072 return R;
5073 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005074 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005075 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005076 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005077 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005078 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005079
Bill Wendling9d1ee112012-10-25 23:28:48 +00005080 // Strip off constraint modifiers.
5081 while (Constraint[0] == '=' ||
5082 Constraint[0] == '+' ||
5083 Constraint[0] == '&')
5084 Constraint = Constraint.substr(1);
5085
5086 switch (Constraint[0]) {
5087 default: break;
5088 case 'r': {
5089 switch (Modifier) {
5090 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005091 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005092 case 'q':
5093 // A register of size 32 cannot fit a vector type.
5094 return false;
5095 }
5096 }
5097 }
5098
5099 return true;
5100 }
Craig Topper3164f332014-03-11 03:39:26 +00005101 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005102 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005103 return "";
5104 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005105
Craig Topper3164f332014-03-11 03:39:26 +00005106 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005107 switch (CC) {
5108 case CC_AAPCS:
5109 case CC_AAPCS_VFP:
5110 case CC_Swift:
5111 return CCCR_OK;
5112 default:
5113 return CCCR_Warning;
5114 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005115 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005116
Craig Topper3164f332014-03-11 03:39:26 +00005117 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005118 if (RegNo == 0) return 0;
5119 if (RegNo == 1) return 1;
5120 return -1;
5121 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005122
5123 bool hasSjLjLowering() const override {
5124 return true;
5125 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005126};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005127
Rafael Espindolaeb265472013-08-21 21:59:03 +00005128bool ARMTargetInfo::setFPMath(StringRef Name) {
5129 if (Name == "neon") {
5130 FPMath = FP_Neon;
5131 return true;
5132 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5133 Name == "vfp4") {
5134 FPMath = FP_VFP;
5135 return true;
5136 }
5137 return false;
5138}
5139
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005140const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005141 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005142 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005143 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5144
5145 // Float registers
5146 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5147 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5148 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005149 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005150
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005151 // Double registers
5152 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5153 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005154 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5155 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005156
5157 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005158 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5159 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005160};
5161
Craig Topperf054e3a2015-10-19 03:52:27 +00005162ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5163 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005164}
5165
5166const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005167 { { "a1" }, "r0" },
5168 { { "a2" }, "r1" },
5169 { { "a3" }, "r2" },
5170 { { "a4" }, "r3" },
5171 { { "v1" }, "r4" },
5172 { { "v2" }, "r5" },
5173 { { "v3" }, "r6" },
5174 { { "v4" }, "r7" },
5175 { { "v5" }, "r8" },
5176 { { "v6", "rfp" }, "r9" },
5177 { { "sl" }, "r10" },
5178 { { "fp" }, "r11" },
5179 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005180 { { "r13" }, "sp" },
5181 { { "r14" }, "lr" },
5182 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005183 // The S, D and Q registers overlap, but aren't really aliases; we
5184 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005185};
5186
Craig Topperf054e3a2015-10-19 03:52:27 +00005187ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5188 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005189}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005190
5191const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005192#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005193 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005194#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5195 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005196#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005197
Craig Topper07d3b622015-08-07 05:14:44 +00005198#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005199 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005200#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005201 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005202#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5203 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005204#include "clang/Basic/BuiltinsARM.def"
5205};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005206
5207class ARMleTargetInfo : public ARMTargetInfo {
5208public:
5209 ARMleTargetInfo(const llvm::Triple &Triple)
5210 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005211 void getTargetDefines(const LangOptions &Opts,
5212 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005213 Builder.defineMacro("__ARMEL__");
5214 ARMTargetInfo::getTargetDefines(Opts, Builder);
5215 }
5216};
5217
5218class ARMbeTargetInfo : public ARMTargetInfo {
5219public:
5220 ARMbeTargetInfo(const llvm::Triple &Triple)
5221 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005222 void getTargetDefines(const LangOptions &Opts,
5223 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005224 Builder.defineMacro("__ARMEB__");
5225 Builder.defineMacro("__ARM_BIG_ENDIAN");
5226 ARMTargetInfo::getTargetDefines(Opts, Builder);
5227 }
5228};
Chris Lattner17df24e2008-04-21 18:56:49 +00005229
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005230class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5231 const llvm::Triple Triple;
5232public:
5233 WindowsARMTargetInfo(const llvm::Triple &Triple)
5234 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005235 WCharType = UnsignedShort;
5236 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005237 }
5238 void getVisualStudioDefines(const LangOptions &Opts,
5239 MacroBuilder &Builder) const {
5240 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5241
5242 // FIXME: this is invalid for WindowsCE
5243 Builder.defineMacro("_M_ARM_NT", "1");
5244 Builder.defineMacro("_M_ARMT", "_M_ARM");
5245 Builder.defineMacro("_M_THUMB", "_M_ARM");
5246
5247 assert((Triple.getArch() == llvm::Triple::arm ||
5248 Triple.getArch() == llvm::Triple::thumb) &&
5249 "invalid architecture for Windows ARM target info");
5250 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5251 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5252
5253 // TODO map the complete set of values
5254 // 31: VFPv3 40: VFPv4
5255 Builder.defineMacro("_M_ARM_FP", "31");
5256 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005257 BuiltinVaListKind getBuiltinVaListKind() const override {
5258 return TargetInfo::CharPtrBuiltinVaList;
5259 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005260 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5261 switch (CC) {
5262 case CC_X86StdCall:
5263 case CC_X86ThisCall:
5264 case CC_X86FastCall:
5265 case CC_X86VectorCall:
5266 return CCCR_Ignore;
5267 case CC_C:
5268 return CCCR_OK;
5269 default:
5270 return CCCR_Warning;
5271 }
5272 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005273};
5274
5275// Windows ARM + Itanium C++ ABI Target
5276class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5277public:
5278 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5279 : WindowsARMTargetInfo(Triple) {
5280 TheCXXABI.set(TargetCXXABI::GenericARM);
5281 }
5282
5283 void getTargetDefines(const LangOptions &Opts,
5284 MacroBuilder &Builder) const override {
5285 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5286
5287 if (Opts.MSVCCompat)
5288 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5289 }
5290};
5291
5292// Windows ARM, MS (C++) ABI
5293class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5294public:
5295 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5296 : WindowsARMTargetInfo(Triple) {
5297 TheCXXABI.set(TargetCXXABI::Microsoft);
5298 }
5299
5300 void getTargetDefines(const LangOptions &Opts,
5301 MacroBuilder &Builder) const override {
5302 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5303 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5304 }
5305};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005306
Yaron Keren321249c2015-07-15 13:32:23 +00005307// ARM MinGW target
5308class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5309public:
5310 MinGWARMTargetInfo(const llvm::Triple &Triple)
5311 : WindowsARMTargetInfo(Triple) {
5312 TheCXXABI.set(TargetCXXABI::GenericARM);
5313 }
5314
5315 void getTargetDefines(const LangOptions &Opts,
5316 MacroBuilder &Builder) const override {
5317 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5318 DefineStd(Builder, "WIN32", Opts);
5319 DefineStd(Builder, "WINNT", Opts);
5320 Builder.defineMacro("_ARM_");
5321 addMinGWDefines(Opts, Builder);
5322 }
5323};
5324
5325// ARM Cygwin target
5326class CygwinARMTargetInfo : public ARMleTargetInfo {
5327public:
5328 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5329 TLSSupported = false;
5330 WCharType = UnsignedShort;
5331 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005332 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005333 }
5334 void getTargetDefines(const LangOptions &Opts,
5335 MacroBuilder &Builder) const override {
5336 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5337 Builder.defineMacro("_ARM_");
5338 Builder.defineMacro("__CYGWIN__");
5339 Builder.defineMacro("__CYGWIN32__");
5340 DefineStd(Builder, "unix", Opts);
5341 if (Opts.CPlusPlus)
5342 Builder.defineMacro("_GNU_SOURCE");
5343 }
5344};
5345
Mike Stump11289f42009-09-09 15:08:12 +00005346class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005347 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005348protected:
Craig Topper3164f332014-03-11 03:39:26 +00005349 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5350 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005351 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005352 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005353
Torok Edwinb2b37c62009-06-30 17:10:35 +00005354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005355 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005356 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005357 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005358 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005359 // FIXME: This should be based off of the target features in
5360 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005361 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005362
Tim Northoverd88ecb32016-01-27 19:32:40 +00005363 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005364 // Darwin on iOS uses a variant of the ARM C++ ABI.
5365 TheCXXABI.set(TargetCXXABI::WatchOS);
5366
5367 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5368 // size_t is long, it's a bit weird for it to be int.
5369 PtrDiffType = SignedLong;
5370
5371 // BOOL should be a real boolean on the new ABI
5372 UseSignedCharForObjCBool = false;
5373 } else
5374 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005375 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005376};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005377
Tim Northover573cbee2014-05-24 12:52:07 +00005378class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005379 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005380 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5381 static const char *const GCCRegNames[];
5382
James Molloy75f5f9e2014-04-16 15:33:48 +00005383 enum FPUModeEnum {
5384 FPUMode,
5385 NeonMode
5386 };
5387
5388 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005389 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005390 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005391 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005392 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005393
Tim Northovera2ee4332014-03-29 15:09:45 +00005394 static const Builtin::Info BuiltinInfo[];
5395
5396 std::string ABI;
5397
5398public:
Tim Northover573cbee2014-05-24 12:52:07 +00005399 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005400 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005401
5402 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5403 WCharType = SignedInt;
5404
5405 // NetBSD apparently prefers consistency across ARM targets to consistency
5406 // across 64-bit targets.
5407 Int64Type = SignedLongLong;
5408 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005409 } else {
5410 WCharType = UnsignedInt;
5411 Int64Type = SignedLong;
5412 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005413 }
5414
Tim Northovera2ee4332014-03-29 15:09:45 +00005415 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005416 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005417 MaxAtomicInlineWidth = 128;
5418 MaxAtomicPromoteWidth = 128;
5419
Tim Northovera6a19f12015-02-06 01:25:07 +00005420 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005421 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5422
Tim Northovera2ee4332014-03-29 15:09:45 +00005423 // {} in inline assembly are neon specifiers, not assembly variant
5424 // specifiers.
5425 NoAsmVariants = true;
5426
Tim Northover7ad87af2015-01-16 18:44:04 +00005427 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5428 // contributes to the alignment of the containing aggregate in the same way
5429 // a plain (non bit-field) member of that type would, without exception for
5430 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005431 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005432 UseZeroLengthBitfieldAlignment = true;
5433
Tim Northover573cbee2014-05-24 12:52:07 +00005434 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005435 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5436 }
5437
Alp Toker4925ba72014-06-07 23:30:42 +00005438 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005439 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005440 if (Name != "aapcs" && Name != "darwinpcs")
5441 return false;
5442
5443 ABI = Name;
5444 return true;
5445 }
5446
David Blaikie1cbb9712014-11-14 19:09:44 +00005447 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005448 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005449 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005450 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5451 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005452 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005453 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005454 .Default(false);
5455 return CPUKnown;
5456 }
5457
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005458 void getTargetDefines(const LangOptions &Opts,
5459 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005460 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005461 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005462
5463 // Target properties.
5464 Builder.defineMacro("_LP64");
5465 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005466
5467 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5468 Builder.defineMacro("__ARM_ACLE", "200");
5469 Builder.defineMacro("__ARM_ARCH", "8");
5470 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5471
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005472 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005473 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005474 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005475
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005476 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5477 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5478 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5479 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005480 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005481 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5482 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005483
5484 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5485
5486 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005487 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005488
5489 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5490 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005491 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5492 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005493
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005494 if (Opts.UnsafeFPMath)
5495 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005496
5497 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5498
5499 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5500 Opts.ShortEnums ? "1" : "4");
5501
James Molloy75f5f9e2014-04-16 15:33:48 +00005502 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005503 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005504 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005505 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005506 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005507
Bradley Smith418c5932014-05-02 15:17:51 +00005508 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005509 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005510
James Molloy75f5f9e2014-04-16 15:33:48 +00005511 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005512 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5513
5514 if (Unaligned)
5515 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005516
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005517 if (V8_1A)
5518 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5519
Reid Klecknerd167d422015-05-06 15:31:46 +00005520 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5521 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5522 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5523 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5524 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005525 }
5526
Craig Topper6c03a542015-10-19 04:51:35 +00005527 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5528 return llvm::makeArrayRef(BuiltinInfo,
5529 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005530 }
5531
David Blaikie1cbb9712014-11-14 19:09:44 +00005532 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005533 return Feature == "aarch64" ||
5534 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005535 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005536 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005537 }
5538
James Molloy5e73df52014-04-16 15:06:20 +00005539 bool handleTargetFeatures(std::vector<std::string> &Features,
5540 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005541 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005542 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005543 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005544 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005545 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005546
Eric Christopher610fe112015-08-26 08:21:55 +00005547 for (const auto &Feature : Features) {
5548 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005549 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005550 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005551 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005552 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005553 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005554 if (Feature == "+strict-align")
5555 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005556 if (Feature == "+v8.1a")
5557 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005558 }
5559
James Y Knightb214cbc2016-03-04 19:00:41 +00005560 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005561
5562 return true;
5563 }
5564
John McCall477f2bb2016-03-03 06:39:32 +00005565 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5566 switch (CC) {
5567 case CC_C:
5568 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005569 case CC_PreserveMost:
5570 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005571 return CCCR_OK;
5572 default:
5573 return CCCR_Warning;
5574 }
5575 }
5576
David Blaikie1cbb9712014-11-14 19:09:44 +00005577 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005578
David Blaikie1cbb9712014-11-14 19:09:44 +00005579 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005580 return TargetInfo::AArch64ABIBuiltinVaList;
5581 }
5582
Craig Topperf054e3a2015-10-19 03:52:27 +00005583 ArrayRef<const char *> getGCCRegNames() const override;
5584 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005585
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005586 bool validateAsmConstraint(const char *&Name,
5587 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005588 switch (*Name) {
5589 default:
5590 return false;
5591 case 'w': // Floating point and SIMD registers (V0-V31)
5592 Info.setAllowsRegister();
5593 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005594 case 'I': // Constant that can be used with an ADD instruction
5595 case 'J': // Constant that can be used with a SUB instruction
5596 case 'K': // Constant that can be used with a 32-bit logical instruction
5597 case 'L': // Constant that can be used with a 64-bit logical instruction
5598 case 'M': // Constant that can be used as a 32-bit MOV immediate
5599 case 'N': // Constant that can be used as a 64-bit MOV immediate
5600 case 'Y': // Floating point constant zero
5601 case 'Z': // Integer constant zero
5602 return true;
5603 case 'Q': // A memory reference with base register and no offset
5604 Info.setAllowsMemory();
5605 return true;
5606 case 'S': // A symbolic address
5607 Info.setAllowsRegister();
5608 return true;
5609 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005610 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5611 // Utf: A memory address suitable for ldp/stp in TF mode.
5612 // Usa: An absolute symbolic address.
5613 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5614 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005615 case 'z': // Zero register, wzr or xzr
5616 Info.setAllowsRegister();
5617 return true;
5618 case 'x': // Floating point and SIMD registers (V0-V15)
5619 Info.setAllowsRegister();
5620 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005621 }
5622 return false;
5623 }
5624
Akira Hatanaka987f1862014-08-22 06:05:21 +00005625 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005626 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005627 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005628 // Strip off constraint modifiers.
5629 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5630 Constraint = Constraint.substr(1);
5631
5632 switch (Constraint[0]) {
5633 default:
5634 return true;
5635 case 'z':
5636 case 'r': {
5637 switch (Modifier) {
5638 case 'x':
5639 case 'w':
5640 // For now assume that the person knows what they're
5641 // doing with the modifier.
5642 return true;
5643 default:
5644 // By default an 'r' constraint will be in the 'x'
5645 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005646 if (Size == 64)
5647 return true;
5648
5649 SuggestedModifier = "w";
5650 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005651 }
5652 }
5653 }
5654 }
5655
David Blaikie1cbb9712014-11-14 19:09:44 +00005656 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005657
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005658 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005659 if (RegNo == 0)
5660 return 0;
5661 if (RegNo == 1)
5662 return 1;
5663 return -1;
5664 }
5665};
5666
Tim Northover573cbee2014-05-24 12:52:07 +00005667const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005668 // 32-bit Integer registers
5669 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5670 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5671 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5672
5673 // 64-bit Integer registers
5674 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5675 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5676 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5677
5678 // 32-bit floating point regsisters
5679 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5680 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5681 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5682
5683 // 64-bit floating point regsisters
5684 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5685 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5686 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5687
5688 // Vector registers
5689 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5690 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5691 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5692};
5693
Craig Topperf054e3a2015-10-19 03:52:27 +00005694ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5695 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005696}
5697
Tim Northover573cbee2014-05-24 12:52:07 +00005698const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005699 { { "w31" }, "wsp" },
5700 { { "x29" }, "fp" },
5701 { { "x30" }, "lr" },
5702 { { "x31" }, "sp" },
5703 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5704 // don't want to substitute one of these for a different-sized one.
5705};
5706
Craig Topperf054e3a2015-10-19 03:52:27 +00005707ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5708 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005709}
5710
Tim Northover573cbee2014-05-24 12:52:07 +00005711const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005712#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005713 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005714#include "clang/Basic/BuiltinsNEON.def"
5715
5716#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005717 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005718#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005719};
James Molloy5e73df52014-04-16 15:06:20 +00005720
Tim Northover573cbee2014-05-24 12:52:07 +00005721class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005722 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005723 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005724 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005725 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005726 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005727 }
5728
5729public:
Tim Northover573cbee2014-05-24 12:52:07 +00005730 AArch64leTargetInfo(const llvm::Triple &Triple)
5731 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005732 BigEndian = false;
5733 }
5734 void getTargetDefines(const LangOptions &Opts,
5735 MacroBuilder &Builder) const override {
5736 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005737 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005738 }
5739};
5740
Tim Northover573cbee2014-05-24 12:52:07 +00005741class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005742 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005743 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005744 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005745 }
5746
5747public:
Tim Northover573cbee2014-05-24 12:52:07 +00005748 AArch64beTargetInfo(const llvm::Triple &Triple)
5749 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005750 void getTargetDefines(const LangOptions &Opts,
5751 MacroBuilder &Builder) const override {
5752 Builder.defineMacro("__AARCH64EB__");
5753 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5754 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005755 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005756 }
5757};
Tim Northovera2ee4332014-03-29 15:09:45 +00005758
Tim Northover573cbee2014-05-24 12:52:07 +00005759class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005760protected:
5761 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5762 MacroBuilder &Builder) const override {
5763 Builder.defineMacro("__AARCH64_SIMD__");
5764 Builder.defineMacro("__ARM64_ARCH_8__");
5765 Builder.defineMacro("__ARM_NEON__");
5766 Builder.defineMacro("__LITTLE_ENDIAN__");
5767 Builder.defineMacro("__REGISTER_PREFIX__", "");
5768 Builder.defineMacro("__arm64", "1");
5769 Builder.defineMacro("__arm64__", "1");
5770
5771 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5772 }
5773
Tim Northovera2ee4332014-03-29 15:09:45 +00005774public:
Tim Northover573cbee2014-05-24 12:52:07 +00005775 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5776 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005777 Int64Type = SignedLongLong;
5778 WCharType = SignedInt;
5779 UseSignedCharForObjCBool = false;
5780
Tim Northovera6a19f12015-02-06 01:25:07 +00005781 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005782 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5783
5784 TheCXXABI.set(TargetCXXABI::iOS64);
5785 }
5786
David Blaikie1cbb9712014-11-14 19:09:44 +00005787 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005788 return TargetInfo::CharPtrBuiltinVaList;
5789 }
5790};
Tim Northovera2ee4332014-03-29 15:09:45 +00005791
Tony Linthicum76329bf2011-12-12 21:14:55 +00005792// Hexagon abstract base class
5793class HexagonTargetInfo : public TargetInfo {
5794 static const Builtin::Info BuiltinInfo[];
5795 static const char * const GCCRegNames[];
5796 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5797 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005798 bool HasHVX, HasHVXDouble;
5799
Tony Linthicum76329bf2011-12-12 21:14:55 +00005800public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005801 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005802 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005803 // Specify the vector alignment explicitly. For v512x1, the calculated
5804 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5805 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005806 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005807 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
James Y Knightb214cbc2016-03-04 19:00:41 +00005808 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005809 SizeType = UnsignedInt;
5810 PtrDiffType = SignedInt;
5811 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005812
5813 // {} in inline assembly are packet specifiers, not assembly variant
5814 // specifiers.
5815 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005816
5817 LargeArrayMinWidth = 64;
5818 LargeArrayAlign = 64;
5819 UseBitFieldTypeAlignment = true;
5820 ZeroLengthBitfieldBoundary = 32;
5821 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005822 }
5823
Craig Topper6c03a542015-10-19 04:51:35 +00005824 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5825 return llvm::makeArrayRef(BuiltinInfo,
5826 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005827 }
5828
Craig Topper3164f332014-03-11 03:39:26 +00005829 bool validateAsmConstraint(const char *&Name,
5830 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005831 return true;
5832 }
5833
Craig Topper3164f332014-03-11 03:39:26 +00005834 void getTargetDefines(const LangOptions &Opts,
5835 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005836
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005837 bool isCLZForZeroUndef() const override { return false; }
5838
Craig Topper3164f332014-03-11 03:39:26 +00005839 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005840 return llvm::StringSwitch<bool>(Feature)
5841 .Case("hexagon", true)
5842 .Case("hvx", HasHVX)
5843 .Case("hvx-double", HasHVXDouble)
5844 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005845 }
Craig Topper3164f332014-03-11 03:39:26 +00005846
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005847 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5848 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5849 const override;
5850
5851 bool handleTargetFeatures(std::vector<std::string> &Features,
5852 DiagnosticsEngine &Diags) override;
5853
Craig Topper3164f332014-03-11 03:39:26 +00005854 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005855 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005856 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005857 ArrayRef<const char *> getGCCRegNames() const override;
5858 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005859 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005860 return "";
5861 }
Sebastian Pop86500282012-01-13 20:37:10 +00005862
5863 static const char *getHexagonCPUSuffix(StringRef Name) {
5864 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005865 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005866 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005867 .Case("hexagonv55", "55")
5868 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005869 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005870 }
5871
Craig Topper3164f332014-03-11 03:39:26 +00005872 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005873 if (!getHexagonCPUSuffix(Name))
5874 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005875 CPU = Name;
5876 return true;
5877 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005878
5879 int getEHDataRegisterNumber(unsigned RegNo) const override {
5880 return RegNo < 2 ? RegNo : -1;
5881 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005882};
5883
5884void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005885 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005886 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005887 Builder.defineMacro("__hexagon__", "1");
5888
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005889 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005890 Builder.defineMacro("__HEXAGON_V4__");
5891 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005892 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005893 Builder.defineMacro("__QDSP6_V4__");
5894 Builder.defineMacro("__QDSP6_ARCH__", "4");
5895 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005896 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005897 Builder.defineMacro("__HEXAGON_V5__");
5898 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5899 if(Opts.HexagonQdsp6Compat) {
5900 Builder.defineMacro("__QDSP6_V5__");
5901 Builder.defineMacro("__QDSP6_ARCH__", "5");
5902 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005903 } else if (CPU == "hexagonv60") {
5904 Builder.defineMacro("__HEXAGON_V60__");
5905 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5906 Builder.defineMacro("__QDSP6_V60__");
5907 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005908 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005909}
5910
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005911bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5912 DiagnosticsEngine &Diags) {
5913 for (auto &F : Features) {
5914 if (F == "+hvx")
5915 HasHVX = true;
5916 else if (F == "-hvx")
5917 HasHVX = HasHVXDouble = false;
5918 else if (F == "+hvx-double")
5919 HasHVX = HasHVXDouble = true;
5920 else if (F == "-hvx-double")
5921 HasHVXDouble = false;
5922 }
5923 return true;
5924}
5925
5926bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5927 DiagnosticsEngine &Diags, StringRef CPU,
5928 const std::vector<std::string> &FeaturesVec) const {
5929 // Default for v60: -hvx, -hvx-double.
5930 Features["hvx"] = false;
5931 Features["hvx-double"] = false;
5932
5933 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5934}
5935
5936
5937const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005938 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5939 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5940 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5941 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5942 "p0", "p1", "p2", "p3",
5943 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5944};
5945
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005946ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005947 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005948}
5949
Tony Linthicum76329bf2011-12-12 21:14:55 +00005950const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5951 { { "sp" }, "r29" },
5952 { { "fp" }, "r30" },
5953 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005954};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005955
Craig Topperf054e3a2015-10-19 03:52:27 +00005956ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5957 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005958}
5959
5960
5961const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005962#define BUILTIN(ID, TYPE, ATTRS) \
5963 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5964#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5965 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005966#include "clang/Basic/BuiltinsHexagon.def"
5967};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005968
Jacques Pienaard964cc22016-03-28 21:02:54 +00005969class LanaiTargetInfo : public TargetInfo {
5970 // Class for Lanai (32-bit).
5971 // The CPU profiles supported by the Lanai backend
5972 enum CPUKind {
5973 CK_NONE,
5974 CK_V11,
5975 } CPU;
5976
5977 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5978 static const char *const GCCRegNames[];
5979
5980public:
5981 LanaiTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5982 // Description string has to be kept in sync with backend.
5983 resetDataLayout("E" // Big endian
5984 "-m:e" // ELF name manging
5985 "-p:32:32" // 32 bit pointers, 32 bit aligned
5986 "-i64:64" // 64 bit integers, 64 bit aligned
5987 "-a:0:32" // 32 bit alignment of objects of aggregate type
5988 "-n32" // 32 bit native integer width
5989 "-S64" // 64 bit natural stack alignment
5990 );
5991
5992 // Setting RegParmMax equal to what mregparm was set to in the old
5993 // toolchain
5994 RegParmMax = 4;
5995
5996 // Set the default CPU to V11
5997 CPU = CK_V11;
5998
5999 // Temporary approach to make everything at least word-aligned and allow for
6000 // safely casting between pointers with different alignment requirements.
6001 // TODO: Remove this when there are no more cast align warnings on the
6002 // firmware.
6003 MinGlobalAlign = 32;
6004 }
6005
6006 void getTargetDefines(const LangOptions &Opts,
6007 MacroBuilder &Builder) const override {
6008 // Define __lanai__ when building for target lanai.
6009 Builder.defineMacro("__lanai__");
6010
6011 // Set define for the CPU specified.
6012 switch (CPU) {
6013 case CK_V11:
6014 Builder.defineMacro("__LANAI_V11__");
6015 break;
6016 case CK_NONE:
6017 llvm_unreachable("Unhandled target CPU");
6018 }
6019 }
6020
6021 bool setCPU(const std::string &Name) override {
6022 CPU = llvm::StringSwitch<CPUKind>(Name)
6023 .Case("v11", CK_V11)
6024 .Default(CK_NONE);
6025
6026 return CPU != CK_NONE;
6027 }
6028
6029 bool hasFeature(StringRef Feature) const override {
6030 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6031 }
6032
6033 ArrayRef<const char *> getGCCRegNames() const override;
6034
6035 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6036
6037 BuiltinVaListKind getBuiltinVaListKind() const override {
6038 return TargetInfo::VoidPtrBuiltinVaList;
6039 }
6040
6041 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6042
6043 bool validateAsmConstraint(const char *&Name,
6044 TargetInfo::ConstraintInfo &info) const override {
6045 return false;
6046 }
6047
6048 const char *getClobbers() const override { return ""; }
6049};
6050
6051const char *const LanaiTargetInfo::GCCRegNames[] = {
6052 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6053 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6054 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6055
6056ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6057 return llvm::makeArrayRef(GCCRegNames);
6058}
6059
6060const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6061 {{"pc"}, "r2"},
6062 {{"sp"}, "r4"},
6063 {{"fp"}, "r5"},
6064 {{"rv"}, "r8"},
6065 {{"rr1"}, "r10"},
6066 {{"rr2"}, "r11"},
6067 {{"rca"}, "r15"},
6068};
6069
6070ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6071 return llvm::makeArrayRef(GCCRegAliases);
6072}
6073
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006074// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6075class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006076 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6077 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006078 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006079public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00006080 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00006081 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006082
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006083 int getEHDataRegisterNumber(unsigned RegNo) const override {
6084 if (RegNo == 0) return 24;
6085 if (RegNo == 1) return 25;
6086 return -1;
6087 }
6088
Craig Topper3164f332014-03-11 03:39:26 +00006089 bool handleTargetFeatures(std::vector<std::string> &Features,
6090 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006091 // The backend doesn't actually handle soft float yet, but in case someone
6092 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006093 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6094 if (Feature != Features.end()) {
6095 SoftFloat = true;
6096 Features.erase(Feature);
6097 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006098 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006099 }
Craig Topper3164f332014-03-11 03:39:26 +00006100 void getTargetDefines(const LangOptions &Opts,
6101 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006102 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006103 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006104
6105 if (SoftFloat)
6106 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006107 }
Craig Topper3164f332014-03-11 03:39:26 +00006108
6109 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006110 return llvm::StringSwitch<bool>(Feature)
6111 .Case("softfloat", SoftFloat)
6112 .Case("sparc", true)
6113 .Default(false);
6114 }
Craig Topper3164f332014-03-11 03:39:26 +00006115
Craig Topper6c03a542015-10-19 04:51:35 +00006116 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006117 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006118 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006119 }
Craig Topper3164f332014-03-11 03:39:26 +00006120 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006121 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006122 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006123 ArrayRef<const char *> getGCCRegNames() const override;
6124 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006125 bool validateAsmConstraint(const char *&Name,
6126 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006127 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006128 switch (*Name) {
6129 case 'I': // Signed 13-bit constant
6130 case 'J': // Zero
6131 case 'K': // 32-bit constant with the low 12 bits clear
6132 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6133 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6134 case 'N': // Same as 'K' but zext (required for SIMode)
6135 case 'O': // The constant 4096
6136 return true;
6137 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006138 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006139 }
Craig Topper3164f332014-03-11 03:39:26 +00006140 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006141 // FIXME: Implement!
6142 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006143 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006144
6145 // No Sparc V7 for now, the backend doesn't support it anyway.
6146 enum CPUKind {
6147 CK_GENERIC,
6148 CK_V8,
6149 CK_SUPERSPARC,
6150 CK_SPARCLITE,
6151 CK_F934,
6152 CK_HYPERSPARC,
6153 CK_SPARCLITE86X,
6154 CK_SPARCLET,
6155 CK_TSC701,
6156 CK_V9,
6157 CK_ULTRASPARC,
6158 CK_ULTRASPARC3,
6159 CK_NIAGARA,
6160 CK_NIAGARA2,
6161 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006162 CK_NIAGARA4,
6163 CK_MYRIAD2_1,
6164 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006165 } CPU = CK_GENERIC;
6166
6167 enum CPUGeneration {
6168 CG_V8,
6169 CG_V9,
6170 };
6171
6172 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6173 switch (Kind) {
6174 case CK_GENERIC:
6175 case CK_V8:
6176 case CK_SUPERSPARC:
6177 case CK_SPARCLITE:
6178 case CK_F934:
6179 case CK_HYPERSPARC:
6180 case CK_SPARCLITE86X:
6181 case CK_SPARCLET:
6182 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006183 case CK_MYRIAD2_1:
6184 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006185 return CG_V8;
6186 case CK_V9:
6187 case CK_ULTRASPARC:
6188 case CK_ULTRASPARC3:
6189 case CK_NIAGARA:
6190 case CK_NIAGARA2:
6191 case CK_NIAGARA3:
6192 case CK_NIAGARA4:
6193 return CG_V9;
6194 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006195 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006196 }
6197
6198 CPUKind getCPUKind(StringRef Name) const {
6199 return llvm::StringSwitch<CPUKind>(Name)
6200 .Case("v8", CK_V8)
6201 .Case("supersparc", CK_SUPERSPARC)
6202 .Case("sparclite", CK_SPARCLITE)
6203 .Case("f934", CK_F934)
6204 .Case("hypersparc", CK_HYPERSPARC)
6205 .Case("sparclite86x", CK_SPARCLITE86X)
6206 .Case("sparclet", CK_SPARCLET)
6207 .Case("tsc701", CK_TSC701)
6208 .Case("v9", CK_V9)
6209 .Case("ultrasparc", CK_ULTRASPARC)
6210 .Case("ultrasparc3", CK_ULTRASPARC3)
6211 .Case("niagara", CK_NIAGARA)
6212 .Case("niagara2", CK_NIAGARA2)
6213 .Case("niagara3", CK_NIAGARA3)
6214 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006215 .Case("myriad2", CK_MYRIAD2_1)
6216 .Case("myriad2.1", CK_MYRIAD2_1)
6217 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006218 .Default(CK_GENERIC);
6219 }
6220
6221 bool setCPU(const std::string &Name) override {
6222 CPU = getCPUKind(Name);
6223 return CPU != CK_GENERIC;
6224 }
Gabor Greif49991682008-02-21 16:29:08 +00006225};
6226
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006227const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006228 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6229 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6230 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6231 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6232};
6233
Craig Topperf054e3a2015-10-19 03:52:27 +00006234ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6235 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006236}
6237
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006238const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006239 { { "g0" }, "r0" },
6240 { { "g1" }, "r1" },
6241 { { "g2" }, "r2" },
6242 { { "g3" }, "r3" },
6243 { { "g4" }, "r4" },
6244 { { "g5" }, "r5" },
6245 { { "g6" }, "r6" },
6246 { { "g7" }, "r7" },
6247 { { "o0" }, "r8" },
6248 { { "o1" }, "r9" },
6249 { { "o2" }, "r10" },
6250 { { "o3" }, "r11" },
6251 { { "o4" }, "r12" },
6252 { { "o5" }, "r13" },
6253 { { "o6", "sp" }, "r14" },
6254 { { "o7" }, "r15" },
6255 { { "l0" }, "r16" },
6256 { { "l1" }, "r17" },
6257 { { "l2" }, "r18" },
6258 { { "l3" }, "r19" },
6259 { { "l4" }, "r20" },
6260 { { "l5" }, "r21" },
6261 { { "l6" }, "r22" },
6262 { { "l7" }, "r23" },
6263 { { "i0" }, "r24" },
6264 { { "i1" }, "r25" },
6265 { { "i2" }, "r26" },
6266 { { "i3" }, "r27" },
6267 { { "i4" }, "r28" },
6268 { { "i5" }, "r29" },
6269 { { "i6", "fp" }, "r30" },
6270 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006271};
6272
Craig Topperf054e3a2015-10-19 03:52:27 +00006273ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6274 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006275}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006276
6277// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6278class SparcV8TargetInfo : public SparcTargetInfo {
6279public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006280 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006281 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006282 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6283 switch (getTriple().getOS()) {
6284 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006285 SizeType = UnsignedInt;
6286 IntPtrType = SignedInt;
6287 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006288 break;
6289 case llvm::Triple::NetBSD:
6290 case llvm::Triple::OpenBSD:
6291 SizeType = UnsignedLong;
6292 IntPtrType = SignedLong;
6293 PtrDiffType = SignedLong;
6294 break;
Brad Smith56495d52015-08-13 22:00:53 +00006295 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006296 }
6297
Craig Topper3164f332014-03-11 03:39:26 +00006298 void getTargetDefines(const LangOptions &Opts,
6299 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006300 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006301 switch (getCPUGeneration(CPU)) {
6302 case CG_V8:
6303 Builder.defineMacro("__sparcv8");
6304 if (getTriple().getOS() != llvm::Triple::Solaris)
6305 Builder.defineMacro("__sparcv8__");
6306 break;
6307 case CG_V9:
6308 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006309 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006310 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006311 Builder.defineMacro("__sparc_v9__");
6312 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006313 break;
6314 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006315 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6316 switch (CPU) {
6317 case CK_MYRIAD2_1:
6318 Builder.defineMacro("__myriad2", "1");
6319 Builder.defineMacro("__myriad2__", "1");
6320 break;
6321 case CK_MYRIAD2_2:
6322 Builder.defineMacro("__myriad2", "2");
6323 Builder.defineMacro("__myriad2__", "2");
6324 break;
6325 default:
6326 break;
6327 }
6328 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006329 }
6330};
6331
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006332// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6333class SparcV8elTargetInfo : public SparcV8TargetInfo {
6334 public:
6335 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006336 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006337 BigEndian = false;
6338 }
6339};
6340
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006341// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6342class SparcV9TargetInfo : public SparcTargetInfo {
6343public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006344 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006345 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006346 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006347 // This is an LP64 platform.
6348 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006349
6350 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006351 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006352 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006353 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006354 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006355 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006356
6357 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6358 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6359 LongDoubleWidth = 128;
6360 LongDoubleAlign = 128;
6361 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006362 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006363 }
6364
Craig Topper3164f332014-03-11 03:39:26 +00006365 void getTargetDefines(const LangOptions &Opts,
6366 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006367 SparcTargetInfo::getTargetDefines(Opts, Builder);
6368 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006369 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006370 // Solaris doesn't need these variants, but the BSDs do.
6371 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006372 Builder.defineMacro("__sparc64__");
6373 Builder.defineMacro("__sparc_v9__");
6374 Builder.defineMacro("__sparcv9__");
6375 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006376 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006377
Craig Topper3164f332014-03-11 03:39:26 +00006378 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006379 if (!SparcTargetInfo::setCPU(Name))
6380 return false;
6381 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006382 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006383};
6384
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006385class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006386 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006387 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006388 std::string CPU;
6389 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006390 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006391
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006392public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006393 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006394 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6395 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006396 IntMaxType = SignedLong;
6397 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006398 TLSSupported = true;
6399 IntWidth = IntAlign = 32;
6400 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6401 PointerWidth = PointerAlign = 64;
6402 LongDoubleWidth = 128;
6403 LongDoubleAlign = 64;
6404 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006405 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006406 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006407 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006408 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6409 }
6410 void getTargetDefines(const LangOptions &Opts,
6411 MacroBuilder &Builder) const override {
6412 Builder.defineMacro("__s390__");
6413 Builder.defineMacro("__s390x__");
6414 Builder.defineMacro("__zarch__");
6415 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006416
6417 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6418 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6419 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6420 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6421
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006422 if (HasTransactionalExecution)
6423 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006424 if (Opts.ZVector)
6425 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006426 }
Craig Topper6c03a542015-10-19 04:51:35 +00006427 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6428 return llvm::makeArrayRef(BuiltinInfo,
6429 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006430 }
6431
Craig Topperf054e3a2015-10-19 03:52:27 +00006432 ArrayRef<const char *> getGCCRegNames() const override;
6433 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006434 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006435 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006436 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006437 bool validateAsmConstraint(const char *&Name,
6438 TargetInfo::ConstraintInfo &info) const override;
6439 const char *getClobbers() const override {
6440 // FIXME: Is this really right?
6441 return "";
6442 }
6443 BuiltinVaListKind getBuiltinVaListKind() const override {
6444 return TargetInfo::SystemZBuiltinVaList;
6445 }
6446 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006447 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006448 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6449 .Case("z10", true)
6450 .Case("z196", true)
6451 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006452 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006453 .Default(false);
6454
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006455 return CPUKnown;
6456 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006457 bool
6458 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6459 StringRef CPU,
6460 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006461 if (CPU == "zEC12")
6462 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006463 if (CPU == "z13") {
6464 Features["transactional-execution"] = true;
6465 Features["vector"] = true;
6466 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006467 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006468 }
6469
6470 bool handleTargetFeatures(std::vector<std::string> &Features,
6471 DiagnosticsEngine &Diags) override {
6472 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006473 for (const auto &Feature : Features) {
6474 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006475 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006476 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006477 HasVector = true;
6478 }
6479 // If we use the vector ABI, vector types are 64-bit aligned.
6480 if (HasVector) {
6481 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006482 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6483 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006484 }
6485 return true;
6486 }
6487
6488 bool hasFeature(StringRef Feature) const override {
6489 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006490 .Case("systemz", true)
6491 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006492 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006493 .Default(false);
6494 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006495
6496 StringRef getABI() const override {
6497 if (HasVector)
6498 return "vector";
6499 return "";
6500 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006501
6502 bool useFloat128ManglingForLongDouble() const override {
6503 return true;
6504 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006505};
6506
6507const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6508#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006509 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006510#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6511 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006512#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006513};
6514
6515const char *const SystemZTargetInfo::GCCRegNames[] = {
6516 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6517 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6518 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6519 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6520};
6521
Craig Topperf054e3a2015-10-19 03:52:27 +00006522ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6523 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006524}
6525
6526bool SystemZTargetInfo::
6527validateAsmConstraint(const char *&Name,
6528 TargetInfo::ConstraintInfo &Info) const {
6529 switch (*Name) {
6530 default:
6531 return false;
6532
6533 case 'a': // Address register
6534 case 'd': // Data register (equivalent to 'r')
6535 case 'f': // Floating-point register
6536 Info.setAllowsRegister();
6537 return true;
6538
6539 case 'I': // Unsigned 8-bit constant
6540 case 'J': // Unsigned 12-bit constant
6541 case 'K': // Signed 16-bit constant
6542 case 'L': // Signed 20-bit displacement (on all targets we support)
6543 case 'M': // 0x7fffffff
6544 return true;
6545
6546 case 'Q': // Memory with base and unsigned 12-bit displacement
6547 case 'R': // Likewise, plus an index
6548 case 'S': // Memory with base and signed 20-bit displacement
6549 case 'T': // Likewise, plus an index
6550 Info.setAllowsMemory();
6551 return true;
6552 }
6553}
Ulrich Weigand47445072013-05-06 16:26:41 +00006554
Eric Christopherc48497a2015-09-18 21:26:24 +00006555class MSP430TargetInfo : public TargetInfo {
6556 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006557
Eric Christopherc48497a2015-09-18 21:26:24 +00006558public:
6559 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6560 BigEndian = false;
6561 TLSSupported = false;
6562 IntWidth = 16;
6563 IntAlign = 16;
6564 LongWidth = 32;
6565 LongLongWidth = 64;
6566 LongAlign = LongLongAlign = 16;
6567 PointerWidth = 16;
6568 PointerAlign = 16;
6569 SuitableAlign = 16;
6570 SizeType = UnsignedInt;
6571 IntMaxType = SignedLongLong;
6572 IntPtrType = SignedInt;
6573 PtrDiffType = SignedInt;
6574 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006575 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006576 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006577 void getTargetDefines(const LangOptions &Opts,
6578 MacroBuilder &Builder) const override {
6579 Builder.defineMacro("MSP430");
6580 Builder.defineMacro("__MSP430__");
6581 // FIXME: defines for different 'flavours' of MCU
6582 }
Craig Topper6c03a542015-10-19 04:51:35 +00006583 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006584 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006585 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006586 }
6587 bool hasFeature(StringRef Feature) const override {
6588 return Feature == "msp430";
6589 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006590 ArrayRef<const char *> getGCCRegNames() const override;
6591 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006592 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006593 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006594 }
6595 bool validateAsmConstraint(const char *&Name,
6596 TargetInfo::ConstraintInfo &info) const override {
6597 // FIXME: implement
6598 switch (*Name) {
6599 case 'K': // the constant 1
6600 case 'L': // constant -1^20 .. 1^19
6601 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006602 return true;
6603 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006604 // No target constraints for now.
6605 return false;
6606 }
6607 const char *getClobbers() const override {
6608 // FIXME: Is this really right?
6609 return "";
6610 }
6611 BuiltinVaListKind getBuiltinVaListKind() const override {
6612 // FIXME: implement
6613 return TargetInfo::CharPtrBuiltinVaList;
6614 }
6615};
6616
6617const char *const MSP430TargetInfo::GCCRegNames[] = {
6618 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6619 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6620
Craig Topperf054e3a2015-10-19 03:52:27 +00006621ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6622 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006623}
6624
6625// LLVM and Clang cannot be used directly to output native binaries for
6626// target, but is used to compile C code to llvm bitcode with correct
6627// type and alignment information.
6628//
6629// TCE uses the llvm bitcode as input and uses it for generating customized
6630// target processor and program binary. TCE co-design environment is
6631// publicly available in http://tce.cs.tut.fi
6632
6633static const unsigned TCEOpenCLAddrSpaceMap[] = {
6634 3, // opencl_global
6635 4, // opencl_local
6636 5, // opencl_constant
6637 // FIXME: generic has to be added to the target
6638 0, // opencl_generic
6639 0, // cuda_device
6640 0, // cuda_constant
6641 0 // cuda_shared
6642};
6643
6644class TCETargetInfo : public TargetInfo {
6645public:
6646 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6647 TLSSupported = false;
6648 IntWidth = 32;
6649 LongWidth = LongLongWidth = 32;
6650 PointerWidth = 32;
6651 IntAlign = 32;
6652 LongAlign = LongLongAlign = 32;
6653 PointerAlign = 32;
6654 SuitableAlign = 32;
6655 SizeType = UnsignedInt;
6656 IntMaxType = SignedLong;
6657 IntPtrType = SignedInt;
6658 PtrDiffType = SignedInt;
6659 FloatWidth = 32;
6660 FloatAlign = 32;
6661 DoubleWidth = 32;
6662 DoubleAlign = 32;
6663 LongDoubleWidth = 32;
6664 LongDoubleAlign = 32;
6665 FloatFormat = &llvm::APFloat::IEEEsingle;
6666 DoubleFormat = &llvm::APFloat::IEEEsingle;
6667 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006668 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6669 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006670 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6671 UseAddrSpaceMapMangling = true;
6672 }
6673
6674 void getTargetDefines(const LangOptions &Opts,
6675 MacroBuilder &Builder) const override {
6676 DefineStd(Builder, "tce", Opts);
6677 Builder.defineMacro("__TCE__");
6678 Builder.defineMacro("__TCE_V1__");
6679 }
6680 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6681
Craig Topper6c03a542015-10-19 04:51:35 +00006682 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006683 const char *getClobbers() const override { return ""; }
6684 BuiltinVaListKind getBuiltinVaListKind() const override {
6685 return TargetInfo::VoidPtrBuiltinVaList;
6686 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006687 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006688 bool validateAsmConstraint(const char *&Name,
6689 TargetInfo::ConstraintInfo &info) const override {
6690 return true;
6691 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006692 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6693 return None;
6694 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006695};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006696
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006697class BPFTargetInfo : public TargetInfo {
6698public:
6699 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6700 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6701 SizeType = UnsignedLong;
6702 PtrDiffType = SignedLong;
6703 IntPtrType = SignedLong;
6704 IntMaxType = SignedLong;
6705 Int64Type = SignedLong;
6706 RegParmMax = 5;
6707 if (Triple.getArch() == llvm::Triple::bpfeb) {
6708 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006709 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006710 } else {
6711 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006712 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006713 }
6714 MaxAtomicPromoteWidth = 64;
6715 MaxAtomicInlineWidth = 64;
6716 TLSSupported = false;
6717 }
6718 void getTargetDefines(const LangOptions &Opts,
6719 MacroBuilder &Builder) const override {
6720 DefineStd(Builder, "bpf", Opts);
6721 Builder.defineMacro("__BPF__");
6722 }
6723 bool hasFeature(StringRef Feature) const override {
6724 return Feature == "bpf";
6725 }
6726
Craig Topper6c03a542015-10-19 04:51:35 +00006727 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006728 const char *getClobbers() const override {
6729 return "";
6730 }
6731 BuiltinVaListKind getBuiltinVaListKind() const override {
6732 return TargetInfo::VoidPtrBuiltinVaList;
6733 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006734 ArrayRef<const char *> getGCCRegNames() const override {
6735 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006736 }
6737 bool validateAsmConstraint(const char *&Name,
6738 TargetInfo::ConstraintInfo &info) const override {
6739 return true;
6740 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006741 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6742 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006743 }
6744};
6745
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006746class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006747 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006748
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006749 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006750 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006751 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006752 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006753 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006754 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006755 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006756 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006757 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006758 enum DspRevEnum {
6759 NoDSP, DSP1, DSP2
6760 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006761 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006762
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006763protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006764 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006765 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006766
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006767public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006768 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6769 const std::string &CPUStr)
6770 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006771 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006772 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6773 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6774 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006775
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006776 bool isNaN2008Default() const {
6777 return CPU == "mips32r6" || CPU == "mips64r6";
6778 }
6779
6780 bool isFP64Default() const {
6781 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6782 }
6783
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006784 bool isNan2008() const override {
6785 return IsNan2008;
6786 }
6787
Alp Toker4925ba72014-06-07 23:30:42 +00006788 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006789 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006790 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6791 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006792 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006793 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006794 .Case("mips1", IsMips32)
6795 .Case("mips2", IsMips32)
6796 .Case("mips3", true)
6797 .Case("mips4", true)
6798 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006799 .Case("mips32", IsMips32)
6800 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006801 .Case("mips32r3", IsMips32)
6802 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006803 .Case("mips32r6", IsMips32)
6804 .Case("mips64", true)
6805 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006806 .Case("mips64r3", true)
6807 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006808 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006809 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006810 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006811 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006812 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006813 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006814 bool
6815 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6816 StringRef CPU,
6817 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006818 if (CPU.empty())
6819 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006820 if (CPU == "octeon")
6821 Features["mips64r2"] = Features["cnmips"] = true;
6822 else
6823 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006824 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006825 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006826
Craig Topper3164f332014-03-11 03:39:26 +00006827 void getTargetDefines(const LangOptions &Opts,
6828 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006829 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006830 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006831 if (Opts.GNUMode)
6832 Builder.defineMacro("mips");
6833
Simon Atanasyan683535b2012-08-29 19:14:58 +00006834 Builder.defineMacro("__REGISTER_PREFIX__", "");
6835
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006836 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006837 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006838 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006839 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006840 case SoftFloat:
6841 Builder.defineMacro("__mips_soft_float", Twine(1));
6842 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006843 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006844
Simon Atanasyan16071912013-04-14 14:07:30 +00006845 if (IsSingleFloat)
6846 Builder.defineMacro("__mips_single_float", Twine(1));
6847
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006848 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6849 Builder.defineMacro("_MIPS_FPSET",
6850 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6851
Simon Atanasyan72244b62012-07-05 16:06:06 +00006852 if (IsMips16)
6853 Builder.defineMacro("__mips16", Twine(1));
6854
Simon Atanasyan60777612013-04-14 14:07:51 +00006855 if (IsMicromips)
6856 Builder.defineMacro("__mips_micromips", Twine(1));
6857
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006858 if (IsNan2008)
6859 Builder.defineMacro("__mips_nan2008", Twine(1));
6860
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006861 switch (DspRev) {
6862 default:
6863 break;
6864 case DSP1:
6865 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6866 Builder.defineMacro("__mips_dsp", Twine(1));
6867 break;
6868 case DSP2:
6869 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6870 Builder.defineMacro("__mips_dspr2", Twine(1));
6871 Builder.defineMacro("__mips_dsp", Twine(1));
6872 break;
6873 }
6874
Jack Carter44ff1e52013-08-12 17:20:29 +00006875 if (HasMSA)
6876 Builder.defineMacro("__mips_msa", Twine(1));
6877
Simon Atanasyan26f19672012-04-05 19:28:31 +00006878 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6879 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6880 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006881
6882 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6883 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006884
6885 // These shouldn't be defined for MIPS-I but there's no need to check
6886 // for that since MIPS-I isn't supported.
6887 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6888 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6889 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006890 }
6891
Craig Topper6c03a542015-10-19 04:51:35 +00006892 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6893 return llvm::makeArrayRef(BuiltinInfo,
6894 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006895 }
Craig Topper3164f332014-03-11 03:39:26 +00006896 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006897 return llvm::StringSwitch<bool>(Feature)
6898 .Case("mips", true)
6899 .Case("fp64", HasFP64)
6900 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006901 }
Craig Topper3164f332014-03-11 03:39:26 +00006902 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006903 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006904 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006905 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006906 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006907 // CPU register names
6908 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006909 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6910 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6911 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006912 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6913 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006914 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6915 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6916 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6917 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006918 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006919 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00006920 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
6921 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006922 // MSA register names
6923 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6924 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6925 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6926 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6927 // MSA control register names
6928 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6929 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006930 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006931 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006932 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006933 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006934 bool validateAsmConstraint(const char *&Name,
6935 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006936 switch (*Name) {
6937 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006938 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006939 case 'r': // CPU registers.
6940 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006941 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006942 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006943 case 'c': // $25 for indirect jumps
6944 case 'l': // lo register
6945 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006946 Info.setAllowsRegister();
6947 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006948 case 'I': // Signed 16-bit constant
6949 case 'J': // Integer 0
6950 case 'K': // Unsigned 16-bit constant
6951 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6952 case 'M': // Constants not loadable via lui, addiu, or ori
6953 case 'N': // Constant -1 to -65535
6954 case 'O': // A signed 15-bit constant
6955 case 'P': // A constant between 1 go 65535
6956 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006957 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006958 Info.setAllowsMemory();
6959 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006960 case 'Z':
6961 if (Name[1] == 'C') { // An address usable by ll, and sc.
6962 Info.setAllowsMemory();
6963 Name++; // Skip over 'Z'.
6964 return true;
6965 }
6966 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006967 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006968 }
6969
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006970 std::string convertConstraint(const char *&Constraint) const override {
6971 std::string R;
6972 switch (*Constraint) {
6973 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6974 if (Constraint[1] == 'C') {
6975 R = std::string("^") + std::string(Constraint, 2);
6976 Constraint++;
6977 return R;
6978 }
6979 break;
6980 }
6981 return TargetInfo::convertConstraint(Constraint);
6982 }
6983
Craig Topper3164f332014-03-11 03:39:26 +00006984 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006985 // In GCC, $1 is not widely used in generated code (it's used only in a few
6986 // specific situations), so there is no real need for users to add it to
6987 // the clobbers list if they want to use it in their inline assembly code.
6988 //
6989 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6990 // code generation, so using it in inline assembly without adding it to the
6991 // clobbers list can cause conflicts between the inline assembly code and
6992 // the surrounding generated code.
6993 //
6994 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6995 // operands, which will conflict with the ".set at" assembler option (which
6996 // we use only for inline assembly, in order to maintain compatibility with
6997 // GCC) and will also conflict with the user's usage of $1.
6998 //
6999 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7000 // register for generated code is to automatically clobber $1 for all inline
7001 // assembly code.
7002 //
7003 // FIXME: We should automatically clobber $1 only for inline assembly code
7004 // which actually uses it. This would allow LLVM to use $1 for inline
7005 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007006 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007007 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007008
Craig Topper3164f332014-03-11 03:39:26 +00007009 bool handleTargetFeatures(std::vector<std::string> &Features,
7010 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007011 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007012 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007013 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007014 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007015 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007016 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007017 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007018
Eric Christopher610fe112015-08-26 08:21:55 +00007019 for (const auto &Feature : Features) {
7020 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007021 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007022 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007023 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007024 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007025 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007026 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007027 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007028 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007029 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007030 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007031 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007032 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007033 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007034 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007035 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007036 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007037 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007038 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007039 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007040 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007041 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007042 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007043
James Y Knightb214cbc2016-03-04 19:00:41 +00007044 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007045
Rafael Espindolaeb265472013-08-21 21:59:03 +00007046 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007047 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007048
Craig Topper3164f332014-03-11 03:39:26 +00007049 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007050 if (RegNo == 0) return 4;
7051 if (RegNo == 1) return 5;
7052 return -1;
7053 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007054
7055 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007056};
7057
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007058const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007059#define BUILTIN(ID, TYPE, ATTRS) \
7060 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7061#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7062 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007063#include "clang/Basic/BuiltinsMips.def"
7064};
7065
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007066class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007067public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007068 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007069 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007070 SizeType = UnsignedInt;
7071 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007072 Int64Type = SignedLongLong;
7073 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007074 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007075 }
Craig Topper3164f332014-03-11 03:39:26 +00007076 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007077 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007078 ABI = Name;
7079 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007080 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007081 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007082 }
Craig Topper3164f332014-03-11 03:39:26 +00007083 void getTargetDefines(const LangOptions &Opts,
7084 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007085 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007086
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007087 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007088 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7089
7090 const std::string& CPUStr = getCPU();
7091 if (CPUStr == "mips32")
7092 Builder.defineMacro("__mips_isa_rev", "1");
7093 else if (CPUStr == "mips32r2")
7094 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007095 else if (CPUStr == "mips32r3")
7096 Builder.defineMacro("__mips_isa_rev", "3");
7097 else if (CPUStr == "mips32r5")
7098 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007099 else if (CPUStr == "mips32r6")
7100 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007101
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007102 if (ABI == "o32") {
7103 Builder.defineMacro("__mips_o32");
7104 Builder.defineMacro("_ABIO32", "1");
7105 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7106 }
7107 else if (ABI == "eabi")
7108 Builder.defineMacro("__mips_eabi");
7109 else
David Blaikie83d382b2011-09-23 05:06:16 +00007110 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007111 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007112 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007113 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7114 { { "at" }, "$1" },
7115 { { "v0" }, "$2" },
7116 { { "v1" }, "$3" },
7117 { { "a0" }, "$4" },
7118 { { "a1" }, "$5" },
7119 { { "a2" }, "$6" },
7120 { { "a3" }, "$7" },
7121 { { "t0" }, "$8" },
7122 { { "t1" }, "$9" },
7123 { { "t2" }, "$10" },
7124 { { "t3" }, "$11" },
7125 { { "t4" }, "$12" },
7126 { { "t5" }, "$13" },
7127 { { "t6" }, "$14" },
7128 { { "t7" }, "$15" },
7129 { { "s0" }, "$16" },
7130 { { "s1" }, "$17" },
7131 { { "s2" }, "$18" },
7132 { { "s3" }, "$19" },
7133 { { "s4" }, "$20" },
7134 { { "s5" }, "$21" },
7135 { { "s6" }, "$22" },
7136 { { "s7" }, "$23" },
7137 { { "t8" }, "$24" },
7138 { { "t9" }, "$25" },
7139 { { "k0" }, "$26" },
7140 { { "k1" }, "$27" },
7141 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007142 { { "sp","$sp" }, "$29" },
7143 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007144 { { "ra" }, "$31" }
7145 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007146 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007147 }
7148};
7149
7150class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007151 void setDataLayout() override {
7152 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007153 }
7154
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007155public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007156 Mips32EBTargetInfo(const llvm::Triple &Triple)
7157 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007158 }
Craig Topper3164f332014-03-11 03:39:26 +00007159 void getTargetDefines(const LangOptions &Opts,
7160 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007161 DefineStd(Builder, "MIPSEB", Opts);
7162 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007163 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007164 }
7165};
7166
7167class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007168 void setDataLayout() override {
7169 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007170 }
7171
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007172public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007173 Mips32ELTargetInfo(const llvm::Triple &Triple)
7174 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007175 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007176 }
Craig Topper3164f332014-03-11 03:39:26 +00007177 void getTargetDefines(const LangOptions &Opts,
7178 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007179 DefineStd(Builder, "MIPSEL", Opts);
7180 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007181 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007182 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007183};
Akira Hatanakabef17452011-09-20 19:21:49 +00007184
7185class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007186public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007187 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007188 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007189 LongDoubleWidth = LongDoubleAlign = 128;
7190 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007191 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7192 LongDoubleWidth = LongDoubleAlign = 64;
7193 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7194 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007195 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007196 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007197 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007198 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007199
7200 void setN64ABITypes() {
7201 LongWidth = LongAlign = 64;
7202 PointerWidth = PointerAlign = 64;
7203 SizeType = UnsignedLong;
7204 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007205 Int64Type = SignedLong;
7206 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007207 }
7208
7209 void setN32ABITypes() {
7210 LongWidth = LongAlign = 32;
7211 PointerWidth = PointerAlign = 32;
7212 SizeType = UnsignedInt;
7213 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007214 Int64Type = SignedLongLong;
7215 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007216 }
7217
Craig Topper3164f332014-03-11 03:39:26 +00007218 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007219 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007220 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007221 ABI = Name;
7222 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007223 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007224 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007225 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007226 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007227 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007228 }
7229 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007230 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007231
Craig Topper3164f332014-03-11 03:39:26 +00007232 void getTargetDefines(const LangOptions &Opts,
7233 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007234 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007235
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007236 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007237 Builder.defineMacro("__mips64");
7238 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007239 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7240
7241 const std::string& CPUStr = getCPU();
7242 if (CPUStr == "mips64")
7243 Builder.defineMacro("__mips_isa_rev", "1");
7244 else if (CPUStr == "mips64r2")
7245 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007246 else if (CPUStr == "mips64r3")
7247 Builder.defineMacro("__mips_isa_rev", "3");
7248 else if (CPUStr == "mips64r5")
7249 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007250 else if (CPUStr == "mips64r6")
7251 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007252
Akira Hatanakabef17452011-09-20 19:21:49 +00007253 if (ABI == "n32") {
7254 Builder.defineMacro("__mips_n32");
7255 Builder.defineMacro("_ABIN32", "2");
7256 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7257 }
7258 else if (ABI == "n64") {
7259 Builder.defineMacro("__mips_n64");
7260 Builder.defineMacro("_ABI64", "3");
7261 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7262 }
7263 else
David Blaikie83d382b2011-09-23 05:06:16 +00007264 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007265
7266 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007267 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007268 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007269 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7270 { { "at" }, "$1" },
7271 { { "v0" }, "$2" },
7272 { { "v1" }, "$3" },
7273 { { "a0" }, "$4" },
7274 { { "a1" }, "$5" },
7275 { { "a2" }, "$6" },
7276 { { "a3" }, "$7" },
7277 { { "a4" }, "$8" },
7278 { { "a5" }, "$9" },
7279 { { "a6" }, "$10" },
7280 { { "a7" }, "$11" },
7281 { { "t0" }, "$12" },
7282 { { "t1" }, "$13" },
7283 { { "t2" }, "$14" },
7284 { { "t3" }, "$15" },
7285 { { "s0" }, "$16" },
7286 { { "s1" }, "$17" },
7287 { { "s2" }, "$18" },
7288 { { "s3" }, "$19" },
7289 { { "s4" }, "$20" },
7290 { { "s5" }, "$21" },
7291 { { "s6" }, "$22" },
7292 { { "s7" }, "$23" },
7293 { { "t8" }, "$24" },
7294 { { "t9" }, "$25" },
7295 { { "k0" }, "$26" },
7296 { { "k1" }, "$27" },
7297 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007298 { { "sp","$sp" }, "$29" },
7299 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007300 { { "ra" }, "$31" }
7301 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007302 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007303 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007304
7305 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007306};
7307
7308class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007309 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007310 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007311 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007312 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007313 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007314 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007315
Akira Hatanakabef17452011-09-20 19:21:49 +00007316public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007317 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007318 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007319 void getTargetDefines(const LangOptions &Opts,
7320 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007321 DefineStd(Builder, "MIPSEB", Opts);
7322 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007323 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007324 }
7325};
7326
7327class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007328 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007329 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007330 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007331 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007332 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007333 }
7334public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007335 Mips64ELTargetInfo(const llvm::Triple &Triple)
7336 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007337 // Default ABI is n64.
7338 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007339 }
Craig Topper3164f332014-03-11 03:39:26 +00007340 void getTargetDefines(const LangOptions &Opts,
7341 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007342 DefineStd(Builder, "MIPSEL", Opts);
7343 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007344 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007345 }
7346};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007347
Ivan Krasindd7403e2011-08-24 20:22:22 +00007348class PNaClTargetInfo : public TargetInfo {
7349public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007350 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007351 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007352 this->LongAlign = 32;
7353 this->LongWidth = 32;
7354 this->PointerAlign = 32;
7355 this->PointerWidth = 32;
7356 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007357 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007358 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007359 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007360 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007361 this->SizeType = TargetInfo::UnsignedInt;
7362 this->PtrDiffType = TargetInfo::SignedInt;
7363 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007364 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007365 }
7366
Craig Toppere6f17d02014-03-11 04:07:52 +00007367 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007368 Builder.defineMacro("__le32__");
7369 Builder.defineMacro("__pnacl__");
7370 }
Craig Topper3164f332014-03-11 03:39:26 +00007371 void getTargetDefines(const LangOptions &Opts,
7372 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007373 getArchDefines(Opts, Builder);
7374 }
Craig Topper3164f332014-03-11 03:39:26 +00007375 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007376 return Feature == "pnacl";
7377 }
Craig Topper6c03a542015-10-19 04:51:35 +00007378 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007379 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007380 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007381 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007382 ArrayRef<const char *> getGCCRegNames() const override;
7383 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007384 bool validateAsmConstraint(const char *&Name,
7385 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007386 return false;
7387 }
7388
Craig Topper3164f332014-03-11 03:39:26 +00007389 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007390 return "";
7391 }
7392};
7393
Craig Topperf054e3a2015-10-19 03:52:27 +00007394ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7395 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007396}
7397
Craig Topperf054e3a2015-10-19 03:52:27 +00007398ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7399 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007400}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007401
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007402// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7403class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7404public:
7405 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007406 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007407 }
7408
7409 BuiltinVaListKind getBuiltinVaListKind() const override {
7410 return TargetInfo::PNaClABIBuiltinVaList;
7411 }
7412};
7413
JF Bastien643817d2014-09-12 17:52:47 +00007414class Le64TargetInfo : public TargetInfo {
7415 static const Builtin::Info BuiltinInfo[];
7416
7417public:
7418 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7419 BigEndian = false;
7420 NoAsmVariants = true;
7421 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7422 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007423 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007424 }
7425
7426 void getTargetDefines(const LangOptions &Opts,
7427 MacroBuilder &Builder) const override {
7428 DefineStd(Builder, "unix", Opts);
7429 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7430 Builder.defineMacro("__ELF__");
7431 }
Craig Topper6c03a542015-10-19 04:51:35 +00007432 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7433 return llvm::makeArrayRef(BuiltinInfo,
7434 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007435 }
7436 BuiltinVaListKind getBuiltinVaListKind() const override {
7437 return TargetInfo::PNaClABIBuiltinVaList;
7438 }
7439 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007440 ArrayRef<const char *> getGCCRegNames() const override {
7441 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007442 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007443 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7444 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007445 }
7446 bool validateAsmConstraint(const char *&Name,
7447 TargetInfo::ConstraintInfo &Info) const override {
7448 return false;
7449 }
7450
7451 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007452};
Dan Gohmanc2853072015-09-03 22:51:53 +00007453
7454class WebAssemblyTargetInfo : public TargetInfo {
7455 static const Builtin::Info BuiltinInfo[];
7456
7457 enum SIMDEnum {
7458 NoSIMD,
7459 SIMD128,
7460 } SIMDLevel;
7461
7462public:
7463 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7464 : TargetInfo(T), SIMDLevel(NoSIMD) {
7465 BigEndian = false;
7466 NoAsmVariants = true;
7467 SuitableAlign = 128;
7468 LargeArrayMinWidth = 128;
7469 LargeArrayAlign = 128;
7470 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007471 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007472 LongDoubleWidth = LongDoubleAlign = 128;
7473 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007474 }
7475
7476protected:
7477 void getTargetDefines(const LangOptions &Opts,
7478 MacroBuilder &Builder) const override {
7479 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7480 if (SIMDLevel >= SIMD128)
7481 Builder.defineMacro("__wasm_simd128__");
7482 }
7483
7484private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007485 bool
7486 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7487 StringRef CPU,
7488 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007489 if (CPU == "bleeding-edge")
7490 Features["simd128"] = true;
7491 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7492 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007493 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007494 return llvm::StringSwitch<bool>(Feature)
7495 .Case("simd128", SIMDLevel >= SIMD128)
7496 .Default(false);
7497 }
7498 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007499 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007500 for (const auto &Feature : Features) {
7501 if (Feature == "+simd128") {
7502 SIMDLevel = std::max(SIMDLevel, SIMD128);
7503 continue;
7504 }
7505 if (Feature == "-simd128") {
7506 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7507 continue;
7508 }
7509
7510 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7511 << "-target-feature";
7512 return false;
7513 }
7514 return true;
7515 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007516 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007517 return llvm::StringSwitch<bool>(Name)
7518 .Case("mvp", true)
7519 .Case("bleeding-edge", true)
7520 .Case("generic", true)
7521 .Default(false);
7522 }
Craig Topper6c03a542015-10-19 04:51:35 +00007523 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7524 return llvm::makeArrayRef(BuiltinInfo,
7525 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007526 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007527 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007528 return VoidPtrBuiltinVaList;
7529 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007530 ArrayRef<const char *> getGCCRegNames() const final {
7531 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007532 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007533 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7534 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007535 }
7536 bool
7537 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007538 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007539 return false;
7540 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007541 const char *getClobbers() const final { return ""; }
7542 bool isCLZForZeroUndef() const final { return false; }
7543 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007544 IntType getIntTypeByWidth(unsigned BitWidth,
7545 bool IsSigned) const final {
7546 // WebAssembly prefers long long for explicitly 64-bit integers.
7547 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7548 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7549 }
7550 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7551 bool IsSigned) const final {
7552 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7553 return BitWidth == 64
7554 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7555 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7556 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007557};
7558
7559const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7560#define BUILTIN(ID, TYPE, ATTRS) \
7561 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7562#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7563 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7564#include "clang/Basic/BuiltinsWebAssembly.def"
7565};
7566
7567class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7568public:
7569 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7570 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007571 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007572 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007573 }
7574
7575protected:
7576 void getTargetDefines(const LangOptions &Opts,
7577 MacroBuilder &Builder) const override {
7578 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7579 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7580 }
7581};
7582
7583class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7584public:
7585 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7586 : WebAssemblyTargetInfo(T) {
7587 LongAlign = LongWidth = 64;
7588 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007589 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007590 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007591 }
7592
7593protected:
7594 void getTargetDefines(const LangOptions &Opts,
7595 MacroBuilder &Builder) const override {
7596 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7597 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7598 }
7599};
7600
JF Bastien643817d2014-09-12 17:52:47 +00007601const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7602#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007603 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007604#include "clang/Basic/BuiltinsLe64.def"
7605};
7606
Eric Christopherc48497a2015-09-18 21:26:24 +00007607static const unsigned SPIRAddrSpaceMap[] = {
7608 1, // opencl_global
7609 3, // opencl_local
7610 2, // opencl_constant
7611 4, // opencl_generic
7612 0, // cuda_device
7613 0, // cuda_constant
7614 0 // cuda_shared
7615};
7616class SPIRTargetInfo : public TargetInfo {
7617public:
7618 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7619 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7620 "SPIR target must use unknown OS");
7621 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7622 "SPIR target must use unknown environment type");
7623 BigEndian = false;
7624 TLSSupported = false;
7625 LongWidth = LongAlign = 64;
7626 AddrSpaceMap = &SPIRAddrSpaceMap;
7627 UseAddrSpaceMapMangling = true;
7628 // Define available target features
7629 // These must be defined in sorted order!
7630 NoAsmVariants = true;
7631 }
7632 void getTargetDefines(const LangOptions &Opts,
7633 MacroBuilder &Builder) const override {
7634 DefineStd(Builder, "SPIR", Opts);
7635 }
7636 bool hasFeature(StringRef Feature) const override {
7637 return Feature == "spir";
7638 }
Craig Topper3164f332014-03-11 03:39:26 +00007639
Craig Topper6c03a542015-10-19 04:51:35 +00007640 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007641 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007642 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007643 bool validateAsmConstraint(const char *&Name,
7644 TargetInfo::ConstraintInfo &info) const override {
7645 return true;
7646 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007647 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7648 return None;
7649 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007650 BuiltinVaListKind getBuiltinVaListKind() const override {
7651 return TargetInfo::VoidPtrBuiltinVaList;
7652 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007653
Eric Christopherc48497a2015-09-18 21:26:24 +00007654 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7655 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7656 : CCCR_Warning;
7657 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007658
Eric Christopherc48497a2015-09-18 21:26:24 +00007659 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7660 return CC_SpirFunction;
7661 }
7662};
Guy Benyeib798fc92012-12-11 21:38:14 +00007663
Eric Christopherc48497a2015-09-18 21:26:24 +00007664class SPIR32TargetInfo : public SPIRTargetInfo {
7665public:
7666 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7667 PointerWidth = PointerAlign = 32;
7668 SizeType = TargetInfo::UnsignedInt;
7669 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007670 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7671 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007672 }
7673 void getTargetDefines(const LangOptions &Opts,
7674 MacroBuilder &Builder) const override {
7675 DefineStd(Builder, "SPIR32", Opts);
7676 }
7677};
Guy Benyeib798fc92012-12-11 21:38:14 +00007678
Eric Christopherc48497a2015-09-18 21:26:24 +00007679class SPIR64TargetInfo : public SPIRTargetInfo {
7680public:
7681 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7682 PointerWidth = PointerAlign = 64;
7683 SizeType = TargetInfo::UnsignedLong;
7684 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007685 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7686 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007687 }
7688 void getTargetDefines(const LangOptions &Opts,
7689 MacroBuilder &Builder) const override {
7690 DefineStd(Builder, "SPIR64", Opts);
7691 }
7692};
Guy Benyeib798fc92012-12-11 21:38:14 +00007693
Robert Lytton0e076492013-08-13 09:43:10 +00007694class XCoreTargetInfo : public TargetInfo {
7695 static const Builtin::Info BuiltinInfo[];
7696public:
7697 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7698 BigEndian = false;
7699 NoAsmVariants = true;
7700 LongLongAlign = 32;
7701 SuitableAlign = 32;
7702 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007703 SizeType = UnsignedInt;
7704 PtrDiffType = SignedInt;
7705 IntPtrType = SignedInt;
7706 WCharType = UnsignedChar;
7707 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007708 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007709 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7710 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007711 }
Craig Topper3164f332014-03-11 03:39:26 +00007712 void getTargetDefines(const LangOptions &Opts,
7713 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007714 Builder.defineMacro("__XS1B__");
7715 }
Craig Topper6c03a542015-10-19 04:51:35 +00007716 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7717 return llvm::makeArrayRef(BuiltinInfo,
7718 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007719 }
Craig Topper3164f332014-03-11 03:39:26 +00007720 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007721 return TargetInfo::VoidPtrBuiltinVaList;
7722 }
Craig Topper3164f332014-03-11 03:39:26 +00007723 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007724 return "";
7725 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007726 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007727 static const char * const GCCRegNames[] = {
7728 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7729 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7730 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007731 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007732 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007733 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7734 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007735 }
Craig Topper3164f332014-03-11 03:39:26 +00007736 bool validateAsmConstraint(const char *&Name,
7737 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007738 return false;
7739 }
Craig Topper3164f332014-03-11 03:39:26 +00007740 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007741 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7742 return (RegNo < 2)? RegNo : -1;
7743 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007744 bool allowsLargerPreferedTypeAlignment() const override {
7745 return false;
7746 }
Robert Lytton0e076492013-08-13 09:43:10 +00007747};
7748
7749const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007750#define BUILTIN(ID, TYPE, ATTRS) \
7751 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7752#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7753 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007754#include "clang/Basic/BuiltinsXCore.def"
7755};
Robert Lytton0e076492013-08-13 09:43:10 +00007756
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007757// x86_32 Android target
7758class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7759public:
7760 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7761 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7762 SuitableAlign = 32;
7763 LongDoubleWidth = 64;
7764 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7765 }
7766};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007767
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007768// x86_64 Android target
7769class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7770public:
7771 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7772 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7773 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7774 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007775
7776 bool useFloat128ManglingForLongDouble() const override {
7777 return true;
7778 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007779};
7780} // end anonymous namespace
7781
Chris Lattner5ba61f02006-10-14 07:39:34 +00007782//===----------------------------------------------------------------------===//
7783// Driver code
7784//===----------------------------------------------------------------------===//
7785
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007786static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007787 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007788
Daniel Dunbar52322032009-08-18 05:47:58 +00007789 switch (Triple.getArch()) {
7790 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007791 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007792
Tim Northover2a0783d2014-05-30 14:14:07 +00007793 case llvm::Triple::xcore:
7794 return new XCoreTargetInfo(Triple);
7795
7796 case llvm::Triple::hexagon:
7797 return new HexagonTargetInfo(Triple);
7798
Jacques Pienaard964cc22016-03-28 21:02:54 +00007799 case llvm::Triple::lanai:
7800 return new LanaiTargetInfo(Triple);
7801
Tim Northover2a0783d2014-05-30 14:14:07 +00007802 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007803 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007804 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007805
7806 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007807 case llvm::Triple::CloudABI:
7808 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007809 case llvm::Triple::FreeBSD:
7810 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007811 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007812 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007813 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007814 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007815 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007816 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007817 }
7818
Christian Pirker9b019ae2014-02-25 13:51:00 +00007819 case llvm::Triple::aarch64_be:
7820 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007821 case llvm::Triple::FreeBSD:
7822 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007823 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007824 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007825 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007826 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007827 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007828 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007829 }
7830
Daniel Dunbar52322032009-08-18 05:47:58 +00007831 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007832 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007833 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007834 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007835
Daniel Dunbar52322032009-08-18 05:47:58 +00007836 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007837 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007838 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007839 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007840 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007841 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007842 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007843 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007844 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007845 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007846 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007847 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007848 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007849 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007850 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007851 case llvm::Triple::Win32:
7852 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007853 case llvm::Triple::Cygnus:
7854 return new CygwinARMTargetInfo(Triple);
7855 case llvm::Triple::GNU:
7856 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007857 case llvm::Triple::Itanium:
7858 return new ItaniumWindowsARMleTargetInfo(Triple);
7859 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007860 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007861 return new MicrosoftARMleTargetInfo(Triple);
7862 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007863 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007864 return new ARMleTargetInfo(Triple);
7865 }
7866
7867 case llvm::Triple::armeb:
7868 case llvm::Triple::thumbeb:
7869 if (Triple.isOSDarwin())
7870 return new DarwinARMTargetInfo(Triple);
7871
7872 switch (os) {
7873 case llvm::Triple::Linux:
7874 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7875 case llvm::Triple::FreeBSD:
7876 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7877 case llvm::Triple::NetBSD:
7878 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7879 case llvm::Triple::OpenBSD:
7880 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7881 case llvm::Triple::Bitrig:
7882 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7883 case llvm::Triple::RTEMS:
7884 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7885 case llvm::Triple::NaCl:
7886 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7887 default:
7888 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007889 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007890
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007891 case llvm::Triple::bpfeb:
7892 case llvm::Triple::bpfel:
7893 return new BPFTargetInfo(Triple);
7894
Daniel Dunbar52322032009-08-18 05:47:58 +00007895 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007896 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007897
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007898 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007899 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007900 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007901 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007902 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007903 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007904 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007905 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007906 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007907 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007908 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007909 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007910 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007911
7912 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007913 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007914 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007915 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007916 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007917 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007918 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007919 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007920 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007921 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007922 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007923 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007924 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007925 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007926 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007927
Akira Hatanakabef17452011-09-20 19:21:49 +00007928 case llvm::Triple::mips64:
7929 switch (os) {
7930 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007931 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007932 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007933 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007934 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007935 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007936 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007937 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007938 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007939 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007940 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007941 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007942 }
7943
7944 case llvm::Triple::mips64el:
7945 switch (os) {
7946 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007947 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007948 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007949 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007950 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007951 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007952 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007953 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007954 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007955 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007956 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007957 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007958 }
7959
Ivan Krasindd7403e2011-08-24 20:22:22 +00007960 case llvm::Triple::le32:
7961 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007962 case llvm::Triple::NaCl:
7963 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7964 default:
7965 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007966 }
7967
JF Bastien643817d2014-09-12 17:52:47 +00007968 case llvm::Triple::le64:
7969 return new Le64TargetInfo(Triple);
7970
Daniel Dunbar52322032009-08-18 05:47:58 +00007971 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007972 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007973 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007974 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007975 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007976 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007977 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007978 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007979 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007980 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007981 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007982 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007983 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007984 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007985 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007986 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007987 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007988
7989 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007990 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007991 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007992 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007993 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007994 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007995 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007996 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007997 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007998 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007999 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008000 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008001 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008002 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008003 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008004
Bill Schmidt778d3872013-07-26 01:36:11 +00008005 case llvm::Triple::ppc64le:
8006 switch (os) {
8007 case llvm::Triple::Linux:
8008 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008009 case llvm::Triple::NetBSD:
8010 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00008011 default:
8012 return new PPC64TargetInfo(Triple);
8013 }
8014
Peter Collingbournec947aae2012-05-20 23:28:41 +00008015 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008016 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008017 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008018 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008019
Tom Stellardd8e38a32015-01-06 20:34:47 +00008020 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008021 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00008022 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008023
Daniel Dunbar52322032009-08-18 05:47:58 +00008024 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008025 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008026 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008027 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008028 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00008029 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008030 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008031 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008032 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008033 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008034 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008035 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008036 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008037 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008038 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008039
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008040 // The 'sparcel' architecture copies all the above cases except for Solaris.
8041 case llvm::Triple::sparcel:
8042 switch (os) {
8043 case llvm::Triple::Linux:
8044 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
8045 case llvm::Triple::NetBSD:
8046 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
8047 case llvm::Triple::OpenBSD:
8048 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
8049 case llvm::Triple::RTEMS:
8050 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
8051 default:
8052 return new SparcV8elTargetInfo(Triple);
8053 }
8054
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008055 case llvm::Triple::sparcv9:
8056 switch (os) {
8057 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008058 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008059 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008060 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008061 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008062 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008063 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008064 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008065 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008066 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008067 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008068 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008069 }
8070
Ulrich Weigand47445072013-05-06 16:26:41 +00008071 case llvm::Triple::systemz:
8072 switch (os) {
8073 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008074 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00008075 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008076 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00008077 }
8078
Eli Friedmana9c3d712009-08-19 20:47:07 +00008079 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008080 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008081
Daniel Dunbar52322032009-08-18 05:47:58 +00008082 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008083 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008084 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008085
Daniel Dunbar52322032009-08-18 05:47:58 +00008086 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008087 case llvm::Triple::CloudABI:
8088 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008089 case llvm::Triple::Linux: {
8090 switch (Triple.getEnvironment()) {
8091 default:
8092 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
8093 case llvm::Triple::Android:
8094 return new AndroidX86_32TargetInfo(Triple);
8095 }
8096 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008097 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008098 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008099 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008100 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008101 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008102 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008103 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008104 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008105 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008106 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008107 case llvm::Triple::KFreeBSD:
8108 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008109 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008110 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008111 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008112 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008113 case llvm::Triple::Win32: {
8114 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008115 case llvm::Triple::Cygnus:
8116 return new CygwinX86_32TargetInfo(Triple);
8117 case llvm::Triple::GNU:
8118 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008119 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008120 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008121 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008122 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008123 }
8124 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008125 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008126 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008127 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008128 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008129 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008130 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008131 case llvm::Triple::ELFIAMCU:
8132 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008133 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008134 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008135 }
8136
8137 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008138 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008139 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008140
Daniel Dunbar52322032009-08-18 05:47:58 +00008141 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008142 case llvm::Triple::CloudABI:
8143 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008144 case llvm::Triple::Linux: {
8145 switch (Triple.getEnvironment()) {
8146 default:
8147 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
8148 case llvm::Triple::Android:
8149 return new AndroidX86_64TargetInfo(Triple);
8150 }
8151 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008152 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008153 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008154 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008155 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008156 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008157 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008158 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008159 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008160 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008161 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008162 case llvm::Triple::KFreeBSD:
8163 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008164 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008165 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008166 case llvm::Triple::Win32: {
8167 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008168 case llvm::Triple::Cygnus:
8169 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008170 case llvm::Triple::GNU:
8171 return new MinGWX86_64TargetInfo(Triple);
8172 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008173 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008174 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008175 }
8176 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008177 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008178 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008179 case llvm::Triple::PS4:
8180 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008181 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008182 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008183 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008184
Douglas Katzman78d7c542015-05-12 21:18:10 +00008185 case llvm::Triple::spir: {
8186 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8187 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8188 return nullptr;
8189 return new SPIR32TargetInfo(Triple);
8190 }
8191 case llvm::Triple::spir64: {
8192 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8193 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8194 return nullptr;
8195 return new SPIR64TargetInfo(Triple);
8196 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008197 case llvm::Triple::wasm32:
8198 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8199 return nullptr;
8200 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
8201 case llvm::Triple::wasm64:
8202 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8203 return nullptr;
8204 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008205 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008206}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008207
8208/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008209/// options.
Alp Toker80758082014-07-06 05:26:44 +00008210TargetInfo *
8211TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
8212 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008213 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008214
8215 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00008216 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008217 if (!Target) {
8218 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008219 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008220 }
Alp Toker80758082014-07-06 05:26:44 +00008221 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008222
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008223 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008224 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8225 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008226 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008227 }
8228
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008229 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008230 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8231 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008232 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008233 }
8234
Rafael Espindolaeb265472013-08-21 21:59:03 +00008235 // Set the fp math unit.
8236 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8237 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008238 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008239 }
8240
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008241 // Compute the default target features, we need the target to handle this
8242 // because features may have dependencies on one another.
8243 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008244 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8245 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008246 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008247
8248 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008249 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008250 for (const auto &F : Features)
8251 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8252
Eric Christopher3ff21b32013-10-16 21:26:26 +00008253 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008254 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008255
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008256 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008257}