blob: a151c5947833e1f9a0006f9fc7b2325ff891c98f [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068//===----------------------------------------------------------------------===//
69// Defines specific to certain operating systems.
70//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000071
Torok Edwinb2b37c62009-06-30 17:10:35 +000072namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000073template<typename TgtInfo>
74class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000075protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000076 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000077 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000079 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000080 void getTargetDefines(const LangOptions &Opts,
81 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 TgtInfo::getTargetDefines(Opts, Builder);
83 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000084 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000085
86};
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Eric Christopher7d0c7252015-09-24 21:17:04 +000088// CloudABI Target
89template <typename Target>
90class CloudABITargetInfo : public OSTargetInfo<Target> {
91protected:
92 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
93 MacroBuilder &Builder) const override {
94 Builder.defineMacro("__CloudABI__");
95 Builder.defineMacro("__ELF__");
96
97 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
98 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
99 Builder.defineMacro("__STDC_UTF_16__");
100 Builder.defineMacro("__STDC_UTF_32__");
101 }
102
103public:
104 CloudABITargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000105 : OSTargetInfo<Target>(Triple) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000106};
107
Daniel Dunbard86666f2010-01-26 01:44:04 +0000108static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000109 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000110 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000111 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000112 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000115 // AddressSanitizer doesn't play well with source fortification, which is on
116 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000117 if (Opts.Sanitize.has(SanitizerKind::Address))
118 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000119
John McCall460ce582015-10-22 18:38:17 +0000120 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
121 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000124 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000125 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000126 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000127
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000128 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000129 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000130 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000131 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000132
133 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000134 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000135
Daniel Dunbarecf13562011-04-19 21:40:34 +0000136 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000138 if (Triple.isMacOSX()) {
139 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 Triple.getOSVersion(Maj, Min, Rev);
143 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000145
Sebastian Pop422377c2012-01-20 22:01:23 +0000146 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000147 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000148 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
149 if (PlatformName == "win32") {
150 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
151 return;
152 }
153
Evan Cheng31dd9a62014-01-26 23:12:43 +0000154 // Set the appropriate OS version define.
155 if (Triple.isiOS()) {
156 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
157 char Str[6];
158 Str[0] = '0' + Maj;
159 Str[1] = '0' + (Min / 10);
160 Str[2] = '0' + (Min % 10);
161 Str[3] = '0' + (Rev / 10);
162 Str[4] = '0' + (Rev % 10);
163 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000164 if (Triple.isTvOS())
165 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
166 else
167 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
168 Str);
169
170 } else if (Triple.isWatchOS()) {
171 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
172 char Str[6];
173 Str[0] = '0' + Maj;
174 Str[1] = '0' + (Min / 10);
175 Str[2] = '0' + (Min % 10);
176 Str[3] = '0' + (Rev / 10);
177 Str[4] = '0' + (Rev % 10);
178 Str[5] = '\0';
179 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000180 } else if (Triple.isMacOSX()) {
181 // Note that the Driver allows versions which aren't representable in the
182 // define (because we only get a single digit for the minor and micro
183 // revision numbers). So, we limit them to the maximum representable
184 // version.
185 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000186 char Str[7];
187 if (Maj < 10 || (Maj == 10 && Min < 10)) {
188 Str[0] = '0' + (Maj / 10);
189 Str[1] = '0' + (Maj % 10);
190 Str[2] = '0' + std::min(Min, 9U);
191 Str[3] = '0' + std::min(Rev, 9U);
192 Str[4] = '\0';
193 } else {
194 // Handle versions > 10.9.
195 Str[0] = '0' + (Maj / 10);
196 Str[1] = '0' + (Maj % 10);
197 Str[2] = '0' + (Min / 10);
198 Str[3] = '0' + (Min % 10);
199 Str[4] = '0' + (Rev / 10);
200 Str[5] = '0' + (Rev % 10);
201 Str[6] = '\0';
202 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000203 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000204 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000205
Tim Northover157d9112014-01-16 08:48:16 +0000206 // Tell users about the kernel if there is one.
207 if (Triple.isOSDarwin())
208 Builder.defineMacro("__MACH__");
209
Daniel Dunbarecf13562011-04-19 21:40:34 +0000210 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000211}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213template<typename Target>
214class DarwinTargetInfo : public OSTargetInfo<Target> {
215protected:
Craig Topper3164f332014-03-11 03:39:26 +0000216 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
217 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000218 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000219 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220 }
Mike Stump11289f42009-09-09 15:08:12 +0000221
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000223 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000224 // By default, no TLS, and we whitelist permitted architecture/OS
225 // combinations.
226 this->TLSSupported = false;
227
228 if (Triple.isMacOSX())
229 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
230 else if (Triple.isiOS()) {
231 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
232 if (Triple.getArch() == llvm::Triple::x86_64 ||
233 Triple.getArch() == llvm::Triple::aarch64)
234 this->TLSSupported = !Triple.isOSVersionLT(8);
235 else if (Triple.getArch() == llvm::Triple::x86 ||
236 Triple.getArch() == llvm::Triple::arm ||
237 Triple.getArch() == llvm::Triple::thumb)
238 this->TLSSupported = !Triple.isOSVersionLT(9);
239 } else if (Triple.isWatchOS())
240 this->TLSSupported = !Triple.isOSVersionLT(2);
241
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000242 this->MCountName = "\01mcount";
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244
Craig Topper3164f332014-03-11 03:39:26 +0000245 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000246 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000247 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000248 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000249 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000250 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000251 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000255 // FIXME: We should return 0 when building kexts.
256 return "__TEXT,__StaticInit,regular,pure_instructions";
257 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000258
John McCalleed64c72012-01-29 01:20:30 +0000259 /// Darwin does not support protected visibility. Darwin's "default"
260 /// is very similar to ELF's "protected"; Darwin requires a "weak"
261 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000262 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000263 return false;
264 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000265};
266
Chris Lattner30ba6742009-08-10 19:03:04 +0000267
Torok Edwinb2b37c62009-06-30 17:10:35 +0000268// DragonFlyBSD Target
269template<typename Target>
270class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
271protected:
Craig Topper3164f332014-03-11 03:39:26 +0000272 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
273 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000275 Builder.defineMacro("__DragonFly__");
276 Builder.defineMacro("__DragonFly_cc_version", "100001");
277 Builder.defineMacro("__ELF__");
278 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
279 Builder.defineMacro("__tune_i386__");
280 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281 }
282public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000283 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
284 : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 switch (Triple.getArch()) {
286 default:
287 case llvm::Triple::x86:
288 case llvm::Triple::x86_64:
289 this->MCountName = ".mcount";
290 break;
291 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000292 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000293};
294
295// FreeBSD Target
296template<typename Target>
297class FreeBSDTargetInfo : public OSTargetInfo<Target> {
298protected:
Craig Topper3164f332014-03-11 03:39:26 +0000299 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
300 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000301 // FreeBSD defines; list based off of gcc output
302
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000303 unsigned Release = Triple.getOSMajorVersion();
304 if (Release == 0U)
305 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000307 Builder.defineMacro("__FreeBSD__", Twine(Release));
308 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000309 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
310 DefineStd(Builder, "unix", Opts);
311 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000312
313 // On FreeBSD, wchar_t contains the number of the code point as
314 // used by the character set of the locale. These character sets are
315 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000316 //
317 // FIXME: This is wrong; the macro refers to the numerical values
318 // of wchar_t *literals*, which are not locale-dependent. However,
319 // FreeBSD systems apparently depend on us getting this wrong, and
320 // setting this to 1 is conforming even if all the basic source
321 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000322 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000323 }
324public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000325 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 switch (Triple.getArch()) {
327 default:
328 case llvm::Triple::x86:
329 case llvm::Triple::x86_64:
330 this->MCountName = ".mcount";
331 break;
332 case llvm::Triple::mips:
333 case llvm::Triple::mipsel:
334 case llvm::Triple::ppc:
335 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000336 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000337 this->MCountName = "_mcount";
338 break;
339 case llvm::Triple::arm:
340 this->MCountName = "__mcount";
341 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000342 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000344};
345
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000346// GNU/kFreeBSD Target
347template<typename Target>
348class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
349protected:
Craig Topper3164f332014-03-11 03:39:26 +0000350 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
351 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000352 // GNU/kFreeBSD defines; list based off of gcc output
353
354 DefineStd(Builder, "unix", Opts);
355 Builder.defineMacro("__FreeBSD_kernel__");
356 Builder.defineMacro("__GLIBC__");
357 Builder.defineMacro("__ELF__");
358 if (Opts.POSIXThreads)
359 Builder.defineMacro("_REENTRANT");
360 if (Opts.CPlusPlus)
361 Builder.defineMacro("_GNU_SOURCE");
362 }
363public:
Eric Christopher917e9522014-11-18 22:36:15 +0000364 KFreeBSDTargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000365 : OSTargetInfo<Target>(Triple) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000366};
367
Chris Lattner3e2ee142010-07-07 16:01:42 +0000368// Minix Target
369template<typename Target>
370class MinixTargetInfo : public OSTargetInfo<Target> {
371protected:
Craig Topper3164f332014-03-11 03:39:26 +0000372 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
373 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000374 // Minix defines
375
376 Builder.defineMacro("__minix", "3");
377 Builder.defineMacro("_EM_WSIZE", "4");
378 Builder.defineMacro("_EM_PSIZE", "4");
379 Builder.defineMacro("_EM_SSIZE", "2");
380 Builder.defineMacro("_EM_LSIZE", "4");
381 Builder.defineMacro("_EM_FSIZE", "4");
382 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000383 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000384 DefineStd(Builder, "unix", Opts);
385 }
386public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000387 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000388};
389
Torok Edwinb2b37c62009-06-30 17:10:35 +0000390// Linux target
391template<typename Target>
392class LinuxTargetInfo : public OSTargetInfo<Target> {
393protected:
Craig Topper3164f332014-03-11 03:39:26 +0000394 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
395 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000396 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000397 DefineStd(Builder, "unix", Opts);
398 DefineStd(Builder, "linux", Opts);
399 Builder.defineMacro("__gnu_linux__");
400 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000401 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000402 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000403 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000404 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000405 this->PlatformName = "android";
406 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
407 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000408 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000409 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000410 if (Opts.CPlusPlus)
411 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000412 }
413public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000414 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000415 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000416
417 switch (Triple.getArch()) {
418 default:
419 break;
420 case llvm::Triple::ppc:
421 case llvm::Triple::ppc64:
422 case llvm::Triple::ppc64le:
423 this->MCountName = "_mcount";
424 break;
425 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000426 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000427
Craig Topper3164f332014-03-11 03:39:26 +0000428 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000429 return ".text.startup";
430 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431};
432
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000433// NetBSD Target
434template<typename Target>
435class NetBSDTargetInfo : public OSTargetInfo<Target> {
436protected:
Craig Topper3164f332014-03-11 03:39:26 +0000437 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
438 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000439 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000440 Builder.defineMacro("__NetBSD__");
441 Builder.defineMacro("__unix__");
442 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000443 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000444 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000445
446 switch (Triple.getArch()) {
447 default:
448 break;
449 case llvm::Triple::arm:
450 case llvm::Triple::armeb:
451 case llvm::Triple::thumb:
452 case llvm::Triple::thumbeb:
453 Builder.defineMacro("__ARM_DWARF_EH__");
454 break;
455 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000456 }
457public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000458 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000459 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000460 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000461};
462
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463// OpenBSD Target
464template<typename Target>
465class OpenBSDTargetInfo : public OSTargetInfo<Target> {
466protected:
Craig Topper3164f332014-03-11 03:39:26 +0000467 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
468 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000469 // OpenBSD defines; list based off of gcc output
470
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000471 Builder.defineMacro("__OpenBSD__");
472 DefineStd(Builder, "unix", Opts);
473 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000474 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000475 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000476 }
477public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000478 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000479 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000480
Eli Friedman3715d1f2011-12-15 02:15:56 +0000481 switch (Triple.getArch()) {
482 default:
483 case llvm::Triple::x86:
484 case llvm::Triple::x86_64:
485 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000486 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000487 this->MCountName = "__mcount";
488 break;
489 case llvm::Triple::mips64:
490 case llvm::Triple::mips64el:
491 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000492 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000493 this->MCountName = "_mcount";
494 break;
495 }
496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497};
498
Eli Friedman9fa28852012-08-08 23:57:20 +0000499// Bitrig Target
500template<typename Target>
501class BitrigTargetInfo : public OSTargetInfo<Target> {
502protected:
Craig Topper3164f332014-03-11 03:39:26 +0000503 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
504 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000505 // Bitrig defines; list based off of gcc output
506
507 Builder.defineMacro("__Bitrig__");
508 DefineStd(Builder, "unix", Opts);
509 Builder.defineMacro("__ELF__");
510 if (Opts.POSIXThreads)
511 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000512
513 switch (Triple.getArch()) {
514 default:
515 break;
516 case llvm::Triple::arm:
517 case llvm::Triple::armeb:
518 case llvm::Triple::thumb:
519 case llvm::Triple::thumbeb:
520 Builder.defineMacro("__ARM_DWARF_EH__");
521 break;
522 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000523 }
524public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000525 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000526 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000527 }
528};
529
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000530// PSP Target
531template<typename Target>
532class PSPTargetInfo : public OSTargetInfo<Target> {
533protected:
Craig Topper3164f332014-03-11 03:39:26 +0000534 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
535 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000536 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000537 Builder.defineMacro("PSP");
538 Builder.defineMacro("_PSP");
539 Builder.defineMacro("__psp__");
540 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000541 }
542public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000543 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000544};
545
John Thompsone467e192009-11-19 17:18:50 +0000546// PS3 PPU Target
547template<typename Target>
548class PS3PPUTargetInfo : public OSTargetInfo<Target> {
549protected:
Craig Topper3164f332014-03-11 03:39:26 +0000550 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
551 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000552 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000553 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000554 Builder.defineMacro("__PPU__");
555 Builder.defineMacro("__CELLOS_LV2__");
556 Builder.defineMacro("__ELF__");
557 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000558 Builder.defineMacro("_ARCH_PPC64");
559 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000560 }
561public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000562 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000563 this->LongWidth = this->LongAlign = 32;
564 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000565 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000566 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000567 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000568 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000569 }
570};
571
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000572template <typename Target>
573class PS4OSTargetInfo : public OSTargetInfo<Target> {
574protected:
575 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
576 MacroBuilder &Builder) const override {
577 Builder.defineMacro("__FreeBSD__", "9");
578 Builder.defineMacro("__FreeBSD_cc_version", "900001");
579 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
580 DefineStd(Builder, "unix", Opts);
581 Builder.defineMacro("__ELF__");
582 Builder.defineMacro("__PS4__");
583 }
584public:
585 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
586 this->WCharType = this->UnsignedShort;
587
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000588 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
589 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000590
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000591 // On PS4, do not honor explicit bit field alignment,
592 // as in "__attribute__((aligned(2))) int b : 1;".
593 this->UseExplicitBitFieldAlignment = false;
594
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000595 switch (Triple.getArch()) {
596 default:
597 case llvm::Triple::x86_64:
598 this->MCountName = ".mcount";
599 break;
600 }
601 }
602};
603
Torok Edwinb2b37c62009-06-30 17:10:35 +0000604// Solaris target
605template<typename Target>
606class SolarisTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000610 DefineStd(Builder, "sun", Opts);
611 DefineStd(Builder, "unix", Opts);
612 Builder.defineMacro("__ELF__");
613 Builder.defineMacro("__svr4__");
614 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000615 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
616 // newer, but to 500 for everything else. feature_test.h has a check to
617 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000618 // with a new version.
619 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000620 Builder.defineMacro("_XOPEN_SOURCE", "600");
621 else
622 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000623 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000624 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000625 Builder.defineMacro("_LARGEFILE_SOURCE");
626 Builder.defineMacro("_LARGEFILE64_SOURCE");
627 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000628 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000629 }
630public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000631 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
David Chisnallb526e932012-03-28 18:04:14 +0000632 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000633 // FIXME: WIntType should be SignedLong
634 }
635};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636
637// Windows target
638template<typename Target>
639class WindowsTargetInfo : public OSTargetInfo<Target> {
640protected:
Craig Topper3164f332014-03-11 03:39:26 +0000641 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
642 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000643 Builder.defineMacro("_WIN32");
644 }
645 void getVisualStudioDefines(const LangOptions &Opts,
646 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000647 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000648 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000649 Builder.defineMacro("_CPPRTTI");
650
Reid Kleckner16514352015-01-30 21:42:55 +0000651 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000652 Builder.defineMacro("_CPPUNWIND");
653 }
654
David Majnemer6a658902015-07-22 22:36:26 +0000655 if (Opts.Bool)
656 Builder.defineMacro("__BOOL_DEFINED");
657
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000658 if (!Opts.CharIsSigned)
659 Builder.defineMacro("_CHAR_UNSIGNED");
660
661 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
662 // but it works for now.
663 if (Opts.POSIXThreads)
664 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000665
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000666 if (Opts.MSCompatibilityVersion) {
667 Builder.defineMacro("_MSC_VER",
668 Twine(Opts.MSCompatibilityVersion / 100000));
669 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000670 // FIXME We cannot encode the revision information into 32-bits
671 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000672
David Majnemerb710a932015-05-11 03:57:49 +0000673 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000674 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000675 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000676
677 if (Opts.MicrosoftExt) {
678 Builder.defineMacro("_MSC_EXTENSIONS");
679
680 if (Opts.CPlusPlus11) {
681 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
682 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
683 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
684 }
685 }
686
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000687 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000688 }
689
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000690public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000691 WindowsTargetInfo(const llvm::Triple &Triple)
692 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000693};
694
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000695template <typename Target>
696class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000697protected:
Craig Topper3164f332014-03-11 03:39:26 +0000698 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
699 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000700 if (Opts.POSIXThreads)
701 Builder.defineMacro("_REENTRANT");
702 if (Opts.CPlusPlus)
703 Builder.defineMacro("_GNU_SOURCE");
704
705 DefineStd(Builder, "unix", Opts);
706 Builder.defineMacro("__ELF__");
707 Builder.defineMacro("__native_client__");
708 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000709
710public:
711 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000712 this->LongAlign = 32;
713 this->LongWidth = 32;
714 this->PointerAlign = 32;
715 this->PointerWidth = 32;
716 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000717 this->Int64Type = TargetInfo::SignedLongLong;
718 this->DoubleAlign = 64;
719 this->LongDoubleWidth = 64;
720 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000721 this->LongLongWidth = 64;
722 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000723 this->SizeType = TargetInfo::UnsignedInt;
724 this->PtrDiffType = TargetInfo::SignedInt;
725 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000726 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000727 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000728 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000729 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000731 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000732 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000733 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000734 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000735 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000736 } else {
737 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000738 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000739 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000740 }
741};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000742
Dan Gohmanc2853072015-09-03 22:51:53 +0000743// WebAssembly target
744template <typename Target>
745class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
746 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000747 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000748 // A common platform macro.
749 if (Opts.POSIXThreads)
750 Builder.defineMacro("_REENTRANT");
751 // Follow g++ convention and predefine _GNU_SOURCE for C++.
752 if (Opts.CPlusPlus)
753 Builder.defineMacro("_GNU_SOURCE");
754 }
755
756 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000757 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000758 return ".text.__startup";
759 }
760
761public:
762 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
763 : OSTargetInfo<Target>(Triple) {
764 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000765 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
766 }
767};
Dan Gohmanc2853072015-09-03 22:51:53 +0000768
Chris Lattner09d98f52008-10-05 21:50:58 +0000769//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000770// Specific target implementations.
771//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000772
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000773// PPC abstract base class
774class PPCTargetInfo : public TargetInfo {
775 static const Builtin::Info BuiltinInfo[];
776 static const char * const GCCRegNames[];
777 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000778 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000779
780 // Target cpu features.
781 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000782 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000783 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000784 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000785 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000786 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000787 bool HasBPERMD;
788 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000789
Ulrich Weigand8afad612014-07-28 13:17:52 +0000790protected:
791 std::string ABI;
792
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000793public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000794 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000795 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000796 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000797 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000798 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000799 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000800 LongDoubleWidth = LongDoubleAlign = 128;
801 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
802 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000803
Hal Finkel6b984f02012-07-03 16:51:04 +0000804 /// \brief Flags for architecture specific defines.
805 typedef enum {
806 ArchDefineNone = 0,
807 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
808 ArchDefinePpcgr = 1 << 1,
809 ArchDefinePpcsq = 1 << 2,
810 ArchDefine440 = 1 << 3,
811 ArchDefine603 = 1 << 4,
812 ArchDefine604 = 1 << 5,
813 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000814 ArchDefinePwr5 = 1 << 7,
815 ArchDefinePwr5x = 1 << 8,
816 ArchDefinePwr6 = 1 << 9,
817 ArchDefinePwr6x = 1 << 10,
818 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000819 ArchDefinePwr8 = 1 << 12,
820 ArchDefineA2 = 1 << 13,
821 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000822 } ArchDefineTypes;
823
Bill Schmidt38378a02013-02-01 20:23:10 +0000824 // Note: GCC recognizes the following additional cpus:
825 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
826 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
827 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000828 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000829 bool CPUKnown = llvm::StringSwitch<bool>(Name)
830 .Case("generic", true)
831 .Case("440", true)
832 .Case("450", true)
833 .Case("601", true)
834 .Case("602", true)
835 .Case("603", true)
836 .Case("603e", true)
837 .Case("603ev", true)
838 .Case("604", true)
839 .Case("604e", true)
840 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000841 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000842 .Case("g3", true)
843 .Case("7400", true)
844 .Case("g4", true)
845 .Case("7450", true)
846 .Case("g4+", true)
847 .Case("750", true)
848 .Case("970", true)
849 .Case("g5", true)
850 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000851 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000852 .Case("e500mc", true)
853 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000854 .Case("power3", true)
855 .Case("pwr3", true)
856 .Case("power4", true)
857 .Case("pwr4", true)
858 .Case("power5", true)
859 .Case("pwr5", true)
860 .Case("power5x", true)
861 .Case("pwr5x", true)
862 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("power6x", true)
865 .Case("pwr6x", true)
866 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000867 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000868 .Case("power8", true)
869 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000870 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000871 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000872 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000873 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000874 .Case("powerpc64le", true)
875 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000876 .Default(false);
877
878 if (CPUKnown)
879 CPU = Name;
880
881 return CPUKnown;
882 }
883
Ulrich Weigand8afad612014-07-28 13:17:52 +0000884
885 StringRef getABI() const override { return ABI; }
886
Craig Topper6c03a542015-10-19 04:51:35 +0000887 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
888 return llvm::makeArrayRef(BuiltinInfo,
889 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000890 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000891
Craig Topper3164f332014-03-11 03:39:26 +0000892 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000893
Craig Topper3164f332014-03-11 03:39:26 +0000894 void getTargetDefines(const LangOptions &Opts,
895 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000896
Eric Christopher8c47b422015-10-09 18:39:55 +0000897 bool
898 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
899 StringRef CPU,
900 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000901
Craig Topper3164f332014-03-11 03:39:26 +0000902 bool handleTargetFeatures(std::vector<std::string> &Features,
903 DiagnosticsEngine &Diags) override;
904 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000905 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
906 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000907
Craig Topperf054e3a2015-10-19 03:52:27 +0000908 ArrayRef<const char *> getGCCRegNames() const override;
909 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000910 bool validateAsmConstraint(const char *&Name,
911 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000912 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000913 default: return false;
914 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000915 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000916 case 'b': // Base register
917 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000918 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000919 break;
920 // FIXME: The following are added to allow parsing.
921 // I just took a guess at what the actions should be.
922 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000924 case 'v': // Altivec vector register
925 Info.setAllowsRegister();
926 break;
927 case 'w':
928 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 case 'd':// VSX vector register to hold vector double data
930 case 'f':// VSX vector register to hold vector float data
931 case 's':// VSX vector register to hold scalar float data
932 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000933 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000934 break;
935 default:
936 return false;
937 }
938 Info.setAllowsRegister();
939 Name++; // Skip over 'w'.
940 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 case 'h': // `MQ', `CTR', or `LINK' register
942 case 'q': // `MQ' register
943 case 'c': // `CTR' register
944 case 'l': // `LINK' register
945 case 'x': // `CR' register (condition register) number 0
946 case 'y': // `CR' register (condition register)
947 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000948 Info.setAllowsRegister();
949 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000951 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000952 // (use `L' instead for SImode constants)
953 case 'K': // Unsigned 16-bit constant
954 case 'L': // Signed 16-bit constant shifted left 16 bits
955 case 'M': // Constant larger than 31
956 case 'N': // Exact power of 2
957 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000960 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000962 break;
963 case 'm': // Memory operand. Note that on PowerPC targets, m can
964 // include addresses that update the base register. It
965 // is therefore only safe to use `m' in an asm statement
966 // if that asm statement accesses the operand exactly once.
967 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000968 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000970 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000972 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
973 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 // register to be updated.
975 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000976 if (Name[1] != 's')
977 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000978 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000979 // include any automodification of the base register. Unlike
980 // `m', this constraint can be used in asm statements that
981 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000982 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000983 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000984 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000985 break;
986 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000987 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000988 case 'Z': // Memory operand that is an indexed or indirect from a
989 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000991 Info.setAllowsMemory();
992 Info.setAllowsRegister();
993 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // register (`p' is preferable for asm statements)
997 case 'S': // Constant suitable as a 64-bit mask operand
998 case 'T': // Constant suitable as a 32-bit mask operand
999 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001000 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 // instructions
1002 case 'W': // Vector constant that does not require memory
1003 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001004 break;
1005 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001006 }
John Thompson07a61a42010-06-24 22:44:13 +00001007 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001008 }
Craig Topper3164f332014-03-11 03:39:26 +00001009 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001010 std::string R;
1011 switch (*Constraint) {
1012 case 'e':
1013 case 'w':
1014 // Two-character constraint; add "^" hint for later parsing.
1015 R = std::string("^") + std::string(Constraint, 2);
1016 Constraint++;
1017 break;
1018 default:
1019 return TargetInfo::convertConstraint(Constraint);
1020 }
1021 return R;
1022 }
Craig Topper3164f332014-03-11 03:39:26 +00001023 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001024 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 }
Craig Topper3164f332014-03-11 03:39:26 +00001026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001027 if (RegNo == 0) return 3;
1028 if (RegNo == 1) return 4;
1029 return -1;
1030 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001031
1032 bool hasSjLjLowering() const override {
1033 return true;
1034 }
David Majnemer2617ea62015-06-09 18:05:33 +00001035
1036 bool useFloat128ManglingForLongDouble() const override {
1037 return LongDoubleWidth == 128 &&
1038 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1039 getTriple().isOSBinFormatELF();
1040 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001041};
Anders Carlssonf511f642007-11-27 04:11:28 +00001042
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001043const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001044#define BUILTIN(ID, TYPE, ATTRS) \
1045 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1046#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1047 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001048#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001049};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001050
Eric Christopher917e9522014-11-18 22:36:15 +00001051/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001053bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001055 for (const auto &Feature : Features) {
1056 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001059 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001061 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001063 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001064 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001065 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001066 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001067 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001068 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001069 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001070 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001071 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001072 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001073 // TODO: Finish this list and add an assert that we've handled them
1074 // all.
1075 }
Eric Christopher02c33352015-08-25 00:59:11 +00001076
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001077 return true;
1078}
1079
Chris Lattnerecd49032009-03-02 22:27:17 +00001080/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1081/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001082void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001084 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001086 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001088 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001089 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001091 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001092 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001093 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001094 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001095 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001098 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1099 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001100 } else {
1101 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1102 getTriple().getOS() != llvm::Triple::OpenBSD)
1103 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001104 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001105
Ulrich Weigand8afad612014-07-28 13:17:52 +00001106 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001107 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001108 Builder.defineMacro("_CALL_ELF", "1");
1109 if (ABI == "elfv2")
1110 Builder.defineMacro("_CALL_ELF", "2");
1111
Chris Lattnerecd49032009-03-02 22:27:17 +00001112 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1114 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001115
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001117 if (LongDoubleWidth == 128)
1118 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001119
John Thompsone467e192009-11-19 17:18:50 +00001120 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001121 Builder.defineMacro("__VEC__", "10206");
1122 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001123 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001124
1125 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001126 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1127 .Case("440", ArchDefineName)
1128 .Case("450", ArchDefineName | ArchDefine440)
1129 .Case("601", ArchDefineName)
1130 .Case("602", ArchDefineName | ArchDefinePpcgr)
1131 .Case("603", ArchDefineName | ArchDefinePpcgr)
1132 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1133 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1134 .Case("604", ArchDefineName | ArchDefinePpcgr)
1135 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1136 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001137 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001138 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1139 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1140 .Case("750", ArchDefineName | ArchDefinePpcgr)
1141 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001143 .Case("a2", ArchDefineA2)
1144 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001145 .Case("pwr3", ArchDefinePpcgr)
1146 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1147 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1148 | ArchDefinePpcsq)
1149 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1150 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1152 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1154 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1157 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001158 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1160 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1161 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 .Case("power3", ArchDefinePpcgr)
1163 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1165 | ArchDefinePpcsq)
1166 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1167 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1169 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1171 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1174 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001175 | ArchDefinePpcgr | ArchDefinePpcsq)
1176 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1177 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1178 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001179 .Default(ArchDefineNone);
1180
1181 if (defs & ArchDefineName)
1182 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1183 if (defs & ArchDefinePpcgr)
1184 Builder.defineMacro("_ARCH_PPCGR");
1185 if (defs & ArchDefinePpcsq)
1186 Builder.defineMacro("_ARCH_PPCSQ");
1187 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001188 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 if (defs & ArchDefine603)
1190 Builder.defineMacro("_ARCH_603");
1191 if (defs & ArchDefine604)
1192 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001193 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001194 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001195 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 if (defs & ArchDefinePwr5x)
1198 Builder.defineMacro("_ARCH_PWR5X");
1199 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001200 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001201 if (defs & ArchDefinePwr6x)
1202 Builder.defineMacro("_ARCH_PWR6X");
1203 if (defs & ArchDefinePwr7)
1204 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001205 if (defs & ArchDefinePwr8)
1206 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001207 if (defs & ArchDefineA2)
1208 Builder.defineMacro("_ARCH_A2");
1209 if (defs & ArchDefineA2q) {
1210 Builder.defineMacro("_ARCH_A2Q");
1211 Builder.defineMacro("_ARCH_QP");
1212 }
1213
1214 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1215 Builder.defineMacro("__bg__");
1216 Builder.defineMacro("__THW_BLUEGENE__");
1217 Builder.defineMacro("__bgq__");
1218 Builder.defineMacro("__TOS_BGQ__");
1219 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001220
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001221 if (HasVSX)
1222 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001223 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001224 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001225 if (HasP8Crypto)
1226 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001227 if (HasHTM)
1228 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001229
1230 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1231 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1232 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1233 if (PointerWidth == 64)
1234 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001235
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 // FIXME: The following are not yet generated here by Clang, but are
1237 // generated by GCC:
1238 //
1239 // _SOFT_FLOAT_
1240 // __RECIP_PRECISION__
1241 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 // __RECIP__
1243 // __RECIPF__
1244 // __RSQRTE__
1245 // __RSQRTEF__
1246 // _SOFT_DOUBLE_
1247 // __NO_LWSYNC__
1248 // __HAVE_BSWAP__
1249 // __LONGDOUBLE128
1250 // __CMODEL_MEDIUM__
1251 // __CMODEL_LARGE__
1252 // _CALL_SYSV
1253 // _CALL_DARWIN
1254 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001255}
1256
Eric Christophera8a14c32015-08-31 18:39:16 +00001257// Handle explicit options being passed to the compiler here: if we've
1258// explicitly turned off vsx and turned on power8-vector or direct-move then
1259// go ahead and error since the customer has expressed a somewhat incompatible
1260// set of options.
1261static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001262 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001263
1264 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1265 FeaturesVec.end()) {
1266 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1267 FeaturesVec.end()) {
1268 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1269 << "-mno-vsx";
1270 return false;
1271 }
1272
1273 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1274 FeaturesVec.end()) {
1275 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1276 << "-mno-vsx";
1277 return false;
1278 }
1279 }
1280
1281 return true;
1282}
1283
Eric Christopher8c47b422015-10-09 18:39:55 +00001284bool PPCTargetInfo::initFeatureMap(
1285 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1286 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001287 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1288 .Case("7400", true)
1289 .Case("g4", true)
1290 .Case("7450", true)
1291 .Case("g4+", true)
1292 .Case("970", true)
1293 .Case("g5", true)
1294 .Case("pwr6", true)
1295 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001296 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001297 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001298 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001299 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001300
1301 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001302 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1303 .Case("ppc64le", true)
1304 .Case("pwr8", true)
1305 .Default(false);
1306 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1307 .Case("ppc64le", true)
1308 .Case("pwr8", true)
1309 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001310 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1311 .Case("ppc64le", true)
1312 .Case("pwr8", true)
1313 .Case("pwr7", true)
1314 .Default(false);
1315 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1316 .Case("ppc64le", true)
1317 .Case("pwr8", true)
1318 .Case("pwr7", true)
1319 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001320 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1321 .Case("ppc64le", true)
1322 .Case("pwr8", true)
1323 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001324 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1325 .Case("ppc64le", true)
1326 .Case("pwr8", true)
1327 .Case("pwr7", true)
1328 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001329
Eric Christophera8a14c32015-08-31 18:39:16 +00001330 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1331 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001332
Eric Christopher007b0a02015-08-28 22:32:01 +00001333 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001334}
1335
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001336bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001337 return llvm::StringSwitch<bool>(Feature)
1338 .Case("powerpc", true)
1339 .Case("vsx", HasVSX)
1340 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001341 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001342 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001343 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001344 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001345 .Case("bpermd", HasBPERMD)
1346 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001347 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001348}
Chris Lattner17df24e2008-04-21 18:56:49 +00001349
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001350void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1351 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001352 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1353 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1354 // incompatible options.
1355 if (Enabled) {
1356 if (Name == "vsx") {
1357 Features[Name] = true;
1358 } else if (Name == "direct-move") {
1359 Features[Name] = Features["vsx"] = true;
1360 } else if (Name == "power8-vector") {
1361 Features[Name] = Features["vsx"] = true;
1362 } else {
1363 Features[Name] = true;
1364 }
1365 } else {
1366 if (Name == "vsx") {
1367 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1368 false;
1369 } else {
1370 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001371 }
1372 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001373}
1374
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001375const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001376 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1378 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1379 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1380 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1381 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1382 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1383 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001385 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001387 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1388 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1389 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1390 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001391 "vrsave", "vscr",
1392 "spe_acc", "spefscr",
1393 "sfp"
1394};
Chris Lattner10a5b382007-01-29 05:24:35 +00001395
Craig Topperf054e3a2015-10-19 03:52:27 +00001396ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1397 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001398}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001399
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001400const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1401 // While some of these aliases do map to different registers
1402 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001403 { { "0" }, "r0" },
1404 { { "1"}, "r1" },
1405 { { "2" }, "r2" },
1406 { { "3" }, "r3" },
1407 { { "4" }, "r4" },
1408 { { "5" }, "r5" },
1409 { { "6" }, "r6" },
1410 { { "7" }, "r7" },
1411 { { "8" }, "r8" },
1412 { { "9" }, "r9" },
1413 { { "10" }, "r10" },
1414 { { "11" }, "r11" },
1415 { { "12" }, "r12" },
1416 { { "13" }, "r13" },
1417 { { "14" }, "r14" },
1418 { { "15" }, "r15" },
1419 { { "16" }, "r16" },
1420 { { "17" }, "r17" },
1421 { { "18" }, "r18" },
1422 { { "19" }, "r19" },
1423 { { "20" }, "r20" },
1424 { { "21" }, "r21" },
1425 { { "22" }, "r22" },
1426 { { "23" }, "r23" },
1427 { { "24" }, "r24" },
1428 { { "25" }, "r25" },
1429 { { "26" }, "r26" },
1430 { { "27" }, "r27" },
1431 { { "28" }, "r28" },
1432 { { "29" }, "r29" },
1433 { { "30" }, "r30" },
1434 { { "31" }, "r31" },
1435 { { "fr0" }, "f0" },
1436 { { "fr1" }, "f1" },
1437 { { "fr2" }, "f2" },
1438 { { "fr3" }, "f3" },
1439 { { "fr4" }, "f4" },
1440 { { "fr5" }, "f5" },
1441 { { "fr6" }, "f6" },
1442 { { "fr7" }, "f7" },
1443 { { "fr8" }, "f8" },
1444 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001445 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001446 { { "fr11" }, "f11" },
1447 { { "fr12" }, "f12" },
1448 { { "fr13" }, "f13" },
1449 { { "fr14" }, "f14" },
1450 { { "fr15" }, "f15" },
1451 { { "fr16" }, "f16" },
1452 { { "fr17" }, "f17" },
1453 { { "fr18" }, "f18" },
1454 { { "fr19" }, "f19" },
1455 { { "fr20" }, "f20" },
1456 { { "fr21" }, "f21" },
1457 { { "fr22" }, "f22" },
1458 { { "fr23" }, "f23" },
1459 { { "fr24" }, "f24" },
1460 { { "fr25" }, "f25" },
1461 { { "fr26" }, "f26" },
1462 { { "fr27" }, "f27" },
1463 { { "fr28" }, "f28" },
1464 { { "fr29" }, "f29" },
1465 { { "fr30" }, "f30" },
1466 { { "fr31" }, "f31" },
1467 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001468};
1469
Craig Topperf054e3a2015-10-19 03:52:27 +00001470ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1471 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001472}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001473
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001474class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001476 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001477 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001478
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001479 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001480 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001481 case llvm::Triple::FreeBSD:
1482 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001483 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001484 PtrDiffType = SignedInt;
1485 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001486 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001487 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001488 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001489 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001490
Roman Divacky3ffe7462012-03-13 19:20:17 +00001491 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1492 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001493 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001494 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001495
1496 // PPC32 supports atomics up to 4 bytes.
1497 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001498 }
1499
Craig Topper3164f332014-03-11 03:39:26 +00001500 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001501 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001502 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001503 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001504};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001505
Bill Schmidt778d3872013-07-26 01:36:11 +00001506// Note: ABI differences may eventually require us to have a separate
1507// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001508class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001510 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001511 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001512 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001513 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001514
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001515 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001516 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001517 ABI = "elfv2";
1518 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001519 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001520 ABI = "elfv1";
1521 }
1522
1523 switch (getTriple().getOS()) {
1524 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001525 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001526 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001527 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001528 case llvm::Triple::NetBSD:
1529 IntMaxType = SignedLongLong;
1530 Int64Type = SignedLongLong;
1531 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001532 default:
1533 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001534 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001535
1536 // PPC64 supports atomics up to 8 bytes.
1537 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001538 }
Craig Topper3164f332014-03-11 03:39:26 +00001539 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001540 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001541 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001542 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001543 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001544 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001545 ABI = Name;
1546 return true;
1547 }
1548 return false;
1549 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001551
Roman Divacky965b0b72011-01-06 08:27:10 +00001552class DarwinPPC32TargetInfo :
1553 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001555 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1556 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001557 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001558 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001559 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001560 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001561 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001562 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001563 }
Craig Topper3164f332014-03-11 03:39:26 +00001564 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001565 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001566 }
1567};
1568
1569class DarwinPPC64TargetInfo :
1570 public DarwinTargetInfo<PPC64TargetInfo> {
1571public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001572 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1573 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001574 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001575 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001576 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001577 }
1578};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001579
Eric Christopherc48497a2015-09-18 21:26:24 +00001580static const unsigned NVPTXAddrSpaceMap[] = {
1581 1, // opencl_global
1582 3, // opencl_local
1583 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001584 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001585 0, // opencl_generic
1586 1, // cuda_device
1587 4, // cuda_constant
1588 3, // cuda_shared
1589};
1590
1591class NVPTXTargetInfo : public TargetInfo {
1592 static const char *const GCCRegNames[];
1593 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001594
1595 // The GPU profiles supported by the NVPTX backend
1596 enum GPUKind {
1597 GK_NONE,
1598 GK_SM20,
1599 GK_SM21,
1600 GK_SM30,
1601 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001602 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001603 } GPU;
1604
Eric Christopherc48497a2015-09-18 21:26:24 +00001605public:
1606 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1607 BigEndian = false;
1608 TLSSupported = false;
1609 LongWidth = LongAlign = 64;
1610 AddrSpaceMap = &NVPTXAddrSpaceMap;
1611 UseAddrSpaceMapMangling = true;
1612 // Define available target features
1613 // These must be defined in sorted order!
1614 NoAsmVariants = true;
1615 // Set the default GPU to sm20
1616 GPU = GK_SM20;
1617 }
1618 void getTargetDefines(const LangOptions &Opts,
1619 MacroBuilder &Builder) const override {
1620 Builder.defineMacro("__PTX__");
1621 Builder.defineMacro("__NVPTX__");
1622 if (Opts.CUDAIsDevice) {
1623 // Set __CUDA_ARCH__ for the GPU specified.
1624 std::string CUDAArchCode;
1625 switch (GPU) {
1626 case GK_SM20:
1627 CUDAArchCode = "200";
1628 break;
1629 case GK_SM21:
1630 CUDAArchCode = "210";
1631 break;
1632 case GK_SM30:
1633 CUDAArchCode = "300";
1634 break;
1635 case GK_SM35:
1636 CUDAArchCode = "350";
1637 break;
1638 case GK_SM37:
1639 CUDAArchCode = "370";
1640 break;
1641 default:
1642 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001643 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001644 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001646 }
Craig Topper6c03a542015-10-19 04:51:35 +00001647 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1648 return llvm::makeArrayRef(BuiltinInfo,
1649 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001650 }
1651 bool hasFeature(StringRef Feature) const override {
1652 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001653 }
1654
Craig Topperf054e3a2015-10-19 03:52:27 +00001655 ArrayRef<const char *> getGCCRegNames() const override;
1656 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001657 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001658 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001659 }
1660 bool validateAsmConstraint(const char *&Name,
1661 TargetInfo::ConstraintInfo &Info) const override {
1662 switch (*Name) {
1663 default:
1664 return false;
1665 case 'c':
1666 case 'h':
1667 case 'r':
1668 case 'l':
1669 case 'f':
1670 case 'd':
1671 Info.setAllowsRegister();
1672 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001673 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 }
1675 const char *getClobbers() const override {
1676 // FIXME: Is this really right?
1677 return "";
1678 }
1679 BuiltinVaListKind getBuiltinVaListKind() const override {
1680 // FIXME: implement
1681 return TargetInfo::CharPtrBuiltinVaList;
1682 }
1683 bool setCPU(const std::string &Name) override {
1684 GPU = llvm::StringSwitch<GPUKind>(Name)
1685 .Case("sm_20", GK_SM20)
1686 .Case("sm_21", GK_SM21)
1687 .Case("sm_30", GK_SM30)
1688 .Case("sm_35", GK_SM35)
1689 .Case("sm_37", GK_SM37)
1690 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001691
Eric Christopherc48497a2015-09-18 21:26:24 +00001692 return GPU != GK_NONE;
1693 }
1694};
1695
1696const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1697#define BUILTIN(ID, TYPE, ATTRS) \
1698 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1699#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1700 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1701#include "clang/Basic/BuiltinsNVPTX.def"
1702};
1703
1704const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1705
Craig Topperf054e3a2015-10-19 03:52:27 +00001706ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1707 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001708}
1709
1710class NVPTX32TargetInfo : public NVPTXTargetInfo {
1711public:
1712 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001713 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 PointerWidth = PointerAlign = 32;
1715 SizeType = TargetInfo::UnsignedInt;
1716 PtrDiffType = TargetInfo::SignedInt;
1717 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001718 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001719 }
1720};
1721
1722class NVPTX64TargetInfo : public NVPTXTargetInfo {
1723public:
1724 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1725 PointerWidth = PointerAlign = 64;
1726 SizeType = TargetInfo::UnsignedLong;
1727 PtrDiffType = TargetInfo::SignedLong;
1728 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001729 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001730 }
1731};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001733static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001734 1, // opencl_global
1735 3, // opencl_local
1736 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001737 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001738 1, // cuda_device
1739 2, // cuda_constant
1740 3 // cuda_shared
1741};
1742
Tom Stellarda96344b2014-08-21 13:58:40 +00001743// If you edit the description strings, make sure you update
1744// getPointerWidthV().
1745
Craig Topper273dbc62015-10-18 05:29:26 +00001746static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001747 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1748 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001749
Craig Topper273dbc62015-10-18 05:29:26 +00001750static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001751 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1752 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001753
Craig Topper273dbc62015-10-18 05:29:26 +00001754static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001755 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001756 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1757 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001759class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001760 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001761 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001762
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001763 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001764 enum GPUKind {
1765 GK_NONE,
1766 GK_R600,
1767 GK_R600_DOUBLE_OPS,
1768 GK_R700,
1769 GK_R700_DOUBLE_OPS,
1770 GK_EVERGREEN,
1771 GK_EVERGREEN_DOUBLE_OPS,
1772 GK_NORTHERN_ISLANDS,
1773 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001774 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001775 GK_SEA_ISLANDS,
1776 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001777 } GPU;
1778
Jan Veselyeebeaea2015-05-04 19:53:36 +00001779 bool hasFP64:1;
1780 bool hasFMAF:1;
1781 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001782
Eli Friedmand13b41e2012-10-12 23:32:00 +00001783public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001784 AMDGPUTargetInfo(const llvm::Triple &Triple)
1785 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001786
1787 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001788 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001789 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001790 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001791 hasFMAF = true;
1792 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001793 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001794 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001795 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001796 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001797 hasFMAF = false;
1798 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001799 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001800 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001801 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001802 }
1803
Tom Stellarda96344b2014-08-21 13:58:40 +00001804 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1805 if (GPU <= GK_CAYMAN)
1806 return 32;
1807
1808 switch(AddrSpace) {
1809 default:
1810 return 64;
1811 case 0:
1812 case 3:
1813 case 5:
1814 return 32;
1815 }
1816 }
1817
Craig Topper3164f332014-03-11 03:39:26 +00001818 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001819 return "";
1820 }
1821
Craig Topperf054e3a2015-10-19 03:52:27 +00001822 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823
Craig Topperf054e3a2015-10-19 03:52:27 +00001824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1825 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001826 }
1827
Craig Topper3164f332014-03-11 03:39:26 +00001828 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001829 TargetInfo::ConstraintInfo &Info) const override {
1830 switch (*Name) {
1831 default: break;
1832 case 'v': // vgpr
1833 case 's': // sgpr
1834 Info.setAllowsRegister();
1835 return true;
1836 }
1837 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001838 }
1839
Craig Topper6c03a542015-10-19 04:51:35 +00001840 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1841 return llvm::makeArrayRef(BuiltinInfo,
1842 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001843 }
1844
Craig Topper3164f332014-03-11 03:39:26 +00001845 void getTargetDefines(const LangOptions &Opts,
1846 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001847 if (getTriple().getArch() == llvm::Triple::amdgcn)
1848 Builder.defineMacro("__AMDGCN__");
1849 else
1850 Builder.defineMacro("__R600__");
1851
Jan Veselyeebeaea2015-05-04 19:53:36 +00001852 if (hasFMAF)
1853 Builder.defineMacro("__HAS_FMAF__");
1854 if (hasLDEXPF)
1855 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001856 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001857 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001858 if (Opts.OpenCL) {
1859 if (GPU >= GK_NORTHERN_ISLANDS) {
1860 Builder.defineMacro("cl_khr_byte_addressable_store");
1861 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1862 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1863 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1864 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1865 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001866 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001867 }
1868
Craig Topper3164f332014-03-11 03:39:26 +00001869 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001870 return TargetInfo::CharPtrBuiltinVaList;
1871 }
1872
Craig Topper3164f332014-03-11 03:39:26 +00001873 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001874 GPU = llvm::StringSwitch<GPUKind>(Name)
1875 .Case("r600" , GK_R600)
1876 .Case("rv610", GK_R600)
1877 .Case("rv620", GK_R600)
1878 .Case("rv630", GK_R600)
1879 .Case("rv635", GK_R600)
1880 .Case("rs780", GK_R600)
1881 .Case("rs880", GK_R600)
1882 .Case("rv670", GK_R600_DOUBLE_OPS)
1883 .Case("rv710", GK_R700)
1884 .Case("rv730", GK_R700)
1885 .Case("rv740", GK_R700_DOUBLE_OPS)
1886 .Case("rv770", GK_R700_DOUBLE_OPS)
1887 .Case("palm", GK_EVERGREEN)
1888 .Case("cedar", GK_EVERGREEN)
1889 .Case("sumo", GK_EVERGREEN)
1890 .Case("sumo2", GK_EVERGREEN)
1891 .Case("redwood", GK_EVERGREEN)
1892 .Case("juniper", GK_EVERGREEN)
1893 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1894 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1895 .Case("barts", GK_NORTHERN_ISLANDS)
1896 .Case("turks", GK_NORTHERN_ISLANDS)
1897 .Case("caicos", GK_NORTHERN_ISLANDS)
1898 .Case("cayman", GK_CAYMAN)
1899 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001900 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001901 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1902 .Case("verde", GK_SOUTHERN_ISLANDS)
1903 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001904 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001905 .Case("bonaire", GK_SEA_ISLANDS)
1906 .Case("kabini", GK_SEA_ISLANDS)
1907 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001908 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001909 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001910 .Case("tonga", GK_VOLCANIC_ISLANDS)
1911 .Case("iceland", GK_VOLCANIC_ISLANDS)
1912 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001913 .Case("fiji", GK_VOLCANIC_ISLANDS)
1914 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001915 .Default(GK_NONE);
1916
1917 if (GPU == GK_NONE) {
1918 return false;
1919 }
1920
1921 // Set the correct data layout
1922 switch (GPU) {
1923 case GK_NONE:
1924 case GK_R600:
1925 case GK_R700:
1926 case GK_EVERGREEN:
1927 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001928 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001929 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001930 hasFMAF = false;
1931 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001932 break;
1933 case GK_R600_DOUBLE_OPS:
1934 case GK_R700_DOUBLE_OPS:
1935 case GK_EVERGREEN_DOUBLE_OPS:
1936 case GK_CAYMAN:
James Y Knightb214cbc2016-03-04 19:00:41 +00001937 resetDataLayout(DataLayoutStringR600DoubleOps);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001938 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001939 hasFMAF = true;
1940 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001941 break;
1942 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001943 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001944 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001945 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001946 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001947 hasFMAF = true;
1948 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001949 break;
1950 }
1951
1952 return true;
1953 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001954};
1955
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001956const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001957#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001958 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001959#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001960};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001961const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001962 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1963 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1964 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1965 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1966 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1967 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1968 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1969 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1970 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1971 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1972 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1973 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1974 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1975 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1976 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1977 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1978 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1979 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1980 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1981 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1982 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1983 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1984 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1985 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1986 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1987 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1988 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1989 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1990 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1991 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1992 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1993 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1994 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1995 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1996 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1997 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1998 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1999 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2000 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2001 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2002 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2003 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2004 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2005 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2006 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2007 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2008 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2009 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
Matt Arsenaultb015d622016-02-27 09:06:22 +00002010 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2011 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002012};
2013
Craig Topperf054e3a2015-10-19 03:52:27 +00002014ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2015 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002016}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002017
Eli Friedman3fd920a2008-08-20 02:34:37 +00002018// Namespace for x86 abstract base class
2019const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002020#define BUILTIN(ID, TYPE, ATTRS) \
2021 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002022#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002023 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002024#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002025 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002026#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002027};
Eli Friedmanb5366062008-05-20 14:21:01 +00002028
Nuno Lopescfca1f02009-12-23 17:49:57 +00002029static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002030 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2031 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002032 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002033 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2034 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2035 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002036 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002037 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2038 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002039 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2040 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2041 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2042 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2043 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2044 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2045 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2046 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002047};
2048
Eric Christophercdd36352011-06-21 00:05:20 +00002049const TargetInfo::AddlRegName AddlRegNames[] = {
2050 { { "al", "ah", "eax", "rax" }, 0 },
2051 { { "bl", "bh", "ebx", "rbx" }, 3 },
2052 { { "cl", "ch", "ecx", "rcx" }, 2 },
2053 { { "dl", "dh", "edx", "rdx" }, 1 },
2054 { { "esi", "rsi" }, 4 },
2055 { { "edi", "rdi" }, 5 },
2056 { { "esp", "rsp" }, 7 },
2057 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002058 { { "r8d", "r8w", "r8b" }, 38 },
2059 { { "r9d", "r9w", "r9b" }, 39 },
2060 { { "r10d", "r10w", "r10b" }, 40 },
2061 { { "r11d", "r11w", "r11b" }, 41 },
2062 { { "r12d", "r12w", "r12b" }, 42 },
2063 { { "r13d", "r13w", "r13b" }, 43 },
2064 { { "r14d", "r14w", "r14b" }, 44 },
2065 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002066};
2067
2068// X86 target abstract base class; x86-32 and x86-64 are very close, so
2069// most of the implementation can be shared.
2070class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002071 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002072 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002073 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002074 enum MMX3DNowEnum {
2075 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002076 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002077 enum XOPEnum {
2078 NoXOP,
2079 SSE4A,
2080 FMA4,
2081 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002082 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002083
Craig Topper543f3bd2015-10-14 23:47:57 +00002084 bool HasAES = false;
2085 bool HasPCLMUL = false;
2086 bool HasLZCNT = false;
2087 bool HasRDRND = false;
2088 bool HasFSGSBASE = false;
2089 bool HasBMI = false;
2090 bool HasBMI2 = false;
2091 bool HasPOPCNT = false;
2092 bool HasRTM = false;
2093 bool HasPRFCHW = false;
2094 bool HasRDSEED = false;
2095 bool HasADX = false;
2096 bool HasTBM = false;
2097 bool HasFMA = false;
2098 bool HasF16C = false;
2099 bool HasAVX512CD = false;
2100 bool HasAVX512ER = false;
2101 bool HasAVX512PF = false;
2102 bool HasAVX512DQ = false;
2103 bool HasAVX512BW = false;
2104 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002105 bool HasAVX512VBMI = false;
2106 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002107 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002108 bool HasMPX = false;
2109 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002110 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002111 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002112 bool HasXSAVE = false;
2113 bool HasXSAVEOPT = false;
2114 bool HasXSAVEC = false;
2115 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002116 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002117 bool HasCLFLUSHOPT = false;
2118 bool HasPCOMMIT = false;
2119 bool HasCLWB = false;
2120 bool HasUMIP = false;
2121 bool HasMOVBE = false;
2122 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002123
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002124 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2125 ///
2126 /// Each enumeration represents a particular CPU supported by Clang. These
2127 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2128 enum CPUKind {
2129 CK_Generic,
2130
2131 /// \name i386
2132 /// i386-generation processors.
2133 //@{
2134 CK_i386,
2135 //@}
2136
2137 /// \name i486
2138 /// i486-generation processors.
2139 //@{
2140 CK_i486,
2141 CK_WinChipC6,
2142 CK_WinChip2,
2143 CK_C3,
2144 //@}
2145
2146 /// \name i586
2147 /// i586-generation processors, P5 microarchitecture based.
2148 //@{
2149 CK_i586,
2150 CK_Pentium,
2151 CK_PentiumMMX,
2152 //@}
2153
2154 /// \name i686
2155 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2156 //@{
2157 CK_i686,
2158 CK_PentiumPro,
2159 CK_Pentium2,
2160 CK_Pentium3,
2161 CK_Pentium3M,
2162 CK_PentiumM,
2163 CK_C3_2,
2164
2165 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2166 /// Clang however has some logic to suport this.
2167 // FIXME: Warn, deprecate, and potentially remove this.
2168 CK_Yonah,
2169 //@}
2170
2171 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002172 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002173 //@{
2174 CK_Pentium4,
2175 CK_Pentium4M,
2176 CK_Prescott,
2177 CK_Nocona,
2178 //@}
2179
2180 /// \name Core
2181 /// Core microarchitecture based processors.
2182 //@{
2183 CK_Core2,
2184
2185 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2186 /// codename which GCC no longer accepts as an option to -march, but Clang
2187 /// has some logic for recognizing it.
2188 // FIXME: Warn, deprecate, and potentially remove this.
2189 CK_Penryn,
2190 //@}
2191
2192 /// \name Atom
2193 /// Atom processors
2194 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002195 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002196 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002197 //@}
2198
2199 /// \name Nehalem
2200 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002201 CK_Nehalem,
2202
2203 /// \name Westmere
2204 /// Westmere microarchitecture based processors.
2205 CK_Westmere,
2206
2207 /// \name Sandy Bridge
2208 /// Sandy Bridge microarchitecture based processors.
2209 CK_SandyBridge,
2210
2211 /// \name Ivy Bridge
2212 /// Ivy Bridge microarchitecture based processors.
2213 CK_IvyBridge,
2214
2215 /// \name Haswell
2216 /// Haswell microarchitecture based processors.
2217 CK_Haswell,
2218
2219 /// \name Broadwell
2220 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002221 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002222
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002223 /// \name Skylake Client
2224 /// Skylake client microarchitecture based processors.
2225 CK_SkylakeClient,
2226
2227 /// \name Skylake Server
2228 /// Skylake server microarchitecture based processors.
2229 CK_SkylakeServer,
2230
2231 /// \name Cannonlake Client
2232 /// Cannonlake client microarchitecture based processors.
2233 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002234
Craig Topper449314e2013-08-20 07:09:39 +00002235 /// \name Knights Landing
2236 /// Knights Landing processor.
2237 CK_KNL,
2238
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002239 /// \name K6
2240 /// K6 architecture processors.
2241 //@{
2242 CK_K6,
2243 CK_K6_2,
2244 CK_K6_3,
2245 //@}
2246
2247 /// \name K7
2248 /// K7 architecture processors.
2249 //@{
2250 CK_Athlon,
2251 CK_AthlonThunderbird,
2252 CK_Athlon4,
2253 CK_AthlonXP,
2254 CK_AthlonMP,
2255 //@}
2256
2257 /// \name K8
2258 /// K8 architecture processors.
2259 //@{
2260 CK_Athlon64,
2261 CK_Athlon64SSE3,
2262 CK_AthlonFX,
2263 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002264 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002265 CK_Opteron,
2266 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002267 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002268 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002269
Benjamin Kramer569f2152012-01-10 11:50:18 +00002270 /// \name Bobcat
2271 /// Bobcat architecture processors.
2272 //@{
2273 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002274 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002275 //@}
2276
2277 /// \name Bulldozer
2278 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002279 //@{
2280 CK_BDVER1,
2281 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002282 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002283 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002284 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002285
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002286 /// This specification is deprecated and will be removed in the future.
2287 /// Users should prefer \see CK_K8.
2288 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002289 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002290 CK_x86_64,
2291 //@}
2292
2293 /// \name Geode
2294 /// Geode processors.
2295 //@{
2296 CK_Geode
2297 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002298 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002299
Eric Christopherc50738f2015-08-27 00:05:50 +00002300 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002301 return llvm::StringSwitch<CPUKind>(CPU)
2302 .Case("i386", CK_i386)
2303 .Case("i486", CK_i486)
2304 .Case("winchip-c6", CK_WinChipC6)
2305 .Case("winchip2", CK_WinChip2)
2306 .Case("c3", CK_C3)
2307 .Case("i586", CK_i586)
2308 .Case("pentium", CK_Pentium)
2309 .Case("pentium-mmx", CK_PentiumMMX)
2310 .Case("i686", CK_i686)
2311 .Case("pentiumpro", CK_PentiumPro)
2312 .Case("pentium2", CK_Pentium2)
2313 .Case("pentium3", CK_Pentium3)
2314 .Case("pentium3m", CK_Pentium3M)
2315 .Case("pentium-m", CK_PentiumM)
2316 .Case("c3-2", CK_C3_2)
2317 .Case("yonah", CK_Yonah)
2318 .Case("pentium4", CK_Pentium4)
2319 .Case("pentium4m", CK_Pentium4M)
2320 .Case("prescott", CK_Prescott)
2321 .Case("nocona", CK_Nocona)
2322 .Case("core2", CK_Core2)
2323 .Case("penryn", CK_Penryn)
2324 .Case("bonnell", CK_Bonnell)
2325 .Case("atom", CK_Bonnell) // Legacy name.
2326 .Case("silvermont", CK_Silvermont)
2327 .Case("slm", CK_Silvermont) // Legacy name.
2328 .Case("nehalem", CK_Nehalem)
2329 .Case("corei7", CK_Nehalem) // Legacy name.
2330 .Case("westmere", CK_Westmere)
2331 .Case("sandybridge", CK_SandyBridge)
2332 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2333 .Case("ivybridge", CK_IvyBridge)
2334 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2335 .Case("haswell", CK_Haswell)
2336 .Case("core-avx2", CK_Haswell) // Legacy name.
2337 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002338 .Case("skylake", CK_SkylakeClient)
2339 .Case("skylake-avx512", CK_SkylakeServer)
2340 .Case("skx", CK_SkylakeServer) // Legacy name.
2341 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002342 .Case("knl", CK_KNL)
2343 .Case("k6", CK_K6)
2344 .Case("k6-2", CK_K6_2)
2345 .Case("k6-3", CK_K6_3)
2346 .Case("athlon", CK_Athlon)
2347 .Case("athlon-tbird", CK_AthlonThunderbird)
2348 .Case("athlon-4", CK_Athlon4)
2349 .Case("athlon-xp", CK_AthlonXP)
2350 .Case("athlon-mp", CK_AthlonMP)
2351 .Case("athlon64", CK_Athlon64)
2352 .Case("athlon64-sse3", CK_Athlon64SSE3)
2353 .Case("athlon-fx", CK_AthlonFX)
2354 .Case("k8", CK_K8)
2355 .Case("k8-sse3", CK_K8SSE3)
2356 .Case("opteron", CK_Opteron)
2357 .Case("opteron-sse3", CK_OpteronSSE3)
2358 .Case("barcelona", CK_AMDFAM10)
2359 .Case("amdfam10", CK_AMDFAM10)
2360 .Case("btver1", CK_BTVER1)
2361 .Case("btver2", CK_BTVER2)
2362 .Case("bdver1", CK_BDVER1)
2363 .Case("bdver2", CK_BDVER2)
2364 .Case("bdver3", CK_BDVER3)
2365 .Case("bdver4", CK_BDVER4)
2366 .Case("x86-64", CK_x86_64)
2367 .Case("geode", CK_Geode)
2368 .Default(CK_Generic);
2369 }
2370
Rafael Espindolaeb265472013-08-21 21:59:03 +00002371 enum FPMathKind {
2372 FP_Default,
2373 FP_SSE,
2374 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002375 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002376
Eli Friedman3fd920a2008-08-20 02:34:37 +00002377public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002378 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002379 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002380 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002381 }
Craig Topper3164f332014-03-11 03:39:26 +00002382 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002383 // X87 evaluates with 80 bits "long double" precision.
2384 return SSELevel == NoSSE ? 2 : 0;
2385 }
Craig Topper6c03a542015-10-19 04:51:35 +00002386 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2387 return llvm::makeArrayRef(BuiltinInfo,
2388 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002389 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002390 ArrayRef<const char *> getGCCRegNames() const override {
2391 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002392 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002393 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2394 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002395 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002396 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2397 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002398 }
Eric Christopherd9832702015-06-29 21:00:05 +00002399 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002400 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002401 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002402
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002403 bool validateGlobalRegisterVariable(StringRef RegName,
2404 unsigned RegSize,
2405 bool &HasSizeMismatch) const override {
2406 // esp and ebp are the only 32-bit registers the x86 backend can currently
2407 // handle.
2408 if (RegName.equals("esp") || RegName.equals("ebp")) {
2409 // Check that the register size is 32-bit.
2410 HasSizeMismatch = RegSize != 32;
2411 return true;
2412 }
2413
2414 return false;
2415 }
2416
Akira Hatanaka974131e2014-09-18 18:17:18 +00002417 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2418
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002419 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2420
Akira Hatanaka974131e2014-09-18 18:17:18 +00002421 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2422
Craig Topper3164f332014-03-11 03:39:26 +00002423 std::string convertConstraint(const char *&Constraint) const override;
2424 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002425 return "~{dirflag},~{fpsr},~{flags}";
2426 }
Craig Topper3164f332014-03-11 03:39:26 +00002427 void getTargetDefines(const LangOptions &Opts,
2428 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002429 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2430 bool Enabled);
2431 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2432 bool Enabled);
2433 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2434 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002435 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2436 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002437 setFeatureEnabledImpl(Features, Name, Enabled);
2438 }
2439 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002440 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002441 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2442 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002443 bool
2444 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2445 StringRef CPU,
2446 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002447 bool hasFeature(StringRef Feature) const override;
2448 bool handleTargetFeatures(std::vector<std::string> &Features,
2449 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002450 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002451 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2452 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002453 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002454 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002455 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002456 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002457 return "no-mmx";
2458 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002459 }
Craig Topper3164f332014-03-11 03:39:26 +00002460 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002461 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002462
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002463 // Perform any per-CPU checks necessary to determine if this CPU is
2464 // acceptable.
2465 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2466 // invalid without explaining *why*.
2467 switch (CPU) {
2468 case CK_Generic:
2469 // No processor selected!
2470 return false;
2471
2472 case CK_i386:
2473 case CK_i486:
2474 case CK_WinChipC6:
2475 case CK_WinChip2:
2476 case CK_C3:
2477 case CK_i586:
2478 case CK_Pentium:
2479 case CK_PentiumMMX:
2480 case CK_i686:
2481 case CK_PentiumPro:
2482 case CK_Pentium2:
2483 case CK_Pentium3:
2484 case CK_Pentium3M:
2485 case CK_PentiumM:
2486 case CK_Yonah:
2487 case CK_C3_2:
2488 case CK_Pentium4:
2489 case CK_Pentium4M:
2490 case CK_Prescott:
2491 case CK_K6:
2492 case CK_K6_2:
2493 case CK_K6_3:
2494 case CK_Athlon:
2495 case CK_AthlonThunderbird:
2496 case CK_Athlon4:
2497 case CK_AthlonXP:
2498 case CK_AthlonMP:
2499 case CK_Geode:
2500 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002501 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002502 return false;
2503
2504 // Fallthrough
2505 case CK_Nocona:
2506 case CK_Core2:
2507 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002508 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002509 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002510 case CK_Nehalem:
2511 case CK_Westmere:
2512 case CK_SandyBridge:
2513 case CK_IvyBridge:
2514 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002515 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002516 case CK_SkylakeClient:
2517 case CK_SkylakeServer:
2518 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002519 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002520 case CK_Athlon64:
2521 case CK_Athlon64SSE3:
2522 case CK_AthlonFX:
2523 case CK_K8:
2524 case CK_K8SSE3:
2525 case CK_Opteron:
2526 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002527 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002528 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002529 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002530 case CK_BDVER1:
2531 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002532 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002533 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002534 case CK_x86_64:
2535 return true;
2536 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002537 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002538 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002539
Craig Topper3164f332014-03-11 03:39:26 +00002540 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002541
Craig Topper3164f332014-03-11 03:39:26 +00002542 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002543 // Most of the non-ARM calling conventions are i386 conventions.
2544 switch (CC) {
2545 case CC_X86ThisCall:
2546 case CC_X86FastCall:
2547 case CC_X86StdCall:
2548 case CC_X86VectorCall:
2549 case CC_C:
2550 case CC_Swift:
2551 case CC_X86Pascal:
2552 case CC_IntelOclBicc:
2553 return CCCR_OK;
2554 default:
2555 return CCCR_Warning;
2556 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002557 }
2558
Craig Topper3164f332014-03-11 03:39:26 +00002559 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002560 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002561 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002562
2563 bool hasSjLjLowering() const override {
2564 return true;
2565 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002566};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002567
Rafael Espindolaeb265472013-08-21 21:59:03 +00002568bool X86TargetInfo::setFPMath(StringRef Name) {
2569 if (Name == "387") {
2570 FPMath = FP_387;
2571 return true;
2572 }
2573 if (Name == "sse") {
2574 FPMath = FP_SSE;
2575 return true;
2576 }
2577 return false;
2578}
2579
Eric Christopher007b0a02015-08-28 22:32:01 +00002580bool X86TargetInfo::initFeatureMap(
2581 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002582 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002583 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002584 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002585 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002586 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002587
Eric Christopher2b4a7252015-08-27 00:05:52 +00002588 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002589 case CK_Generic:
2590 case CK_i386:
2591 case CK_i486:
2592 case CK_i586:
2593 case CK_Pentium:
2594 case CK_i686:
2595 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002596 break;
2597 case CK_PentiumMMX:
2598 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002599 case CK_K6:
2600 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002601 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 break;
2603 case CK_Pentium3:
2604 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002605 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002606 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002607 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
2609 case CK_PentiumM:
2610 case CK_Pentium4:
2611 case CK_Pentium4M:
2612 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002613 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002614 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 break;
2616 case CK_Yonah:
2617 case CK_Prescott:
2618 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002619 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002620 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002621 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 break;
2623 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002624 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002625 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002626 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002627 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 break;
2629 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002630 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002631 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002632 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002633 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002634 case CK_Cannonlake:
2635 setFeatureEnabledImpl(Features, "avx512ifma", true);
2636 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2637 setFeatureEnabledImpl(Features, "sha", true);
2638 setFeatureEnabledImpl(Features, "umip", true);
2639 // FALLTHROUGH
2640 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002641 setFeatureEnabledImpl(Features, "avx512f", true);
2642 setFeatureEnabledImpl(Features, "avx512cd", true);
2643 setFeatureEnabledImpl(Features, "avx512dq", true);
2644 setFeatureEnabledImpl(Features, "avx512bw", true);
2645 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002646 setFeatureEnabledImpl(Features, "pku", true);
2647 setFeatureEnabledImpl(Features, "pcommit", true);
2648 setFeatureEnabledImpl(Features, "clwb", true);
2649 // FALLTHROUGH
2650 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002651 setFeatureEnabledImpl(Features, "xsavec", true);
2652 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002653 setFeatureEnabledImpl(Features, "mpx", true);
2654 setFeatureEnabledImpl(Features, "sgx", true);
2655 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002656 // FALLTHROUGH
2657 case CK_Broadwell:
2658 setFeatureEnabledImpl(Features, "rdseed", true);
2659 setFeatureEnabledImpl(Features, "adx", true);
2660 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002661 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002662 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002663 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002664 setFeatureEnabledImpl(Features, "bmi", true);
2665 setFeatureEnabledImpl(Features, "bmi2", true);
2666 setFeatureEnabledImpl(Features, "rtm", true);
2667 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002668 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002669 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002670 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002671 setFeatureEnabledImpl(Features, "rdrnd", true);
2672 setFeatureEnabledImpl(Features, "f16c", true);
2673 setFeatureEnabledImpl(Features, "fsgsbase", true);
2674 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002675 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002676 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002677 setFeatureEnabledImpl(Features, "xsave", true);
2678 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002679 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002680 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002681 case CK_Silvermont:
2682 setFeatureEnabledImpl(Features, "aes", true);
2683 setFeatureEnabledImpl(Features, "pclmul", true);
2684 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002685 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002686 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002687 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002688 setFeatureEnabledImpl(Features, "cx16", true);
2689 break;
2690 case CK_KNL:
2691 setFeatureEnabledImpl(Features, "avx512f", true);
2692 setFeatureEnabledImpl(Features, "avx512cd", true);
2693 setFeatureEnabledImpl(Features, "avx512er", true);
2694 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002695 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002696 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002697 setFeatureEnabledImpl(Features, "rdseed", true);
2698 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002699 setFeatureEnabledImpl(Features, "lzcnt", true);
2700 setFeatureEnabledImpl(Features, "bmi", true);
2701 setFeatureEnabledImpl(Features, "bmi2", true);
2702 setFeatureEnabledImpl(Features, "rtm", true);
2703 setFeatureEnabledImpl(Features, "fma", true);
2704 setFeatureEnabledImpl(Features, "rdrnd", true);
2705 setFeatureEnabledImpl(Features, "f16c", true);
2706 setFeatureEnabledImpl(Features, "fsgsbase", true);
2707 setFeatureEnabledImpl(Features, "aes", true);
2708 setFeatureEnabledImpl(Features, "pclmul", true);
2709 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002710 setFeatureEnabledImpl(Features, "xsaveopt", true);
2711 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002712 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002713 break;
2714 case CK_K6_2:
2715 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002716 case CK_WinChip2:
2717 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002718 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002719 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002720 case CK_Athlon:
2721 case CK_AthlonThunderbird:
2722 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002723 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002724 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002725 case CK_Athlon4:
2726 case CK_AthlonXP:
2727 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002728 setFeatureEnabledImpl(Features, "sse", true);
2729 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002730 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002731 break;
2732 case CK_K8:
2733 case CK_Opteron:
2734 case CK_Athlon64:
2735 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002736 setFeatureEnabledImpl(Features, "sse2", true);
2737 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002738 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002739 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002740 case CK_AMDFAM10:
2741 setFeatureEnabledImpl(Features, "sse4a", true);
2742 setFeatureEnabledImpl(Features, "lzcnt", true);
2743 setFeatureEnabledImpl(Features, "popcnt", true);
2744 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002745 case CK_K8SSE3:
2746 case CK_OpteronSSE3:
2747 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002748 setFeatureEnabledImpl(Features, "sse3", true);
2749 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002750 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002751 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002752 case CK_BTVER2:
2753 setFeatureEnabledImpl(Features, "avx", true);
2754 setFeatureEnabledImpl(Features, "aes", true);
2755 setFeatureEnabledImpl(Features, "pclmul", true);
2756 setFeatureEnabledImpl(Features, "bmi", true);
2757 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002758 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002759 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002760 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002761 setFeatureEnabledImpl(Features, "ssse3", true);
2762 setFeatureEnabledImpl(Features, "sse4a", true);
2763 setFeatureEnabledImpl(Features, "lzcnt", true);
2764 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002765 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002766 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002767 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002768 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002769 case CK_BDVER4:
2770 setFeatureEnabledImpl(Features, "avx2", true);
2771 setFeatureEnabledImpl(Features, "bmi2", true);
2772 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002773 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002774 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002775 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002776 // FALLTHROUGH
2777 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002778 setFeatureEnabledImpl(Features, "bmi", true);
2779 setFeatureEnabledImpl(Features, "fma", true);
2780 setFeatureEnabledImpl(Features, "f16c", true);
2781 setFeatureEnabledImpl(Features, "tbm", true);
2782 // FALLTHROUGH
2783 case CK_BDVER1:
2784 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002785 setFeatureEnabledImpl(Features, "xop", true);
2786 setFeatureEnabledImpl(Features, "lzcnt", true);
2787 setFeatureEnabledImpl(Features, "aes", true);
2788 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002789 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002790 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002791 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002792 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002793 break;
Eli Friedman33465822011-07-08 23:31:17 +00002794 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002795 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2796 return false;
2797
2798 // Can't do this earlier because we need to be able to explicitly enable
2799 // or disable these features and the things that they depend upon.
2800
2801 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2802 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002803 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002804 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2805 FeaturesVec.end())
2806 Features["popcnt"] = true;
2807
2808 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2809 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002810 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002811 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2812 FeaturesVec.end())
2813 Features["prfchw"] = true;
2814
Eric Christophera7260af2015-10-08 20:10:18 +00002815 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2816 // then enable MMX.
2817 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002818 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002819 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2820 FeaturesVec.end())
2821 Features["mmx"] = true;
2822
Eric Christopherbbd746d2015-10-08 20:10:14 +00002823 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002824}
2825
Rafael Espindolae62e2792013-08-20 13:44:29 +00002826void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002827 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002828 if (Enabled) {
2829 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002830 case AVX512F:
2831 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002832 case AVX2:
2833 Features["avx2"] = true;
2834 case AVX:
2835 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002836 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002837 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002838 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002839 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002840 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002841 case SSSE3:
2842 Features["ssse3"] = true;
2843 case SSE3:
2844 Features["sse3"] = true;
2845 case SSE2:
2846 Features["sse2"] = true;
2847 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002848 Features["sse"] = true;
2849 case NoSSE:
2850 break;
2851 }
2852 return;
2853 }
2854
2855 switch (Level) {
2856 case NoSSE:
2857 case SSE1:
2858 Features["sse"] = false;
2859 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002860 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2861 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002862 case SSE3:
2863 Features["sse3"] = false;
2864 setXOPLevel(Features, NoXOP, false);
2865 case SSSE3:
2866 Features["ssse3"] = false;
2867 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002868 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002870 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002871 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002872 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2873 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002874 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002875 case AVX2:
2876 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002877 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002878 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002879 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002880 Features["avx512vl"] = Features["avx512vbmi"] =
2881 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002882 }
2883}
2884
2885void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002886 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 if (Enabled) {
2888 switch (Level) {
2889 case AMD3DNowAthlon:
2890 Features["3dnowa"] = true;
2891 case AMD3DNow:
2892 Features["3dnow"] = true;
2893 case MMX:
2894 Features["mmx"] = true;
2895 case NoMMX3DNow:
2896 break;
2897 }
2898 return;
2899 }
2900
2901 switch (Level) {
2902 case NoMMX3DNow:
2903 case MMX:
2904 Features["mmx"] = false;
2905 case AMD3DNow:
2906 Features["3dnow"] = false;
2907 case AMD3DNowAthlon:
2908 Features["3dnowa"] = false;
2909 }
2910}
2911
2912void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002913 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002914 if (Enabled) {
2915 switch (Level) {
2916 case XOP:
2917 Features["xop"] = true;
2918 case FMA4:
2919 Features["fma4"] = true;
2920 setSSELevel(Features, AVX, true);
2921 case SSE4A:
2922 Features["sse4a"] = true;
2923 setSSELevel(Features, SSE3, true);
2924 case NoXOP:
2925 break;
2926 }
2927 return;
2928 }
2929
2930 switch (Level) {
2931 case NoXOP:
2932 case SSE4A:
2933 Features["sse4a"] = false;
2934 case FMA4:
2935 Features["fma4"] = false;
2936 case XOP:
2937 Features["xop"] = false;
2938 }
2939}
2940
Craig Topper86d79ef2013-09-17 04:51:29 +00002941void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2942 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002943 // This is a bit of a hack to deal with the sse4 target feature when used
2944 // as part of the target attribute. We handle sse4 correctly everywhere
2945 // else. See below for more information on how we handle the sse4 options.
2946 if (Name != "sse4")
2947 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002948
Craig Topper29561122013-09-19 01:13:07 +00002949 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002950 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002951 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002952 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002953 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002954 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002955 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002956 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002957 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002958 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002959 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002960 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002961 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002962 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002963 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002964 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002965 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002966 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002967 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002968 if (Enabled)
2969 setSSELevel(Features, SSE2, Enabled);
2970 } else if (Name == "pclmul") {
2971 if (Enabled)
2972 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002973 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002974 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002975 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002976 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002977 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002978 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00002979 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
2980 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
2981 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00002982 if (Enabled)
2983 setSSELevel(Features, AVX512F, Enabled);
2984 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002985 if (Enabled)
2986 setSSELevel(Features, AVX, Enabled);
2987 } else if (Name == "fma4") {
2988 setXOPLevel(Features, FMA4, Enabled);
2989 } else if (Name == "xop") {
2990 setXOPLevel(Features, XOP, Enabled);
2991 } else if (Name == "sse4a") {
2992 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002993 } else if (Name == "f16c") {
2994 if (Enabled)
2995 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002996 } else if (Name == "sha") {
2997 if (Enabled)
2998 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002999 } else if (Name == "sse4") {
3000 // We can get here via the __target__ attribute since that's not controlled
3001 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3002 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3003 // disabled.
3004 if (Enabled)
3005 setSSELevel(Features, SSE42, Enabled);
3006 else
3007 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003008 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003009 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003010 Features["xsaveopt"] = false;
3011 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003012 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003013 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003014 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003015}
3016
Eric Christopher3ff21b32013-10-16 21:26:26 +00003017/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003018/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003019bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003020 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003021 for (const auto &Feature : Features) {
3022 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003023 continue;
3024
Eric Christopher610fe112015-08-26 08:21:55 +00003025 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003026 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003027 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003028 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003029 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003030 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003031 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003032 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003033 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003034 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003035 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003036 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003037 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003038 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003039 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003040 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003041 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003042 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003043 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003044 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003045 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003046 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003047 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003048 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003049 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003050 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003051 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003052 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003053 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003054 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003055 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003056 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003057 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003058 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003059 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003060 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003061 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003062 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003063 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003064 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003065 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003066 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003067 } else if (Feature == "+avx512vbmi") {
3068 HasAVX512VBMI = true;
3069 } else if (Feature == "+avx512ifma") {
3070 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003071 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003072 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003073 } else if (Feature == "+mpx") {
3074 HasMPX = true;
3075 } else if (Feature == "+movbe") {
3076 HasMOVBE = true;
3077 } else if (Feature == "+sgx") {
3078 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003079 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003080 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003081 } else if (Feature == "+fxsr") {
3082 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003083 } else if (Feature == "+xsave") {
3084 HasXSAVE = true;
3085 } else if (Feature == "+xsaveopt") {
3086 HasXSAVEOPT = true;
3087 } else if (Feature == "+xsavec") {
3088 HasXSAVEC = true;
3089 } else if (Feature == "+xsaves") {
3090 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003091 } else if (Feature == "+pku") {
3092 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003093 } else if (Feature == "+clflushopt") {
3094 HasCLFLUSHOPT = true;
3095 } else if (Feature == "+pcommit") {
3096 HasPCOMMIT = true;
3097 } else if (Feature == "+clwb") {
3098 HasCLWB = true;
3099 } else if (Feature == "+umip") {
3100 HasUMIP = true;
3101 } else if (Feature == "+prefetchwt1") {
3102 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003103 }
3104
Benjamin Kramer27402c62012-03-05 15:10:44 +00003105 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003106 .Case("+avx512f", AVX512F)
3107 .Case("+avx2", AVX2)
3108 .Case("+avx", AVX)
3109 .Case("+sse4.2", SSE42)
3110 .Case("+sse4.1", SSE41)
3111 .Case("+ssse3", SSSE3)
3112 .Case("+sse3", SSE3)
3113 .Case("+sse2", SSE2)
3114 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003115 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003116 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003117
Eli Friedman33465822011-07-08 23:31:17 +00003118 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003119 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003120 .Case("+3dnowa", AMD3DNowAthlon)
3121 .Case("+3dnow", AMD3DNow)
3122 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003123 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003124 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003125
3126 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003127 .Case("+xop", XOP)
3128 .Case("+fma4", FMA4)
3129 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003130 .Default(NoXOP);
3131 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003132 }
Eli Friedman33465822011-07-08 23:31:17 +00003133
Rafael Espindolaeb265472013-08-21 21:59:03 +00003134 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3135 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003136 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3137 (FPMath == FP_387 && SSELevel >= SSE1)) {
3138 Diags.Report(diag::err_target_unsupported_fpmath) <<
3139 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003140 return false;
3141 }
3142
Alexey Bataev00396512015-07-02 03:40:19 +00003143 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003144 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003145 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003146}
Chris Lattnerecd49032009-03-02 22:27:17 +00003147
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003148/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3149/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003150void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003151 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003152 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003153 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003154 Builder.defineMacro("__amd64__");
3155 Builder.defineMacro("__amd64");
3156 Builder.defineMacro("__x86_64");
3157 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003158 if (getTriple().getArchName() == "x86_64h") {
3159 Builder.defineMacro("__x86_64h");
3160 Builder.defineMacro("__x86_64h__");
3161 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003162 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003163 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003164 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003165
Chris Lattnerecd49032009-03-02 22:27:17 +00003166 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003167 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3168 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003169 switch (CPU) {
3170 case CK_Generic:
3171 break;
3172 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003173 // The rest are coming from the i386 define above.
3174 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003175 break;
3176 case CK_i486:
3177 case CK_WinChipC6:
3178 case CK_WinChip2:
3179 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003180 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003182 case CK_PentiumMMX:
3183 Builder.defineMacro("__pentium_mmx__");
3184 Builder.defineMacro("__tune_pentium_mmx__");
3185 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003186 case CK_i586:
3187 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003188 defineCPUMacros(Builder, "i586");
3189 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003190 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003191 case CK_Pentium3:
3192 case CK_Pentium3M:
3193 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003194 Builder.defineMacro("__tune_pentium3__");
3195 // Fallthrough
3196 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003197 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003198 Builder.defineMacro("__tune_pentium2__");
3199 // Fallthrough
3200 case CK_PentiumPro:
3201 Builder.defineMacro("__tune_i686__");
3202 Builder.defineMacro("__tune_pentiumpro__");
3203 // Fallthrough
3204 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003205 Builder.defineMacro("__i686");
3206 Builder.defineMacro("__i686__");
3207 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3208 Builder.defineMacro("__pentiumpro");
3209 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003210 break;
3211 case CK_Pentium4:
3212 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003213 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003214 break;
3215 case CK_Yonah:
3216 case CK_Prescott:
3217 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003218 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003219 break;
3220 case CK_Core2:
3221 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003222 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003223 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003224 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003225 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003226 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003227 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003228 defineCPUMacros(Builder, "slm");
3229 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003230 case CK_Nehalem:
3231 case CK_Westmere:
3232 case CK_SandyBridge:
3233 case CK_IvyBridge:
3234 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003235 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003236 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003237 // FIXME: Historically, we defined this legacy name, it would be nice to
3238 // remove it at some point. We've never exposed fine-grained names for
3239 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003240 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003241 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003242 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003243 defineCPUMacros(Builder, "skx");
3244 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003245 case CK_Cannonlake:
3246 break;
Craig Topper449314e2013-08-20 07:09:39 +00003247 case CK_KNL:
3248 defineCPUMacros(Builder, "knl");
3249 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003250 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003251 Builder.defineMacro("__k6_2__");
3252 Builder.defineMacro("__tune_k6_2__");
3253 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003254 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003255 if (CPU != CK_K6_2) { // In case of fallthrough
3256 // FIXME: GCC may be enabling these in cases where some other k6
3257 // architecture is specified but -m3dnow is explicitly provided. The
3258 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003259 Builder.defineMacro("__k6_3__");
3260 Builder.defineMacro("__tune_k6_3__");
3261 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003262 // Fallthrough
3263 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003264 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003265 break;
3266 case CK_Athlon:
3267 case CK_AthlonThunderbird:
3268 case CK_Athlon4:
3269 case CK_AthlonXP:
3270 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003271 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003272 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003273 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003274 Builder.defineMacro("__tune_athlon_sse__");
3275 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003276 break;
3277 case CK_K8:
3278 case CK_K8SSE3:
3279 case CK_x86_64:
3280 case CK_Opteron:
3281 case CK_OpteronSSE3:
3282 case CK_Athlon64:
3283 case CK_Athlon64SSE3:
3284 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003285 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003286 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003287 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003288 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003289 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003290 case CK_BTVER1:
3291 defineCPUMacros(Builder, "btver1");
3292 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003293 case CK_BTVER2:
3294 defineCPUMacros(Builder, "btver2");
3295 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003296 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003297 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003298 break;
3299 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003300 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003301 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003302 case CK_BDVER3:
3303 defineCPUMacros(Builder, "bdver3");
3304 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003305 case CK_BDVER4:
3306 defineCPUMacros(Builder, "bdver4");
3307 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003308 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003309 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003310 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003311 }
Chris Lattner96e43572009-03-02 22:40:39 +00003312
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003313 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003314 Builder.defineMacro("__REGISTER_PREFIX__", "");
3315
Chris Lattner6df41af2009-04-19 17:32:33 +00003316 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3317 // functions in glibc header files that use FP Stack inline asm which the
3318 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003319 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003320
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003321 if (HasAES)
3322 Builder.defineMacro("__AES__");
3323
Craig Topper3f122a72012-05-31 05:18:48 +00003324 if (HasPCLMUL)
3325 Builder.defineMacro("__PCLMUL__");
3326
Craig Topper22967d42011-12-25 05:06:45 +00003327 if (HasLZCNT)
3328 Builder.defineMacro("__LZCNT__");
3329
Benjamin Kramer1e250392012-07-07 09:39:18 +00003330 if (HasRDRND)
3331 Builder.defineMacro("__RDRND__");
3332
Craig Topper8c7f2512014-11-03 06:51:41 +00003333 if (HasFSGSBASE)
3334 Builder.defineMacro("__FSGSBASE__");
3335
Craig Topper22967d42011-12-25 05:06:45 +00003336 if (HasBMI)
3337 Builder.defineMacro("__BMI__");
3338
3339 if (HasBMI2)
3340 Builder.defineMacro("__BMI2__");
3341
Craig Topper1de83482011-12-29 16:10:46 +00003342 if (HasPOPCNT)
3343 Builder.defineMacro("__POPCNT__");
3344
Michael Liao625a8752012-11-10 05:17:46 +00003345 if (HasRTM)
3346 Builder.defineMacro("__RTM__");
3347
Michael Liao74f4eaf2013-03-26 17:52:08 +00003348 if (HasPRFCHW)
3349 Builder.defineMacro("__PRFCHW__");
3350
Michael Liaoffaae352013-03-29 05:17:55 +00003351 if (HasRDSEED)
3352 Builder.defineMacro("__RDSEED__");
3353
Robert Khasanov50e6f582014-09-19 09:53:48 +00003354 if (HasADX)
3355 Builder.defineMacro("__ADX__");
3356
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003357 if (HasTBM)
3358 Builder.defineMacro("__TBM__");
3359
Rafael Espindolae62e2792013-08-20 13:44:29 +00003360 switch (XOPLevel) {
3361 case XOP:
3362 Builder.defineMacro("__XOP__");
3363 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003364 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003365 case SSE4A:
3366 Builder.defineMacro("__SSE4A__");
3367 case NoXOP:
3368 break;
3369 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003370
Craig Topperbba778b2012-06-03 21:46:30 +00003371 if (HasFMA)
3372 Builder.defineMacro("__FMA__");
3373
Manman Rena45358c2012-10-11 00:59:55 +00003374 if (HasF16C)
3375 Builder.defineMacro("__F16C__");
3376
Craig Topper679b53a2013-08-21 05:29:10 +00003377 if (HasAVX512CD)
3378 Builder.defineMacro("__AVX512CD__");
3379 if (HasAVX512ER)
3380 Builder.defineMacro("__AVX512ER__");
3381 if (HasAVX512PF)
3382 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003383 if (HasAVX512DQ)
3384 Builder.defineMacro("__AVX512DQ__");
3385 if (HasAVX512BW)
3386 Builder.defineMacro("__AVX512BW__");
3387 if (HasAVX512VL)
3388 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003389 if (HasAVX512VBMI)
3390 Builder.defineMacro("__AVX512VBMI__");
3391 if (HasAVX512IFMA)
3392 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003393
Ben Langmuir58078d02013-09-19 13:22:04 +00003394 if (HasSHA)
3395 Builder.defineMacro("__SHA__");
3396
Craig Toppere33f51f2015-10-16 06:22:36 +00003397 if (HasFXSR)
3398 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003399 if (HasXSAVE)
3400 Builder.defineMacro("__XSAVE__");
3401 if (HasXSAVEOPT)
3402 Builder.defineMacro("__XSAVEOPT__");
3403 if (HasXSAVEC)
3404 Builder.defineMacro("__XSAVEC__");
3405 if (HasXSAVES)
3406 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003407 if (HasPKU)
3408 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003409 if (HasCX16)
3410 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3411
Chris Lattner96e43572009-03-02 22:40:39 +00003412 // Each case falls through to the previous one here.
3413 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003414 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003415 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003416 case AVX2:
3417 Builder.defineMacro("__AVX2__");
3418 case AVX:
3419 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003420 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003421 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003422 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003423 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003424 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003425 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003426 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003427 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003428 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003429 Builder.defineMacro("__SSE2__");
3430 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003431 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003432 Builder.defineMacro("__SSE__");
3433 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003434 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003435 break;
3436 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003437
Derek Schuffc7dd7222012-10-11 15:52:22 +00003438 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003439 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003440 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003441 case AVX2:
3442 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003443 case SSE42:
3444 case SSE41:
3445 case SSSE3:
3446 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003447 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003448 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003449 break;
3450 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003451 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003452 break;
3453 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003454 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003455 }
3456 }
3457
Anders Carlssone437c682010-01-27 03:47:49 +00003458 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003459 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003460 case AMD3DNowAthlon:
3461 Builder.defineMacro("__3dNOW_A__");
3462 case AMD3DNow:
3463 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003464 case MMX:
3465 Builder.defineMacro("__MMX__");
3466 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003467 break;
3468 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003469
3470 if (CPU >= CK_i486) {
3471 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3472 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3473 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3474 }
3475 if (CPU >= CK_i586)
3476 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003477}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003478
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003479bool X86TargetInfo::hasFeature(StringRef Feature) const {
3480 return llvm::StringSwitch<bool>(Feature)
3481 .Case("aes", HasAES)
3482 .Case("avx", SSELevel >= AVX)
3483 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003484 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003485 .Case("avx512cd", HasAVX512CD)
3486 .Case("avx512er", HasAVX512ER)
3487 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003488 .Case("avx512dq", HasAVX512DQ)
3489 .Case("avx512bw", HasAVX512BW)
3490 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003491 .Case("avx512vbmi", HasAVX512VBMI)
3492 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003493 .Case("bmi", HasBMI)
3494 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003495 .Case("clflushopt", HasCLFLUSHOPT)
3496 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003497 .Case("cx16", HasCX16)
3498 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003499 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003500 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003501 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003502 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003503 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003504 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3505 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3506 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003507 .Case("movbe", HasMOVBE)
3508 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003509 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003510 .Case("pcommit", HasPCOMMIT)
3511 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003512 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003513 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003514 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003515 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003516 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003517 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003518 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003519 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003520 .Case("sse", SSELevel >= SSE1)
3521 .Case("sse2", SSELevel >= SSE2)
3522 .Case("sse3", SSELevel >= SSE3)
3523 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003524 .Case("sse4.1", SSELevel >= SSE41)
3525 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003526 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003527 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003528 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003529 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003530 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3531 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003533 .Case("xsave", HasXSAVE)
3534 .Case("xsavec", HasXSAVEC)
3535 .Case("xsaves", HasXSAVES)
3536 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003537 .Default(false);
3538}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003539
Eric Christopherd9832702015-06-29 21:00:05 +00003540// We can't use a generic validation scheme for the features accepted here
3541// versus subtarget features accepted in the target attribute because the
3542// bitfield structure that's initialized in the runtime only supports the
3543// below currently rather than the full range of subtarget features. (See
3544// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3545bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3546 return llvm::StringSwitch<bool>(FeatureStr)
3547 .Case("cmov", true)
3548 .Case("mmx", true)
3549 .Case("popcnt", true)
3550 .Case("sse", true)
3551 .Case("sse2", true)
3552 .Case("sse3", true)
3553 .Case("sse4.1", true)
3554 .Case("sse4.2", true)
3555 .Case("avx", true)
3556 .Case("avx2", true)
3557 .Case("sse4a", true)
3558 .Case("fma4", true)
3559 .Case("xop", true)
3560 .Case("fma", true)
3561 .Case("avx512f", true)
3562 .Case("bmi", true)
3563 .Case("bmi2", true)
3564 .Default(false);
3565}
3566
Eli Friedman3fd920a2008-08-20 02:34:37 +00003567bool
Anders Carlsson58436352009-02-28 17:11:49 +00003568X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003569 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003570 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003571 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003572 // Constant constraints.
3573 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3574 // instructions.
3575 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3576 // x86_64 instructions.
3577 case 's':
3578 Info.setRequiresImmediate();
3579 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003580 case 'I':
3581 Info.setRequiresImmediate(0, 31);
3582 return true;
3583 case 'J':
3584 Info.setRequiresImmediate(0, 63);
3585 return true;
3586 case 'K':
3587 Info.setRequiresImmediate(-128, 127);
3588 return true;
3589 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003590 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003591 return true;
3592 case 'M':
3593 Info.setRequiresImmediate(0, 3);
3594 return true;
3595 case 'N':
3596 Info.setRequiresImmediate(0, 255);
3597 return true;
3598 case 'O':
3599 Info.setRequiresImmediate(0, 127);
3600 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003601 // Register constraints.
3602 case 'Y': // 'Y' is the first character for several 2-character constraints.
3603 // Shift the pointer to the second character of the constraint.
3604 Name++;
3605 switch (*Name) {
3606 default:
3607 return false;
3608 case '0': // First SSE register.
3609 case 't': // Any SSE register, when SSE2 is enabled.
3610 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3611 case 'm': // Any MMX register, when inter-unit moves enabled.
3612 Info.setAllowsRegister();
3613 return true;
3614 }
3615 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003616 // Constraint 'f' cannot be used for output operands.
3617 if (Info.ConstraintStr[0] == '=')
3618 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003619 Info.setAllowsRegister();
3620 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003621 case 'a': // eax.
3622 case 'b': // ebx.
3623 case 'c': // ecx.
3624 case 'd': // edx.
3625 case 'S': // esi.
3626 case 'D': // edi.
3627 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003628 case 't': // Top of floating point stack.
3629 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003630 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003631 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003632 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003633 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003634 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3635 case 'l': // "Index" registers: any general register that can be used as an
3636 // index in a base+index memory access.
3637 Info.setAllowsRegister();
3638 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003639 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003640 case 'C': // SSE floating point constant.
3641 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003642 return true;
3643 }
3644}
3645
Akira Hatanaka974131e2014-09-18 18:17:18 +00003646bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3647 unsigned Size) const {
3648 // Strip off constraint modifiers.
3649 while (Constraint[0] == '=' ||
3650 Constraint[0] == '+' ||
3651 Constraint[0] == '&')
3652 Constraint = Constraint.substr(1);
3653
3654 return validateOperandSize(Constraint, Size);
3655}
3656
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003657bool X86TargetInfo::validateInputSize(StringRef Constraint,
3658 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003659 return validateOperandSize(Constraint, Size);
3660}
3661
3662bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3663 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003664 switch (Constraint[0]) {
3665 default: break;
3666 case 'y':
3667 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003668 case 'f':
3669 case 't':
3670 case 'u':
3671 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003672 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003673 if (SSELevel >= AVX512F)
3674 // 512-bit zmm registers can be used if target supports AVX512F.
3675 return Size <= 512U;
3676 else if (SSELevel >= AVX)
3677 // 256-bit ymm registers can be used if target supports AVX.
3678 return Size <= 256U;
3679 return Size <= 128U;
3680 case 'Y':
3681 // 'Y' is the first character for several 2-character constraints.
3682 switch (Constraint[1]) {
3683 default: break;
3684 case 'm':
3685 // 'Ym' is synonymous with 'y'.
3686 return Size <= 64;
3687 case 'i':
3688 case 't':
3689 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3690 if (SSELevel >= AVX512F)
3691 return Size <= 512U;
3692 else if (SSELevel >= AVX)
3693 return Size <= 256U;
3694 return SSELevel >= SSE2 && Size <= 128U;
3695 }
3696
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003697 }
3698
3699 return true;
3700}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003701
Eli Friedman3fd920a2008-08-20 02:34:37 +00003702std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003703X86TargetInfo::convertConstraint(const char *&Constraint) const {
3704 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003705 case 'a': return std::string("{ax}");
3706 case 'b': return std::string("{bx}");
3707 case 'c': return std::string("{cx}");
3708 case 'd': return std::string("{dx}");
3709 case 'S': return std::string("{si}");
3710 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003711 case 'p': // address
3712 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003713 case 't': // top of floating point stack.
3714 return std::string("{st}");
3715 case 'u': // second from top of floating point stack.
3716 return std::string("{st(1)}"); // second from top of floating point stack.
3717 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003718 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003719 }
3720}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003721
Eli Friedman3fd920a2008-08-20 02:34:37 +00003722// X86-32 generic target
3723class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003724public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003725 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003726 DoubleAlign = LongLongAlign = 32;
3727 LongDoubleWidth = 96;
3728 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003729 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003730 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003731 SizeType = UnsignedInt;
3732 PtrDiffType = SignedInt;
3733 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003734 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003735
3736 // Use fpret for all types.
3737 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3738 (1 << TargetInfo::Double) |
3739 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003740
3741 // x86-32 has atomics up to 8 bytes
3742 // FIXME: Check that we actually have cmpxchg8b before setting
3743 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3744 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003745 }
Craig Topper3164f332014-03-11 03:39:26 +00003746 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003747 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003748 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003749
Craig Topper3164f332014-03-11 03:39:26 +00003750 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003751 if (RegNo == 0) return 0;
3752 if (RegNo == 1) return 2;
3753 return -1;
3754 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003755 bool validateOperandSize(StringRef Constraint,
3756 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003757 switch (Constraint[0]) {
3758 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003759 case 'R':
3760 case 'q':
3761 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003762 case 'a':
3763 case 'b':
3764 case 'c':
3765 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003766 case 'S':
3767 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003768 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003769 case 'A':
3770 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003771 }
3772
Akira Hatanaka974131e2014-09-18 18:17:18 +00003773 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003774 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003775};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003776
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003777class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3778public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003779 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3780 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003781
Craig Topper3164f332014-03-11 03:39:26 +00003782 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003783 unsigned Major, Minor, Micro;
3784 getTriple().getOSVersion(Major, Minor, Micro);
3785 // New NetBSD uses the default rounding mode.
3786 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3787 return X86_32TargetInfo::getFloatEvalMethod();
3788 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003789 return 1;
3790 }
3791};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003792
Eli Friedmane3aa4542009-07-05 18:47:56 +00003793class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3794public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003795 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3796 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003797 SizeType = UnsignedLong;
3798 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003799 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003800 }
3801};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003802
Eli Friedman9fa28852012-08-08 23:57:20 +00003803class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3804public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003805 BitrigI386TargetInfo(const llvm::Triple &Triple)
3806 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003807 SizeType = UnsignedLong;
3808 IntPtrType = SignedLong;
3809 PtrDiffType = SignedLong;
3810 }
3811};
Eli Friedman9fa28852012-08-08 23:57:20 +00003812
Torok Edwinb2b37c62009-06-30 17:10:35 +00003813class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003814public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003815 DarwinI386TargetInfo(const llvm::Triple &Triple)
3816 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003817 LongDoubleWidth = 128;
3818 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003819 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003820 MaxVectorAlign = 256;
3821 // The watchOS simulator uses the builtin bool type for Objective-C.
3822 llvm::Triple T = llvm::Triple(Triple);
3823 if (T.isWatchOS())
3824 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003825 SizeType = UnsignedLong;
3826 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003827 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003828 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003829 }
3830
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003831 bool handleTargetFeatures(std::vector<std::string> &Features,
3832 DiagnosticsEngine &Diags) override {
3833 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3834 Diags))
3835 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003836 // We now know the features we have: we can decide how to align vectors.
3837 MaxVectorAlign =
3838 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003839 return true;
3840 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003841};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003842
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003843// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003844class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003845public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003846 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3847 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003848 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003849 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003850 bool IsWinCOFF =
3851 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003852 resetDataLayout(IsWinCOFF
3853 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3854 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003855 }
Craig Topper3164f332014-03-11 03:39:26 +00003856 void getTargetDefines(const LangOptions &Opts,
3857 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003858 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3859 }
3860};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003861
3862// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003863class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003864public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003865 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003866 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003867 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003868 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3869 }
Craig Topper3164f332014-03-11 03:39:26 +00003870 void getTargetDefines(const LangOptions &Opts,
3871 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003872 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3873 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3874 // The value of the following reflects processor type.
3875 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3876 // We lost the original triple, so we use the default.
3877 Builder.defineMacro("_M_IX86", "600");
3878 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003879};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003880
David Majnemerae1ed0e2015-05-28 04:36:18 +00003881static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003882 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3883 // supports __declspec natively under -fms-extensions, but we define a no-op
3884 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003885 if (Opts.MicrosoftExt)
3886 Builder.defineMacro("__declspec", "__declspec");
3887 else
3888 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3889
3890 if (!Opts.MicrosoftExt) {
3891 // Provide macros for all the calling convention keywords. Provide both
3892 // single and double underscore prefixed variants. These are available on
3893 // x64 as well as x86, even though they have no effect.
3894 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3895 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003896 std::string GCCSpelling = "__attribute__((__";
3897 GCCSpelling += CC;
3898 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003899 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3900 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3901 }
3902 }
3903}
3904
David Majnemerae1ed0e2015-05-28 04:36:18 +00003905static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3906 Builder.defineMacro("__MSVCRT__");
3907 Builder.defineMacro("__MINGW32__");
3908 addCygMingDefines(Opts, Builder);
3909}
3910
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003911// x86-32 MinGW target
3912class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3913public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003914 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003915 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003916 void getTargetDefines(const LangOptions &Opts,
3917 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003918 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003919 DefineStd(Builder, "WIN32", Opts);
3920 DefineStd(Builder, "WINNT", Opts);
3921 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003922 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003923 }
3924};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003925
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003926// x86-32 Cygwin target
3927class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3928public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003929 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3930 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003931 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003932 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00003933 resetDataLayout("e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003934 }
Craig Topper3164f332014-03-11 03:39:26 +00003935 void getTargetDefines(const LangOptions &Opts,
3936 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003937 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003938 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003939 Builder.defineMacro("__CYGWIN__");
3940 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003941 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003942 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003943 if (Opts.CPlusPlus)
3944 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003945 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003946};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003947
Chris Lattnerb986aba2010-04-11 19:29:39 +00003948// x86-32 Haiku target
3949class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3950public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003951 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003952 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003953 IntPtrType = SignedLong;
3954 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003955 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003956 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003957 }
Craig Topper3164f332014-03-11 03:39:26 +00003958 void getTargetDefines(const LangOptions &Opts,
3959 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003960 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3961 Builder.defineMacro("__INTEL__");
3962 Builder.defineMacro("__HAIKU__");
3963 }
3964};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003965
Alexey Bataevc99b0492015-11-25 09:24:26 +00003966// X86-32 MCU target
3967class MCUX86_32TargetInfo : public X86_32TargetInfo {
3968public:
3969 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3970 LongDoubleWidth = 64;
3971 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00003972 resetDataLayout("e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32");
Andrey Bokhanko6e34c1d2016-02-04 11:54:45 +00003973 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003974 }
3975
3976 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3977 // On MCU we support only C calling convention.
3978 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3979 }
3980
3981 void getTargetDefines(const LangOptions &Opts,
3982 MacroBuilder &Builder) const override {
3983 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3984 Builder.defineMacro("__iamcu");
3985 Builder.defineMacro("__iamcu__");
3986 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00003987
3988 bool allowsLargerPreferedTypeAlignment() const override {
3989 return false;
3990 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00003991};
3992
Douglas Gregor9fabd852011-07-01 22:41:14 +00003993// RTEMS Target
3994template<typename Target>
3995class RTEMSTargetInfo : public OSTargetInfo<Target> {
3996protected:
Craig Topper3164f332014-03-11 03:39:26 +00003997 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3998 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003999 // RTEMS defines; list based off of gcc output
4000
Douglas Gregor9fabd852011-07-01 22:41:14 +00004001 Builder.defineMacro("__rtems__");
4002 Builder.defineMacro("__ELF__");
4003 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004004
Douglas Gregor9fabd852011-07-01 22:41:14 +00004005public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004006 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004007 switch (Triple.getArch()) {
4008 default:
4009 case llvm::Triple::x86:
4010 // this->MCountName = ".mcount";
4011 break;
4012 case llvm::Triple::mips:
4013 case llvm::Triple::mipsel:
4014 case llvm::Triple::ppc:
4015 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004016 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004017 // this->MCountName = "_mcount";
4018 break;
4019 case llvm::Triple::arm:
4020 // this->MCountName = "__mcount";
4021 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004022 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004023 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004024};
4025
Douglas Gregor9fabd852011-07-01 22:41:14 +00004026// x86-32 RTEMS target
4027class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4028public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004029 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004030 SizeType = UnsignedLong;
4031 IntPtrType = SignedLong;
4032 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004033 }
Craig Topper3164f332014-03-11 03:39:26 +00004034 void getTargetDefines(const LangOptions &Opts,
4035 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004036 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4037 Builder.defineMacro("__INTEL__");
4038 Builder.defineMacro("__rtems__");
4039 }
4040};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004041
Eli Friedman3fd920a2008-08-20 02:34:37 +00004042// x86-64 generic target
4043class X86_64TargetInfo : public X86TargetInfo {
4044public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004045 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00004046 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004047 bool IsWinCOFF =
4048 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004049 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004050 LongDoubleWidth = 128;
4051 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004052 LargeArrayMinWidth = 128;
4053 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004054 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004055 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4056 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4057 IntPtrType = IsX32 ? SignedInt : SignedLong;
4058 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004059 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004060 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004061
Eric Christopher917e9522014-11-18 22:36:15 +00004062 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004063 resetDataLayout(IsX32
4064 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4065 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4066 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004067
4068 // Use fpret only for long double.
4069 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004070
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004071 // Use fp2ret for _Complex long double.
4072 ComplexLongDoubleUsesFP2Ret = true;
4073
Charles Davisc7d5c942015-09-17 20:55:33 +00004074 // Make __builtin_ms_va_list available.
4075 HasBuiltinMSVaList = true;
4076
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004077 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004078 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004079 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004080 }
Craig Topper3164f332014-03-11 03:39:26 +00004081 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004082 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004083 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004084
Craig Topper3164f332014-03-11 03:39:26 +00004085 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004086 if (RegNo == 0) return 0;
4087 if (RegNo == 1) return 1;
4088 return -1;
4089 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004090
Craig Topper3164f332014-03-11 03:39:26 +00004091 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004092 switch (CC) {
4093 case CC_C:
4094 case CC_Swift:
4095 case CC_X86VectorCall:
4096 case CC_IntelOclBicc:
4097 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004098 case CC_PreserveMost:
4099 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004100 return CCCR_OK;
4101 default:
4102 return CCCR_Warning;
4103 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004104 }
4105
Craig Topper3164f332014-03-11 03:39:26 +00004106 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004107 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004108 }
4109
Pavel Chupinfd223e12014-08-04 12:39:43 +00004110 // for x32 we need it here explicitly
4111 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004112 unsigned getUnwindWordWidth() const override { return 64; }
4113 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004114
4115 bool validateGlobalRegisterVariable(StringRef RegName,
4116 unsigned RegSize,
4117 bool &HasSizeMismatch) const override {
4118 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4119 // handle.
4120 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4121 // Check that the register size is 64-bit.
4122 HasSizeMismatch = RegSize != 64;
4123 return true;
4124 }
4125
4126 // Check if the register is a 32-bit register the backend can handle.
4127 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4128 HasSizeMismatch);
4129 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004130};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004131
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004132// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004133class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004134public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004135 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4136 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004137 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004138 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004139 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004140 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004141 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004142 SizeType = UnsignedLongLong;
4143 PtrDiffType = SignedLongLong;
4144 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004145 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004146
Craig Topper3164f332014-03-11 03:39:26 +00004147 void getTargetDefines(const LangOptions &Opts,
4148 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004149 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004150 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004151 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004152
Craig Topper3164f332014-03-11 03:39:26 +00004153 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004154 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004155 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004156
Craig Topper3164f332014-03-11 03:39:26 +00004157 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004158 switch (CC) {
4159 case CC_X86StdCall:
4160 case CC_X86ThisCall:
4161 case CC_X86FastCall:
4162 return CCCR_Ignore;
4163 case CC_C:
4164 case CC_X86VectorCall:
4165 case CC_IntelOclBicc:
4166 case CC_X86_64SysV:
4167 return CCCR_OK;
4168 default:
4169 return CCCR_Warning;
4170 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004171 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004172};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004173
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004174// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004175class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004176public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004177 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004178 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004179 LongDoubleWidth = LongDoubleAlign = 64;
4180 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004181 }
Craig Topper3164f332014-03-11 03:39:26 +00004182 void getTargetDefines(const LangOptions &Opts,
4183 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004184 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4185 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004186 Builder.defineMacro("_M_X64", "100");
4187 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004188 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004189};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004190
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004191// x86-64 MinGW target
4192class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4193public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004194 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004195 : WindowsX86_64TargetInfo(Triple) {
4196 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4197 // with x86 FP ops. Weird.
4198 LongDoubleWidth = LongDoubleAlign = 128;
4199 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4200 }
4201
Craig Topper3164f332014-03-11 03:39:26 +00004202 void getTargetDefines(const LangOptions &Opts,
4203 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004204 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004205 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004206 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004207 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004208
4209 // GCC defines this macro when it is using __gxx_personality_seh0.
4210 if (!Opts.SjLjExceptions)
4211 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004212 }
4213};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004214
Yaron Kerend030d112015-07-22 17:38:19 +00004215// x86-64 Cygwin target
4216class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4217public:
4218 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4219 : X86_64TargetInfo(Triple) {
4220 TLSSupported = false;
4221 WCharType = UnsignedShort;
4222 }
4223 void getTargetDefines(const LangOptions &Opts,
4224 MacroBuilder &Builder) const override {
4225 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4226 Builder.defineMacro("__x86_64__");
4227 Builder.defineMacro("__CYGWIN__");
4228 Builder.defineMacro("__CYGWIN64__");
4229 addCygMingDefines(Opts, Builder);
4230 DefineStd(Builder, "unix", Opts);
4231 if (Opts.CPlusPlus)
4232 Builder.defineMacro("_GNU_SOURCE");
4233
4234 // GCC defines this macro when it is using __gxx_personality_seh0.
4235 if (!Opts.SjLjExceptions)
4236 Builder.defineMacro("__SEH__");
4237 }
4238};
4239
Eli Friedman2857ccb2009-07-01 03:36:11 +00004240class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4241public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004242 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4243 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004244 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004245 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4246 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004247 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004248 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004249 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004250 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004251
4252 bool handleTargetFeatures(std::vector<std::string> &Features,
4253 DiagnosticsEngine &Diags) override {
4254 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4255 Diags))
4256 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004257 // We now know the features we have: we can decide how to align vectors.
4258 MaxVectorAlign =
4259 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004260 return true;
4261 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004262};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004263
Eli Friedman245f2292009-07-05 22:31:18 +00004264class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4265public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004266 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4267 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004268 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004269 Int64Type = SignedLongLong;
4270 }
4271};
Eli Friedman245f2292009-07-05 22:31:18 +00004272
Eli Friedman9fa28852012-08-08 23:57:20 +00004273class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004275 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4276 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4277 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004278 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004279 }
4280};
Tim Northover9bb857a2013-01-31 12:13:10 +00004281
Eli Friedmanf05b7722008-08-20 07:44:10 +00004282class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004283 // Possible FPU choices.
4284 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004285 VFP2FPU = (1 << 0),
4286 VFP3FPU = (1 << 1),
4287 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004288 NeonFPU = (1 << 3),
4289 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004290 };
4291
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004292 // Possible HWDiv features.
4293 enum HWDivMode {
4294 HWDivThumb = (1 << 0),
4295 HWDivARM = (1 << 1)
4296 };
4297
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004298 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004299 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004300 }
4301
4302 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4303 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004304
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004305 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004306
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004307 StringRef CPUProfile;
4308 StringRef CPUAttr;
4309
Rafael Espindolaeb265472013-08-21 21:59:03 +00004310 enum {
4311 FP_Default,
4312 FP_VFP,
4313 FP_Neon
4314 } FPMath;
4315
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004316 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004317 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004318 unsigned ArchProfile;
4319 unsigned ArchVersion;
4320
Bernard Ogdenda13af32013-10-24 18:32:51 +00004321 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004322
Logan Chien57086ce2012-10-10 06:56:20 +00004323 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004324 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004325
4326 // Initialized via features.
4327 unsigned SoftFloat : 1;
4328 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004329
Bernard Ogden18b57012013-10-29 09:47:51 +00004330 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004331 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004332 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004333 unsigned Unaligned : 1;
4334
4335 enum {
4336 LDREX_B = (1 << 0), /// byte (8-bit)
4337 LDREX_H = (1 << 1), /// half (16-bit)
4338 LDREX_W = (1 << 2), /// word (32-bit)
4339 LDREX_D = (1 << 3), /// double (64-bit)
4340 };
4341
4342 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004343
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004344 // ACLE 6.5.1 Hardware floating point
4345 enum {
4346 HW_FP_HP = (1 << 1), /// half (16-bit)
4347 HW_FP_SP = (1 << 2), /// single (32-bit)
4348 HW_FP_DP = (1 << 3), /// double (64-bit)
4349 };
4350 uint32_t HW_FP;
4351
Chris Lattner5cc15e02010-03-03 19:03:45 +00004352 static const Builtin::Info BuiltinInfo[];
4353
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004354 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004355 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004356
4357 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004358 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004359
Renato Golin9ba39232015-02-27 16:35:48 +00004360 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4361 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4362 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004363 SizeType = UnsignedLong;
4364 else
4365 SizeType = UnsignedInt;
4366
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004367 switch (T.getOS()) {
4368 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004369 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004370 break;
4371 case llvm::Triple::Win32:
4372 WCharType = UnsignedShort;
4373 break;
4374 case llvm::Triple::Linux:
4375 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004376 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4377 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004378 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004379 }
4380
4381 UseBitFieldTypeAlignment = true;
4382
4383 ZeroLengthBitfieldBoundary = 0;
4384
Tim Northover147cd2f2014-10-14 22:12:21 +00004385 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4386 // so set preferred for small types to 32.
4387 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004388 resetDataLayout(BigEndian
4389 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4390 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004391 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004392 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004393 resetDataLayout("e"
4394 "-m:w"
4395 "-p:32:32"
4396 "-i64:64"
4397 "-v128:64:128"
4398 "-a:0:32"
4399 "-n32"
4400 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004401 } else if (T.isOSNaCl()) {
4402 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004403 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004404 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004405 resetDataLayout(BigEndian
4406 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4407 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004408 }
4409
4410 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004411 }
4412
Tim Northover5627d392015-10-30 16:30:45 +00004413 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004414 const llvm::Triple &T = getTriple();
4415
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004416 IsAAPCS = false;
4417
Tim Northover5627d392015-10-30 16:30:45 +00004418 if (IsAAPCS16)
4419 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4420 else
4421 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004422
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004423 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004424 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004425 SizeType = UnsignedInt;
4426 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004427 SizeType = UnsignedLong;
4428
4429 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4430 WCharType = SignedInt;
4431
4432 // Do not respect the alignment of bit-field types when laying out
4433 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4434 UseBitFieldTypeAlignment = false;
4435
4436 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4437 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4438 /// gcc.
4439 ZeroLengthBitfieldBoundary = 32;
4440
Tim Northover5627d392015-10-30 16:30:45 +00004441 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4442 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004443 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004444 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004445 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004446 BigEndian
4447 ? "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 +00004448 : "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 +00004449 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004450 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004451 BigEndian
4452 ? "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 +00004453 : "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 +00004454
4455 // FIXME: Override "preferred align" for double and long long.
4456 }
4457
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004458 void setArchInfo() {
4459 StringRef ArchName = getTriple().getArchName();
4460
Renato Goline84b0002015-10-08 16:43:26 +00004461 ArchISA = llvm::ARM::parseArchISA(ArchName);
4462 CPU = llvm::ARM::getDefaultCPU(ArchName);
4463 unsigned AK = llvm::ARM::parseArch(ArchName);
4464 if (AK != llvm::ARM::AK_INVALID)
4465 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004466 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004467 }
4468
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004469 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004470 StringRef SubArch;
4471
4472 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004473 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004474 SubArch = llvm::ARM::getSubArch(ArchKind);
4475 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4476 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004477
4478 // cache CPU related strings
4479 CPUAttr = getCPUAttr();
4480 CPUProfile = getCPUProfile();
4481 }
4482
4483 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004484 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004485 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004486 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004487 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4488 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004489 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004490 if (ArchProfile == llvm::ARM::PK_M) {
4491 MaxAtomicPromoteWidth = 32;
4492 if (ShouldUseInlineAtomic)
4493 MaxAtomicInlineWidth = 32;
4494 }
4495 else {
4496 MaxAtomicPromoteWidth = 64;
4497 if (ShouldUseInlineAtomic)
4498 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004499 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004500 }
4501
4502 bool isThumb() const {
4503 return (ArchISA == llvm::ARM::IK_THUMB);
4504 }
4505
4506 bool supportsThumb() const {
4507 return CPUAttr.count('T') || ArchVersion >= 6;
4508 }
4509
4510 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004511 return CPUAttr.equals("6T2") ||
4512 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004513 }
4514
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004515 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004516 // For most sub-arches, the build attribute CPU name is enough.
4517 // For Cortex variants, it's slightly different.
4518 switch(ArchKind) {
4519 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004520 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004521 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004522 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004523 case llvm::ARM::AK_ARMV7S:
4524 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004525 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004526 return "7A";
4527 case llvm::ARM::AK_ARMV7R:
4528 return "7R";
4529 case llvm::ARM::AK_ARMV7M:
4530 return "7M";
4531 case llvm::ARM::AK_ARMV7EM:
4532 return "7EM";
4533 case llvm::ARM::AK_ARMV8A:
4534 return "8A";
4535 case llvm::ARM::AK_ARMV8_1A:
4536 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004537 case llvm::ARM::AK_ARMV8_2A:
4538 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004539 case llvm::ARM::AK_ARMV8MBaseline:
4540 return "8M_BASE";
4541 case llvm::ARM::AK_ARMV8MMainline:
4542 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004543 }
4544 }
4545
4546 StringRef getCPUProfile() const {
4547 switch(ArchProfile) {
4548 case llvm::ARM::PK_A:
4549 return "A";
4550 case llvm::ARM::PK_R:
4551 return "R";
4552 case llvm::ARM::PK_M:
4553 return "M";
4554 default:
4555 return "";
4556 }
4557 }
4558
Chris Lattner17df24e2008-04-21 18:56:49 +00004559public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004560 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004561 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004562 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004563 BigEndian = IsBigEndian;
4564
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004565 switch (getTriple().getOS()) {
4566 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004567 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004568 break;
4569 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004570 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004571 break;
4572 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004573
Renato Goline84b0002015-10-08 16:43:26 +00004574 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004575 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004576
Chris Lattner1a8f3942010-04-23 16:29:58 +00004577 // {} in inline assembly are neon specifiers, not assembly variant
4578 // specifiers.
4579 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004580
Eric Christopher0e261882014-12-05 01:06:59 +00004581 // FIXME: This duplicates code from the driver that sets the -target-abi
4582 // option - this code is used if -target-abi isn't passed and should
4583 // be unified in some way.
4584 if (Triple.isOSBinFormatMachO()) {
4585 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4586 // the frontend matches that.
4587 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4588 Triple.getOS() == llvm::Triple::UnknownOS ||
4589 StringRef(CPU).startswith("cortex-m")) {
4590 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004591 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004592 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004593 } else {
4594 setABI("apcs-gnu");
4595 }
4596 } else if (Triple.isOSWindows()) {
4597 // FIXME: this is invalid for WindowsCE
4598 setABI("aapcs");
4599 } else {
4600 // Select the default based on the platform.
4601 switch (Triple.getEnvironment()) {
4602 case llvm::Triple::Android:
4603 case llvm::Triple::GNUEABI:
4604 case llvm::Triple::GNUEABIHF:
4605 setABI("aapcs-linux");
4606 break;
4607 case llvm::Triple::EABIHF:
4608 case llvm::Triple::EABI:
4609 setABI("aapcs");
4610 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004611 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004612 setABI("apcs-gnu");
4613 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004614 default:
4615 if (Triple.getOS() == llvm::Triple::NetBSD)
4616 setABI("apcs-gnu");
4617 else
4618 setABI("aapcs");
4619 break;
4620 }
4621 }
John McCall86353412010-08-21 22:46:04 +00004622
4623 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004624 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004625
Renato Golin15b86152015-07-03 16:41:13 +00004626 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004627 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004628
James Molloya7139222012-03-12 09:14:10 +00004629 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004630 // the alignment of the zero-length bitfield is greater than the member
4631 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004632 // zero length bitfield.
4633 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004634 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004635
Alp Toker4925ba72014-06-07 23:30:42 +00004636 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004637
Craig Topper3164f332014-03-11 03:39:26 +00004638 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004639 ABI = Name;
4640
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004641 // The defaults (above) are for AAPCS, check if we need to change them.
4642 //
4643 // FIXME: We need support for -meabi... we could just mangle it into the
4644 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004645 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004646 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004647 return true;
4648 }
4649 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4650 setABIAAPCS();
4651 return true;
4652 }
4653 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004654 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004655
Renato Golinf5c4dec2015-05-27 13:33:00 +00004656 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004657 bool
4658 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4659 StringRef CPU,
4660 const std::vector<std::string> &FeaturesVec) const override {
4661
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004662 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004663 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004664
4665 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004666 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004667 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4668
4669 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004670 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004671 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4672
4673 for (const char *Feature : TargetFeatures)
4674 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004675 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004676
Eric Christopher007b0a02015-08-28 22:32:01 +00004677 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004678 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004679
Craig Topper3164f332014-03-11 03:39:26 +00004680 bool handleTargetFeatures(std::vector<std::string> &Features,
4681 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004682 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004683 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004684 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004685 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004686 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004687 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004688 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004689
Ranjeet Singhac08e532015-06-24 23:39:25 +00004690 // This does not diagnose illegal cases like having both
4691 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4692 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004693 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004694 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004695 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004696 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004697 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004698 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004699 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004700 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004701 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004702 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004703 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004704 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004705 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004706 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004707 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004708 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004709 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004710 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004711 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004712 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004713 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004714 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004715 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004716 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004717 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004718 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004719 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004720 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004721 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004722 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004723 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004724 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004725 } else if (Feature == "+strict-align") {
4726 Unaligned = 0;
4727 } else if (Feature == "+fp16") {
4728 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004729 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004730 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004731 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004732
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004733 switch (ArchVersion) {
4734 case 6:
4735 if (ArchProfile == llvm::ARM::PK_M)
4736 LDREX = 0;
4737 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4738 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4739 else
4740 LDREX = LDREX_W;
4741 break;
4742 case 7:
4743 if (ArchProfile == llvm::ARM::PK_M)
4744 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4745 else
4746 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4747 break;
4748 case 8:
4749 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4750 }
4751
Rafael Espindolaeb265472013-08-21 21:59:03 +00004752 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4753 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4754 return false;
4755 }
4756
4757 if (FPMath == FP_Neon)
4758 Features.push_back("+neonfp");
4759 else if (FPMath == FP_VFP)
4760 Features.push_back("-neonfp");
4761
Daniel Dunbar893d4752009-12-19 04:15:38 +00004762 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004763 auto Feature =
4764 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4765 if (Feature != Features.end())
4766 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004767
Rafael Espindolaeb265472013-08-21 21:59:03 +00004768 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004769 }
4770
Craig Topper3164f332014-03-11 03:39:26 +00004771 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004772 return llvm::StringSwitch<bool>(Feature)
4773 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004774 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004775 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004776 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004777 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004778 .Case("hwdiv", HWDiv & HWDivThumb)
4779 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004780 .Default(false);
4781 }
Renato Golin15b86152015-07-03 16:41:13 +00004782
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004783 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004784 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004785 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004786
Renato Golin15b86152015-07-03 16:41:13 +00004787 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004788 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004789 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004790 CPU = Name;
4791 return true;
4792 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004793
Craig Topper3164f332014-03-11 03:39:26 +00004794 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795
Craig Topper3164f332014-03-11 03:39:26 +00004796 void getTargetDefines(const LangOptions &Opts,
4797 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004798 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004799 Builder.defineMacro("__arm");
4800 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004801
Chris Lattnerecd49032009-03-02 22:27:17 +00004802 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004803 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004804
4805 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4806 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004807 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004808 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4809
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004810 if (!CPUAttr.empty())
4811 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004812
4813 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004814 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004815 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004816
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004817 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004818 // ACLE 6.5.7 Crypto Extension
4819 if (Crypto)
4820 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4821 // ACLE 6.5.8 CRC32 Extension
4822 if (CRC)
4823 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4824 // ACLE 6.5.10 Numeric Maximum and Minimum
4825 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4826 // ACLE 6.5.9 Directed Rounding
4827 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004828 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004829
4830 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4831 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004832 // NOTE that the default profile is assumed to be 'A'
4833 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004834 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4835
Bradley Smithf4affc12016-03-03 13:52:22 +00004836 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4837 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4838 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4839 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004840 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004841 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004842 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004843 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4844
4845 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4846 // instruction set such as ARM or Thumb.
4847 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4848
4849 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4850
4851 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004852 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004853 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004854
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004855 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004856 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004857 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004858
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004859 // ACLE 6.4.4 LDREX/STREX
4860 if (LDREX)
4861 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4862
4863 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004864 if (ArchVersion == 5 ||
4865 (ArchVersion == 6 && CPUProfile != "M") ||
4866 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004867 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4868
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004869 // ACLE 6.5.1 Hardware Floating Point
4870 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004871 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004872
Yi Konga44c4d72014-06-27 21:25:42 +00004873 // ACLE predefines.
4874 Builder.defineMacro("__ARM_ACLE", "200");
4875
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004876 // FP16 support (we currently only support IEEE format).
4877 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4878 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4879
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004880 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4881 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4882 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4883
Mike Stump9d54bd72009-04-08 02:07:04 +00004884 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004885
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004886 // FIXME: It's more complicated than this and we don't really support
4887 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004888 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004889 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004890 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004891
David Tweed8f676532012-10-25 13:33:01 +00004892 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004893 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004894 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4895 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004896 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004897 Builder.defineMacro("__ARM_PCS", "1");
4898
David Tweed8f676532012-10-25 13:33:01 +00004899 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004900 Builder.defineMacro("__ARM_PCS_VFP", "1");
4901 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004902
Daniel Dunbar893d4752009-12-19 04:15:38 +00004903 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004904 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004905
4906 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004907 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004908
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004909 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004910 Builder.defineMacro("__THUMBEL__");
4911 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004912 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004913 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004914 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004915
4916 // ACLE 6.4.9 32-bit SIMD instructions
4917 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4918 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4919
4920 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004921 if (((HWDiv & HWDivThumb) && isThumb()) ||
4922 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004923 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004924 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004925 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004926
4927 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004928 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004929
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004930 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004931 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004932 if (FPU & VFP2FPU)
4933 Builder.defineMacro("__ARM_VFPV2__");
4934 if (FPU & VFP3FPU)
4935 Builder.defineMacro("__ARM_VFPV3__");
4936 if (FPU & VFP4FPU)
4937 Builder.defineMacro("__ARM_VFPV4__");
4938 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004939
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004940 // This only gets set when Neon instructions are actually available, unlike
4941 // the VFP define, hence the soft float and arch check. This is subtly
4942 // different from gcc, we follow the intent which was that it should be set
4943 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004944 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004945 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004946 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004947 // current AArch32 NEON implementations do not support double-precision
4948 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004949 Builder.defineMacro("__ARM_NEON_FP",
4950 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004951 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004952
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004953 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4954 Opts.ShortWChar ? "2" : "4");
4955
4956 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4957 Opts.ShortEnums ? "1" : "4");
4958
Bradley Smithf4affc12016-03-03 13:52:22 +00004959 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004960 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4961 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4962 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4963 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4964 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004965
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004966 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004967 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004968 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004969 }
4970
4971 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004972 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004973 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4974 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004975 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004976 }
4977
4978 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004979 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004980 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004981
4982 if (Opts.UnsafeFPMath)
4983 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004984
4985 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4986 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004987 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004988
Craig Topper6c03a542015-10-19 04:51:35 +00004989 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4990 return llvm::makeArrayRef(BuiltinInfo,
4991 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004992 }
Craig Topper3164f332014-03-11 03:39:26 +00004993 bool isCLZForZeroUndef() const override { return false; }
4994 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004995 return IsAAPCS
4996 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00004997 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
4998 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00004999 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005000 ArrayRef<const char *> getGCCRegNames() const override;
5001 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005002 bool validateAsmConstraint(const char *&Name,
5003 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005004 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005005 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005006 case 'l': // r0-r7
5007 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005008 case 't': // VFP Floating point register single precision
5009 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005010 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005011 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005012 case 'I':
5013 case 'J':
5014 case 'K':
5015 case 'L':
5016 case 'M':
5017 // FIXME
5018 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005019 case 'Q': // A memory address that is a single base register.
5020 Info.setAllowsMemory();
5021 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005022 case 'U': // a memory reference...
5023 switch (Name[1]) {
5024 case 'q': // ...ARMV4 ldrsb
5025 case 'v': // ...VFP load/store (reg+constant offset)
5026 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005027 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005028 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005029 case 'n': // valid address for Neon doubleword vector load/store
5030 case 'm': // valid address for Neon element and structure load/store
5031 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005032 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005033 Info.setAllowsMemory();
5034 Name++;
5035 return true;
5036 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005037 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005038 return false;
5039 }
Craig Topper3164f332014-03-11 03:39:26 +00005040 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005041 std::string R;
5042 switch (*Constraint) {
5043 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005044 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005045 Constraint++;
5046 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005047 case 'p': // 'p' should be translated to 'r' by default.
5048 R = std::string("r");
5049 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005050 default:
5051 return std::string(1, *Constraint);
5052 }
5053 return R;
5054 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005055 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005056 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005057 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005058 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005059 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005060
Bill Wendling9d1ee112012-10-25 23:28:48 +00005061 // Strip off constraint modifiers.
5062 while (Constraint[0] == '=' ||
5063 Constraint[0] == '+' ||
5064 Constraint[0] == '&')
5065 Constraint = Constraint.substr(1);
5066
5067 switch (Constraint[0]) {
5068 default: break;
5069 case 'r': {
5070 switch (Modifier) {
5071 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005072 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005073 case 'q':
5074 // A register of size 32 cannot fit a vector type.
5075 return false;
5076 }
5077 }
5078 }
5079
5080 return true;
5081 }
Craig Topper3164f332014-03-11 03:39:26 +00005082 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005083 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005084 return "";
5085 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005086
Craig Topper3164f332014-03-11 03:39:26 +00005087 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005088 switch (CC) {
5089 case CC_AAPCS:
5090 case CC_AAPCS_VFP:
5091 case CC_Swift:
5092 return CCCR_OK;
5093 default:
5094 return CCCR_Warning;
5095 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005096 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005097
Craig Topper3164f332014-03-11 03:39:26 +00005098 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005099 if (RegNo == 0) return 0;
5100 if (RegNo == 1) return 1;
5101 return -1;
5102 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005103
5104 bool hasSjLjLowering() const override {
5105 return true;
5106 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005107};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005108
Rafael Espindolaeb265472013-08-21 21:59:03 +00005109bool ARMTargetInfo::setFPMath(StringRef Name) {
5110 if (Name == "neon") {
5111 FPMath = FP_Neon;
5112 return true;
5113 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5114 Name == "vfp4") {
5115 FPMath = FP_VFP;
5116 return true;
5117 }
5118 return false;
5119}
5120
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005121const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005122 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005123 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005124 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5125
5126 // Float registers
5127 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5128 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5129 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005130 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005131
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005132 // Double registers
5133 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5134 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005135 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5136 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005137
5138 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005139 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5140 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005141};
5142
Craig Topperf054e3a2015-10-19 03:52:27 +00005143ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5144 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005145}
5146
5147const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005148 { { "a1" }, "r0" },
5149 { { "a2" }, "r1" },
5150 { { "a3" }, "r2" },
5151 { { "a4" }, "r3" },
5152 { { "v1" }, "r4" },
5153 { { "v2" }, "r5" },
5154 { { "v3" }, "r6" },
5155 { { "v4" }, "r7" },
5156 { { "v5" }, "r8" },
5157 { { "v6", "rfp" }, "r9" },
5158 { { "sl" }, "r10" },
5159 { { "fp" }, "r11" },
5160 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005161 { { "r13" }, "sp" },
5162 { { "r14" }, "lr" },
5163 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005164 // The S, D and Q registers overlap, but aren't really aliases; we
5165 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005166};
5167
Craig Topperf054e3a2015-10-19 03:52:27 +00005168ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5169 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005170}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005171
5172const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005173#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005174 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005175#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5176 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005177#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005178
Craig Topper07d3b622015-08-07 05:14:44 +00005179#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005180 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005181#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005182 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005183#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5184 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005185#include "clang/Basic/BuiltinsARM.def"
5186};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005187
5188class ARMleTargetInfo : public ARMTargetInfo {
5189public:
5190 ARMleTargetInfo(const llvm::Triple &Triple)
5191 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005192 void getTargetDefines(const LangOptions &Opts,
5193 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005194 Builder.defineMacro("__ARMEL__");
5195 ARMTargetInfo::getTargetDefines(Opts, Builder);
5196 }
5197};
5198
5199class ARMbeTargetInfo : public ARMTargetInfo {
5200public:
5201 ARMbeTargetInfo(const llvm::Triple &Triple)
5202 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005203 void getTargetDefines(const LangOptions &Opts,
5204 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005205 Builder.defineMacro("__ARMEB__");
5206 Builder.defineMacro("__ARM_BIG_ENDIAN");
5207 ARMTargetInfo::getTargetDefines(Opts, Builder);
5208 }
5209};
Chris Lattner17df24e2008-04-21 18:56:49 +00005210
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005211class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5212 const llvm::Triple Triple;
5213public:
5214 WindowsARMTargetInfo(const llvm::Triple &Triple)
5215 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005216 WCharType = UnsignedShort;
5217 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005218 }
5219 void getVisualStudioDefines(const LangOptions &Opts,
5220 MacroBuilder &Builder) const {
5221 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5222
5223 // FIXME: this is invalid for WindowsCE
5224 Builder.defineMacro("_M_ARM_NT", "1");
5225 Builder.defineMacro("_M_ARMT", "_M_ARM");
5226 Builder.defineMacro("_M_THUMB", "_M_ARM");
5227
5228 assert((Triple.getArch() == llvm::Triple::arm ||
5229 Triple.getArch() == llvm::Triple::thumb) &&
5230 "invalid architecture for Windows ARM target info");
5231 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5232 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5233
5234 // TODO map the complete set of values
5235 // 31: VFPv3 40: VFPv4
5236 Builder.defineMacro("_M_ARM_FP", "31");
5237 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005238 BuiltinVaListKind getBuiltinVaListKind() const override {
5239 return TargetInfo::CharPtrBuiltinVaList;
5240 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005241 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5242 switch (CC) {
5243 case CC_X86StdCall:
5244 case CC_X86ThisCall:
5245 case CC_X86FastCall:
5246 case CC_X86VectorCall:
5247 return CCCR_Ignore;
5248 case CC_C:
5249 return CCCR_OK;
5250 default:
5251 return CCCR_Warning;
5252 }
5253 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005254};
5255
5256// Windows ARM + Itanium C++ ABI Target
5257class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5258public:
5259 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5260 : WindowsARMTargetInfo(Triple) {
5261 TheCXXABI.set(TargetCXXABI::GenericARM);
5262 }
5263
5264 void getTargetDefines(const LangOptions &Opts,
5265 MacroBuilder &Builder) const override {
5266 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5267
5268 if (Opts.MSVCCompat)
5269 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5270 }
5271};
5272
5273// Windows ARM, MS (C++) ABI
5274class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5275public:
5276 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5277 : WindowsARMTargetInfo(Triple) {
5278 TheCXXABI.set(TargetCXXABI::Microsoft);
5279 }
5280
5281 void getTargetDefines(const LangOptions &Opts,
5282 MacroBuilder &Builder) const override {
5283 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5284 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5285 }
5286};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005287
Yaron Keren321249c2015-07-15 13:32:23 +00005288// ARM MinGW target
5289class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5290public:
5291 MinGWARMTargetInfo(const llvm::Triple &Triple)
5292 : WindowsARMTargetInfo(Triple) {
5293 TheCXXABI.set(TargetCXXABI::GenericARM);
5294 }
5295
5296 void getTargetDefines(const LangOptions &Opts,
5297 MacroBuilder &Builder) const override {
5298 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5299 DefineStd(Builder, "WIN32", Opts);
5300 DefineStd(Builder, "WINNT", Opts);
5301 Builder.defineMacro("_ARM_");
5302 addMinGWDefines(Opts, Builder);
5303 }
5304};
5305
5306// ARM Cygwin target
5307class CygwinARMTargetInfo : public ARMleTargetInfo {
5308public:
5309 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5310 TLSSupported = false;
5311 WCharType = UnsignedShort;
5312 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005313 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005314 }
5315 void getTargetDefines(const LangOptions &Opts,
5316 MacroBuilder &Builder) const override {
5317 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5318 Builder.defineMacro("_ARM_");
5319 Builder.defineMacro("__CYGWIN__");
5320 Builder.defineMacro("__CYGWIN32__");
5321 DefineStd(Builder, "unix", Opts);
5322 if (Opts.CPlusPlus)
5323 Builder.defineMacro("_GNU_SOURCE");
5324 }
5325};
5326
Mike Stump11289f42009-09-09 15:08:12 +00005327class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005328 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005329protected:
Craig Topper3164f332014-03-11 03:39:26 +00005330 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5331 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005332 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005333 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005334
Torok Edwinb2b37c62009-06-30 17:10:35 +00005335public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005336 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005337 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005338 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005339 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005340 // FIXME: This should be based off of the target features in
5341 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005342 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005343
Tim Northoverd88ecb32016-01-27 19:32:40 +00005344 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005345 // Darwin on iOS uses a variant of the ARM C++ ABI.
5346 TheCXXABI.set(TargetCXXABI::WatchOS);
5347
5348 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5349 // size_t is long, it's a bit weird for it to be int.
5350 PtrDiffType = SignedLong;
5351
5352 // BOOL should be a real boolean on the new ABI
5353 UseSignedCharForObjCBool = false;
5354 } else
5355 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005356 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005357};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005358
Tim Northover573cbee2014-05-24 12:52:07 +00005359class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005360 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005361 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5362 static const char *const GCCRegNames[];
5363
James Molloy75f5f9e2014-04-16 15:33:48 +00005364 enum FPUModeEnum {
5365 FPUMode,
5366 NeonMode
5367 };
5368
5369 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005370 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005371 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005372 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005373 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005374
Tim Northovera2ee4332014-03-29 15:09:45 +00005375 static const Builtin::Info BuiltinInfo[];
5376
5377 std::string ABI;
5378
5379public:
Tim Northover573cbee2014-05-24 12:52:07 +00005380 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005381 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005382
5383 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5384 WCharType = SignedInt;
5385
5386 // NetBSD apparently prefers consistency across ARM targets to consistency
5387 // across 64-bit targets.
5388 Int64Type = SignedLongLong;
5389 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005390 } else {
5391 WCharType = UnsignedInt;
5392 Int64Type = SignedLong;
5393 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005394 }
5395
Tim Northovera2ee4332014-03-29 15:09:45 +00005396 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005397 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005398 MaxAtomicInlineWidth = 128;
5399 MaxAtomicPromoteWidth = 128;
5400
Tim Northovera6a19f12015-02-06 01:25:07 +00005401 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005402 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5403
Tim Northovera2ee4332014-03-29 15:09:45 +00005404 // {} in inline assembly are neon specifiers, not assembly variant
5405 // specifiers.
5406 NoAsmVariants = true;
5407
Tim Northover7ad87af2015-01-16 18:44:04 +00005408 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5409 // contributes to the alignment of the containing aggregate in the same way
5410 // a plain (non bit-field) member of that type would, without exception for
5411 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005412 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005413 UseZeroLengthBitfieldAlignment = true;
5414
Tim Northover573cbee2014-05-24 12:52:07 +00005415 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005416 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5417 }
5418
Alp Toker4925ba72014-06-07 23:30:42 +00005419 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005420 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005421 if (Name != "aapcs" && Name != "darwinpcs")
5422 return false;
5423
5424 ABI = Name;
5425 return true;
5426 }
5427
David Blaikie1cbb9712014-11-14 19:09:44 +00005428 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005429 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005430 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005431 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5432 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005433 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005434 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005435 .Default(false);
5436 return CPUKnown;
5437 }
5438
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005439 void getTargetDefines(const LangOptions &Opts,
5440 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005441 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005442 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005443
5444 // Target properties.
5445 Builder.defineMacro("_LP64");
5446 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005447
5448 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5449 Builder.defineMacro("__ARM_ACLE", "200");
5450 Builder.defineMacro("__ARM_ARCH", "8");
5451 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5452
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005453 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005454 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005455 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005456
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005457 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5458 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5459 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5460 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005461 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005462 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5463 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005464
5465 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5466
5467 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005468 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005469
5470 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5471 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005472 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5473 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005474
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005475 if (Opts.UnsafeFPMath)
5476 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005477
5478 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5479
5480 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5481 Opts.ShortEnums ? "1" : "4");
5482
James Molloy75f5f9e2014-04-16 15:33:48 +00005483 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005484 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005485 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005486 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005487 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005488
Bradley Smith418c5932014-05-02 15:17:51 +00005489 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005490 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005491
James Molloy75f5f9e2014-04-16 15:33:48 +00005492 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005493 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5494
5495 if (Unaligned)
5496 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005497
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005498 if (V8_1A)
5499 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5500
Reid Klecknerd167d422015-05-06 15:31:46 +00005501 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5502 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5503 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5504 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5505 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005506 }
5507
Craig Topper6c03a542015-10-19 04:51:35 +00005508 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5509 return llvm::makeArrayRef(BuiltinInfo,
5510 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005511 }
5512
David Blaikie1cbb9712014-11-14 19:09:44 +00005513 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005514 return Feature == "aarch64" ||
5515 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005516 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005517 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005518 }
5519
James Molloy5e73df52014-04-16 15:06:20 +00005520 bool handleTargetFeatures(std::vector<std::string> &Features,
5521 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005522 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005523 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005524 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005525 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005526 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005527
Eric Christopher610fe112015-08-26 08:21:55 +00005528 for (const auto &Feature : Features) {
5529 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005530 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005531 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005532 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005533 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005534 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005535 if (Feature == "+strict-align")
5536 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005537 if (Feature == "+v8.1a")
5538 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005539 }
5540
James Y Knightb214cbc2016-03-04 19:00:41 +00005541 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005542
5543 return true;
5544 }
5545
John McCall477f2bb2016-03-03 06:39:32 +00005546 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5547 switch (CC) {
5548 case CC_C:
5549 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005550 case CC_PreserveMost:
5551 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005552 return CCCR_OK;
5553 default:
5554 return CCCR_Warning;
5555 }
5556 }
5557
David Blaikie1cbb9712014-11-14 19:09:44 +00005558 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005559
David Blaikie1cbb9712014-11-14 19:09:44 +00005560 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005561 return TargetInfo::AArch64ABIBuiltinVaList;
5562 }
5563
Craig Topperf054e3a2015-10-19 03:52:27 +00005564 ArrayRef<const char *> getGCCRegNames() const override;
5565 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005566
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005567 bool validateAsmConstraint(const char *&Name,
5568 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005569 switch (*Name) {
5570 default:
5571 return false;
5572 case 'w': // Floating point and SIMD registers (V0-V31)
5573 Info.setAllowsRegister();
5574 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005575 case 'I': // Constant that can be used with an ADD instruction
5576 case 'J': // Constant that can be used with a SUB instruction
5577 case 'K': // Constant that can be used with a 32-bit logical instruction
5578 case 'L': // Constant that can be used with a 64-bit logical instruction
5579 case 'M': // Constant that can be used as a 32-bit MOV immediate
5580 case 'N': // Constant that can be used as a 64-bit MOV immediate
5581 case 'Y': // Floating point constant zero
5582 case 'Z': // Integer constant zero
5583 return true;
5584 case 'Q': // A memory reference with base register and no offset
5585 Info.setAllowsMemory();
5586 return true;
5587 case 'S': // A symbolic address
5588 Info.setAllowsRegister();
5589 return true;
5590 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005591 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5592 // Utf: A memory address suitable for ldp/stp in TF mode.
5593 // Usa: An absolute symbolic address.
5594 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5595 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005596 case 'z': // Zero register, wzr or xzr
5597 Info.setAllowsRegister();
5598 return true;
5599 case 'x': // Floating point and SIMD registers (V0-V15)
5600 Info.setAllowsRegister();
5601 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005602 }
5603 return false;
5604 }
5605
Akira Hatanaka987f1862014-08-22 06:05:21 +00005606 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005607 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005608 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005609 // Strip off constraint modifiers.
5610 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5611 Constraint = Constraint.substr(1);
5612
5613 switch (Constraint[0]) {
5614 default:
5615 return true;
5616 case 'z':
5617 case 'r': {
5618 switch (Modifier) {
5619 case 'x':
5620 case 'w':
5621 // For now assume that the person knows what they're
5622 // doing with the modifier.
5623 return true;
5624 default:
5625 // By default an 'r' constraint will be in the 'x'
5626 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005627 if (Size == 64)
5628 return true;
5629
5630 SuggestedModifier = "w";
5631 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005632 }
5633 }
5634 }
5635 }
5636
David Blaikie1cbb9712014-11-14 19:09:44 +00005637 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005638
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005639 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005640 if (RegNo == 0)
5641 return 0;
5642 if (RegNo == 1)
5643 return 1;
5644 return -1;
5645 }
5646};
5647
Tim Northover573cbee2014-05-24 12:52:07 +00005648const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005649 // 32-bit Integer registers
5650 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5651 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5652 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5653
5654 // 64-bit Integer registers
5655 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5656 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5657 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5658
5659 // 32-bit floating point regsisters
5660 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5661 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5662 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5663
5664 // 64-bit floating point regsisters
5665 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5666 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5667 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5668
5669 // Vector registers
5670 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5671 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5672 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5673};
5674
Craig Topperf054e3a2015-10-19 03:52:27 +00005675ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5676 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005677}
5678
Tim Northover573cbee2014-05-24 12:52:07 +00005679const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005680 { { "w31" }, "wsp" },
5681 { { "x29" }, "fp" },
5682 { { "x30" }, "lr" },
5683 { { "x31" }, "sp" },
5684 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5685 // don't want to substitute one of these for a different-sized one.
5686};
5687
Craig Topperf054e3a2015-10-19 03:52:27 +00005688ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5689 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005690}
5691
Tim Northover573cbee2014-05-24 12:52:07 +00005692const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005693#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005694 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005695#include "clang/Basic/BuiltinsNEON.def"
5696
5697#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005698 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005699#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005700};
James Molloy5e73df52014-04-16 15:06:20 +00005701
Tim Northover573cbee2014-05-24 12:52:07 +00005702class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005703 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005704 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005705 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005706 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005707 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005708 }
5709
5710public:
Tim Northover573cbee2014-05-24 12:52:07 +00005711 AArch64leTargetInfo(const llvm::Triple &Triple)
5712 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005713 BigEndian = false;
5714 }
5715 void getTargetDefines(const LangOptions &Opts,
5716 MacroBuilder &Builder) const override {
5717 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005718 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005719 }
5720};
5721
Tim Northover573cbee2014-05-24 12:52:07 +00005722class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005723 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005724 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005725 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005726 }
5727
5728public:
Tim Northover573cbee2014-05-24 12:52:07 +00005729 AArch64beTargetInfo(const llvm::Triple &Triple)
5730 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005731 void getTargetDefines(const LangOptions &Opts,
5732 MacroBuilder &Builder) const override {
5733 Builder.defineMacro("__AARCH64EB__");
5734 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5735 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005736 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005737 }
5738};
Tim Northovera2ee4332014-03-29 15:09:45 +00005739
Tim Northover573cbee2014-05-24 12:52:07 +00005740class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005741protected:
5742 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5743 MacroBuilder &Builder) const override {
5744 Builder.defineMacro("__AARCH64_SIMD__");
5745 Builder.defineMacro("__ARM64_ARCH_8__");
5746 Builder.defineMacro("__ARM_NEON__");
5747 Builder.defineMacro("__LITTLE_ENDIAN__");
5748 Builder.defineMacro("__REGISTER_PREFIX__", "");
5749 Builder.defineMacro("__arm64", "1");
5750 Builder.defineMacro("__arm64__", "1");
5751
5752 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5753 }
5754
Tim Northovera2ee4332014-03-29 15:09:45 +00005755public:
Tim Northover573cbee2014-05-24 12:52:07 +00005756 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5757 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005758 Int64Type = SignedLongLong;
5759 WCharType = SignedInt;
5760 UseSignedCharForObjCBool = false;
5761
Tim Northovera6a19f12015-02-06 01:25:07 +00005762 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005763 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5764
5765 TheCXXABI.set(TargetCXXABI::iOS64);
5766 }
5767
David Blaikie1cbb9712014-11-14 19:09:44 +00005768 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005769 return TargetInfo::CharPtrBuiltinVaList;
5770 }
5771};
Tim Northovera2ee4332014-03-29 15:09:45 +00005772
Tony Linthicum76329bf2011-12-12 21:14:55 +00005773// Hexagon abstract base class
5774class HexagonTargetInfo : public TargetInfo {
5775 static const Builtin::Info BuiltinInfo[];
5776 static const char * const GCCRegNames[];
5777 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5778 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005779 bool HasHVX, HasHVXDouble;
5780
Tony Linthicum76329bf2011-12-12 21:14:55 +00005781public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005782 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005783 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005784 // Specify the vector alignment explicitly. For v512x1, the calculated
5785 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5786 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005787 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005788 "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 +00005789 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005790 SizeType = UnsignedInt;
5791 PtrDiffType = SignedInt;
5792 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005793
5794 // {} in inline assembly are packet specifiers, not assembly variant
5795 // specifiers.
5796 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005797
5798 LargeArrayMinWidth = 64;
5799 LargeArrayAlign = 64;
5800 UseBitFieldTypeAlignment = true;
5801 ZeroLengthBitfieldBoundary = 32;
5802 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005803 }
5804
Craig Topper6c03a542015-10-19 04:51:35 +00005805 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5806 return llvm::makeArrayRef(BuiltinInfo,
5807 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005808 }
5809
Craig Topper3164f332014-03-11 03:39:26 +00005810 bool validateAsmConstraint(const char *&Name,
5811 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005812 return true;
5813 }
5814
Craig Topper3164f332014-03-11 03:39:26 +00005815 void getTargetDefines(const LangOptions &Opts,
5816 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005817
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005818 bool isCLZForZeroUndef() const override { return false; }
5819
Craig Topper3164f332014-03-11 03:39:26 +00005820 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005821 return llvm::StringSwitch<bool>(Feature)
5822 .Case("hexagon", true)
5823 .Case("hvx", HasHVX)
5824 .Case("hvx-double", HasHVXDouble)
5825 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005826 }
Craig Topper3164f332014-03-11 03:39:26 +00005827
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005828 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5829 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5830 const override;
5831
5832 bool handleTargetFeatures(std::vector<std::string> &Features,
5833 DiagnosticsEngine &Diags) override;
5834
Craig Topper3164f332014-03-11 03:39:26 +00005835 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005836 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005837 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005838 ArrayRef<const char *> getGCCRegNames() const override;
5839 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005840 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005841 return "";
5842 }
Sebastian Pop86500282012-01-13 20:37:10 +00005843
5844 static const char *getHexagonCPUSuffix(StringRef Name) {
5845 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005846 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005847 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005848 .Case("hexagonv55", "55")
5849 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005850 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005851 }
5852
Craig Topper3164f332014-03-11 03:39:26 +00005853 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005854 if (!getHexagonCPUSuffix(Name))
5855 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005856 CPU = Name;
5857 return true;
5858 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005859
5860 int getEHDataRegisterNumber(unsigned RegNo) const override {
5861 return RegNo < 2 ? RegNo : -1;
5862 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005863};
5864
5865void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005866 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005867 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005868 Builder.defineMacro("__hexagon__", "1");
5869
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005870 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005871 Builder.defineMacro("__HEXAGON_V4__");
5872 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005873 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005874 Builder.defineMacro("__QDSP6_V4__");
5875 Builder.defineMacro("__QDSP6_ARCH__", "4");
5876 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005877 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005878 Builder.defineMacro("__HEXAGON_V5__");
5879 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5880 if(Opts.HexagonQdsp6Compat) {
5881 Builder.defineMacro("__QDSP6_V5__");
5882 Builder.defineMacro("__QDSP6_ARCH__", "5");
5883 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005884 } else if (CPU == "hexagonv60") {
5885 Builder.defineMacro("__HEXAGON_V60__");
5886 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5887 Builder.defineMacro("__QDSP6_V60__");
5888 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005889 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005890}
5891
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005892bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5893 DiagnosticsEngine &Diags) {
5894 for (auto &F : Features) {
5895 if (F == "+hvx")
5896 HasHVX = true;
5897 else if (F == "-hvx")
5898 HasHVX = HasHVXDouble = false;
5899 else if (F == "+hvx-double")
5900 HasHVX = HasHVXDouble = true;
5901 else if (F == "-hvx-double")
5902 HasHVXDouble = false;
5903 }
5904 return true;
5905}
5906
5907bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5908 DiagnosticsEngine &Diags, StringRef CPU,
5909 const std::vector<std::string> &FeaturesVec) const {
5910 // Default for v60: -hvx, -hvx-double.
5911 Features["hvx"] = false;
5912 Features["hvx-double"] = false;
5913
5914 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5915}
5916
5917
5918const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005919 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5920 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5921 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5922 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5923 "p0", "p1", "p2", "p3",
5924 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5925};
5926
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005927ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005928 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005929}
5930
Tony Linthicum76329bf2011-12-12 21:14:55 +00005931const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5932 { { "sp" }, "r29" },
5933 { { "fp" }, "r30" },
5934 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005935};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005936
Craig Topperf054e3a2015-10-19 03:52:27 +00005937ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5938 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005939}
5940
5941
5942const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005943#define BUILTIN(ID, TYPE, ATTRS) \
5944 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5945#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5946 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005947#include "clang/Basic/BuiltinsHexagon.def"
5948};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005949
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005950// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5951class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005952 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5953 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005954 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005955public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005956 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00005957 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005958
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00005959 int getEHDataRegisterNumber(unsigned RegNo) const override {
5960 if (RegNo == 0) return 24;
5961 if (RegNo == 1) return 25;
5962 return -1;
5963 }
5964
Craig Topper3164f332014-03-11 03:39:26 +00005965 bool handleTargetFeatures(std::vector<std::string> &Features,
5966 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005967 // The backend doesn't actually handle soft float yet, but in case someone
5968 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005969 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5970 if (Feature != Features.end()) {
5971 SoftFloat = true;
5972 Features.erase(Feature);
5973 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005974 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005975 }
Craig Topper3164f332014-03-11 03:39:26 +00005976 void getTargetDefines(const LangOptions &Opts,
5977 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005978 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005979 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005980
5981 if (SoftFloat)
5982 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005983 }
Craig Topper3164f332014-03-11 03:39:26 +00005984
5985 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005986 return llvm::StringSwitch<bool>(Feature)
5987 .Case("softfloat", SoftFloat)
5988 .Case("sparc", true)
5989 .Default(false);
5990 }
Craig Topper3164f332014-03-11 03:39:26 +00005991
Craig Topper6c03a542015-10-19 04:51:35 +00005992 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005993 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005994 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005995 }
Craig Topper3164f332014-03-11 03:39:26 +00005996 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005997 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005998 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005999 ArrayRef<const char *> getGCCRegNames() const override;
6000 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006001 bool validateAsmConstraint(const char *&Name,
6002 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006003 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006004 switch (*Name) {
6005 case 'I': // Signed 13-bit constant
6006 case 'J': // Zero
6007 case 'K': // 32-bit constant with the low 12 bits clear
6008 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6009 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6010 case 'N': // Same as 'K' but zext (required for SIMode)
6011 case 'O': // The constant 4096
6012 return true;
6013 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006014 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006015 }
Craig Topper3164f332014-03-11 03:39:26 +00006016 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006017 // FIXME: Implement!
6018 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006019 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006020
6021 // No Sparc V7 for now, the backend doesn't support it anyway.
6022 enum CPUKind {
6023 CK_GENERIC,
6024 CK_V8,
6025 CK_SUPERSPARC,
6026 CK_SPARCLITE,
6027 CK_F934,
6028 CK_HYPERSPARC,
6029 CK_SPARCLITE86X,
6030 CK_SPARCLET,
6031 CK_TSC701,
6032 CK_V9,
6033 CK_ULTRASPARC,
6034 CK_ULTRASPARC3,
6035 CK_NIAGARA,
6036 CK_NIAGARA2,
6037 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006038 CK_NIAGARA4,
6039 CK_MYRIAD2_1,
6040 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006041 } CPU = CK_GENERIC;
6042
6043 enum CPUGeneration {
6044 CG_V8,
6045 CG_V9,
6046 };
6047
6048 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6049 switch (Kind) {
6050 case CK_GENERIC:
6051 case CK_V8:
6052 case CK_SUPERSPARC:
6053 case CK_SPARCLITE:
6054 case CK_F934:
6055 case CK_HYPERSPARC:
6056 case CK_SPARCLITE86X:
6057 case CK_SPARCLET:
6058 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006059 case CK_MYRIAD2_1:
6060 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006061 return CG_V8;
6062 case CK_V9:
6063 case CK_ULTRASPARC:
6064 case CK_ULTRASPARC3:
6065 case CK_NIAGARA:
6066 case CK_NIAGARA2:
6067 case CK_NIAGARA3:
6068 case CK_NIAGARA4:
6069 return CG_V9;
6070 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006071 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006072 }
6073
6074 CPUKind getCPUKind(StringRef Name) const {
6075 return llvm::StringSwitch<CPUKind>(Name)
6076 .Case("v8", CK_V8)
6077 .Case("supersparc", CK_SUPERSPARC)
6078 .Case("sparclite", CK_SPARCLITE)
6079 .Case("f934", CK_F934)
6080 .Case("hypersparc", CK_HYPERSPARC)
6081 .Case("sparclite86x", CK_SPARCLITE86X)
6082 .Case("sparclet", CK_SPARCLET)
6083 .Case("tsc701", CK_TSC701)
6084 .Case("v9", CK_V9)
6085 .Case("ultrasparc", CK_ULTRASPARC)
6086 .Case("ultrasparc3", CK_ULTRASPARC3)
6087 .Case("niagara", CK_NIAGARA)
6088 .Case("niagara2", CK_NIAGARA2)
6089 .Case("niagara3", CK_NIAGARA3)
6090 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006091 .Case("myriad2", CK_MYRIAD2_1)
6092 .Case("myriad2.1", CK_MYRIAD2_1)
6093 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006094 .Default(CK_GENERIC);
6095 }
6096
6097 bool setCPU(const std::string &Name) override {
6098 CPU = getCPUKind(Name);
6099 return CPU != CK_GENERIC;
6100 }
Gabor Greif49991682008-02-21 16:29:08 +00006101};
6102
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006103const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006104 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6105 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6106 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6107 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6108};
6109
Craig Topperf054e3a2015-10-19 03:52:27 +00006110ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6111 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006112}
6113
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006114const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006115 { { "g0" }, "r0" },
6116 { { "g1" }, "r1" },
6117 { { "g2" }, "r2" },
6118 { { "g3" }, "r3" },
6119 { { "g4" }, "r4" },
6120 { { "g5" }, "r5" },
6121 { { "g6" }, "r6" },
6122 { { "g7" }, "r7" },
6123 { { "o0" }, "r8" },
6124 { { "o1" }, "r9" },
6125 { { "o2" }, "r10" },
6126 { { "o3" }, "r11" },
6127 { { "o4" }, "r12" },
6128 { { "o5" }, "r13" },
6129 { { "o6", "sp" }, "r14" },
6130 { { "o7" }, "r15" },
6131 { { "l0" }, "r16" },
6132 { { "l1" }, "r17" },
6133 { { "l2" }, "r18" },
6134 { { "l3" }, "r19" },
6135 { { "l4" }, "r20" },
6136 { { "l5" }, "r21" },
6137 { { "l6" }, "r22" },
6138 { { "l7" }, "r23" },
6139 { { "i0" }, "r24" },
6140 { { "i1" }, "r25" },
6141 { { "i2" }, "r26" },
6142 { { "i3" }, "r27" },
6143 { { "i4" }, "r28" },
6144 { { "i5" }, "r29" },
6145 { { "i6", "fp" }, "r30" },
6146 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006147};
6148
Craig Topperf054e3a2015-10-19 03:52:27 +00006149ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6150 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006151}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006152
6153// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6154class SparcV8TargetInfo : public SparcTargetInfo {
6155public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006156 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006157 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006158 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6159 switch (getTriple().getOS()) {
6160 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006161 SizeType = UnsignedInt;
6162 IntPtrType = SignedInt;
6163 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006164 break;
6165 case llvm::Triple::NetBSD:
6166 case llvm::Triple::OpenBSD:
6167 SizeType = UnsignedLong;
6168 IntPtrType = SignedLong;
6169 PtrDiffType = SignedLong;
6170 break;
Brad Smith56495d52015-08-13 22:00:53 +00006171 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006172 }
6173
Craig Topper3164f332014-03-11 03:39:26 +00006174 void getTargetDefines(const LangOptions &Opts,
6175 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006176 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006177 switch (getCPUGeneration(CPU)) {
6178 case CG_V8:
6179 Builder.defineMacro("__sparcv8");
6180 if (getTriple().getOS() != llvm::Triple::Solaris)
6181 Builder.defineMacro("__sparcv8__");
6182 break;
6183 case CG_V9:
6184 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006185 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006186 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006187 Builder.defineMacro("__sparc_v9__");
6188 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006189 break;
6190 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006191 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6192 switch (CPU) {
6193 case CK_MYRIAD2_1:
6194 Builder.defineMacro("__myriad2", "1");
6195 Builder.defineMacro("__myriad2__", "1");
6196 break;
6197 case CK_MYRIAD2_2:
6198 Builder.defineMacro("__myriad2", "2");
6199 Builder.defineMacro("__myriad2__", "2");
6200 break;
6201 default:
6202 break;
6203 }
6204 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006205 }
6206};
6207
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006208// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6209class SparcV8elTargetInfo : public SparcV8TargetInfo {
6210 public:
6211 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006212 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006213 BigEndian = false;
6214 }
6215};
6216
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006217// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6218class SparcV9TargetInfo : public SparcTargetInfo {
6219public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006220 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006221 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006222 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006223 // This is an LP64 platform.
6224 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006225
6226 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006227 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006228 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006229 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006230 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006231 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006232
6233 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6234 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6235 LongDoubleWidth = 128;
6236 LongDoubleAlign = 128;
6237 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006238 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006239 }
6240
Craig Topper3164f332014-03-11 03:39:26 +00006241 void getTargetDefines(const LangOptions &Opts,
6242 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006243 SparcTargetInfo::getTargetDefines(Opts, Builder);
6244 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006245 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006246 // Solaris doesn't need these variants, but the BSDs do.
6247 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006248 Builder.defineMacro("__sparc64__");
6249 Builder.defineMacro("__sparc_v9__");
6250 Builder.defineMacro("__sparcv9__");
6251 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006252 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006253
Craig Topper3164f332014-03-11 03:39:26 +00006254 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006255 if (!SparcTargetInfo::setCPU(Name))
6256 return false;
6257 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006258 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006259};
6260
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006261class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006262 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006263 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006264 std::string CPU;
6265 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006266 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006267
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006268public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006269 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006270 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6271 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006272 IntMaxType = SignedLong;
6273 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006274 TLSSupported = true;
6275 IntWidth = IntAlign = 32;
6276 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6277 PointerWidth = PointerAlign = 64;
6278 LongDoubleWidth = 128;
6279 LongDoubleAlign = 64;
6280 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006281 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006282 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006283 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 +00006284 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6285 }
6286 void getTargetDefines(const LangOptions &Opts,
6287 MacroBuilder &Builder) const override {
6288 Builder.defineMacro("__s390__");
6289 Builder.defineMacro("__s390x__");
6290 Builder.defineMacro("__zarch__");
6291 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006292
6293 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6294 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6295 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6296 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6297
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006298 if (HasTransactionalExecution)
6299 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006300 if (Opts.ZVector)
6301 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006302 }
Craig Topper6c03a542015-10-19 04:51:35 +00006303 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6304 return llvm::makeArrayRef(BuiltinInfo,
6305 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006306 }
6307
Craig Topperf054e3a2015-10-19 03:52:27 +00006308 ArrayRef<const char *> getGCCRegNames() const override;
6309 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006310 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006311 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006312 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006313 bool validateAsmConstraint(const char *&Name,
6314 TargetInfo::ConstraintInfo &info) const override;
6315 const char *getClobbers() const override {
6316 // FIXME: Is this really right?
6317 return "";
6318 }
6319 BuiltinVaListKind getBuiltinVaListKind() const override {
6320 return TargetInfo::SystemZBuiltinVaList;
6321 }
6322 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006323 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006324 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6325 .Case("z10", true)
6326 .Case("z196", true)
6327 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006328 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006329 .Default(false);
6330
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006331 return CPUKnown;
6332 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006333 bool
6334 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6335 StringRef CPU,
6336 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006337 if (CPU == "zEC12")
6338 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006339 if (CPU == "z13") {
6340 Features["transactional-execution"] = true;
6341 Features["vector"] = true;
6342 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006343 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006344 }
6345
6346 bool handleTargetFeatures(std::vector<std::string> &Features,
6347 DiagnosticsEngine &Diags) override {
6348 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006349 for (const auto &Feature : Features) {
6350 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006351 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006352 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006353 HasVector = true;
6354 }
6355 // If we use the vector ABI, vector types are 64-bit aligned.
6356 if (HasVector) {
6357 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006358 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6359 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006360 }
6361 return true;
6362 }
6363
6364 bool hasFeature(StringRef Feature) const override {
6365 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006366 .Case("systemz", true)
6367 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006368 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006369 .Default(false);
6370 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006371
6372 StringRef getABI() const override {
6373 if (HasVector)
6374 return "vector";
6375 return "";
6376 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006377
6378 bool useFloat128ManglingForLongDouble() const override {
6379 return true;
6380 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006381};
6382
6383const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6384#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006385 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006386#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006387};
6388
6389const char *const SystemZTargetInfo::GCCRegNames[] = {
6390 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6391 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6392 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6393 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6394};
6395
Craig Topperf054e3a2015-10-19 03:52:27 +00006396ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6397 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006398}
6399
6400bool SystemZTargetInfo::
6401validateAsmConstraint(const char *&Name,
6402 TargetInfo::ConstraintInfo &Info) const {
6403 switch (*Name) {
6404 default:
6405 return false;
6406
6407 case 'a': // Address register
6408 case 'd': // Data register (equivalent to 'r')
6409 case 'f': // Floating-point register
6410 Info.setAllowsRegister();
6411 return true;
6412
6413 case 'I': // Unsigned 8-bit constant
6414 case 'J': // Unsigned 12-bit constant
6415 case 'K': // Signed 16-bit constant
6416 case 'L': // Signed 20-bit displacement (on all targets we support)
6417 case 'M': // 0x7fffffff
6418 return true;
6419
6420 case 'Q': // Memory with base and unsigned 12-bit displacement
6421 case 'R': // Likewise, plus an index
6422 case 'S': // Memory with base and signed 20-bit displacement
6423 case 'T': // Likewise, plus an index
6424 Info.setAllowsMemory();
6425 return true;
6426 }
6427}
Ulrich Weigand47445072013-05-06 16:26:41 +00006428
Eric Christopherc48497a2015-09-18 21:26:24 +00006429class MSP430TargetInfo : public TargetInfo {
6430 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006431
Eric Christopherc48497a2015-09-18 21:26:24 +00006432public:
6433 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6434 BigEndian = false;
6435 TLSSupported = false;
6436 IntWidth = 16;
6437 IntAlign = 16;
6438 LongWidth = 32;
6439 LongLongWidth = 64;
6440 LongAlign = LongLongAlign = 16;
6441 PointerWidth = 16;
6442 PointerAlign = 16;
6443 SuitableAlign = 16;
6444 SizeType = UnsignedInt;
6445 IntMaxType = SignedLongLong;
6446 IntPtrType = SignedInt;
6447 PtrDiffType = SignedInt;
6448 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006449 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006450 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006451 void getTargetDefines(const LangOptions &Opts,
6452 MacroBuilder &Builder) const override {
6453 Builder.defineMacro("MSP430");
6454 Builder.defineMacro("__MSP430__");
6455 // FIXME: defines for different 'flavours' of MCU
6456 }
Craig Topper6c03a542015-10-19 04:51:35 +00006457 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006458 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006459 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006460 }
6461 bool hasFeature(StringRef Feature) const override {
6462 return Feature == "msp430";
6463 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006464 ArrayRef<const char *> getGCCRegNames() const override;
6465 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006466 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006467 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006468 }
6469 bool validateAsmConstraint(const char *&Name,
6470 TargetInfo::ConstraintInfo &info) const override {
6471 // FIXME: implement
6472 switch (*Name) {
6473 case 'K': // the constant 1
6474 case 'L': // constant -1^20 .. 1^19
6475 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006476 return true;
6477 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006478 // No target constraints for now.
6479 return false;
6480 }
6481 const char *getClobbers() const override {
6482 // FIXME: Is this really right?
6483 return "";
6484 }
6485 BuiltinVaListKind getBuiltinVaListKind() const override {
6486 // FIXME: implement
6487 return TargetInfo::CharPtrBuiltinVaList;
6488 }
6489};
6490
6491const char *const MSP430TargetInfo::GCCRegNames[] = {
6492 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6493 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6494
Craig Topperf054e3a2015-10-19 03:52:27 +00006495ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6496 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006497}
6498
6499// LLVM and Clang cannot be used directly to output native binaries for
6500// target, but is used to compile C code to llvm bitcode with correct
6501// type and alignment information.
6502//
6503// TCE uses the llvm bitcode as input and uses it for generating customized
6504// target processor and program binary. TCE co-design environment is
6505// publicly available in http://tce.cs.tut.fi
6506
6507static const unsigned TCEOpenCLAddrSpaceMap[] = {
6508 3, // opencl_global
6509 4, // opencl_local
6510 5, // opencl_constant
6511 // FIXME: generic has to be added to the target
6512 0, // opencl_generic
6513 0, // cuda_device
6514 0, // cuda_constant
6515 0 // cuda_shared
6516};
6517
6518class TCETargetInfo : public TargetInfo {
6519public:
6520 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6521 TLSSupported = false;
6522 IntWidth = 32;
6523 LongWidth = LongLongWidth = 32;
6524 PointerWidth = 32;
6525 IntAlign = 32;
6526 LongAlign = LongLongAlign = 32;
6527 PointerAlign = 32;
6528 SuitableAlign = 32;
6529 SizeType = UnsignedInt;
6530 IntMaxType = SignedLong;
6531 IntPtrType = SignedInt;
6532 PtrDiffType = SignedInt;
6533 FloatWidth = 32;
6534 FloatAlign = 32;
6535 DoubleWidth = 32;
6536 DoubleAlign = 32;
6537 LongDoubleWidth = 32;
6538 LongDoubleAlign = 32;
6539 FloatFormat = &llvm::APFloat::IEEEsingle;
6540 DoubleFormat = &llvm::APFloat::IEEEsingle;
6541 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006542 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6543 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006544 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6545 UseAddrSpaceMapMangling = true;
6546 }
6547
6548 void getTargetDefines(const LangOptions &Opts,
6549 MacroBuilder &Builder) const override {
6550 DefineStd(Builder, "tce", Opts);
6551 Builder.defineMacro("__TCE__");
6552 Builder.defineMacro("__TCE_V1__");
6553 }
6554 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6555
Craig Topper6c03a542015-10-19 04:51:35 +00006556 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006557 const char *getClobbers() const override { return ""; }
6558 BuiltinVaListKind getBuiltinVaListKind() const override {
6559 return TargetInfo::VoidPtrBuiltinVaList;
6560 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006561 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006562 bool validateAsmConstraint(const char *&Name,
6563 TargetInfo::ConstraintInfo &info) const override {
6564 return true;
6565 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006566 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6567 return None;
6568 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006569};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006570
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006571class BPFTargetInfo : public TargetInfo {
6572public:
6573 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6574 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6575 SizeType = UnsignedLong;
6576 PtrDiffType = SignedLong;
6577 IntPtrType = SignedLong;
6578 IntMaxType = SignedLong;
6579 Int64Type = SignedLong;
6580 RegParmMax = 5;
6581 if (Triple.getArch() == llvm::Triple::bpfeb) {
6582 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006583 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006584 } else {
6585 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006586 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006587 }
6588 MaxAtomicPromoteWidth = 64;
6589 MaxAtomicInlineWidth = 64;
6590 TLSSupported = false;
6591 }
6592 void getTargetDefines(const LangOptions &Opts,
6593 MacroBuilder &Builder) const override {
6594 DefineStd(Builder, "bpf", Opts);
6595 Builder.defineMacro("__BPF__");
6596 }
6597 bool hasFeature(StringRef Feature) const override {
6598 return Feature == "bpf";
6599 }
6600
Craig Topper6c03a542015-10-19 04:51:35 +00006601 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006602 const char *getClobbers() const override {
6603 return "";
6604 }
6605 BuiltinVaListKind getBuiltinVaListKind() const override {
6606 return TargetInfo::VoidPtrBuiltinVaList;
6607 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006608 ArrayRef<const char *> getGCCRegNames() const override {
6609 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006610 }
6611 bool validateAsmConstraint(const char *&Name,
6612 TargetInfo::ConstraintInfo &info) const override {
6613 return true;
6614 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006615 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6616 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006617 }
6618};
6619
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006620class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006621 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006622
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006623 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006624 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006625 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006626 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006627 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006628 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006629 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006630 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006631 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006632 enum DspRevEnum {
6633 NoDSP, DSP1, DSP2
6634 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006635 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006636
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006637protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006638 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006639 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006640
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006641public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006642 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6643 const std::string &CPUStr)
6644 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006645 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006646 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6647 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6648 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006649
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006650 bool isNaN2008Default() const {
6651 return CPU == "mips32r6" || CPU == "mips64r6";
6652 }
6653
6654 bool isFP64Default() const {
6655 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6656 }
6657
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006658 bool isNan2008() const override {
6659 return IsNan2008;
6660 }
6661
Alp Toker4925ba72014-06-07 23:30:42 +00006662 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006663 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006664 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6665 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006666 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006667 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006668 .Case("mips1", IsMips32)
6669 .Case("mips2", IsMips32)
6670 .Case("mips3", true)
6671 .Case("mips4", true)
6672 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006673 .Case("mips32", IsMips32)
6674 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006675 .Case("mips32r3", IsMips32)
6676 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006677 .Case("mips32r6", IsMips32)
6678 .Case("mips64", true)
6679 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006680 .Case("mips64r3", true)
6681 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006682 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006683 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006684 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006685 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006686 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006687 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006688 bool
6689 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6690 StringRef CPU,
6691 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006692 if (CPU.empty())
6693 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006694 if (CPU == "octeon")
6695 Features["mips64r2"] = Features["cnmips"] = true;
6696 else
6697 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006698 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006699 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006700
Craig Topper3164f332014-03-11 03:39:26 +00006701 void getTargetDefines(const LangOptions &Opts,
6702 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006703 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006704 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006705 if (Opts.GNUMode)
6706 Builder.defineMacro("mips");
6707
Simon Atanasyan683535b2012-08-29 19:14:58 +00006708 Builder.defineMacro("__REGISTER_PREFIX__", "");
6709
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006710 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006711 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006712 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006713 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006714 case SoftFloat:
6715 Builder.defineMacro("__mips_soft_float", Twine(1));
6716 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006717 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006718
Simon Atanasyan16071912013-04-14 14:07:30 +00006719 if (IsSingleFloat)
6720 Builder.defineMacro("__mips_single_float", Twine(1));
6721
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006722 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6723 Builder.defineMacro("_MIPS_FPSET",
6724 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6725
Simon Atanasyan72244b62012-07-05 16:06:06 +00006726 if (IsMips16)
6727 Builder.defineMacro("__mips16", Twine(1));
6728
Simon Atanasyan60777612013-04-14 14:07:51 +00006729 if (IsMicromips)
6730 Builder.defineMacro("__mips_micromips", Twine(1));
6731
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006732 if (IsNan2008)
6733 Builder.defineMacro("__mips_nan2008", Twine(1));
6734
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006735 switch (DspRev) {
6736 default:
6737 break;
6738 case DSP1:
6739 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6740 Builder.defineMacro("__mips_dsp", Twine(1));
6741 break;
6742 case DSP2:
6743 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6744 Builder.defineMacro("__mips_dspr2", Twine(1));
6745 Builder.defineMacro("__mips_dsp", Twine(1));
6746 break;
6747 }
6748
Jack Carter44ff1e52013-08-12 17:20:29 +00006749 if (HasMSA)
6750 Builder.defineMacro("__mips_msa", Twine(1));
6751
Simon Atanasyan26f19672012-04-05 19:28:31 +00006752 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6753 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6754 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006755
6756 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6757 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006758
6759 // These shouldn't be defined for MIPS-I but there's no need to check
6760 // for that since MIPS-I isn't supported.
6761 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6762 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6763 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006764 }
6765
Craig Topper6c03a542015-10-19 04:51:35 +00006766 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6767 return llvm::makeArrayRef(BuiltinInfo,
6768 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006769 }
Craig Topper3164f332014-03-11 03:39:26 +00006770 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006771 return llvm::StringSwitch<bool>(Feature)
6772 .Case("mips", true)
6773 .Case("fp64", HasFP64)
6774 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006775 }
Craig Topper3164f332014-03-11 03:39:26 +00006776 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006777 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006778 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006779 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006780 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006781 // CPU register names
6782 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006783 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6784 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6785 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006786 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6787 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006788 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6789 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6790 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6791 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006792 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006793 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006794 "$fcc5","$fcc6","$fcc7",
6795 // MSA register names
6796 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6797 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6798 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6799 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6800 // MSA control register names
6801 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6802 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006803 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006804 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006805 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006806 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006807 bool validateAsmConstraint(const char *&Name,
6808 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006809 switch (*Name) {
6810 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006811 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006812 case 'r': // CPU registers.
6813 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006814 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006815 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006816 case 'c': // $25 for indirect jumps
6817 case 'l': // lo register
6818 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006819 Info.setAllowsRegister();
6820 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006821 case 'I': // Signed 16-bit constant
6822 case 'J': // Integer 0
6823 case 'K': // Unsigned 16-bit constant
6824 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6825 case 'M': // Constants not loadable via lui, addiu, or ori
6826 case 'N': // Constant -1 to -65535
6827 case 'O': // A signed 15-bit constant
6828 case 'P': // A constant between 1 go 65535
6829 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006830 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006831 Info.setAllowsMemory();
6832 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006833 case 'Z':
6834 if (Name[1] == 'C') { // An address usable by ll, and sc.
6835 Info.setAllowsMemory();
6836 Name++; // Skip over 'Z'.
6837 return true;
6838 }
6839 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006840 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006841 }
6842
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006843 std::string convertConstraint(const char *&Constraint) const override {
6844 std::string R;
6845 switch (*Constraint) {
6846 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6847 if (Constraint[1] == 'C') {
6848 R = std::string("^") + std::string(Constraint, 2);
6849 Constraint++;
6850 return R;
6851 }
6852 break;
6853 }
6854 return TargetInfo::convertConstraint(Constraint);
6855 }
6856
Craig Topper3164f332014-03-11 03:39:26 +00006857 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006858 // In GCC, $1 is not widely used in generated code (it's used only in a few
6859 // specific situations), so there is no real need for users to add it to
6860 // the clobbers list if they want to use it in their inline assembly code.
6861 //
6862 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6863 // code generation, so using it in inline assembly without adding it to the
6864 // clobbers list can cause conflicts between the inline assembly code and
6865 // the surrounding generated code.
6866 //
6867 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6868 // operands, which will conflict with the ".set at" assembler option (which
6869 // we use only for inline assembly, in order to maintain compatibility with
6870 // GCC) and will also conflict with the user's usage of $1.
6871 //
6872 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6873 // register for generated code is to automatically clobber $1 for all inline
6874 // assembly code.
6875 //
6876 // FIXME: We should automatically clobber $1 only for inline assembly code
6877 // which actually uses it. This would allow LLVM to use $1 for inline
6878 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006879 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006880 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006881
Craig Topper3164f332014-03-11 03:39:26 +00006882 bool handleTargetFeatures(std::vector<std::string> &Features,
6883 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006884 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006885 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006886 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006887 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006888 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006889 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006890 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006891
Eric Christopher610fe112015-08-26 08:21:55 +00006892 for (const auto &Feature : Features) {
6893 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006894 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006895 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006896 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006897 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006898 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006899 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006900 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006901 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006902 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006903 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006904 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006905 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006906 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006907 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006908 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006909 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006910 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006911 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006912 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006913 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006914 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006915 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006916
James Y Knightb214cbc2016-03-04 19:00:41 +00006917 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006918
Rafael Espindolaeb265472013-08-21 21:59:03 +00006919 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006920 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006921
Craig Topper3164f332014-03-11 03:39:26 +00006922 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006923 if (RegNo == 0) return 4;
6924 if (RegNo == 1) return 5;
6925 return -1;
6926 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006927
6928 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006929};
6930
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006931const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006932#define BUILTIN(ID, TYPE, ATTRS) \
6933 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6934#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6935 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006936#include "clang/Basic/BuiltinsMips.def"
6937};
6938
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006939class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006940public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006941 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006942 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006943 SizeType = UnsignedInt;
6944 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006945 Int64Type = SignedLongLong;
6946 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006947 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006948 }
Craig Topper3164f332014-03-11 03:39:26 +00006949 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006950 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006951 ABI = Name;
6952 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006953 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006954 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006955 }
Craig Topper3164f332014-03-11 03:39:26 +00006956 void getTargetDefines(const LangOptions &Opts,
6957 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006958 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006959
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006960 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006961 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6962
6963 const std::string& CPUStr = getCPU();
6964 if (CPUStr == "mips32")
6965 Builder.defineMacro("__mips_isa_rev", "1");
6966 else if (CPUStr == "mips32r2")
6967 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006968 else if (CPUStr == "mips32r3")
6969 Builder.defineMacro("__mips_isa_rev", "3");
6970 else if (CPUStr == "mips32r5")
6971 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006972 else if (CPUStr == "mips32r6")
6973 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006974
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006975 if (ABI == "o32") {
6976 Builder.defineMacro("__mips_o32");
6977 Builder.defineMacro("_ABIO32", "1");
6978 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6979 }
6980 else if (ABI == "eabi")
6981 Builder.defineMacro("__mips_eabi");
6982 else
David Blaikie83d382b2011-09-23 05:06:16 +00006983 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006984 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006985 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006986 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6987 { { "at" }, "$1" },
6988 { { "v0" }, "$2" },
6989 { { "v1" }, "$3" },
6990 { { "a0" }, "$4" },
6991 { { "a1" }, "$5" },
6992 { { "a2" }, "$6" },
6993 { { "a3" }, "$7" },
6994 { { "t0" }, "$8" },
6995 { { "t1" }, "$9" },
6996 { { "t2" }, "$10" },
6997 { { "t3" }, "$11" },
6998 { { "t4" }, "$12" },
6999 { { "t5" }, "$13" },
7000 { { "t6" }, "$14" },
7001 { { "t7" }, "$15" },
7002 { { "s0" }, "$16" },
7003 { { "s1" }, "$17" },
7004 { { "s2" }, "$18" },
7005 { { "s3" }, "$19" },
7006 { { "s4" }, "$20" },
7007 { { "s5" }, "$21" },
7008 { { "s6" }, "$22" },
7009 { { "s7" }, "$23" },
7010 { { "t8" }, "$24" },
7011 { { "t9" }, "$25" },
7012 { { "k0" }, "$26" },
7013 { { "k1" }, "$27" },
7014 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007015 { { "sp","$sp" }, "$29" },
7016 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007017 { { "ra" }, "$31" }
7018 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007019 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007020 }
7021};
7022
7023class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007024 void setDataLayout() override {
7025 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007026 }
7027
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007028public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007029 Mips32EBTargetInfo(const llvm::Triple &Triple)
7030 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007031 }
Craig Topper3164f332014-03-11 03:39:26 +00007032 void getTargetDefines(const LangOptions &Opts,
7033 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007034 DefineStd(Builder, "MIPSEB", Opts);
7035 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007036 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007037 }
7038};
7039
7040class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007041 void setDataLayout() override {
7042 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007043 }
7044
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007045public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007046 Mips32ELTargetInfo(const llvm::Triple &Triple)
7047 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007048 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007049 }
Craig Topper3164f332014-03-11 03:39:26 +00007050 void getTargetDefines(const LangOptions &Opts,
7051 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007052 DefineStd(Builder, "MIPSEL", Opts);
7053 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007054 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007055 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007056};
Akira Hatanakabef17452011-09-20 19:21:49 +00007057
7058class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007059public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007060 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007061 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007062 LongDoubleWidth = LongDoubleAlign = 128;
7063 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007064 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7065 LongDoubleWidth = LongDoubleAlign = 64;
7066 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7067 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007068 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007069 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007070 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007071 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007072
7073 void setN64ABITypes() {
7074 LongWidth = LongAlign = 64;
7075 PointerWidth = PointerAlign = 64;
7076 SizeType = UnsignedLong;
7077 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007078 Int64Type = SignedLong;
7079 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007080 }
7081
7082 void setN32ABITypes() {
7083 LongWidth = LongAlign = 32;
7084 PointerWidth = PointerAlign = 32;
7085 SizeType = UnsignedInt;
7086 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007087 Int64Type = SignedLongLong;
7088 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007089 }
7090
Craig Topper3164f332014-03-11 03:39:26 +00007091 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007092 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007093 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007094 ABI = Name;
7095 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007096 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007097 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007098 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007099 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007100 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007101 }
7102 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007103 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007104
Craig Topper3164f332014-03-11 03:39:26 +00007105 void getTargetDefines(const LangOptions &Opts,
7106 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007107 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007108
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007109 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007110 Builder.defineMacro("__mips64");
7111 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007112 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7113
7114 const std::string& CPUStr = getCPU();
7115 if (CPUStr == "mips64")
7116 Builder.defineMacro("__mips_isa_rev", "1");
7117 else if (CPUStr == "mips64r2")
7118 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007119 else if (CPUStr == "mips64r3")
7120 Builder.defineMacro("__mips_isa_rev", "3");
7121 else if (CPUStr == "mips64r5")
7122 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007123 else if (CPUStr == "mips64r6")
7124 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007125
Akira Hatanakabef17452011-09-20 19:21:49 +00007126 if (ABI == "n32") {
7127 Builder.defineMacro("__mips_n32");
7128 Builder.defineMacro("_ABIN32", "2");
7129 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7130 }
7131 else if (ABI == "n64") {
7132 Builder.defineMacro("__mips_n64");
7133 Builder.defineMacro("_ABI64", "3");
7134 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7135 }
7136 else
David Blaikie83d382b2011-09-23 05:06:16 +00007137 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007138
7139 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007140 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007141 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007142 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7143 { { "at" }, "$1" },
7144 { { "v0" }, "$2" },
7145 { { "v1" }, "$3" },
7146 { { "a0" }, "$4" },
7147 { { "a1" }, "$5" },
7148 { { "a2" }, "$6" },
7149 { { "a3" }, "$7" },
7150 { { "a4" }, "$8" },
7151 { { "a5" }, "$9" },
7152 { { "a6" }, "$10" },
7153 { { "a7" }, "$11" },
7154 { { "t0" }, "$12" },
7155 { { "t1" }, "$13" },
7156 { { "t2" }, "$14" },
7157 { { "t3" }, "$15" },
7158 { { "s0" }, "$16" },
7159 { { "s1" }, "$17" },
7160 { { "s2" }, "$18" },
7161 { { "s3" }, "$19" },
7162 { { "s4" }, "$20" },
7163 { { "s5" }, "$21" },
7164 { { "s6" }, "$22" },
7165 { { "s7" }, "$23" },
7166 { { "t8" }, "$24" },
7167 { { "t9" }, "$25" },
7168 { { "k0" }, "$26" },
7169 { { "k1" }, "$27" },
7170 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007171 { { "sp","$sp" }, "$29" },
7172 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007173 { { "ra" }, "$31" }
7174 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007175 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007176 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007177
7178 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007179};
7180
7181class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007182 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007183 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007184 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 +00007185 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007186 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007187 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007188
Akira Hatanakabef17452011-09-20 19:21:49 +00007189public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007190 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007191 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007192 void getTargetDefines(const LangOptions &Opts,
7193 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007194 DefineStd(Builder, "MIPSEB", Opts);
7195 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007196 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007197 }
7198};
7199
7200class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007201 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007202 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007203 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 +00007204 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007205 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007206 }
7207public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007208 Mips64ELTargetInfo(const llvm::Triple &Triple)
7209 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007210 // Default ABI is n64.
7211 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007212 }
Craig Topper3164f332014-03-11 03:39:26 +00007213 void getTargetDefines(const LangOptions &Opts,
7214 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007215 DefineStd(Builder, "MIPSEL", Opts);
7216 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007217 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007218 }
7219};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007220
Ivan Krasindd7403e2011-08-24 20:22:22 +00007221class PNaClTargetInfo : public TargetInfo {
7222public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007223 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007224 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007225 this->LongAlign = 32;
7226 this->LongWidth = 32;
7227 this->PointerAlign = 32;
7228 this->PointerWidth = 32;
7229 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007230 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007231 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007232 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007233 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007234 this->SizeType = TargetInfo::UnsignedInt;
7235 this->PtrDiffType = TargetInfo::SignedInt;
7236 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007237 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007238 }
7239
Craig Toppere6f17d02014-03-11 04:07:52 +00007240 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007241 Builder.defineMacro("__le32__");
7242 Builder.defineMacro("__pnacl__");
7243 }
Craig Topper3164f332014-03-11 03:39:26 +00007244 void getTargetDefines(const LangOptions &Opts,
7245 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007246 getArchDefines(Opts, Builder);
7247 }
Craig Topper3164f332014-03-11 03:39:26 +00007248 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007249 return Feature == "pnacl";
7250 }
Craig Topper6c03a542015-10-19 04:51:35 +00007251 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007252 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007253 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007254 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007255 ArrayRef<const char *> getGCCRegNames() const override;
7256 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007257 bool validateAsmConstraint(const char *&Name,
7258 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007259 return false;
7260 }
7261
Craig Topper3164f332014-03-11 03:39:26 +00007262 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007263 return "";
7264 }
7265};
7266
Craig Topperf054e3a2015-10-19 03:52:27 +00007267ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7268 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007269}
7270
Craig Topperf054e3a2015-10-19 03:52:27 +00007271ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7272 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007273}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007274
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007275// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7276class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7277public:
7278 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007279 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007280 }
7281
7282 BuiltinVaListKind getBuiltinVaListKind() const override {
7283 return TargetInfo::PNaClABIBuiltinVaList;
7284 }
7285};
7286
JF Bastien643817d2014-09-12 17:52:47 +00007287class Le64TargetInfo : public TargetInfo {
7288 static const Builtin::Info BuiltinInfo[];
7289
7290public:
7291 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7292 BigEndian = false;
7293 NoAsmVariants = true;
7294 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7295 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007296 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007297 }
7298
7299 void getTargetDefines(const LangOptions &Opts,
7300 MacroBuilder &Builder) const override {
7301 DefineStd(Builder, "unix", Opts);
7302 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7303 Builder.defineMacro("__ELF__");
7304 }
Craig Topper6c03a542015-10-19 04:51:35 +00007305 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7306 return llvm::makeArrayRef(BuiltinInfo,
7307 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007308 }
7309 BuiltinVaListKind getBuiltinVaListKind() const override {
7310 return TargetInfo::PNaClABIBuiltinVaList;
7311 }
7312 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007313 ArrayRef<const char *> getGCCRegNames() const override {
7314 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007315 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007316 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7317 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007318 }
7319 bool validateAsmConstraint(const char *&Name,
7320 TargetInfo::ConstraintInfo &Info) const override {
7321 return false;
7322 }
7323
7324 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007325};
Dan Gohmanc2853072015-09-03 22:51:53 +00007326
7327class WebAssemblyTargetInfo : public TargetInfo {
7328 static const Builtin::Info BuiltinInfo[];
7329
7330 enum SIMDEnum {
7331 NoSIMD,
7332 SIMD128,
7333 } SIMDLevel;
7334
7335public:
7336 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7337 : TargetInfo(T), SIMDLevel(NoSIMD) {
7338 BigEndian = false;
7339 NoAsmVariants = true;
7340 SuitableAlign = 128;
7341 LargeArrayMinWidth = 128;
7342 LargeArrayAlign = 128;
7343 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007344 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007345 LongDoubleWidth = LongDoubleAlign = 128;
7346 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007347 }
7348
7349protected:
7350 void getTargetDefines(const LangOptions &Opts,
7351 MacroBuilder &Builder) const override {
7352 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7353 if (SIMDLevel >= SIMD128)
7354 Builder.defineMacro("__wasm_simd128__");
7355 }
7356
7357private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007358 bool
7359 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7360 StringRef CPU,
7361 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007362 if (CPU == "bleeding-edge")
7363 Features["simd128"] = true;
7364 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7365 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007366 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007367 return llvm::StringSwitch<bool>(Feature)
7368 .Case("simd128", SIMDLevel >= SIMD128)
7369 .Default(false);
7370 }
7371 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007372 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007373 for (const auto &Feature : Features) {
7374 if (Feature == "+simd128") {
7375 SIMDLevel = std::max(SIMDLevel, SIMD128);
7376 continue;
7377 }
7378 if (Feature == "-simd128") {
7379 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7380 continue;
7381 }
7382
7383 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7384 << "-target-feature";
7385 return false;
7386 }
7387 return true;
7388 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007389 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007390 return llvm::StringSwitch<bool>(Name)
7391 .Case("mvp", true)
7392 .Case("bleeding-edge", true)
7393 .Case("generic", true)
7394 .Default(false);
7395 }
Craig Topper6c03a542015-10-19 04:51:35 +00007396 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7397 return llvm::makeArrayRef(BuiltinInfo,
7398 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007399 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007400 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007401 return VoidPtrBuiltinVaList;
7402 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007403 ArrayRef<const char *> getGCCRegNames() const final {
7404 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007405 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007406 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7407 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007408 }
7409 bool
7410 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007411 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007412 return false;
7413 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007414 const char *getClobbers() const final { return ""; }
7415 bool isCLZForZeroUndef() const final { return false; }
7416 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007417 IntType getIntTypeByWidth(unsigned BitWidth,
7418 bool IsSigned) const final {
7419 // WebAssembly prefers long long for explicitly 64-bit integers.
7420 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7421 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7422 }
7423 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7424 bool IsSigned) const final {
7425 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7426 return BitWidth == 64
7427 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7428 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7429 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007430};
7431
7432const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7433#define BUILTIN(ID, TYPE, ATTRS) \
7434 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7435#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7436 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7437#include "clang/Basic/BuiltinsWebAssembly.def"
7438};
7439
7440class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7441public:
7442 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7443 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007444 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007445 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007446 }
7447
7448protected:
7449 void getTargetDefines(const LangOptions &Opts,
7450 MacroBuilder &Builder) const override {
7451 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7452 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7453 }
7454};
7455
7456class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7457public:
7458 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7459 : WebAssemblyTargetInfo(T) {
7460 LongAlign = LongWidth = 64;
7461 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007462 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007463 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007464 }
7465
7466protected:
7467 void getTargetDefines(const LangOptions &Opts,
7468 MacroBuilder &Builder) const override {
7469 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7470 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7471 }
7472};
7473
JF Bastien643817d2014-09-12 17:52:47 +00007474const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7475#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007476 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007477#include "clang/Basic/BuiltinsLe64.def"
7478};
7479
Eric Christopherc48497a2015-09-18 21:26:24 +00007480static const unsigned SPIRAddrSpaceMap[] = {
7481 1, // opencl_global
7482 3, // opencl_local
7483 2, // opencl_constant
7484 4, // opencl_generic
7485 0, // cuda_device
7486 0, // cuda_constant
7487 0 // cuda_shared
7488};
7489class SPIRTargetInfo : public TargetInfo {
7490public:
7491 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7492 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7493 "SPIR target must use unknown OS");
7494 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7495 "SPIR target must use unknown environment type");
7496 BigEndian = false;
7497 TLSSupported = false;
7498 LongWidth = LongAlign = 64;
7499 AddrSpaceMap = &SPIRAddrSpaceMap;
7500 UseAddrSpaceMapMangling = true;
7501 // Define available target features
7502 // These must be defined in sorted order!
7503 NoAsmVariants = true;
7504 }
7505 void getTargetDefines(const LangOptions &Opts,
7506 MacroBuilder &Builder) const override {
7507 DefineStd(Builder, "SPIR", Opts);
7508 }
7509 bool hasFeature(StringRef Feature) const override {
7510 return Feature == "spir";
7511 }
Craig Topper3164f332014-03-11 03:39:26 +00007512
Craig Topper6c03a542015-10-19 04:51:35 +00007513 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007514 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007515 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007516 bool validateAsmConstraint(const char *&Name,
7517 TargetInfo::ConstraintInfo &info) const override {
7518 return true;
7519 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007520 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7521 return None;
7522 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007523 BuiltinVaListKind getBuiltinVaListKind() const override {
7524 return TargetInfo::VoidPtrBuiltinVaList;
7525 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007526
Eric Christopherc48497a2015-09-18 21:26:24 +00007527 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7528 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7529 : CCCR_Warning;
7530 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007531
Eric Christopherc48497a2015-09-18 21:26:24 +00007532 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7533 return CC_SpirFunction;
7534 }
7535};
Guy Benyeib798fc92012-12-11 21:38:14 +00007536
Eric Christopherc48497a2015-09-18 21:26:24 +00007537class SPIR32TargetInfo : public SPIRTargetInfo {
7538public:
7539 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7540 PointerWidth = PointerAlign = 32;
7541 SizeType = TargetInfo::UnsignedInt;
7542 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007543 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7544 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007545 }
7546 void getTargetDefines(const LangOptions &Opts,
7547 MacroBuilder &Builder) const override {
7548 DefineStd(Builder, "SPIR32", Opts);
7549 }
7550};
Guy Benyeib798fc92012-12-11 21:38:14 +00007551
Eric Christopherc48497a2015-09-18 21:26:24 +00007552class SPIR64TargetInfo : public SPIRTargetInfo {
7553public:
7554 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7555 PointerWidth = PointerAlign = 64;
7556 SizeType = TargetInfo::UnsignedLong;
7557 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007558 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7559 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007560 }
7561 void getTargetDefines(const LangOptions &Opts,
7562 MacroBuilder &Builder) const override {
7563 DefineStd(Builder, "SPIR64", Opts);
7564 }
7565};
Guy Benyeib798fc92012-12-11 21:38:14 +00007566
Robert Lytton0e076492013-08-13 09:43:10 +00007567class XCoreTargetInfo : public TargetInfo {
7568 static const Builtin::Info BuiltinInfo[];
7569public:
7570 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7571 BigEndian = false;
7572 NoAsmVariants = true;
7573 LongLongAlign = 32;
7574 SuitableAlign = 32;
7575 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007576 SizeType = UnsignedInt;
7577 PtrDiffType = SignedInt;
7578 IntPtrType = SignedInt;
7579 WCharType = UnsignedChar;
7580 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007581 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007582 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7583 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007584 }
Craig Topper3164f332014-03-11 03:39:26 +00007585 void getTargetDefines(const LangOptions &Opts,
7586 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007587 Builder.defineMacro("__XS1B__");
7588 }
Craig Topper6c03a542015-10-19 04:51:35 +00007589 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7590 return llvm::makeArrayRef(BuiltinInfo,
7591 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007592 }
Craig Topper3164f332014-03-11 03:39:26 +00007593 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007594 return TargetInfo::VoidPtrBuiltinVaList;
7595 }
Craig Topper3164f332014-03-11 03:39:26 +00007596 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007597 return "";
7598 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007599 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007600 static const char * const GCCRegNames[] = {
7601 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7602 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7603 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007604 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007605 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007606 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7607 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007608 }
Craig Topper3164f332014-03-11 03:39:26 +00007609 bool validateAsmConstraint(const char *&Name,
7610 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007611 return false;
7612 }
Craig Topper3164f332014-03-11 03:39:26 +00007613 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007614 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7615 return (RegNo < 2)? RegNo : -1;
7616 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007617 bool allowsLargerPreferedTypeAlignment() const override {
7618 return false;
7619 }
Robert Lytton0e076492013-08-13 09:43:10 +00007620};
7621
7622const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007623#define BUILTIN(ID, TYPE, ATTRS) \
7624 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7625#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7626 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007627#include "clang/Basic/BuiltinsXCore.def"
7628};
Robert Lytton0e076492013-08-13 09:43:10 +00007629
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007630// x86_32 Android target
7631class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7632public:
7633 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7634 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7635 SuitableAlign = 32;
7636 LongDoubleWidth = 64;
7637 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7638 }
7639};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007640
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007641// x86_64 Android target
7642class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7643public:
7644 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7645 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7646 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7647 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007648
7649 bool useFloat128ManglingForLongDouble() const override {
7650 return true;
7651 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007652};
7653} // end anonymous namespace
7654
Chris Lattner5ba61f02006-10-14 07:39:34 +00007655//===----------------------------------------------------------------------===//
7656// Driver code
7657//===----------------------------------------------------------------------===//
7658
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007659static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007660 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007661
Daniel Dunbar52322032009-08-18 05:47:58 +00007662 switch (Triple.getArch()) {
7663 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007664 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007665
Tim Northover2a0783d2014-05-30 14:14:07 +00007666 case llvm::Triple::xcore:
7667 return new XCoreTargetInfo(Triple);
7668
7669 case llvm::Triple::hexagon:
7670 return new HexagonTargetInfo(Triple);
7671
7672 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007673 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007674 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007675
7676 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007677 case llvm::Triple::CloudABI:
7678 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007679 case llvm::Triple::FreeBSD:
7680 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007681 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007682 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007683 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007684 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007685 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007686 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007687 }
7688
Christian Pirker9b019ae2014-02-25 13:51:00 +00007689 case llvm::Triple::aarch64_be:
7690 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007691 case llvm::Triple::FreeBSD:
7692 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007693 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007694 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007695 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007696 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007697 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007698 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007699 }
7700
Daniel Dunbar52322032009-08-18 05:47:58 +00007701 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007702 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007703 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007704 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007705
Daniel Dunbar52322032009-08-18 05:47:58 +00007706 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007707 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007708 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007709 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007710 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007711 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007712 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007713 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007714 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007715 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007716 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007717 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007718 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007719 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007720 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007721 case llvm::Triple::Win32:
7722 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007723 case llvm::Triple::Cygnus:
7724 return new CygwinARMTargetInfo(Triple);
7725 case llvm::Triple::GNU:
7726 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007727 case llvm::Triple::Itanium:
7728 return new ItaniumWindowsARMleTargetInfo(Triple);
7729 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007730 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007731 return new MicrosoftARMleTargetInfo(Triple);
7732 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007733 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007734 return new ARMleTargetInfo(Triple);
7735 }
7736
7737 case llvm::Triple::armeb:
7738 case llvm::Triple::thumbeb:
7739 if (Triple.isOSDarwin())
7740 return new DarwinARMTargetInfo(Triple);
7741
7742 switch (os) {
7743 case llvm::Triple::Linux:
7744 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7745 case llvm::Triple::FreeBSD:
7746 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7747 case llvm::Triple::NetBSD:
7748 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7749 case llvm::Triple::OpenBSD:
7750 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7751 case llvm::Triple::Bitrig:
7752 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7753 case llvm::Triple::RTEMS:
7754 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7755 case llvm::Triple::NaCl:
7756 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7757 default:
7758 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007759 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007760
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007761 case llvm::Triple::bpfeb:
7762 case llvm::Triple::bpfel:
7763 return new BPFTargetInfo(Triple);
7764
Daniel Dunbar52322032009-08-18 05:47:58 +00007765 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007766 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007767
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007768 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007769 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007770 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007771 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007772 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007773 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007774 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007775 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007776 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007777 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007778 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007779 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007780 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007781
7782 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007783 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007784 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007785 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007786 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007787 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007788 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007789 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007790 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007791 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007792 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007793 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007794 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007795 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007796 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007797
Akira Hatanakabef17452011-09-20 19:21:49 +00007798 case llvm::Triple::mips64:
7799 switch (os) {
7800 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007801 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007802 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007803 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007804 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007805 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007806 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007807 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007808 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007809 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007810 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007811 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007812 }
7813
7814 case llvm::Triple::mips64el:
7815 switch (os) {
7816 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007817 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007818 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007819 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007820 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007821 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007822 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007823 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007824 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007825 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007826 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007827 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007828 }
7829
Ivan Krasindd7403e2011-08-24 20:22:22 +00007830 case llvm::Triple::le32:
7831 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007832 case llvm::Triple::NaCl:
7833 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7834 default:
7835 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007836 }
7837
JF Bastien643817d2014-09-12 17:52:47 +00007838 case llvm::Triple::le64:
7839 return new Le64TargetInfo(Triple);
7840
Daniel Dunbar52322032009-08-18 05:47:58 +00007841 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007842 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007843 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007844 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007845 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007846 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007847 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007848 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007849 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007850 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007851 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007852 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007853 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007854 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007855 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007856 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007857 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007858
7859 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007860 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007861 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007862 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007863 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007864 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007865 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007866 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007867 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007868 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007869 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007870 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007871 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007872 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007873 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007874
Bill Schmidt778d3872013-07-26 01:36:11 +00007875 case llvm::Triple::ppc64le:
7876 switch (os) {
7877 case llvm::Triple::Linux:
7878 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007879 case llvm::Triple::NetBSD:
7880 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007881 default:
7882 return new PPC64TargetInfo(Triple);
7883 }
7884
Peter Collingbournec947aae2012-05-20 23:28:41 +00007885 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007886 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007887 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007888 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007889
Tom Stellardd8e38a32015-01-06 20:34:47 +00007890 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007891 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007892 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007893
Daniel Dunbar52322032009-08-18 05:47:58 +00007894 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007895 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007896 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007897 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007898 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007899 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007900 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007901 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007902 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007903 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007904 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007905 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007906 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007907 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007908 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007909
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007910 // The 'sparcel' architecture copies all the above cases except for Solaris.
7911 case llvm::Triple::sparcel:
7912 switch (os) {
7913 case llvm::Triple::Linux:
7914 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7915 case llvm::Triple::NetBSD:
7916 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7917 case llvm::Triple::OpenBSD:
7918 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7919 case llvm::Triple::RTEMS:
7920 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7921 default:
7922 return new SparcV8elTargetInfo(Triple);
7923 }
7924
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007925 case llvm::Triple::sparcv9:
7926 switch (os) {
7927 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007928 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007929 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007930 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007931 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007932 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007933 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007934 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007935 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007936 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007937 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007938 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007939 }
7940
Ulrich Weigand47445072013-05-06 16:26:41 +00007941 case llvm::Triple::systemz:
7942 switch (os) {
7943 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007944 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007945 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007946 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007947 }
7948
Eli Friedmana9c3d712009-08-19 20:47:07 +00007949 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007950 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007951
Daniel Dunbar52322032009-08-18 05:47:58 +00007952 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007953 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007954 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007955
Daniel Dunbar52322032009-08-18 05:47:58 +00007956 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007957 case llvm::Triple::CloudABI:
7958 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007959 case llvm::Triple::Linux: {
7960 switch (Triple.getEnvironment()) {
7961 default:
7962 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7963 case llvm::Triple::Android:
7964 return new AndroidX86_32TargetInfo(Triple);
7965 }
7966 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007967 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007968 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007969 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007970 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007971 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007972 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007973 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007974 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007975 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007976 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007977 case llvm::Triple::KFreeBSD:
7978 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007979 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007980 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007981 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007982 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007983 case llvm::Triple::Win32: {
7984 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007985 case llvm::Triple::Cygnus:
7986 return new CygwinX86_32TargetInfo(Triple);
7987 case llvm::Triple::GNU:
7988 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007989 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007990 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007991 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007992 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007993 }
7994 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007995 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007996 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007997 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007998 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007999 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008000 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008001 case llvm::Triple::ELFIAMCU:
8002 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008003 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008004 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008005 }
8006
8007 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008008 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008009 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008010
Daniel Dunbar52322032009-08-18 05:47:58 +00008011 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008012 case llvm::Triple::CloudABI:
8013 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008014 case llvm::Triple::Linux: {
8015 switch (Triple.getEnvironment()) {
8016 default:
8017 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
8018 case llvm::Triple::Android:
8019 return new AndroidX86_64TargetInfo(Triple);
8020 }
8021 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008022 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008023 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008024 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008025 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008026 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008027 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008028 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008029 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008030 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008031 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008032 case llvm::Triple::KFreeBSD:
8033 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008034 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008035 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008036 case llvm::Triple::Win32: {
8037 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008038 case llvm::Triple::Cygnus:
8039 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008040 case llvm::Triple::GNU:
8041 return new MinGWX86_64TargetInfo(Triple);
8042 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008043 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008044 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008045 }
8046 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008047 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008048 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008049 case llvm::Triple::PS4:
8050 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008051 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008052 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008053 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008054
Douglas Katzman78d7c542015-05-12 21:18:10 +00008055 case llvm::Triple::spir: {
8056 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8057 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8058 return nullptr;
8059 return new SPIR32TargetInfo(Triple);
8060 }
8061 case llvm::Triple::spir64: {
8062 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8063 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8064 return nullptr;
8065 return new SPIR64TargetInfo(Triple);
8066 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008067 case llvm::Triple::wasm32:
8068 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8069 return nullptr;
8070 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
8071 case llvm::Triple::wasm64:
8072 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8073 return nullptr;
8074 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008075 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008076}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008077
8078/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008079/// options.
Alp Toker80758082014-07-06 05:26:44 +00008080TargetInfo *
8081TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
8082 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008083 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008084
8085 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00008086 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008087 if (!Target) {
8088 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008089 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008090 }
Alp Toker80758082014-07-06 05:26:44 +00008091 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008092
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008093 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008094 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8095 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008096 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008097 }
8098
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008099 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008100 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8101 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008102 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008103 }
8104
Rafael Espindolaeb265472013-08-21 21:59:03 +00008105 // Set the fp math unit.
8106 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8107 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008108 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008109 }
8110
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008111 // Compute the default target features, we need the target to handle this
8112 // because features may have dependencies on one another.
8113 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008114 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8115 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008116 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008117
8118 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008119 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008120 for (const auto &F : Features)
8121 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8122
Eric Christopher3ff21b32013-10-16 21:26:26 +00008123 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008124 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008125
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008126 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008127}