blob: b3dc80b5565bc010373c56ce92281d04e5548ae6 [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",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002009 "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
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002588 // Enable X87 for all X86 processors.
2589 setFeatureEnabledImpl(Features, "x87", true);
2590
Eric Christopher2b4a7252015-08-27 00:05:52 +00002591 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002592 case CK_Generic:
2593 case CK_i386:
2594 case CK_i486:
2595 case CK_i586:
2596 case CK_Pentium:
2597 case CK_i686:
2598 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002599 break;
2600 case CK_PentiumMMX:
2601 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002602 case CK_K6:
2603 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002604 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002605 break;
2606 case CK_Pentium3:
2607 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002608 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002609 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002610 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 break;
2612 case CK_PentiumM:
2613 case CK_Pentium4:
2614 case CK_Pentium4M:
2615 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002616 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002617 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002618 break;
2619 case CK_Yonah:
2620 case CK_Prescott:
2621 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002622 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002623 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002624 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002625 break;
2626 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002627 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002628 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002629 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002630 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002631 break;
2632 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002633 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002634 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002635 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002636 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002637 case CK_Cannonlake:
2638 setFeatureEnabledImpl(Features, "avx512ifma", true);
2639 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2640 setFeatureEnabledImpl(Features, "sha", true);
2641 setFeatureEnabledImpl(Features, "umip", true);
2642 // FALLTHROUGH
2643 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002644 setFeatureEnabledImpl(Features, "avx512f", true);
2645 setFeatureEnabledImpl(Features, "avx512cd", true);
2646 setFeatureEnabledImpl(Features, "avx512dq", true);
2647 setFeatureEnabledImpl(Features, "avx512bw", true);
2648 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002649 setFeatureEnabledImpl(Features, "pku", true);
2650 setFeatureEnabledImpl(Features, "pcommit", true);
2651 setFeatureEnabledImpl(Features, "clwb", true);
2652 // FALLTHROUGH
2653 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002654 setFeatureEnabledImpl(Features, "xsavec", true);
2655 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002656 setFeatureEnabledImpl(Features, "mpx", true);
2657 setFeatureEnabledImpl(Features, "sgx", true);
2658 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002659 // FALLTHROUGH
2660 case CK_Broadwell:
2661 setFeatureEnabledImpl(Features, "rdseed", true);
2662 setFeatureEnabledImpl(Features, "adx", true);
2663 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002664 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002665 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002666 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002667 setFeatureEnabledImpl(Features, "bmi", true);
2668 setFeatureEnabledImpl(Features, "bmi2", true);
2669 setFeatureEnabledImpl(Features, "rtm", true);
2670 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002671 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002672 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002673 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002674 setFeatureEnabledImpl(Features, "rdrnd", true);
2675 setFeatureEnabledImpl(Features, "f16c", true);
2676 setFeatureEnabledImpl(Features, "fsgsbase", true);
2677 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002678 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002679 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002680 setFeatureEnabledImpl(Features, "xsave", true);
2681 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002682 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002683 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002684 case CK_Silvermont:
2685 setFeatureEnabledImpl(Features, "aes", true);
2686 setFeatureEnabledImpl(Features, "pclmul", true);
2687 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002688 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002689 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002690 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002691 setFeatureEnabledImpl(Features, "cx16", true);
2692 break;
2693 case CK_KNL:
2694 setFeatureEnabledImpl(Features, "avx512f", true);
2695 setFeatureEnabledImpl(Features, "avx512cd", true);
2696 setFeatureEnabledImpl(Features, "avx512er", true);
2697 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002698 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002699 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002700 setFeatureEnabledImpl(Features, "rdseed", true);
2701 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002702 setFeatureEnabledImpl(Features, "lzcnt", true);
2703 setFeatureEnabledImpl(Features, "bmi", true);
2704 setFeatureEnabledImpl(Features, "bmi2", true);
2705 setFeatureEnabledImpl(Features, "rtm", true);
2706 setFeatureEnabledImpl(Features, "fma", true);
2707 setFeatureEnabledImpl(Features, "rdrnd", true);
2708 setFeatureEnabledImpl(Features, "f16c", true);
2709 setFeatureEnabledImpl(Features, "fsgsbase", true);
2710 setFeatureEnabledImpl(Features, "aes", true);
2711 setFeatureEnabledImpl(Features, "pclmul", true);
2712 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002713 setFeatureEnabledImpl(Features, "xsaveopt", true);
2714 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002715 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002716 break;
2717 case CK_K6_2:
2718 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002719 case CK_WinChip2:
2720 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002721 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002722 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002723 case CK_Athlon:
2724 case CK_AthlonThunderbird:
2725 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002726 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002727 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002728 case CK_Athlon4:
2729 case CK_AthlonXP:
2730 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002731 setFeatureEnabledImpl(Features, "sse", true);
2732 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002733 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002734 break;
2735 case CK_K8:
2736 case CK_Opteron:
2737 case CK_Athlon64:
2738 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002739 setFeatureEnabledImpl(Features, "sse2", true);
2740 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002741 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002742 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002743 case CK_AMDFAM10:
2744 setFeatureEnabledImpl(Features, "sse4a", true);
2745 setFeatureEnabledImpl(Features, "lzcnt", true);
2746 setFeatureEnabledImpl(Features, "popcnt", true);
2747 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002748 case CK_K8SSE3:
2749 case CK_OpteronSSE3:
2750 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002751 setFeatureEnabledImpl(Features, "sse3", true);
2752 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002753 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002754 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002755 case CK_BTVER2:
2756 setFeatureEnabledImpl(Features, "avx", true);
2757 setFeatureEnabledImpl(Features, "aes", true);
2758 setFeatureEnabledImpl(Features, "pclmul", true);
2759 setFeatureEnabledImpl(Features, "bmi", true);
2760 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002761 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002762 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002763 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002764 setFeatureEnabledImpl(Features, "ssse3", true);
2765 setFeatureEnabledImpl(Features, "sse4a", true);
2766 setFeatureEnabledImpl(Features, "lzcnt", true);
2767 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002768 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002769 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002770 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002771 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002772 case CK_BDVER4:
2773 setFeatureEnabledImpl(Features, "avx2", true);
2774 setFeatureEnabledImpl(Features, "bmi2", true);
2775 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002776 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002777 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002778 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002779 // FALLTHROUGH
2780 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002781 setFeatureEnabledImpl(Features, "bmi", true);
2782 setFeatureEnabledImpl(Features, "fma", true);
2783 setFeatureEnabledImpl(Features, "f16c", true);
2784 setFeatureEnabledImpl(Features, "tbm", true);
2785 // FALLTHROUGH
2786 case CK_BDVER1:
2787 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002788 setFeatureEnabledImpl(Features, "xop", true);
2789 setFeatureEnabledImpl(Features, "lzcnt", true);
2790 setFeatureEnabledImpl(Features, "aes", true);
2791 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002792 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002793 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002794 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002795 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002796 break;
Eli Friedman33465822011-07-08 23:31:17 +00002797 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002798 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2799 return false;
2800
2801 // Can't do this earlier because we need to be able to explicitly enable
2802 // or disable these features and the things that they depend upon.
2803
2804 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2805 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002806 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002807 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2808 FeaturesVec.end())
2809 Features["popcnt"] = true;
2810
2811 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2812 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002813 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002814 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2815 FeaturesVec.end())
2816 Features["prfchw"] = true;
2817
Eric Christophera7260af2015-10-08 20:10:18 +00002818 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2819 // then enable MMX.
2820 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002821 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002822 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2823 FeaturesVec.end())
2824 Features["mmx"] = true;
2825
Eric Christopherbbd746d2015-10-08 20:10:14 +00002826 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002827}
2828
Rafael Espindolae62e2792013-08-20 13:44:29 +00002829void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002830 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002831 if (Enabled) {
2832 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002833 case AVX512F:
2834 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002835 case AVX2:
2836 Features["avx2"] = true;
2837 case AVX:
2838 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002839 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002840 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002841 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002843 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002844 case SSSE3:
2845 Features["ssse3"] = true;
2846 case SSE3:
2847 Features["sse3"] = true;
2848 case SSE2:
2849 Features["sse2"] = true;
2850 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002851 Features["sse"] = true;
2852 case NoSSE:
2853 break;
2854 }
2855 return;
2856 }
2857
2858 switch (Level) {
2859 case NoSSE:
2860 case SSE1:
2861 Features["sse"] = false;
2862 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002863 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2864 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002865 case SSE3:
2866 Features["sse3"] = false;
2867 setXOPLevel(Features, NoXOP, false);
2868 case SSSE3:
2869 Features["ssse3"] = false;
2870 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002871 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002872 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002873 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002874 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002875 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2876 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002877 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002878 case AVX2:
2879 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002880 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002881 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002882 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002883 Features["avx512vl"] = Features["avx512vbmi"] =
2884 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002885 }
2886}
2887
2888void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002889 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002890 if (Enabled) {
2891 switch (Level) {
2892 case AMD3DNowAthlon:
2893 Features["3dnowa"] = true;
2894 case AMD3DNow:
2895 Features["3dnow"] = true;
2896 case MMX:
2897 Features["mmx"] = true;
2898 case NoMMX3DNow:
2899 break;
2900 }
2901 return;
2902 }
2903
2904 switch (Level) {
2905 case NoMMX3DNow:
2906 case MMX:
2907 Features["mmx"] = false;
2908 case AMD3DNow:
2909 Features["3dnow"] = false;
2910 case AMD3DNowAthlon:
2911 Features["3dnowa"] = false;
2912 }
2913}
2914
2915void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002916 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002917 if (Enabled) {
2918 switch (Level) {
2919 case XOP:
2920 Features["xop"] = true;
2921 case FMA4:
2922 Features["fma4"] = true;
2923 setSSELevel(Features, AVX, true);
2924 case SSE4A:
2925 Features["sse4a"] = true;
2926 setSSELevel(Features, SSE3, true);
2927 case NoXOP:
2928 break;
2929 }
2930 return;
2931 }
2932
2933 switch (Level) {
2934 case NoXOP:
2935 case SSE4A:
2936 Features["sse4a"] = false;
2937 case FMA4:
2938 Features["fma4"] = false;
2939 case XOP:
2940 Features["xop"] = false;
2941 }
2942}
2943
Craig Topper86d79ef2013-09-17 04:51:29 +00002944void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2945 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002946 // This is a bit of a hack to deal with the sse4 target feature when used
2947 // as part of the target attribute. We handle sse4 correctly everywhere
2948 // else. See below for more information on how we handle the sse4 options.
2949 if (Name != "sse4")
2950 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002951
Craig Topper29561122013-09-19 01:13:07 +00002952 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002953 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002954 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002955 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002956 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002957 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002958 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002959 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002960 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002961 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002962 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002963 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002964 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002965 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002966 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002967 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002968 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002969 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002970 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002971 if (Enabled)
2972 setSSELevel(Features, SSE2, Enabled);
2973 } else if (Name == "pclmul") {
2974 if (Enabled)
2975 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002976 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002977 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002978 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002979 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002980 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002981 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00002982 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
2983 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
2984 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00002985 if (Enabled)
2986 setSSELevel(Features, AVX512F, Enabled);
2987 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002988 if (Enabled)
2989 setSSELevel(Features, AVX, Enabled);
2990 } else if (Name == "fma4") {
2991 setXOPLevel(Features, FMA4, Enabled);
2992 } else if (Name == "xop") {
2993 setXOPLevel(Features, XOP, Enabled);
2994 } else if (Name == "sse4a") {
2995 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002996 } else if (Name == "f16c") {
2997 if (Enabled)
2998 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002999 } else if (Name == "sha") {
3000 if (Enabled)
3001 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003002 } else if (Name == "sse4") {
3003 // We can get here via the __target__ attribute since that's not controlled
3004 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3005 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3006 // disabled.
3007 if (Enabled)
3008 setSSELevel(Features, SSE42, Enabled);
3009 else
3010 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003011 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003012 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003013 Features["xsaveopt"] = false;
3014 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003015 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003016 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003017 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003018}
3019
Eric Christopher3ff21b32013-10-16 21:26:26 +00003020/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003021/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003022bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003023 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003024 for (const auto &Feature : Features) {
3025 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003026 continue;
3027
Eric Christopher610fe112015-08-26 08:21:55 +00003028 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003029 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003030 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003031 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003032 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003033 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003034 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003035 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003036 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003037 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003038 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003039 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003040 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003041 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003042 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003043 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003044 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003045 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003046 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003047 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003048 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003049 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003050 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003051 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003052 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003053 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003054 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003055 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003056 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003057 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003058 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003059 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003060 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003061 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003062 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003063 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003064 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003065 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003066 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003067 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003068 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003069 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003070 } else if (Feature == "+avx512vbmi") {
3071 HasAVX512VBMI = true;
3072 } else if (Feature == "+avx512ifma") {
3073 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003074 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003075 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003076 } else if (Feature == "+mpx") {
3077 HasMPX = true;
3078 } else if (Feature == "+movbe") {
3079 HasMOVBE = true;
3080 } else if (Feature == "+sgx") {
3081 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003082 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003083 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003084 } else if (Feature == "+fxsr") {
3085 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003086 } else if (Feature == "+xsave") {
3087 HasXSAVE = true;
3088 } else if (Feature == "+xsaveopt") {
3089 HasXSAVEOPT = true;
3090 } else if (Feature == "+xsavec") {
3091 HasXSAVEC = true;
3092 } else if (Feature == "+xsaves") {
3093 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003094 } else if (Feature == "+pku") {
3095 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003096 } else if (Feature == "+clflushopt") {
3097 HasCLFLUSHOPT = true;
3098 } else if (Feature == "+pcommit") {
3099 HasPCOMMIT = true;
3100 } else if (Feature == "+clwb") {
3101 HasCLWB = true;
3102 } else if (Feature == "+umip") {
3103 HasUMIP = true;
3104 } else if (Feature == "+prefetchwt1") {
3105 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003106 }
3107
Benjamin Kramer27402c62012-03-05 15:10:44 +00003108 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003109 .Case("+avx512f", AVX512F)
3110 .Case("+avx2", AVX2)
3111 .Case("+avx", AVX)
3112 .Case("+sse4.2", SSE42)
3113 .Case("+sse4.1", SSE41)
3114 .Case("+ssse3", SSSE3)
3115 .Case("+sse3", SSE3)
3116 .Case("+sse2", SSE2)
3117 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003118 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003119 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003120
Eli Friedman33465822011-07-08 23:31:17 +00003121 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003122 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003123 .Case("+3dnowa", AMD3DNowAthlon)
3124 .Case("+3dnow", AMD3DNow)
3125 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003126 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003127 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003128
3129 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003130 .Case("+xop", XOP)
3131 .Case("+fma4", FMA4)
3132 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003133 .Default(NoXOP);
3134 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003135 }
Eli Friedman33465822011-07-08 23:31:17 +00003136
Rafael Espindolaeb265472013-08-21 21:59:03 +00003137 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3138 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003139 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3140 (FPMath == FP_387 && SSELevel >= SSE1)) {
3141 Diags.Report(diag::err_target_unsupported_fpmath) <<
3142 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003143 return false;
3144 }
3145
Alexey Bataev00396512015-07-02 03:40:19 +00003146 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003147 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003148 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003149}
Chris Lattnerecd49032009-03-02 22:27:17 +00003150
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003151/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3152/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003153void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003154 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003155 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003156 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003157 Builder.defineMacro("__amd64__");
3158 Builder.defineMacro("__amd64");
3159 Builder.defineMacro("__x86_64");
3160 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003161 if (getTriple().getArchName() == "x86_64h") {
3162 Builder.defineMacro("__x86_64h");
3163 Builder.defineMacro("__x86_64h__");
3164 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003165 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003166 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003167 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003168
Chris Lattnerecd49032009-03-02 22:27:17 +00003169 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003170 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3171 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003172 switch (CPU) {
3173 case CK_Generic:
3174 break;
3175 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003176 // The rest are coming from the i386 define above.
3177 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003178 break;
3179 case CK_i486:
3180 case CK_WinChipC6:
3181 case CK_WinChip2:
3182 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003183 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003184 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003185 case CK_PentiumMMX:
3186 Builder.defineMacro("__pentium_mmx__");
3187 Builder.defineMacro("__tune_pentium_mmx__");
3188 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003189 case CK_i586:
3190 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003191 defineCPUMacros(Builder, "i586");
3192 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003193 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003194 case CK_Pentium3:
3195 case CK_Pentium3M:
3196 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003197 Builder.defineMacro("__tune_pentium3__");
3198 // Fallthrough
3199 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003200 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003201 Builder.defineMacro("__tune_pentium2__");
3202 // Fallthrough
3203 case CK_PentiumPro:
3204 Builder.defineMacro("__tune_i686__");
3205 Builder.defineMacro("__tune_pentiumpro__");
3206 // Fallthrough
3207 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003208 Builder.defineMacro("__i686");
3209 Builder.defineMacro("__i686__");
3210 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3211 Builder.defineMacro("__pentiumpro");
3212 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003213 break;
3214 case CK_Pentium4:
3215 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003216 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003217 break;
3218 case CK_Yonah:
3219 case CK_Prescott:
3220 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003221 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003222 break;
3223 case CK_Core2:
3224 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003225 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003226 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003227 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003228 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003229 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003230 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003231 defineCPUMacros(Builder, "slm");
3232 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003233 case CK_Nehalem:
3234 case CK_Westmere:
3235 case CK_SandyBridge:
3236 case CK_IvyBridge:
3237 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003238 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003239 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003240 // FIXME: Historically, we defined this legacy name, it would be nice to
3241 // remove it at some point. We've never exposed fine-grained names for
3242 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003243 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003244 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003245 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003246 defineCPUMacros(Builder, "skx");
3247 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003248 case CK_Cannonlake:
3249 break;
Craig Topper449314e2013-08-20 07:09:39 +00003250 case CK_KNL:
3251 defineCPUMacros(Builder, "knl");
3252 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003253 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003254 Builder.defineMacro("__k6_2__");
3255 Builder.defineMacro("__tune_k6_2__");
3256 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003257 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003258 if (CPU != CK_K6_2) { // In case of fallthrough
3259 // FIXME: GCC may be enabling these in cases where some other k6
3260 // architecture is specified but -m3dnow is explicitly provided. The
3261 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003262 Builder.defineMacro("__k6_3__");
3263 Builder.defineMacro("__tune_k6_3__");
3264 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003265 // Fallthrough
3266 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003267 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003268 break;
3269 case CK_Athlon:
3270 case CK_AthlonThunderbird:
3271 case CK_Athlon4:
3272 case CK_AthlonXP:
3273 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003274 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003275 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003276 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003277 Builder.defineMacro("__tune_athlon_sse__");
3278 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003279 break;
3280 case CK_K8:
3281 case CK_K8SSE3:
3282 case CK_x86_64:
3283 case CK_Opteron:
3284 case CK_OpteronSSE3:
3285 case CK_Athlon64:
3286 case CK_Athlon64SSE3:
3287 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003288 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003289 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003290 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003291 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003292 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003293 case CK_BTVER1:
3294 defineCPUMacros(Builder, "btver1");
3295 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003296 case CK_BTVER2:
3297 defineCPUMacros(Builder, "btver2");
3298 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003299 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003300 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003301 break;
3302 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003303 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003304 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003305 case CK_BDVER3:
3306 defineCPUMacros(Builder, "bdver3");
3307 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003308 case CK_BDVER4:
3309 defineCPUMacros(Builder, "bdver4");
3310 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003311 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003312 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003313 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003314 }
Chris Lattner96e43572009-03-02 22:40:39 +00003315
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003316 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003317 Builder.defineMacro("__REGISTER_PREFIX__", "");
3318
Chris Lattner6df41af2009-04-19 17:32:33 +00003319 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3320 // functions in glibc header files that use FP Stack inline asm which the
3321 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003322 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003323
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003324 if (HasAES)
3325 Builder.defineMacro("__AES__");
3326
Craig Topper3f122a72012-05-31 05:18:48 +00003327 if (HasPCLMUL)
3328 Builder.defineMacro("__PCLMUL__");
3329
Craig Topper22967d42011-12-25 05:06:45 +00003330 if (HasLZCNT)
3331 Builder.defineMacro("__LZCNT__");
3332
Benjamin Kramer1e250392012-07-07 09:39:18 +00003333 if (HasRDRND)
3334 Builder.defineMacro("__RDRND__");
3335
Craig Topper8c7f2512014-11-03 06:51:41 +00003336 if (HasFSGSBASE)
3337 Builder.defineMacro("__FSGSBASE__");
3338
Craig Topper22967d42011-12-25 05:06:45 +00003339 if (HasBMI)
3340 Builder.defineMacro("__BMI__");
3341
3342 if (HasBMI2)
3343 Builder.defineMacro("__BMI2__");
3344
Craig Topper1de83482011-12-29 16:10:46 +00003345 if (HasPOPCNT)
3346 Builder.defineMacro("__POPCNT__");
3347
Michael Liao625a8752012-11-10 05:17:46 +00003348 if (HasRTM)
3349 Builder.defineMacro("__RTM__");
3350
Michael Liao74f4eaf2013-03-26 17:52:08 +00003351 if (HasPRFCHW)
3352 Builder.defineMacro("__PRFCHW__");
3353
Michael Liaoffaae352013-03-29 05:17:55 +00003354 if (HasRDSEED)
3355 Builder.defineMacro("__RDSEED__");
3356
Robert Khasanov50e6f582014-09-19 09:53:48 +00003357 if (HasADX)
3358 Builder.defineMacro("__ADX__");
3359
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003360 if (HasTBM)
3361 Builder.defineMacro("__TBM__");
3362
Rafael Espindolae62e2792013-08-20 13:44:29 +00003363 switch (XOPLevel) {
3364 case XOP:
3365 Builder.defineMacro("__XOP__");
3366 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003367 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003368 case SSE4A:
3369 Builder.defineMacro("__SSE4A__");
3370 case NoXOP:
3371 break;
3372 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003373
Craig Topperbba778b2012-06-03 21:46:30 +00003374 if (HasFMA)
3375 Builder.defineMacro("__FMA__");
3376
Manman Rena45358c2012-10-11 00:59:55 +00003377 if (HasF16C)
3378 Builder.defineMacro("__F16C__");
3379
Craig Topper679b53a2013-08-21 05:29:10 +00003380 if (HasAVX512CD)
3381 Builder.defineMacro("__AVX512CD__");
3382 if (HasAVX512ER)
3383 Builder.defineMacro("__AVX512ER__");
3384 if (HasAVX512PF)
3385 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003386 if (HasAVX512DQ)
3387 Builder.defineMacro("__AVX512DQ__");
3388 if (HasAVX512BW)
3389 Builder.defineMacro("__AVX512BW__");
3390 if (HasAVX512VL)
3391 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003392 if (HasAVX512VBMI)
3393 Builder.defineMacro("__AVX512VBMI__");
3394 if (HasAVX512IFMA)
3395 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003396
Ben Langmuir58078d02013-09-19 13:22:04 +00003397 if (HasSHA)
3398 Builder.defineMacro("__SHA__");
3399
Craig Toppere33f51f2015-10-16 06:22:36 +00003400 if (HasFXSR)
3401 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003402 if (HasXSAVE)
3403 Builder.defineMacro("__XSAVE__");
3404 if (HasXSAVEOPT)
3405 Builder.defineMacro("__XSAVEOPT__");
3406 if (HasXSAVEC)
3407 Builder.defineMacro("__XSAVEC__");
3408 if (HasXSAVES)
3409 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003410 if (HasPKU)
3411 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003412 if (HasCX16)
3413 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3414
Chris Lattner96e43572009-03-02 22:40:39 +00003415 // Each case falls through to the previous one here.
3416 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003417 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003418 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003419 case AVX2:
3420 Builder.defineMacro("__AVX2__");
3421 case AVX:
3422 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003423 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003424 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003425 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003426 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003427 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003428 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003429 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003430 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003431 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003432 Builder.defineMacro("__SSE2__");
3433 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003434 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003435 Builder.defineMacro("__SSE__");
3436 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003437 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003438 break;
3439 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003440
Derek Schuffc7dd7222012-10-11 15:52:22 +00003441 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003442 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003443 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003444 case AVX2:
3445 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003446 case SSE42:
3447 case SSE41:
3448 case SSSE3:
3449 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003450 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003451 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003452 break;
3453 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003454 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003455 break;
3456 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003457 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003458 }
3459 }
3460
Anders Carlssone437c682010-01-27 03:47:49 +00003461 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003462 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003463 case AMD3DNowAthlon:
3464 Builder.defineMacro("__3dNOW_A__");
3465 case AMD3DNow:
3466 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003467 case MMX:
3468 Builder.defineMacro("__MMX__");
3469 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003470 break;
3471 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003472
3473 if (CPU >= CK_i486) {
3474 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3475 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3476 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3477 }
3478 if (CPU >= CK_i586)
3479 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003480}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003481
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003482bool X86TargetInfo::hasFeature(StringRef Feature) const {
3483 return llvm::StringSwitch<bool>(Feature)
3484 .Case("aes", HasAES)
3485 .Case("avx", SSELevel >= AVX)
3486 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003487 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003488 .Case("avx512cd", HasAVX512CD)
3489 .Case("avx512er", HasAVX512ER)
3490 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003491 .Case("avx512dq", HasAVX512DQ)
3492 .Case("avx512bw", HasAVX512BW)
3493 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003494 .Case("avx512vbmi", HasAVX512VBMI)
3495 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003496 .Case("bmi", HasBMI)
3497 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003498 .Case("clflushopt", HasCLFLUSHOPT)
3499 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003500 .Case("cx16", HasCX16)
3501 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003502 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003503 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003504 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003505 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003506 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003507 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3508 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3509 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003510 .Case("movbe", HasMOVBE)
3511 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003512 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003513 .Case("pcommit", HasPCOMMIT)
3514 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003515 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003516 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003517 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003518 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003519 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003520 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003521 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003522 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003523 .Case("sse", SSELevel >= SSE1)
3524 .Case("sse2", SSELevel >= SSE2)
3525 .Case("sse3", SSELevel >= SSE3)
3526 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003527 .Case("sse4.1", SSELevel >= SSE41)
3528 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003529 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003530 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003531 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003532 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003533 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3534 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003535 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003536 .Case("xsave", HasXSAVE)
3537 .Case("xsavec", HasXSAVEC)
3538 .Case("xsaves", HasXSAVES)
3539 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003540 .Default(false);
3541}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003542
Eric Christopherd9832702015-06-29 21:00:05 +00003543// We can't use a generic validation scheme for the features accepted here
3544// versus subtarget features accepted in the target attribute because the
3545// bitfield structure that's initialized in the runtime only supports the
3546// below currently rather than the full range of subtarget features. (See
3547// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3548bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3549 return llvm::StringSwitch<bool>(FeatureStr)
3550 .Case("cmov", true)
3551 .Case("mmx", true)
3552 .Case("popcnt", true)
3553 .Case("sse", true)
3554 .Case("sse2", true)
3555 .Case("sse3", true)
3556 .Case("sse4.1", true)
3557 .Case("sse4.2", true)
3558 .Case("avx", true)
3559 .Case("avx2", true)
3560 .Case("sse4a", true)
3561 .Case("fma4", true)
3562 .Case("xop", true)
3563 .Case("fma", true)
3564 .Case("avx512f", true)
3565 .Case("bmi", true)
3566 .Case("bmi2", true)
3567 .Default(false);
3568}
3569
Eli Friedman3fd920a2008-08-20 02:34:37 +00003570bool
Anders Carlsson58436352009-02-28 17:11:49 +00003571X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003572 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003573 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003574 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003575 // Constant constraints.
3576 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3577 // instructions.
3578 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3579 // x86_64 instructions.
3580 case 's':
3581 Info.setRequiresImmediate();
3582 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003583 case 'I':
3584 Info.setRequiresImmediate(0, 31);
3585 return true;
3586 case 'J':
3587 Info.setRequiresImmediate(0, 63);
3588 return true;
3589 case 'K':
3590 Info.setRequiresImmediate(-128, 127);
3591 return true;
3592 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003593 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003594 return true;
3595 case 'M':
3596 Info.setRequiresImmediate(0, 3);
3597 return true;
3598 case 'N':
3599 Info.setRequiresImmediate(0, 255);
3600 return true;
3601 case 'O':
3602 Info.setRequiresImmediate(0, 127);
3603 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003604 // Register constraints.
3605 case 'Y': // 'Y' is the first character for several 2-character constraints.
3606 // Shift the pointer to the second character of the constraint.
3607 Name++;
3608 switch (*Name) {
3609 default:
3610 return false;
3611 case '0': // First SSE register.
3612 case 't': // Any SSE register, when SSE2 is enabled.
3613 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3614 case 'm': // Any MMX register, when inter-unit moves enabled.
3615 Info.setAllowsRegister();
3616 return true;
3617 }
3618 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003619 // Constraint 'f' cannot be used for output operands.
3620 if (Info.ConstraintStr[0] == '=')
3621 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003622 Info.setAllowsRegister();
3623 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003624 case 'a': // eax.
3625 case 'b': // ebx.
3626 case 'c': // ecx.
3627 case 'd': // edx.
3628 case 'S': // esi.
3629 case 'D': // edi.
3630 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003631 case 't': // Top of floating point stack.
3632 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003633 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003634 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003635 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003636 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003637 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3638 case 'l': // "Index" registers: any general register that can be used as an
3639 // index in a base+index memory access.
3640 Info.setAllowsRegister();
3641 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003642 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003643 case 'C': // SSE floating point constant.
3644 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003645 return true;
3646 }
3647}
3648
Akira Hatanaka974131e2014-09-18 18:17:18 +00003649bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3650 unsigned Size) const {
3651 // Strip off constraint modifiers.
3652 while (Constraint[0] == '=' ||
3653 Constraint[0] == '+' ||
3654 Constraint[0] == '&')
3655 Constraint = Constraint.substr(1);
3656
3657 return validateOperandSize(Constraint, Size);
3658}
3659
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003660bool X86TargetInfo::validateInputSize(StringRef Constraint,
3661 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003662 return validateOperandSize(Constraint, Size);
3663}
3664
3665bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3666 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003667 switch (Constraint[0]) {
3668 default: break;
3669 case 'y':
3670 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003671 case 'f':
3672 case 't':
3673 case 'u':
3674 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003675 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003676 if (SSELevel >= AVX512F)
3677 // 512-bit zmm registers can be used if target supports AVX512F.
3678 return Size <= 512U;
3679 else if (SSELevel >= AVX)
3680 // 256-bit ymm registers can be used if target supports AVX.
3681 return Size <= 256U;
3682 return Size <= 128U;
3683 case 'Y':
3684 // 'Y' is the first character for several 2-character constraints.
3685 switch (Constraint[1]) {
3686 default: break;
3687 case 'm':
3688 // 'Ym' is synonymous with 'y'.
3689 return Size <= 64;
3690 case 'i':
3691 case 't':
3692 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3693 if (SSELevel >= AVX512F)
3694 return Size <= 512U;
3695 else if (SSELevel >= AVX)
3696 return Size <= 256U;
3697 return SSELevel >= SSE2 && Size <= 128U;
3698 }
3699
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003700 }
3701
3702 return true;
3703}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003704
Eli Friedman3fd920a2008-08-20 02:34:37 +00003705std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003706X86TargetInfo::convertConstraint(const char *&Constraint) const {
3707 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003708 case 'a': return std::string("{ax}");
3709 case 'b': return std::string("{bx}");
3710 case 'c': return std::string("{cx}");
3711 case 'd': return std::string("{dx}");
3712 case 'S': return std::string("{si}");
3713 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003714 case 'p': // address
3715 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003716 case 't': // top of floating point stack.
3717 return std::string("{st}");
3718 case 'u': // second from top of floating point stack.
3719 return std::string("{st(1)}"); // second from top of floating point stack.
3720 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003721 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003722 }
3723}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003724
Eli Friedman3fd920a2008-08-20 02:34:37 +00003725// X86-32 generic target
3726class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003727public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003728 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003729 DoubleAlign = LongLongAlign = 32;
3730 LongDoubleWidth = 96;
3731 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003732 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003733 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003734 SizeType = UnsignedInt;
3735 PtrDiffType = SignedInt;
3736 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003737 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003738
3739 // Use fpret for all types.
3740 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3741 (1 << TargetInfo::Double) |
3742 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003743
3744 // x86-32 has atomics up to 8 bytes
3745 // FIXME: Check that we actually have cmpxchg8b before setting
3746 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3747 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003748 }
Craig Topper3164f332014-03-11 03:39:26 +00003749 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003750 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003751 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003752
Craig Topper3164f332014-03-11 03:39:26 +00003753 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003754 if (RegNo == 0) return 0;
3755 if (RegNo == 1) return 2;
3756 return -1;
3757 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003758 bool validateOperandSize(StringRef Constraint,
3759 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003760 switch (Constraint[0]) {
3761 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003762 case 'R':
3763 case 'q':
3764 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003765 case 'a':
3766 case 'b':
3767 case 'c':
3768 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003769 case 'S':
3770 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003771 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003772 case 'A':
3773 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003774 }
3775
Akira Hatanaka974131e2014-09-18 18:17:18 +00003776 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003777 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003778};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003779
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003780class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3781public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003782 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3783 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003784
Craig Topper3164f332014-03-11 03:39:26 +00003785 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003786 unsigned Major, Minor, Micro;
3787 getTriple().getOSVersion(Major, Minor, Micro);
3788 // New NetBSD uses the default rounding mode.
3789 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3790 return X86_32TargetInfo::getFloatEvalMethod();
3791 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003792 return 1;
3793 }
3794};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003795
Eli Friedmane3aa4542009-07-05 18:47:56 +00003796class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3797public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003798 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3799 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003800 SizeType = UnsignedLong;
3801 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003802 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003803 }
3804};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003805
Eli Friedman9fa28852012-08-08 23:57:20 +00003806class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3807public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003808 BitrigI386TargetInfo(const llvm::Triple &Triple)
3809 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003810 SizeType = UnsignedLong;
3811 IntPtrType = SignedLong;
3812 PtrDiffType = SignedLong;
3813 }
3814};
Eli Friedman9fa28852012-08-08 23:57:20 +00003815
Torok Edwinb2b37c62009-06-30 17:10:35 +00003816class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003817public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003818 DarwinI386TargetInfo(const llvm::Triple &Triple)
3819 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003820 LongDoubleWidth = 128;
3821 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003822 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003823 MaxVectorAlign = 256;
3824 // The watchOS simulator uses the builtin bool type for Objective-C.
3825 llvm::Triple T = llvm::Triple(Triple);
3826 if (T.isWatchOS())
3827 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003828 SizeType = UnsignedLong;
3829 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003830 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003831 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003832 }
3833
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003834 bool handleTargetFeatures(std::vector<std::string> &Features,
3835 DiagnosticsEngine &Diags) override {
3836 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3837 Diags))
3838 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003839 // We now know the features we have: we can decide how to align vectors.
3840 MaxVectorAlign =
3841 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003842 return true;
3843 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003844};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003845
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003846// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003847class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003848public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003849 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3850 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003851 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003852 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003853 bool IsWinCOFF =
3854 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003855 resetDataLayout(IsWinCOFF
3856 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3857 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003858 }
Craig Topper3164f332014-03-11 03:39:26 +00003859 void getTargetDefines(const LangOptions &Opts,
3860 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003861 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3862 }
3863};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003864
3865// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003866class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003867public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003868 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003869 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003870 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003871 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3872 }
Craig Topper3164f332014-03-11 03:39:26 +00003873 void getTargetDefines(const LangOptions &Opts,
3874 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003875 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3876 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3877 // The value of the following reflects processor type.
3878 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3879 // We lost the original triple, so we use the default.
3880 Builder.defineMacro("_M_IX86", "600");
3881 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003882};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003883
David Majnemerae1ed0e2015-05-28 04:36:18 +00003884static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003885 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3886 // supports __declspec natively under -fms-extensions, but we define a no-op
3887 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003888 if (Opts.MicrosoftExt)
3889 Builder.defineMacro("__declspec", "__declspec");
3890 else
3891 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3892
3893 if (!Opts.MicrosoftExt) {
3894 // Provide macros for all the calling convention keywords. Provide both
3895 // single and double underscore prefixed variants. These are available on
3896 // x64 as well as x86, even though they have no effect.
3897 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3898 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003899 std::string GCCSpelling = "__attribute__((__";
3900 GCCSpelling += CC;
3901 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003902 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3903 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3904 }
3905 }
3906}
3907
David Majnemerae1ed0e2015-05-28 04:36:18 +00003908static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3909 Builder.defineMacro("__MSVCRT__");
3910 Builder.defineMacro("__MINGW32__");
3911 addCygMingDefines(Opts, Builder);
3912}
3913
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003914// x86-32 MinGW target
3915class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3916public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003917 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003918 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003919 void getTargetDefines(const LangOptions &Opts,
3920 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003921 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003922 DefineStd(Builder, "WIN32", Opts);
3923 DefineStd(Builder, "WINNT", Opts);
3924 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003925 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003926 }
3927};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003928
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003929// x86-32 Cygwin target
3930class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3931public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003932 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3933 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003934 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003935 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00003936 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 +00003937 }
Craig Topper3164f332014-03-11 03:39:26 +00003938 void getTargetDefines(const LangOptions &Opts,
3939 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003940 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003941 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003942 Builder.defineMacro("__CYGWIN__");
3943 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003944 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003945 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003946 if (Opts.CPlusPlus)
3947 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003948 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003949};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003950
Chris Lattnerb986aba2010-04-11 19:29:39 +00003951// x86-32 Haiku target
3952class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3953public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003954 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003955 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003956 IntPtrType = SignedLong;
3957 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003958 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003959 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003960 }
Craig Topper3164f332014-03-11 03:39:26 +00003961 void getTargetDefines(const LangOptions &Opts,
3962 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003963 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3964 Builder.defineMacro("__INTEL__");
3965 Builder.defineMacro("__HAIKU__");
3966 }
3967};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003968
Alexey Bataevc99b0492015-11-25 09:24:26 +00003969// X86-32 MCU target
3970class MCUX86_32TargetInfo : public X86_32TargetInfo {
3971public:
3972 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3973 LongDoubleWidth = 64;
3974 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00003975 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 +00003976 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003977 }
3978
3979 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3980 // On MCU we support only C calling convention.
3981 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3982 }
3983
3984 void getTargetDefines(const LangOptions &Opts,
3985 MacroBuilder &Builder) const override {
3986 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3987 Builder.defineMacro("__iamcu");
3988 Builder.defineMacro("__iamcu__");
3989 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00003990
3991 bool allowsLargerPreferedTypeAlignment() const override {
3992 return false;
3993 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00003994};
3995
Douglas Gregor9fabd852011-07-01 22:41:14 +00003996// RTEMS Target
3997template<typename Target>
3998class RTEMSTargetInfo : public OSTargetInfo<Target> {
3999protected:
Craig Topper3164f332014-03-11 03:39:26 +00004000 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4001 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004002 // RTEMS defines; list based off of gcc output
4003
Douglas Gregor9fabd852011-07-01 22:41:14 +00004004 Builder.defineMacro("__rtems__");
4005 Builder.defineMacro("__ELF__");
4006 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004007
Douglas Gregor9fabd852011-07-01 22:41:14 +00004008public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004009 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004010 switch (Triple.getArch()) {
4011 default:
4012 case llvm::Triple::x86:
4013 // this->MCountName = ".mcount";
4014 break;
4015 case llvm::Triple::mips:
4016 case llvm::Triple::mipsel:
4017 case llvm::Triple::ppc:
4018 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004019 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004020 // this->MCountName = "_mcount";
4021 break;
4022 case llvm::Triple::arm:
4023 // this->MCountName = "__mcount";
4024 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004025 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004026 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004027};
4028
Douglas Gregor9fabd852011-07-01 22:41:14 +00004029// x86-32 RTEMS target
4030class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4031public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004032 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004033 SizeType = UnsignedLong;
4034 IntPtrType = SignedLong;
4035 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004036 }
Craig Topper3164f332014-03-11 03:39:26 +00004037 void getTargetDefines(const LangOptions &Opts,
4038 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004039 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4040 Builder.defineMacro("__INTEL__");
4041 Builder.defineMacro("__rtems__");
4042 }
4043};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004044
Eli Friedman3fd920a2008-08-20 02:34:37 +00004045// x86-64 generic target
4046class X86_64TargetInfo : public X86TargetInfo {
4047public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004048 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00004049 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004050 bool IsWinCOFF =
4051 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004052 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004053 LongDoubleWidth = 128;
4054 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004055 LargeArrayMinWidth = 128;
4056 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004057 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004058 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4059 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4060 IntPtrType = IsX32 ? SignedInt : SignedLong;
4061 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004062 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004063 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004064
Eric Christopher917e9522014-11-18 22:36:15 +00004065 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004066 resetDataLayout(IsX32
4067 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4068 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4069 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004070
4071 // Use fpret only for long double.
4072 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004073
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004074 // Use fp2ret for _Complex long double.
4075 ComplexLongDoubleUsesFP2Ret = true;
4076
Charles Davisc7d5c942015-09-17 20:55:33 +00004077 // Make __builtin_ms_va_list available.
4078 HasBuiltinMSVaList = true;
4079
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004080 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004081 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004082 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004083 }
Craig Topper3164f332014-03-11 03:39:26 +00004084 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004085 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004086 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004087
Craig Topper3164f332014-03-11 03:39:26 +00004088 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004089 if (RegNo == 0) return 0;
4090 if (RegNo == 1) return 1;
4091 return -1;
4092 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004093
Craig Topper3164f332014-03-11 03:39:26 +00004094 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004095 switch (CC) {
4096 case CC_C:
4097 case CC_Swift:
4098 case CC_X86VectorCall:
4099 case CC_IntelOclBicc:
4100 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004101 case CC_PreserveMost:
4102 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004103 return CCCR_OK;
4104 default:
4105 return CCCR_Warning;
4106 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004107 }
4108
Craig Topper3164f332014-03-11 03:39:26 +00004109 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004110 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004111 }
4112
Pavel Chupinfd223e12014-08-04 12:39:43 +00004113 // for x32 we need it here explicitly
4114 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004115 unsigned getUnwindWordWidth() const override { return 64; }
4116 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004117
4118 bool validateGlobalRegisterVariable(StringRef RegName,
4119 unsigned RegSize,
4120 bool &HasSizeMismatch) const override {
4121 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4122 // handle.
4123 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4124 // Check that the register size is 64-bit.
4125 HasSizeMismatch = RegSize != 64;
4126 return true;
4127 }
4128
4129 // Check if the register is a 32-bit register the backend can handle.
4130 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4131 HasSizeMismatch);
4132 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004133};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004134
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004135// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004136class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004137public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004138 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4139 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004140 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004141 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004142 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004143 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004144 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004145 SizeType = UnsignedLongLong;
4146 PtrDiffType = SignedLongLong;
4147 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004148 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004149
Craig Topper3164f332014-03-11 03:39:26 +00004150 void getTargetDefines(const LangOptions &Opts,
4151 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004152 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004153 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004154 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004155
Craig Topper3164f332014-03-11 03:39:26 +00004156 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004157 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004158 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004159
Craig Topper3164f332014-03-11 03:39:26 +00004160 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004161 switch (CC) {
4162 case CC_X86StdCall:
4163 case CC_X86ThisCall:
4164 case CC_X86FastCall:
4165 return CCCR_Ignore;
4166 case CC_C:
4167 case CC_X86VectorCall:
4168 case CC_IntelOclBicc:
4169 case CC_X86_64SysV:
4170 return CCCR_OK;
4171 default:
4172 return CCCR_Warning;
4173 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004174 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004175};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004176
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004177// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004178class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004179public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004180 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004181 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004182 LongDoubleWidth = LongDoubleAlign = 64;
4183 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004184 }
Craig Topper3164f332014-03-11 03:39:26 +00004185 void getTargetDefines(const LangOptions &Opts,
4186 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004187 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4188 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004189 Builder.defineMacro("_M_X64", "100");
4190 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004191 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004192};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004193
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004194// x86-64 MinGW target
4195class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4196public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004197 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004198 : WindowsX86_64TargetInfo(Triple) {
4199 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4200 // with x86 FP ops. Weird.
4201 LongDoubleWidth = LongDoubleAlign = 128;
4202 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4203 }
4204
Craig Topper3164f332014-03-11 03:39:26 +00004205 void getTargetDefines(const LangOptions &Opts,
4206 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004207 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004208 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004209 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004210 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004211
4212 // GCC defines this macro when it is using __gxx_personality_seh0.
4213 if (!Opts.SjLjExceptions)
4214 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004215 }
4216};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004217
Yaron Kerend030d112015-07-22 17:38:19 +00004218// x86-64 Cygwin target
4219class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4220public:
4221 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4222 : X86_64TargetInfo(Triple) {
4223 TLSSupported = false;
4224 WCharType = UnsignedShort;
4225 }
4226 void getTargetDefines(const LangOptions &Opts,
4227 MacroBuilder &Builder) const override {
4228 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4229 Builder.defineMacro("__x86_64__");
4230 Builder.defineMacro("__CYGWIN__");
4231 Builder.defineMacro("__CYGWIN64__");
4232 addCygMingDefines(Opts, Builder);
4233 DefineStd(Builder, "unix", Opts);
4234 if (Opts.CPlusPlus)
4235 Builder.defineMacro("_GNU_SOURCE");
4236
4237 // GCC defines this macro when it is using __gxx_personality_seh0.
4238 if (!Opts.SjLjExceptions)
4239 Builder.defineMacro("__SEH__");
4240 }
4241};
4242
Eli Friedman2857ccb2009-07-01 03:36:11 +00004243class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4244public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004245 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4246 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004247 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004248 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4249 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004250 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004251 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004252 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004253 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004254
4255 bool handleTargetFeatures(std::vector<std::string> &Features,
4256 DiagnosticsEngine &Diags) override {
4257 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4258 Diags))
4259 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004260 // We now know the features we have: we can decide how to align vectors.
4261 MaxVectorAlign =
4262 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004263 return true;
4264 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004265};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004266
Eli Friedman245f2292009-07-05 22:31:18 +00004267class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4268public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004269 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4270 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004271 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004272 Int64Type = SignedLongLong;
4273 }
4274};
Eli Friedman245f2292009-07-05 22:31:18 +00004275
Eli Friedman9fa28852012-08-08 23:57:20 +00004276class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4277public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004278 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4279 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4280 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004281 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004282 }
4283};
Tim Northover9bb857a2013-01-31 12:13:10 +00004284
Eli Friedmanf05b7722008-08-20 07:44:10 +00004285class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004286 // Possible FPU choices.
4287 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004288 VFP2FPU = (1 << 0),
4289 VFP3FPU = (1 << 1),
4290 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004291 NeonFPU = (1 << 3),
4292 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004293 };
4294
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004295 // Possible HWDiv features.
4296 enum HWDivMode {
4297 HWDivThumb = (1 << 0),
4298 HWDivARM = (1 << 1)
4299 };
4300
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004301 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004302 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004303 }
4304
4305 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4306 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004307
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004308 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004309
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004310 StringRef CPUProfile;
4311 StringRef CPUAttr;
4312
Rafael Espindolaeb265472013-08-21 21:59:03 +00004313 enum {
4314 FP_Default,
4315 FP_VFP,
4316 FP_Neon
4317 } FPMath;
4318
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004319 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004320 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004321 unsigned ArchProfile;
4322 unsigned ArchVersion;
4323
Bernard Ogdenda13af32013-10-24 18:32:51 +00004324 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004325
Logan Chien57086ce2012-10-10 06:56:20 +00004326 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004327 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004328
4329 // Initialized via features.
4330 unsigned SoftFloat : 1;
4331 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004332
Bernard Ogden18b57012013-10-29 09:47:51 +00004333 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004334 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004335 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004336 unsigned Unaligned : 1;
4337
4338 enum {
4339 LDREX_B = (1 << 0), /// byte (8-bit)
4340 LDREX_H = (1 << 1), /// half (16-bit)
4341 LDREX_W = (1 << 2), /// word (32-bit)
4342 LDREX_D = (1 << 3), /// double (64-bit)
4343 };
4344
4345 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004346
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004347 // ACLE 6.5.1 Hardware floating point
4348 enum {
4349 HW_FP_HP = (1 << 1), /// half (16-bit)
4350 HW_FP_SP = (1 << 2), /// single (32-bit)
4351 HW_FP_DP = (1 << 3), /// double (64-bit)
4352 };
4353 uint32_t HW_FP;
4354
Chris Lattner5cc15e02010-03-03 19:03:45 +00004355 static const Builtin::Info BuiltinInfo[];
4356
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004357 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004358 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004359
4360 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004361 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004362
Renato Golin9ba39232015-02-27 16:35:48 +00004363 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4364 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4365 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004366 SizeType = UnsignedLong;
4367 else
4368 SizeType = UnsignedInt;
4369
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004370 switch (T.getOS()) {
4371 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004372 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004373 break;
4374 case llvm::Triple::Win32:
4375 WCharType = UnsignedShort;
4376 break;
4377 case llvm::Triple::Linux:
4378 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004379 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4380 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004381 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004382 }
4383
4384 UseBitFieldTypeAlignment = true;
4385
4386 ZeroLengthBitfieldBoundary = 0;
4387
Tim Northover147cd2f2014-10-14 22:12:21 +00004388 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4389 // so set preferred for small types to 32.
4390 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004391 resetDataLayout(BigEndian
4392 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4393 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004394 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004395 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004396 resetDataLayout("e"
4397 "-m:w"
4398 "-p:32:32"
4399 "-i64:64"
4400 "-v128:64:128"
4401 "-a:0:32"
4402 "-n32"
4403 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004404 } else if (T.isOSNaCl()) {
4405 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004406 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004407 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004408 resetDataLayout(BigEndian
4409 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4410 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004411 }
4412
4413 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004414 }
4415
Tim Northover5627d392015-10-30 16:30:45 +00004416 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004417 const llvm::Triple &T = getTriple();
4418
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004419 IsAAPCS = false;
4420
Tim Northover5627d392015-10-30 16:30:45 +00004421 if (IsAAPCS16)
4422 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4423 else
4424 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004425
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004426 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004427 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004428 SizeType = UnsignedInt;
4429 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004430 SizeType = UnsignedLong;
4431
4432 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4433 WCharType = SignedInt;
4434
4435 // Do not respect the alignment of bit-field types when laying out
4436 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4437 UseBitFieldTypeAlignment = false;
4438
4439 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4440 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4441 /// gcc.
4442 ZeroLengthBitfieldBoundary = 32;
4443
Tim Northover5627d392015-10-30 16:30:45 +00004444 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4445 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004446 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004447 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004448 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004449 BigEndian
4450 ? "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 +00004451 : "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 +00004452 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004453 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004454 BigEndian
4455 ? "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 +00004456 : "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 +00004457
4458 // FIXME: Override "preferred align" for double and long long.
4459 }
4460
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004461 void setArchInfo() {
4462 StringRef ArchName = getTriple().getArchName();
4463
Renato Goline84b0002015-10-08 16:43:26 +00004464 ArchISA = llvm::ARM::parseArchISA(ArchName);
4465 CPU = llvm::ARM::getDefaultCPU(ArchName);
4466 unsigned AK = llvm::ARM::parseArch(ArchName);
4467 if (AK != llvm::ARM::AK_INVALID)
4468 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004469 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004470 }
4471
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004472 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004473 StringRef SubArch;
4474
4475 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004476 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004477 SubArch = llvm::ARM::getSubArch(ArchKind);
4478 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4479 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004480
4481 // cache CPU related strings
4482 CPUAttr = getCPUAttr();
4483 CPUProfile = getCPUProfile();
4484 }
4485
4486 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004487 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004488 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004489 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004490 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4491 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004492 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004493 if (ArchProfile == llvm::ARM::PK_M) {
4494 MaxAtomicPromoteWidth = 32;
4495 if (ShouldUseInlineAtomic)
4496 MaxAtomicInlineWidth = 32;
4497 }
4498 else {
4499 MaxAtomicPromoteWidth = 64;
4500 if (ShouldUseInlineAtomic)
4501 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004502 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004503 }
4504
4505 bool isThumb() const {
4506 return (ArchISA == llvm::ARM::IK_THUMB);
4507 }
4508
4509 bool supportsThumb() const {
4510 return CPUAttr.count('T') || ArchVersion >= 6;
4511 }
4512
4513 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004514 return CPUAttr.equals("6T2") ||
4515 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004516 }
4517
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004518 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004519 // For most sub-arches, the build attribute CPU name is enough.
4520 // For Cortex variants, it's slightly different.
4521 switch(ArchKind) {
4522 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004523 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004524 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004525 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004526 case llvm::ARM::AK_ARMV7S:
4527 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004528 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004529 return "7A";
4530 case llvm::ARM::AK_ARMV7R:
4531 return "7R";
4532 case llvm::ARM::AK_ARMV7M:
4533 return "7M";
4534 case llvm::ARM::AK_ARMV7EM:
4535 return "7EM";
4536 case llvm::ARM::AK_ARMV8A:
4537 return "8A";
4538 case llvm::ARM::AK_ARMV8_1A:
4539 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004540 case llvm::ARM::AK_ARMV8_2A:
4541 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004542 case llvm::ARM::AK_ARMV8MBaseline:
4543 return "8M_BASE";
4544 case llvm::ARM::AK_ARMV8MMainline:
4545 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004546 }
4547 }
4548
4549 StringRef getCPUProfile() const {
4550 switch(ArchProfile) {
4551 case llvm::ARM::PK_A:
4552 return "A";
4553 case llvm::ARM::PK_R:
4554 return "R";
4555 case llvm::ARM::PK_M:
4556 return "M";
4557 default:
4558 return "";
4559 }
4560 }
4561
Chris Lattner17df24e2008-04-21 18:56:49 +00004562public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004563 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004564 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004565 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004566 BigEndian = IsBigEndian;
4567
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004568 switch (getTriple().getOS()) {
4569 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004570 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004571 break;
4572 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004573 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004574 break;
4575 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004576
Renato Goline84b0002015-10-08 16:43:26 +00004577 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004578 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004579
Chris Lattner1a8f3942010-04-23 16:29:58 +00004580 // {} in inline assembly are neon specifiers, not assembly variant
4581 // specifiers.
4582 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004583
Eric Christopher0e261882014-12-05 01:06:59 +00004584 // FIXME: This duplicates code from the driver that sets the -target-abi
4585 // option - this code is used if -target-abi isn't passed and should
4586 // be unified in some way.
4587 if (Triple.isOSBinFormatMachO()) {
4588 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4589 // the frontend matches that.
4590 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4591 Triple.getOS() == llvm::Triple::UnknownOS ||
4592 StringRef(CPU).startswith("cortex-m")) {
4593 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004594 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004595 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004596 } else {
4597 setABI("apcs-gnu");
4598 }
4599 } else if (Triple.isOSWindows()) {
4600 // FIXME: this is invalid for WindowsCE
4601 setABI("aapcs");
4602 } else {
4603 // Select the default based on the platform.
4604 switch (Triple.getEnvironment()) {
4605 case llvm::Triple::Android:
4606 case llvm::Triple::GNUEABI:
4607 case llvm::Triple::GNUEABIHF:
4608 setABI("aapcs-linux");
4609 break;
4610 case llvm::Triple::EABIHF:
4611 case llvm::Triple::EABI:
4612 setABI("aapcs");
4613 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004614 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004615 setABI("apcs-gnu");
4616 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004617 default:
4618 if (Triple.getOS() == llvm::Triple::NetBSD)
4619 setABI("apcs-gnu");
4620 else
4621 setABI("aapcs");
4622 break;
4623 }
4624 }
John McCall86353412010-08-21 22:46:04 +00004625
4626 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004627 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004628
Renato Golin15b86152015-07-03 16:41:13 +00004629 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004630 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004631
James Molloya7139222012-03-12 09:14:10 +00004632 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004633 // the alignment of the zero-length bitfield is greater than the member
4634 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004635 // zero length bitfield.
4636 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004637 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004638
Alp Toker4925ba72014-06-07 23:30:42 +00004639 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004640
Craig Topper3164f332014-03-11 03:39:26 +00004641 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004642 ABI = Name;
4643
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004644 // The defaults (above) are for AAPCS, check if we need to change them.
4645 //
4646 // FIXME: We need support for -meabi... we could just mangle it into the
4647 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004648 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004649 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004650 return true;
4651 }
4652 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4653 setABIAAPCS();
4654 return true;
4655 }
4656 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004657 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004658
Renato Golinf5c4dec2015-05-27 13:33:00 +00004659 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004660 bool
4661 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4662 StringRef CPU,
4663 const std::vector<std::string> &FeaturesVec) const override {
4664
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004665 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004666 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004667
4668 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004669 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004670 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4671
4672 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004673 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004674 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4675
4676 for (const char *Feature : TargetFeatures)
4677 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004678 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004679
Eric Christopher007b0a02015-08-28 22:32:01 +00004680 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004681 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004682
Craig Topper3164f332014-03-11 03:39:26 +00004683 bool handleTargetFeatures(std::vector<std::string> &Features,
4684 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004685 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004686 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004687 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004688 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004689 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004690 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004691 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004692
Ranjeet Singhac08e532015-06-24 23:39:25 +00004693 // This does not diagnose illegal cases like having both
4694 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4695 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004696 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004697 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004698 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004699 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004700 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004701 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004702 FPU |= VFP2FPU;
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 == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004705 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004706 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004707 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004708 FPU |= VFP4FPU;
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 == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004711 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004712 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004713 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004714 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004715 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004716 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004717 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004718 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004719 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004720 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004721 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004722 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004723 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004724 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004725 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004726 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004727 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004728 } else if (Feature == "+strict-align") {
4729 Unaligned = 0;
4730 } else if (Feature == "+fp16") {
4731 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004732 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004733 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004734 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004735
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004736 switch (ArchVersion) {
4737 case 6:
4738 if (ArchProfile == llvm::ARM::PK_M)
4739 LDREX = 0;
4740 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4741 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4742 else
4743 LDREX = LDREX_W;
4744 break;
4745 case 7:
4746 if (ArchProfile == llvm::ARM::PK_M)
4747 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4748 else
4749 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4750 break;
4751 case 8:
4752 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4753 }
4754
Rafael Espindolaeb265472013-08-21 21:59:03 +00004755 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4756 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4757 return false;
4758 }
4759
4760 if (FPMath == FP_Neon)
4761 Features.push_back("+neonfp");
4762 else if (FPMath == FP_VFP)
4763 Features.push_back("-neonfp");
4764
Daniel Dunbar893d4752009-12-19 04:15:38 +00004765 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004766 auto Feature =
4767 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4768 if (Feature != Features.end())
4769 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004770
Rafael Espindolaeb265472013-08-21 21:59:03 +00004771 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004772 }
4773
Craig Topper3164f332014-03-11 03:39:26 +00004774 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004775 return llvm::StringSwitch<bool>(Feature)
4776 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004777 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004778 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004779 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004780 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004781 .Case("hwdiv", HWDiv & HWDivThumb)
4782 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004783 .Default(false);
4784 }
Renato Golin15b86152015-07-03 16:41:13 +00004785
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004786 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004787 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004788 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004789
Renato Golin15b86152015-07-03 16:41:13 +00004790 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004791 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004792 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004793 CPU = Name;
4794 return true;
4795 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004796
Craig Topper3164f332014-03-11 03:39:26 +00004797 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004798
Craig Topper3164f332014-03-11 03:39:26 +00004799 void getTargetDefines(const LangOptions &Opts,
4800 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004801 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004802 Builder.defineMacro("__arm");
4803 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004804
Chris Lattnerecd49032009-03-02 22:27:17 +00004805 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004806 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004807
4808 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4809 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004810 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004811 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4812
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004813 if (!CPUAttr.empty())
4814 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004815
4816 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004817 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004818 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004819
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004820 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004821 // ACLE 6.5.7 Crypto Extension
4822 if (Crypto)
4823 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4824 // ACLE 6.5.8 CRC32 Extension
4825 if (CRC)
4826 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4827 // ACLE 6.5.10 Numeric Maximum and Minimum
4828 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4829 // ACLE 6.5.9 Directed Rounding
4830 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004831 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004832
4833 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4834 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004835 // NOTE that the default profile is assumed to be 'A'
4836 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004837 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4838
Bradley Smithf4affc12016-03-03 13:52:22 +00004839 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4840 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4841 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4842 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004843 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004844 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004845 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004846 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4847
4848 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4849 // instruction set such as ARM or Thumb.
4850 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4851
4852 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4853
4854 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004855 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004856 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004857
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004858 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004859 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004860 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004861
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004862 // ACLE 6.4.4 LDREX/STREX
4863 if (LDREX)
4864 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4865
4866 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004867 if (ArchVersion == 5 ||
4868 (ArchVersion == 6 && CPUProfile != "M") ||
4869 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004870 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4871
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004872 // ACLE 6.5.1 Hardware Floating Point
4873 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004874 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004875
Yi Konga44c4d72014-06-27 21:25:42 +00004876 // ACLE predefines.
4877 Builder.defineMacro("__ARM_ACLE", "200");
4878
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004879 // FP16 support (we currently only support IEEE format).
4880 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4881 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4882
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004883 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4884 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4885 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4886
Mike Stump9d54bd72009-04-08 02:07:04 +00004887 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004888
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004889 // FIXME: It's more complicated than this and we don't really support
4890 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004891 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004892 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004893 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004894
David Tweed8f676532012-10-25 13:33:01 +00004895 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004896 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004897 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4898 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004899 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004900 Builder.defineMacro("__ARM_PCS", "1");
4901
David Tweed8f676532012-10-25 13:33:01 +00004902 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004903 Builder.defineMacro("__ARM_PCS_VFP", "1");
4904 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004905
Daniel Dunbar893d4752009-12-19 04:15:38 +00004906 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004907 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004908
4909 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004910 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004911
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004912 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004913 Builder.defineMacro("__THUMBEL__");
4914 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004915 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004916 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004917 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004918
4919 // ACLE 6.4.9 32-bit SIMD instructions
4920 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4921 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4922
4923 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004924 if (((HWDiv & HWDivThumb) && isThumb()) ||
4925 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004926 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004927 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004928 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004929
4930 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004931 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004932
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004933 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004934 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004935 if (FPU & VFP2FPU)
4936 Builder.defineMacro("__ARM_VFPV2__");
4937 if (FPU & VFP3FPU)
4938 Builder.defineMacro("__ARM_VFPV3__");
4939 if (FPU & VFP4FPU)
4940 Builder.defineMacro("__ARM_VFPV4__");
4941 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004942
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004943 // This only gets set when Neon instructions are actually available, unlike
4944 // the VFP define, hence the soft float and arch check. This is subtly
4945 // different from gcc, we follow the intent which was that it should be set
4946 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004947 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004948 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004949 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004950 // current AArch32 NEON implementations do not support double-precision
4951 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004952 Builder.defineMacro("__ARM_NEON_FP",
4953 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004954 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004955
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004956 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4957 Opts.ShortWChar ? "2" : "4");
4958
4959 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4960 Opts.ShortEnums ? "1" : "4");
4961
Bradley Smithf4affc12016-03-03 13:52:22 +00004962 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004963 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4964 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4965 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4966 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4967 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004968
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004969 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004970 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004971 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004972 }
4973
4974 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004975 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004976 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4977 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004978 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004979 }
4980
4981 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004982 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004983 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004984
4985 if (Opts.UnsafeFPMath)
4986 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004987
4988 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4989 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004990 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004991
Craig Topper6c03a542015-10-19 04:51:35 +00004992 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4993 return llvm::makeArrayRef(BuiltinInfo,
4994 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004995 }
Craig Topper3164f332014-03-11 03:39:26 +00004996 bool isCLZForZeroUndef() const override { return false; }
4997 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004998 return IsAAPCS
4999 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005000 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5001 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005002 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005003 ArrayRef<const char *> getGCCRegNames() const override;
5004 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005005 bool validateAsmConstraint(const char *&Name,
5006 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005007 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005008 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005009 case 'l': // r0-r7
5010 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005011 case 't': // VFP Floating point register single precision
5012 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005013 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005014 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005015 case 'I':
5016 case 'J':
5017 case 'K':
5018 case 'L':
5019 case 'M':
5020 // FIXME
5021 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005022 case 'Q': // A memory address that is a single base register.
5023 Info.setAllowsMemory();
5024 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005025 case 'U': // a memory reference...
5026 switch (Name[1]) {
5027 case 'q': // ...ARMV4 ldrsb
5028 case 'v': // ...VFP load/store (reg+constant offset)
5029 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005030 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005031 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005032 case 'n': // valid address for Neon doubleword vector load/store
5033 case 'm': // valid address for Neon element and structure load/store
5034 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005035 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005036 Info.setAllowsMemory();
5037 Name++;
5038 return true;
5039 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005040 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005041 return false;
5042 }
Craig Topper3164f332014-03-11 03:39:26 +00005043 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005044 std::string R;
5045 switch (*Constraint) {
5046 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005047 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005048 Constraint++;
5049 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005050 case 'p': // 'p' should be translated to 'r' by default.
5051 R = std::string("r");
5052 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005053 default:
5054 return std::string(1, *Constraint);
5055 }
5056 return R;
5057 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005058 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005059 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005060 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005061 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005062 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005063
Bill Wendling9d1ee112012-10-25 23:28:48 +00005064 // Strip off constraint modifiers.
5065 while (Constraint[0] == '=' ||
5066 Constraint[0] == '+' ||
5067 Constraint[0] == '&')
5068 Constraint = Constraint.substr(1);
5069
5070 switch (Constraint[0]) {
5071 default: break;
5072 case 'r': {
5073 switch (Modifier) {
5074 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005075 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005076 case 'q':
5077 // A register of size 32 cannot fit a vector type.
5078 return false;
5079 }
5080 }
5081 }
5082
5083 return true;
5084 }
Craig Topper3164f332014-03-11 03:39:26 +00005085 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005086 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005087 return "";
5088 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005089
Craig Topper3164f332014-03-11 03:39:26 +00005090 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005091 switch (CC) {
5092 case CC_AAPCS:
5093 case CC_AAPCS_VFP:
5094 case CC_Swift:
5095 return CCCR_OK;
5096 default:
5097 return CCCR_Warning;
5098 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005099 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005100
Craig Topper3164f332014-03-11 03:39:26 +00005101 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005102 if (RegNo == 0) return 0;
5103 if (RegNo == 1) return 1;
5104 return -1;
5105 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005106
5107 bool hasSjLjLowering() const override {
5108 return true;
5109 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005110};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005111
Rafael Espindolaeb265472013-08-21 21:59:03 +00005112bool ARMTargetInfo::setFPMath(StringRef Name) {
5113 if (Name == "neon") {
5114 FPMath = FP_Neon;
5115 return true;
5116 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5117 Name == "vfp4") {
5118 FPMath = FP_VFP;
5119 return true;
5120 }
5121 return false;
5122}
5123
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005124const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005125 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005126 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005127 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5128
5129 // Float registers
5130 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5131 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5132 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005133 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005134
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005135 // Double registers
5136 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5137 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005138 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5139 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005140
5141 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005142 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5143 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005144};
5145
Craig Topperf054e3a2015-10-19 03:52:27 +00005146ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5147 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005148}
5149
5150const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005151 { { "a1" }, "r0" },
5152 { { "a2" }, "r1" },
5153 { { "a3" }, "r2" },
5154 { { "a4" }, "r3" },
5155 { { "v1" }, "r4" },
5156 { { "v2" }, "r5" },
5157 { { "v3" }, "r6" },
5158 { { "v4" }, "r7" },
5159 { { "v5" }, "r8" },
5160 { { "v6", "rfp" }, "r9" },
5161 { { "sl" }, "r10" },
5162 { { "fp" }, "r11" },
5163 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005164 { { "r13" }, "sp" },
5165 { { "r14" }, "lr" },
5166 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005167 // The S, D and Q registers overlap, but aren't really aliases; we
5168 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005169};
5170
Craig Topperf054e3a2015-10-19 03:52:27 +00005171ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5172 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005173}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005174
5175const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005176#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005177 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005178#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5179 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005180#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005181
Craig Topper07d3b622015-08-07 05:14:44 +00005182#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005183 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005184#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005185 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005186#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5187 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005188#include "clang/Basic/BuiltinsARM.def"
5189};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005190
5191class ARMleTargetInfo : public ARMTargetInfo {
5192public:
5193 ARMleTargetInfo(const llvm::Triple &Triple)
5194 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005195 void getTargetDefines(const LangOptions &Opts,
5196 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005197 Builder.defineMacro("__ARMEL__");
5198 ARMTargetInfo::getTargetDefines(Opts, Builder);
5199 }
5200};
5201
5202class ARMbeTargetInfo : public ARMTargetInfo {
5203public:
5204 ARMbeTargetInfo(const llvm::Triple &Triple)
5205 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005206 void getTargetDefines(const LangOptions &Opts,
5207 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005208 Builder.defineMacro("__ARMEB__");
5209 Builder.defineMacro("__ARM_BIG_ENDIAN");
5210 ARMTargetInfo::getTargetDefines(Opts, Builder);
5211 }
5212};
Chris Lattner17df24e2008-04-21 18:56:49 +00005213
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005214class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5215 const llvm::Triple Triple;
5216public:
5217 WindowsARMTargetInfo(const llvm::Triple &Triple)
5218 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005219 WCharType = UnsignedShort;
5220 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005221 }
5222 void getVisualStudioDefines(const LangOptions &Opts,
5223 MacroBuilder &Builder) const {
5224 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5225
5226 // FIXME: this is invalid for WindowsCE
5227 Builder.defineMacro("_M_ARM_NT", "1");
5228 Builder.defineMacro("_M_ARMT", "_M_ARM");
5229 Builder.defineMacro("_M_THUMB", "_M_ARM");
5230
5231 assert((Triple.getArch() == llvm::Triple::arm ||
5232 Triple.getArch() == llvm::Triple::thumb) &&
5233 "invalid architecture for Windows ARM target info");
5234 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5235 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5236
5237 // TODO map the complete set of values
5238 // 31: VFPv3 40: VFPv4
5239 Builder.defineMacro("_M_ARM_FP", "31");
5240 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005241 BuiltinVaListKind getBuiltinVaListKind() const override {
5242 return TargetInfo::CharPtrBuiltinVaList;
5243 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005244 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5245 switch (CC) {
5246 case CC_X86StdCall:
5247 case CC_X86ThisCall:
5248 case CC_X86FastCall:
5249 case CC_X86VectorCall:
5250 return CCCR_Ignore;
5251 case CC_C:
5252 return CCCR_OK;
5253 default:
5254 return CCCR_Warning;
5255 }
5256 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005257};
5258
5259// Windows ARM + Itanium C++ ABI Target
5260class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5261public:
5262 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5263 : WindowsARMTargetInfo(Triple) {
5264 TheCXXABI.set(TargetCXXABI::GenericARM);
5265 }
5266
5267 void getTargetDefines(const LangOptions &Opts,
5268 MacroBuilder &Builder) const override {
5269 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5270
5271 if (Opts.MSVCCompat)
5272 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5273 }
5274};
5275
5276// Windows ARM, MS (C++) ABI
5277class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5278public:
5279 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5280 : WindowsARMTargetInfo(Triple) {
5281 TheCXXABI.set(TargetCXXABI::Microsoft);
5282 }
5283
5284 void getTargetDefines(const LangOptions &Opts,
5285 MacroBuilder &Builder) const override {
5286 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5287 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5288 }
5289};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005290
Yaron Keren321249c2015-07-15 13:32:23 +00005291// ARM MinGW target
5292class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5293public:
5294 MinGWARMTargetInfo(const llvm::Triple &Triple)
5295 : WindowsARMTargetInfo(Triple) {
5296 TheCXXABI.set(TargetCXXABI::GenericARM);
5297 }
5298
5299 void getTargetDefines(const LangOptions &Opts,
5300 MacroBuilder &Builder) const override {
5301 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5302 DefineStd(Builder, "WIN32", Opts);
5303 DefineStd(Builder, "WINNT", Opts);
5304 Builder.defineMacro("_ARM_");
5305 addMinGWDefines(Opts, Builder);
5306 }
5307};
5308
5309// ARM Cygwin target
5310class CygwinARMTargetInfo : public ARMleTargetInfo {
5311public:
5312 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5313 TLSSupported = false;
5314 WCharType = UnsignedShort;
5315 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005316 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005317 }
5318 void getTargetDefines(const LangOptions &Opts,
5319 MacroBuilder &Builder) const override {
5320 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5321 Builder.defineMacro("_ARM_");
5322 Builder.defineMacro("__CYGWIN__");
5323 Builder.defineMacro("__CYGWIN32__");
5324 DefineStd(Builder, "unix", Opts);
5325 if (Opts.CPlusPlus)
5326 Builder.defineMacro("_GNU_SOURCE");
5327 }
5328};
5329
Mike Stump11289f42009-09-09 15:08:12 +00005330class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005331 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005332protected:
Craig Topper3164f332014-03-11 03:39:26 +00005333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5334 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005335 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005336 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005337
Torok Edwinb2b37c62009-06-30 17:10:35 +00005338public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005339 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005340 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005341 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005342 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005343 // FIXME: This should be based off of the target features in
5344 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005345 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005346
Tim Northoverd88ecb32016-01-27 19:32:40 +00005347 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005348 // Darwin on iOS uses a variant of the ARM C++ ABI.
5349 TheCXXABI.set(TargetCXXABI::WatchOS);
5350
5351 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5352 // size_t is long, it's a bit weird for it to be int.
5353 PtrDiffType = SignedLong;
5354
5355 // BOOL should be a real boolean on the new ABI
5356 UseSignedCharForObjCBool = false;
5357 } else
5358 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005359 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005360};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005361
Tim Northover573cbee2014-05-24 12:52:07 +00005362class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005363 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005364 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5365 static const char *const GCCRegNames[];
5366
James Molloy75f5f9e2014-04-16 15:33:48 +00005367 enum FPUModeEnum {
5368 FPUMode,
5369 NeonMode
5370 };
5371
5372 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005373 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005374 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005375 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005376 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005377
Tim Northovera2ee4332014-03-29 15:09:45 +00005378 static const Builtin::Info BuiltinInfo[];
5379
5380 std::string ABI;
5381
5382public:
Tim Northover573cbee2014-05-24 12:52:07 +00005383 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005384 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005385
5386 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5387 WCharType = SignedInt;
5388
5389 // NetBSD apparently prefers consistency across ARM targets to consistency
5390 // across 64-bit targets.
5391 Int64Type = SignedLongLong;
5392 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005393 } else {
5394 WCharType = UnsignedInt;
5395 Int64Type = SignedLong;
5396 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005397 }
5398
Tim Northovera2ee4332014-03-29 15:09:45 +00005399 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005400 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005401 MaxAtomicInlineWidth = 128;
5402 MaxAtomicPromoteWidth = 128;
5403
Tim Northovera6a19f12015-02-06 01:25:07 +00005404 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005405 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5406
Tim Northovera2ee4332014-03-29 15:09:45 +00005407 // {} in inline assembly are neon specifiers, not assembly variant
5408 // specifiers.
5409 NoAsmVariants = true;
5410
Tim Northover7ad87af2015-01-16 18:44:04 +00005411 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5412 // contributes to the alignment of the containing aggregate in the same way
5413 // a plain (non bit-field) member of that type would, without exception for
5414 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005415 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005416 UseZeroLengthBitfieldAlignment = true;
5417
Tim Northover573cbee2014-05-24 12:52:07 +00005418 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005419 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5420 }
5421
Alp Toker4925ba72014-06-07 23:30:42 +00005422 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005423 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005424 if (Name != "aapcs" && Name != "darwinpcs")
5425 return false;
5426
5427 ABI = Name;
5428 return true;
5429 }
5430
David Blaikie1cbb9712014-11-14 19:09:44 +00005431 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005432 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005433 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005434 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5435 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005436 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005437 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005438 .Default(false);
5439 return CPUKnown;
5440 }
5441
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005442 void getTargetDefines(const LangOptions &Opts,
5443 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005444 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005445 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005446
5447 // Target properties.
5448 Builder.defineMacro("_LP64");
5449 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005450
5451 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5452 Builder.defineMacro("__ARM_ACLE", "200");
5453 Builder.defineMacro("__ARM_ARCH", "8");
5454 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5455
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005456 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005457 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005458 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005459
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005460 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5461 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5462 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5463 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005464 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005465 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5466 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005467
5468 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5469
5470 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005471 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005472
5473 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5474 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005475 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5476 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005477
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005478 if (Opts.UnsafeFPMath)
5479 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005480
5481 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5482
5483 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5484 Opts.ShortEnums ? "1" : "4");
5485
James Molloy75f5f9e2014-04-16 15:33:48 +00005486 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005487 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005488 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005489 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005490 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005491
Bradley Smith418c5932014-05-02 15:17:51 +00005492 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005493 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005494
James Molloy75f5f9e2014-04-16 15:33:48 +00005495 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005496 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5497
5498 if (Unaligned)
5499 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005500
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005501 if (V8_1A)
5502 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5503
Reid Klecknerd167d422015-05-06 15:31:46 +00005504 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5505 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5506 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5507 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5508 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005509 }
5510
Craig Topper6c03a542015-10-19 04:51:35 +00005511 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5512 return llvm::makeArrayRef(BuiltinInfo,
5513 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005514 }
5515
David Blaikie1cbb9712014-11-14 19:09:44 +00005516 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005517 return Feature == "aarch64" ||
5518 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005519 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005520 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005521 }
5522
James Molloy5e73df52014-04-16 15:06:20 +00005523 bool handleTargetFeatures(std::vector<std::string> &Features,
5524 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005525 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005526 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005527 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005528 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005529 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005530
Eric Christopher610fe112015-08-26 08:21:55 +00005531 for (const auto &Feature : Features) {
5532 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005533 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005534 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005535 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005536 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005537 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005538 if (Feature == "+strict-align")
5539 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005540 if (Feature == "+v8.1a")
5541 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005542 }
5543
James Y Knightb214cbc2016-03-04 19:00:41 +00005544 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005545
5546 return true;
5547 }
5548
John McCall477f2bb2016-03-03 06:39:32 +00005549 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5550 switch (CC) {
5551 case CC_C:
5552 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005553 case CC_PreserveMost:
5554 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005555 return CCCR_OK;
5556 default:
5557 return CCCR_Warning;
5558 }
5559 }
5560
David Blaikie1cbb9712014-11-14 19:09:44 +00005561 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005562
David Blaikie1cbb9712014-11-14 19:09:44 +00005563 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005564 return TargetInfo::AArch64ABIBuiltinVaList;
5565 }
5566
Craig Topperf054e3a2015-10-19 03:52:27 +00005567 ArrayRef<const char *> getGCCRegNames() const override;
5568 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005569
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005570 bool validateAsmConstraint(const char *&Name,
5571 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005572 switch (*Name) {
5573 default:
5574 return false;
5575 case 'w': // Floating point and SIMD registers (V0-V31)
5576 Info.setAllowsRegister();
5577 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005578 case 'I': // Constant that can be used with an ADD instruction
5579 case 'J': // Constant that can be used with a SUB instruction
5580 case 'K': // Constant that can be used with a 32-bit logical instruction
5581 case 'L': // Constant that can be used with a 64-bit logical instruction
5582 case 'M': // Constant that can be used as a 32-bit MOV immediate
5583 case 'N': // Constant that can be used as a 64-bit MOV immediate
5584 case 'Y': // Floating point constant zero
5585 case 'Z': // Integer constant zero
5586 return true;
5587 case 'Q': // A memory reference with base register and no offset
5588 Info.setAllowsMemory();
5589 return true;
5590 case 'S': // A symbolic address
5591 Info.setAllowsRegister();
5592 return true;
5593 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005594 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5595 // Utf: A memory address suitable for ldp/stp in TF mode.
5596 // Usa: An absolute symbolic address.
5597 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5598 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005599 case 'z': // Zero register, wzr or xzr
5600 Info.setAllowsRegister();
5601 return true;
5602 case 'x': // Floating point and SIMD registers (V0-V15)
5603 Info.setAllowsRegister();
5604 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005605 }
5606 return false;
5607 }
5608
Akira Hatanaka987f1862014-08-22 06:05:21 +00005609 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005610 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005611 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005612 // Strip off constraint modifiers.
5613 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5614 Constraint = Constraint.substr(1);
5615
5616 switch (Constraint[0]) {
5617 default:
5618 return true;
5619 case 'z':
5620 case 'r': {
5621 switch (Modifier) {
5622 case 'x':
5623 case 'w':
5624 // For now assume that the person knows what they're
5625 // doing with the modifier.
5626 return true;
5627 default:
5628 // By default an 'r' constraint will be in the 'x'
5629 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005630 if (Size == 64)
5631 return true;
5632
5633 SuggestedModifier = "w";
5634 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005635 }
5636 }
5637 }
5638 }
5639
David Blaikie1cbb9712014-11-14 19:09:44 +00005640 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005641
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005642 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005643 if (RegNo == 0)
5644 return 0;
5645 if (RegNo == 1)
5646 return 1;
5647 return -1;
5648 }
5649};
5650
Tim Northover573cbee2014-05-24 12:52:07 +00005651const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005652 // 32-bit Integer registers
5653 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5654 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5655 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5656
5657 // 64-bit Integer registers
5658 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5659 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5660 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5661
5662 // 32-bit floating point regsisters
5663 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5664 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5665 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5666
5667 // 64-bit floating point regsisters
5668 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5669 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5670 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5671
5672 // Vector registers
5673 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5674 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5675 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5676};
5677
Craig Topperf054e3a2015-10-19 03:52:27 +00005678ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5679 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005680}
5681
Tim Northover573cbee2014-05-24 12:52:07 +00005682const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005683 { { "w31" }, "wsp" },
5684 { { "x29" }, "fp" },
5685 { { "x30" }, "lr" },
5686 { { "x31" }, "sp" },
5687 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5688 // don't want to substitute one of these for a different-sized one.
5689};
5690
Craig Topperf054e3a2015-10-19 03:52:27 +00005691ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5692 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005693}
5694
Tim Northover573cbee2014-05-24 12:52:07 +00005695const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005696#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005697 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005698#include "clang/Basic/BuiltinsNEON.def"
5699
5700#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005701 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005702#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005703};
James Molloy5e73df52014-04-16 15:06:20 +00005704
Tim Northover573cbee2014-05-24 12:52:07 +00005705class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005706 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005707 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005708 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005709 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005710 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005711 }
5712
5713public:
Tim Northover573cbee2014-05-24 12:52:07 +00005714 AArch64leTargetInfo(const llvm::Triple &Triple)
5715 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005716 BigEndian = false;
5717 }
5718 void getTargetDefines(const LangOptions &Opts,
5719 MacroBuilder &Builder) const override {
5720 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005721 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005722 }
5723};
5724
Tim Northover573cbee2014-05-24 12:52:07 +00005725class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005726 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005727 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005728 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005729 }
5730
5731public:
Tim Northover573cbee2014-05-24 12:52:07 +00005732 AArch64beTargetInfo(const llvm::Triple &Triple)
5733 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005734 void getTargetDefines(const LangOptions &Opts,
5735 MacroBuilder &Builder) const override {
5736 Builder.defineMacro("__AARCH64EB__");
5737 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5738 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005739 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005740 }
5741};
Tim Northovera2ee4332014-03-29 15:09:45 +00005742
Tim Northover573cbee2014-05-24 12:52:07 +00005743class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005744protected:
5745 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5746 MacroBuilder &Builder) const override {
5747 Builder.defineMacro("__AARCH64_SIMD__");
5748 Builder.defineMacro("__ARM64_ARCH_8__");
5749 Builder.defineMacro("__ARM_NEON__");
5750 Builder.defineMacro("__LITTLE_ENDIAN__");
5751 Builder.defineMacro("__REGISTER_PREFIX__", "");
5752 Builder.defineMacro("__arm64", "1");
5753 Builder.defineMacro("__arm64__", "1");
5754
5755 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5756 }
5757
Tim Northovera2ee4332014-03-29 15:09:45 +00005758public:
Tim Northover573cbee2014-05-24 12:52:07 +00005759 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5760 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005761 Int64Type = SignedLongLong;
5762 WCharType = SignedInt;
5763 UseSignedCharForObjCBool = false;
5764
Tim Northovera6a19f12015-02-06 01:25:07 +00005765 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005766 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5767
5768 TheCXXABI.set(TargetCXXABI::iOS64);
5769 }
5770
David Blaikie1cbb9712014-11-14 19:09:44 +00005771 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005772 return TargetInfo::CharPtrBuiltinVaList;
5773 }
5774};
Tim Northovera2ee4332014-03-29 15:09:45 +00005775
Tony Linthicum76329bf2011-12-12 21:14:55 +00005776// Hexagon abstract base class
5777class HexagonTargetInfo : public TargetInfo {
5778 static const Builtin::Info BuiltinInfo[];
5779 static const char * const GCCRegNames[];
5780 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5781 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005782 bool HasHVX, HasHVXDouble;
5783
Tony Linthicum76329bf2011-12-12 21:14:55 +00005784public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005785 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005786 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005787 // Specify the vector alignment explicitly. For v512x1, the calculated
5788 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5789 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005790 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005791 "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 +00005792 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005793 SizeType = UnsignedInt;
5794 PtrDiffType = SignedInt;
5795 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005796
5797 // {} in inline assembly are packet specifiers, not assembly variant
5798 // specifiers.
5799 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005800
5801 LargeArrayMinWidth = 64;
5802 LargeArrayAlign = 64;
5803 UseBitFieldTypeAlignment = true;
5804 ZeroLengthBitfieldBoundary = 32;
5805 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005806 }
5807
Craig Topper6c03a542015-10-19 04:51:35 +00005808 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5809 return llvm::makeArrayRef(BuiltinInfo,
5810 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005811 }
5812
Craig Topper3164f332014-03-11 03:39:26 +00005813 bool validateAsmConstraint(const char *&Name,
5814 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005815 return true;
5816 }
5817
Craig Topper3164f332014-03-11 03:39:26 +00005818 void getTargetDefines(const LangOptions &Opts,
5819 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005820
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005821 bool isCLZForZeroUndef() const override { return false; }
5822
Craig Topper3164f332014-03-11 03:39:26 +00005823 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005824 return llvm::StringSwitch<bool>(Feature)
5825 .Case("hexagon", true)
5826 .Case("hvx", HasHVX)
5827 .Case("hvx-double", HasHVXDouble)
5828 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005829 }
Craig Topper3164f332014-03-11 03:39:26 +00005830
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005831 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5832 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5833 const override;
5834
5835 bool handleTargetFeatures(std::vector<std::string> &Features,
5836 DiagnosticsEngine &Diags) override;
5837
Craig Topper3164f332014-03-11 03:39:26 +00005838 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005839 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005840 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005841 ArrayRef<const char *> getGCCRegNames() const override;
5842 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005843 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005844 return "";
5845 }
Sebastian Pop86500282012-01-13 20:37:10 +00005846
5847 static const char *getHexagonCPUSuffix(StringRef Name) {
5848 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005849 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005850 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005851 .Case("hexagonv55", "55")
5852 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005853 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005854 }
5855
Craig Topper3164f332014-03-11 03:39:26 +00005856 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005857 if (!getHexagonCPUSuffix(Name))
5858 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005859 CPU = Name;
5860 return true;
5861 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005862
5863 int getEHDataRegisterNumber(unsigned RegNo) const override {
5864 return RegNo < 2 ? RegNo : -1;
5865 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005866};
5867
5868void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005869 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005870 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005871 Builder.defineMacro("__hexagon__", "1");
5872
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005873 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005874 Builder.defineMacro("__HEXAGON_V4__");
5875 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005876 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005877 Builder.defineMacro("__QDSP6_V4__");
5878 Builder.defineMacro("__QDSP6_ARCH__", "4");
5879 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005880 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005881 Builder.defineMacro("__HEXAGON_V5__");
5882 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5883 if(Opts.HexagonQdsp6Compat) {
5884 Builder.defineMacro("__QDSP6_V5__");
5885 Builder.defineMacro("__QDSP6_ARCH__", "5");
5886 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005887 } else if (CPU == "hexagonv60") {
5888 Builder.defineMacro("__HEXAGON_V60__");
5889 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5890 Builder.defineMacro("__QDSP6_V60__");
5891 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005892 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005893}
5894
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005895bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5896 DiagnosticsEngine &Diags) {
5897 for (auto &F : Features) {
5898 if (F == "+hvx")
5899 HasHVX = true;
5900 else if (F == "-hvx")
5901 HasHVX = HasHVXDouble = false;
5902 else if (F == "+hvx-double")
5903 HasHVX = HasHVXDouble = true;
5904 else if (F == "-hvx-double")
5905 HasHVXDouble = false;
5906 }
5907 return true;
5908}
5909
5910bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5911 DiagnosticsEngine &Diags, StringRef CPU,
5912 const std::vector<std::string> &FeaturesVec) const {
5913 // Default for v60: -hvx, -hvx-double.
5914 Features["hvx"] = false;
5915 Features["hvx-double"] = false;
5916
5917 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5918}
5919
5920
5921const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005922 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5923 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5924 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5925 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5926 "p0", "p1", "p2", "p3",
5927 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5928};
5929
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005930ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005931 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005932}
5933
Tony Linthicum76329bf2011-12-12 21:14:55 +00005934const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5935 { { "sp" }, "r29" },
5936 { { "fp" }, "r30" },
5937 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005938};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005939
Craig Topperf054e3a2015-10-19 03:52:27 +00005940ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5941 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005942}
5943
5944
5945const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005946#define BUILTIN(ID, TYPE, ATTRS) \
5947 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5948#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5949 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005950#include "clang/Basic/BuiltinsHexagon.def"
5951};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005952
Jacques Pienaard964cc22016-03-28 21:02:54 +00005953class LanaiTargetInfo : public TargetInfo {
5954 // Class for Lanai (32-bit).
5955 // The CPU profiles supported by the Lanai backend
5956 enum CPUKind {
5957 CK_NONE,
5958 CK_V11,
5959 } CPU;
5960
5961 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5962 static const char *const GCCRegNames[];
5963
5964public:
5965 LanaiTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5966 // Description string has to be kept in sync with backend.
5967 resetDataLayout("E" // Big endian
5968 "-m:e" // ELF name manging
5969 "-p:32:32" // 32 bit pointers, 32 bit aligned
5970 "-i64:64" // 64 bit integers, 64 bit aligned
5971 "-a:0:32" // 32 bit alignment of objects of aggregate type
5972 "-n32" // 32 bit native integer width
5973 "-S64" // 64 bit natural stack alignment
5974 );
5975
5976 // Setting RegParmMax equal to what mregparm was set to in the old
5977 // toolchain
5978 RegParmMax = 4;
5979
5980 // Set the default CPU to V11
5981 CPU = CK_V11;
5982
5983 // Temporary approach to make everything at least word-aligned and allow for
5984 // safely casting between pointers with different alignment requirements.
5985 // TODO: Remove this when there are no more cast align warnings on the
5986 // firmware.
5987 MinGlobalAlign = 32;
5988 }
5989
5990 void getTargetDefines(const LangOptions &Opts,
5991 MacroBuilder &Builder) const override {
5992 // Define __lanai__ when building for target lanai.
5993 Builder.defineMacro("__lanai__");
5994
5995 // Set define for the CPU specified.
5996 switch (CPU) {
5997 case CK_V11:
5998 Builder.defineMacro("__LANAI_V11__");
5999 break;
6000 case CK_NONE:
6001 llvm_unreachable("Unhandled target CPU");
6002 }
6003 }
6004
6005 bool setCPU(const std::string &Name) override {
6006 CPU = llvm::StringSwitch<CPUKind>(Name)
6007 .Case("v11", CK_V11)
6008 .Default(CK_NONE);
6009
6010 return CPU != CK_NONE;
6011 }
6012
6013 bool hasFeature(StringRef Feature) const override {
6014 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6015 }
6016
6017 ArrayRef<const char *> getGCCRegNames() const override;
6018
6019 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6020
6021 BuiltinVaListKind getBuiltinVaListKind() const override {
6022 return TargetInfo::VoidPtrBuiltinVaList;
6023 }
6024
6025 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6026
6027 bool validateAsmConstraint(const char *&Name,
6028 TargetInfo::ConstraintInfo &info) const override {
6029 return false;
6030 }
6031
6032 const char *getClobbers() const override { return ""; }
6033};
6034
6035const char *const LanaiTargetInfo::GCCRegNames[] = {
6036 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6037 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6038 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6039
6040ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6041 return llvm::makeArrayRef(GCCRegNames);
6042}
6043
6044const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6045 {{"pc"}, "r2"},
6046 {{"sp"}, "r4"},
6047 {{"fp"}, "r5"},
6048 {{"rv"}, "r8"},
6049 {{"rr1"}, "r10"},
6050 {{"rr2"}, "r11"},
6051 {{"rca"}, "r15"},
6052};
6053
6054ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6055 return llvm::makeArrayRef(GCCRegAliases);
6056}
6057
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006058// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6059class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006060 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6061 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006062 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006063public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00006064 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00006065 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006066
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006067 int getEHDataRegisterNumber(unsigned RegNo) const override {
6068 if (RegNo == 0) return 24;
6069 if (RegNo == 1) return 25;
6070 return -1;
6071 }
6072
Craig Topper3164f332014-03-11 03:39:26 +00006073 bool handleTargetFeatures(std::vector<std::string> &Features,
6074 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006075 // The backend doesn't actually handle soft float yet, but in case someone
6076 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006077 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6078 if (Feature != Features.end()) {
6079 SoftFloat = true;
6080 Features.erase(Feature);
6081 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006082 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006083 }
Craig Topper3164f332014-03-11 03:39:26 +00006084 void getTargetDefines(const LangOptions &Opts,
6085 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006086 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006087 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006088
6089 if (SoftFloat)
6090 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006091 }
Craig Topper3164f332014-03-11 03:39:26 +00006092
6093 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006094 return llvm::StringSwitch<bool>(Feature)
6095 .Case("softfloat", SoftFloat)
6096 .Case("sparc", true)
6097 .Default(false);
6098 }
Craig Topper3164f332014-03-11 03:39:26 +00006099
Craig Topper6c03a542015-10-19 04:51:35 +00006100 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006101 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006102 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006103 }
Craig Topper3164f332014-03-11 03:39:26 +00006104 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006105 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006106 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006107 ArrayRef<const char *> getGCCRegNames() const override;
6108 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006109 bool validateAsmConstraint(const char *&Name,
6110 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006111 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006112 switch (*Name) {
6113 case 'I': // Signed 13-bit constant
6114 case 'J': // Zero
6115 case 'K': // 32-bit constant with the low 12 bits clear
6116 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6117 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6118 case 'N': // Same as 'K' but zext (required for SIMode)
6119 case 'O': // The constant 4096
6120 return true;
6121 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006122 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006123 }
Craig Topper3164f332014-03-11 03:39:26 +00006124 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006125 // FIXME: Implement!
6126 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006127 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006128
6129 // No Sparc V7 for now, the backend doesn't support it anyway.
6130 enum CPUKind {
6131 CK_GENERIC,
6132 CK_V8,
6133 CK_SUPERSPARC,
6134 CK_SPARCLITE,
6135 CK_F934,
6136 CK_HYPERSPARC,
6137 CK_SPARCLITE86X,
6138 CK_SPARCLET,
6139 CK_TSC701,
6140 CK_V9,
6141 CK_ULTRASPARC,
6142 CK_ULTRASPARC3,
6143 CK_NIAGARA,
6144 CK_NIAGARA2,
6145 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006146 CK_NIAGARA4,
6147 CK_MYRIAD2_1,
6148 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006149 } CPU = CK_GENERIC;
6150
6151 enum CPUGeneration {
6152 CG_V8,
6153 CG_V9,
6154 };
6155
6156 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6157 switch (Kind) {
6158 case CK_GENERIC:
6159 case CK_V8:
6160 case CK_SUPERSPARC:
6161 case CK_SPARCLITE:
6162 case CK_F934:
6163 case CK_HYPERSPARC:
6164 case CK_SPARCLITE86X:
6165 case CK_SPARCLET:
6166 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006167 case CK_MYRIAD2_1:
6168 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006169 return CG_V8;
6170 case CK_V9:
6171 case CK_ULTRASPARC:
6172 case CK_ULTRASPARC3:
6173 case CK_NIAGARA:
6174 case CK_NIAGARA2:
6175 case CK_NIAGARA3:
6176 case CK_NIAGARA4:
6177 return CG_V9;
6178 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006179 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006180 }
6181
6182 CPUKind getCPUKind(StringRef Name) const {
6183 return llvm::StringSwitch<CPUKind>(Name)
6184 .Case("v8", CK_V8)
6185 .Case("supersparc", CK_SUPERSPARC)
6186 .Case("sparclite", CK_SPARCLITE)
6187 .Case("f934", CK_F934)
6188 .Case("hypersparc", CK_HYPERSPARC)
6189 .Case("sparclite86x", CK_SPARCLITE86X)
6190 .Case("sparclet", CK_SPARCLET)
6191 .Case("tsc701", CK_TSC701)
6192 .Case("v9", CK_V9)
6193 .Case("ultrasparc", CK_ULTRASPARC)
6194 .Case("ultrasparc3", CK_ULTRASPARC3)
6195 .Case("niagara", CK_NIAGARA)
6196 .Case("niagara2", CK_NIAGARA2)
6197 .Case("niagara3", CK_NIAGARA3)
6198 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006199 .Case("myriad2", CK_MYRIAD2_1)
6200 .Case("myriad2.1", CK_MYRIAD2_1)
6201 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006202 .Default(CK_GENERIC);
6203 }
6204
6205 bool setCPU(const std::string &Name) override {
6206 CPU = getCPUKind(Name);
6207 return CPU != CK_GENERIC;
6208 }
Gabor Greif49991682008-02-21 16:29:08 +00006209};
6210
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006211const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006212 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6213 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6214 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6215 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6216};
6217
Craig Topperf054e3a2015-10-19 03:52:27 +00006218ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6219 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006220}
6221
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006222const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006223 { { "g0" }, "r0" },
6224 { { "g1" }, "r1" },
6225 { { "g2" }, "r2" },
6226 { { "g3" }, "r3" },
6227 { { "g4" }, "r4" },
6228 { { "g5" }, "r5" },
6229 { { "g6" }, "r6" },
6230 { { "g7" }, "r7" },
6231 { { "o0" }, "r8" },
6232 { { "o1" }, "r9" },
6233 { { "o2" }, "r10" },
6234 { { "o3" }, "r11" },
6235 { { "o4" }, "r12" },
6236 { { "o5" }, "r13" },
6237 { { "o6", "sp" }, "r14" },
6238 { { "o7" }, "r15" },
6239 { { "l0" }, "r16" },
6240 { { "l1" }, "r17" },
6241 { { "l2" }, "r18" },
6242 { { "l3" }, "r19" },
6243 { { "l4" }, "r20" },
6244 { { "l5" }, "r21" },
6245 { { "l6" }, "r22" },
6246 { { "l7" }, "r23" },
6247 { { "i0" }, "r24" },
6248 { { "i1" }, "r25" },
6249 { { "i2" }, "r26" },
6250 { { "i3" }, "r27" },
6251 { { "i4" }, "r28" },
6252 { { "i5" }, "r29" },
6253 { { "i6", "fp" }, "r30" },
6254 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006255};
6256
Craig Topperf054e3a2015-10-19 03:52:27 +00006257ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6258 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006259}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006260
6261// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6262class SparcV8TargetInfo : public SparcTargetInfo {
6263public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006264 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006265 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006266 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6267 switch (getTriple().getOS()) {
6268 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006269 SizeType = UnsignedInt;
6270 IntPtrType = SignedInt;
6271 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006272 break;
6273 case llvm::Triple::NetBSD:
6274 case llvm::Triple::OpenBSD:
6275 SizeType = UnsignedLong;
6276 IntPtrType = SignedLong;
6277 PtrDiffType = SignedLong;
6278 break;
Brad Smith56495d52015-08-13 22:00:53 +00006279 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006280 }
6281
Craig Topper3164f332014-03-11 03:39:26 +00006282 void getTargetDefines(const LangOptions &Opts,
6283 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006284 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006285 switch (getCPUGeneration(CPU)) {
6286 case CG_V8:
6287 Builder.defineMacro("__sparcv8");
6288 if (getTriple().getOS() != llvm::Triple::Solaris)
6289 Builder.defineMacro("__sparcv8__");
6290 break;
6291 case CG_V9:
6292 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006293 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006294 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006295 Builder.defineMacro("__sparc_v9__");
6296 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006297 break;
6298 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006299 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6300 switch (CPU) {
6301 case CK_MYRIAD2_1:
6302 Builder.defineMacro("__myriad2", "1");
6303 Builder.defineMacro("__myriad2__", "1");
6304 break;
6305 case CK_MYRIAD2_2:
6306 Builder.defineMacro("__myriad2", "2");
6307 Builder.defineMacro("__myriad2__", "2");
6308 break;
6309 default:
6310 break;
6311 }
6312 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006313 }
6314};
6315
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006316// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6317class SparcV8elTargetInfo : public SparcV8TargetInfo {
6318 public:
6319 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006320 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006321 BigEndian = false;
6322 }
6323};
6324
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006325// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6326class SparcV9TargetInfo : public SparcTargetInfo {
6327public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006328 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006329 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006330 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006331 // This is an LP64 platform.
6332 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006333
6334 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006335 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006336 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006337 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006338 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006339 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006340
6341 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6342 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6343 LongDoubleWidth = 128;
6344 LongDoubleAlign = 128;
6345 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006346 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006347 }
6348
Craig Topper3164f332014-03-11 03:39:26 +00006349 void getTargetDefines(const LangOptions &Opts,
6350 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006351 SparcTargetInfo::getTargetDefines(Opts, Builder);
6352 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006353 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006354 // Solaris doesn't need these variants, but the BSDs do.
6355 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006356 Builder.defineMacro("__sparc64__");
6357 Builder.defineMacro("__sparc_v9__");
6358 Builder.defineMacro("__sparcv9__");
6359 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006360 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006361
Craig Topper3164f332014-03-11 03:39:26 +00006362 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006363 if (!SparcTargetInfo::setCPU(Name))
6364 return false;
6365 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006366 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006367};
6368
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006369class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006370 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006371 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006372 std::string CPU;
6373 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006374 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006375
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006376public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006377 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006378 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6379 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006380 IntMaxType = SignedLong;
6381 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006382 TLSSupported = true;
6383 IntWidth = IntAlign = 32;
6384 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6385 PointerWidth = PointerAlign = 64;
6386 LongDoubleWidth = 128;
6387 LongDoubleAlign = 64;
6388 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006389 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006390 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006391 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 +00006392 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6393 }
6394 void getTargetDefines(const LangOptions &Opts,
6395 MacroBuilder &Builder) const override {
6396 Builder.defineMacro("__s390__");
6397 Builder.defineMacro("__s390x__");
6398 Builder.defineMacro("__zarch__");
6399 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006400
6401 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6402 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6403 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6404 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6405
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006406 if (HasTransactionalExecution)
6407 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006408 if (Opts.ZVector)
6409 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006410 }
Craig Topper6c03a542015-10-19 04:51:35 +00006411 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6412 return llvm::makeArrayRef(BuiltinInfo,
6413 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006414 }
6415
Craig Topperf054e3a2015-10-19 03:52:27 +00006416 ArrayRef<const char *> getGCCRegNames() const override;
6417 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006418 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006419 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006420 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006421 bool validateAsmConstraint(const char *&Name,
6422 TargetInfo::ConstraintInfo &info) const override;
6423 const char *getClobbers() const override {
6424 // FIXME: Is this really right?
6425 return "";
6426 }
6427 BuiltinVaListKind getBuiltinVaListKind() const override {
6428 return TargetInfo::SystemZBuiltinVaList;
6429 }
6430 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006431 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006432 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6433 .Case("z10", true)
6434 .Case("z196", true)
6435 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006436 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006437 .Default(false);
6438
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006439 return CPUKnown;
6440 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006441 bool
6442 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6443 StringRef CPU,
6444 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006445 if (CPU == "zEC12")
6446 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006447 if (CPU == "z13") {
6448 Features["transactional-execution"] = true;
6449 Features["vector"] = true;
6450 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006451 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006452 }
6453
6454 bool handleTargetFeatures(std::vector<std::string> &Features,
6455 DiagnosticsEngine &Diags) override {
6456 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006457 for (const auto &Feature : Features) {
6458 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006459 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006460 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006461 HasVector = true;
6462 }
6463 // If we use the vector ABI, vector types are 64-bit aligned.
6464 if (HasVector) {
6465 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006466 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6467 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006468 }
6469 return true;
6470 }
6471
6472 bool hasFeature(StringRef Feature) const override {
6473 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006474 .Case("systemz", true)
6475 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006476 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006477 .Default(false);
6478 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006479
6480 StringRef getABI() const override {
6481 if (HasVector)
6482 return "vector";
6483 return "";
6484 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006485
6486 bool useFloat128ManglingForLongDouble() const override {
6487 return true;
6488 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006489};
6490
6491const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6492#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006493 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006494#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6495 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006496#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006497};
6498
6499const char *const SystemZTargetInfo::GCCRegNames[] = {
6500 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6501 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6502 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6503 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6504};
6505
Craig Topperf054e3a2015-10-19 03:52:27 +00006506ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6507 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006508}
6509
6510bool SystemZTargetInfo::
6511validateAsmConstraint(const char *&Name,
6512 TargetInfo::ConstraintInfo &Info) const {
6513 switch (*Name) {
6514 default:
6515 return false;
6516
6517 case 'a': // Address register
6518 case 'd': // Data register (equivalent to 'r')
6519 case 'f': // Floating-point register
6520 Info.setAllowsRegister();
6521 return true;
6522
6523 case 'I': // Unsigned 8-bit constant
6524 case 'J': // Unsigned 12-bit constant
6525 case 'K': // Signed 16-bit constant
6526 case 'L': // Signed 20-bit displacement (on all targets we support)
6527 case 'M': // 0x7fffffff
6528 return true;
6529
6530 case 'Q': // Memory with base and unsigned 12-bit displacement
6531 case 'R': // Likewise, plus an index
6532 case 'S': // Memory with base and signed 20-bit displacement
6533 case 'T': // Likewise, plus an index
6534 Info.setAllowsMemory();
6535 return true;
6536 }
6537}
Ulrich Weigand47445072013-05-06 16:26:41 +00006538
Eric Christopherc48497a2015-09-18 21:26:24 +00006539class MSP430TargetInfo : public TargetInfo {
6540 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006541
Eric Christopherc48497a2015-09-18 21:26:24 +00006542public:
6543 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6544 BigEndian = false;
6545 TLSSupported = false;
6546 IntWidth = 16;
6547 IntAlign = 16;
6548 LongWidth = 32;
6549 LongLongWidth = 64;
6550 LongAlign = LongLongAlign = 16;
6551 PointerWidth = 16;
6552 PointerAlign = 16;
6553 SuitableAlign = 16;
6554 SizeType = UnsignedInt;
6555 IntMaxType = SignedLongLong;
6556 IntPtrType = SignedInt;
6557 PtrDiffType = SignedInt;
6558 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006559 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006560 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006561 void getTargetDefines(const LangOptions &Opts,
6562 MacroBuilder &Builder) const override {
6563 Builder.defineMacro("MSP430");
6564 Builder.defineMacro("__MSP430__");
6565 // FIXME: defines for different 'flavours' of MCU
6566 }
Craig Topper6c03a542015-10-19 04:51:35 +00006567 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006568 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006569 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006570 }
6571 bool hasFeature(StringRef Feature) const override {
6572 return Feature == "msp430";
6573 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006574 ArrayRef<const char *> getGCCRegNames() const override;
6575 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006576 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006577 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006578 }
6579 bool validateAsmConstraint(const char *&Name,
6580 TargetInfo::ConstraintInfo &info) const override {
6581 // FIXME: implement
6582 switch (*Name) {
6583 case 'K': // the constant 1
6584 case 'L': // constant -1^20 .. 1^19
6585 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006586 return true;
6587 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006588 // No target constraints for now.
6589 return false;
6590 }
6591 const char *getClobbers() const override {
6592 // FIXME: Is this really right?
6593 return "";
6594 }
6595 BuiltinVaListKind getBuiltinVaListKind() const override {
6596 // FIXME: implement
6597 return TargetInfo::CharPtrBuiltinVaList;
6598 }
6599};
6600
6601const char *const MSP430TargetInfo::GCCRegNames[] = {
6602 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6603 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6604
Craig Topperf054e3a2015-10-19 03:52:27 +00006605ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6606 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006607}
6608
6609// LLVM and Clang cannot be used directly to output native binaries for
6610// target, but is used to compile C code to llvm bitcode with correct
6611// type and alignment information.
6612//
6613// TCE uses the llvm bitcode as input and uses it for generating customized
6614// target processor and program binary. TCE co-design environment is
6615// publicly available in http://tce.cs.tut.fi
6616
6617static const unsigned TCEOpenCLAddrSpaceMap[] = {
6618 3, // opencl_global
6619 4, // opencl_local
6620 5, // opencl_constant
6621 // FIXME: generic has to be added to the target
6622 0, // opencl_generic
6623 0, // cuda_device
6624 0, // cuda_constant
6625 0 // cuda_shared
6626};
6627
6628class TCETargetInfo : public TargetInfo {
6629public:
6630 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6631 TLSSupported = false;
6632 IntWidth = 32;
6633 LongWidth = LongLongWidth = 32;
6634 PointerWidth = 32;
6635 IntAlign = 32;
6636 LongAlign = LongLongAlign = 32;
6637 PointerAlign = 32;
6638 SuitableAlign = 32;
6639 SizeType = UnsignedInt;
6640 IntMaxType = SignedLong;
6641 IntPtrType = SignedInt;
6642 PtrDiffType = SignedInt;
6643 FloatWidth = 32;
6644 FloatAlign = 32;
6645 DoubleWidth = 32;
6646 DoubleAlign = 32;
6647 LongDoubleWidth = 32;
6648 LongDoubleAlign = 32;
6649 FloatFormat = &llvm::APFloat::IEEEsingle;
6650 DoubleFormat = &llvm::APFloat::IEEEsingle;
6651 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006652 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6653 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006654 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6655 UseAddrSpaceMapMangling = true;
6656 }
6657
6658 void getTargetDefines(const LangOptions &Opts,
6659 MacroBuilder &Builder) const override {
6660 DefineStd(Builder, "tce", Opts);
6661 Builder.defineMacro("__TCE__");
6662 Builder.defineMacro("__TCE_V1__");
6663 }
6664 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6665
Craig Topper6c03a542015-10-19 04:51:35 +00006666 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006667 const char *getClobbers() const override { return ""; }
6668 BuiltinVaListKind getBuiltinVaListKind() const override {
6669 return TargetInfo::VoidPtrBuiltinVaList;
6670 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006671 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006672 bool validateAsmConstraint(const char *&Name,
6673 TargetInfo::ConstraintInfo &info) const override {
6674 return true;
6675 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006676 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6677 return None;
6678 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006679};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006680
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006681class BPFTargetInfo : public TargetInfo {
6682public:
6683 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6684 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6685 SizeType = UnsignedLong;
6686 PtrDiffType = SignedLong;
6687 IntPtrType = SignedLong;
6688 IntMaxType = SignedLong;
6689 Int64Type = SignedLong;
6690 RegParmMax = 5;
6691 if (Triple.getArch() == llvm::Triple::bpfeb) {
6692 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006693 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006694 } else {
6695 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006696 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006697 }
6698 MaxAtomicPromoteWidth = 64;
6699 MaxAtomicInlineWidth = 64;
6700 TLSSupported = false;
6701 }
6702 void getTargetDefines(const LangOptions &Opts,
6703 MacroBuilder &Builder) const override {
6704 DefineStd(Builder, "bpf", Opts);
6705 Builder.defineMacro("__BPF__");
6706 }
6707 bool hasFeature(StringRef Feature) const override {
6708 return Feature == "bpf";
6709 }
6710
Craig Topper6c03a542015-10-19 04:51:35 +00006711 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006712 const char *getClobbers() const override {
6713 return "";
6714 }
6715 BuiltinVaListKind getBuiltinVaListKind() const override {
6716 return TargetInfo::VoidPtrBuiltinVaList;
6717 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006718 ArrayRef<const char *> getGCCRegNames() const override {
6719 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006720 }
6721 bool validateAsmConstraint(const char *&Name,
6722 TargetInfo::ConstraintInfo &info) const override {
6723 return true;
6724 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006725 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6726 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006727 }
6728};
6729
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006730class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006731 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006732
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006733 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006734 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006735 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006736 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006737 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006738 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006739 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006740 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006741 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006742 enum DspRevEnum {
6743 NoDSP, DSP1, DSP2
6744 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006745 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006746
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006747protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006748 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006749 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006750
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006751public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006752 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6753 const std::string &CPUStr)
6754 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006755 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006756 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6757 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6758 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006759
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006760 bool isNaN2008Default() const {
6761 return CPU == "mips32r6" || CPU == "mips64r6";
6762 }
6763
6764 bool isFP64Default() const {
6765 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6766 }
6767
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006768 bool isNan2008() const override {
6769 return IsNan2008;
6770 }
6771
Alp Toker4925ba72014-06-07 23:30:42 +00006772 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006773 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006774 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6775 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006776 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006777 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006778 .Case("mips1", IsMips32)
6779 .Case("mips2", IsMips32)
6780 .Case("mips3", true)
6781 .Case("mips4", true)
6782 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006783 .Case("mips32", IsMips32)
6784 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006785 .Case("mips32r3", IsMips32)
6786 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006787 .Case("mips32r6", IsMips32)
6788 .Case("mips64", true)
6789 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006790 .Case("mips64r3", true)
6791 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006792 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006793 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006794 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006795 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006796 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006797 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006798 bool
6799 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6800 StringRef CPU,
6801 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006802 if (CPU.empty())
6803 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006804 if (CPU == "octeon")
6805 Features["mips64r2"] = Features["cnmips"] = true;
6806 else
6807 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006808 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006809 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006810
Craig Topper3164f332014-03-11 03:39:26 +00006811 void getTargetDefines(const LangOptions &Opts,
6812 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006813 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006814 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006815 if (Opts.GNUMode)
6816 Builder.defineMacro("mips");
6817
Simon Atanasyan683535b2012-08-29 19:14:58 +00006818 Builder.defineMacro("__REGISTER_PREFIX__", "");
6819
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006820 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006821 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006822 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006823 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006824 case SoftFloat:
6825 Builder.defineMacro("__mips_soft_float", Twine(1));
6826 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006827 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006828
Simon Atanasyan16071912013-04-14 14:07:30 +00006829 if (IsSingleFloat)
6830 Builder.defineMacro("__mips_single_float", Twine(1));
6831
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006832 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6833 Builder.defineMacro("_MIPS_FPSET",
6834 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6835
Simon Atanasyan72244b62012-07-05 16:06:06 +00006836 if (IsMips16)
6837 Builder.defineMacro("__mips16", Twine(1));
6838
Simon Atanasyan60777612013-04-14 14:07:51 +00006839 if (IsMicromips)
6840 Builder.defineMacro("__mips_micromips", Twine(1));
6841
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006842 if (IsNan2008)
6843 Builder.defineMacro("__mips_nan2008", Twine(1));
6844
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006845 switch (DspRev) {
6846 default:
6847 break;
6848 case DSP1:
6849 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6850 Builder.defineMacro("__mips_dsp", Twine(1));
6851 break;
6852 case DSP2:
6853 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6854 Builder.defineMacro("__mips_dspr2", Twine(1));
6855 Builder.defineMacro("__mips_dsp", Twine(1));
6856 break;
6857 }
6858
Jack Carter44ff1e52013-08-12 17:20:29 +00006859 if (HasMSA)
6860 Builder.defineMacro("__mips_msa", Twine(1));
6861
Simon Atanasyan26f19672012-04-05 19:28:31 +00006862 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6863 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6864 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006865
6866 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6867 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006868
6869 // These shouldn't be defined for MIPS-I but there's no need to check
6870 // for that since MIPS-I isn't supported.
6871 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6872 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6873 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006874 }
6875
Craig Topper6c03a542015-10-19 04:51:35 +00006876 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6877 return llvm::makeArrayRef(BuiltinInfo,
6878 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006879 }
Craig Topper3164f332014-03-11 03:39:26 +00006880 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006881 return llvm::StringSwitch<bool>(Feature)
6882 .Case("mips", true)
6883 .Case("fp64", HasFP64)
6884 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006885 }
Craig Topper3164f332014-03-11 03:39:26 +00006886 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006887 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006888 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006889 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006890 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006891 // CPU register names
6892 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006893 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6894 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6895 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006896 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6897 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006898 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6899 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6900 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6901 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006902 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006903 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00006904 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
6905 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006906 // MSA register names
6907 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6908 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6909 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6910 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6911 // MSA control register names
6912 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6913 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006914 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006915 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006916 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006917 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006918 bool validateAsmConstraint(const char *&Name,
6919 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006920 switch (*Name) {
6921 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006922 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006923 case 'r': // CPU registers.
6924 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006925 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006926 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006927 case 'c': // $25 for indirect jumps
6928 case 'l': // lo register
6929 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006930 Info.setAllowsRegister();
6931 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006932 case 'I': // Signed 16-bit constant
6933 case 'J': // Integer 0
6934 case 'K': // Unsigned 16-bit constant
6935 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6936 case 'M': // Constants not loadable via lui, addiu, or ori
6937 case 'N': // Constant -1 to -65535
6938 case 'O': // A signed 15-bit constant
6939 case 'P': // A constant between 1 go 65535
6940 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006941 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006942 Info.setAllowsMemory();
6943 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006944 case 'Z':
6945 if (Name[1] == 'C') { // An address usable by ll, and sc.
6946 Info.setAllowsMemory();
6947 Name++; // Skip over 'Z'.
6948 return true;
6949 }
6950 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006951 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006952 }
6953
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006954 std::string convertConstraint(const char *&Constraint) const override {
6955 std::string R;
6956 switch (*Constraint) {
6957 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6958 if (Constraint[1] == 'C') {
6959 R = std::string("^") + std::string(Constraint, 2);
6960 Constraint++;
6961 return R;
6962 }
6963 break;
6964 }
6965 return TargetInfo::convertConstraint(Constraint);
6966 }
6967
Craig Topper3164f332014-03-11 03:39:26 +00006968 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006969 // In GCC, $1 is not widely used in generated code (it's used only in a few
6970 // specific situations), so there is no real need for users to add it to
6971 // the clobbers list if they want to use it in their inline assembly code.
6972 //
6973 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6974 // code generation, so using it in inline assembly without adding it to the
6975 // clobbers list can cause conflicts between the inline assembly code and
6976 // the surrounding generated code.
6977 //
6978 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6979 // operands, which will conflict with the ".set at" assembler option (which
6980 // we use only for inline assembly, in order to maintain compatibility with
6981 // GCC) and will also conflict with the user's usage of $1.
6982 //
6983 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6984 // register for generated code is to automatically clobber $1 for all inline
6985 // assembly code.
6986 //
6987 // FIXME: We should automatically clobber $1 only for inline assembly code
6988 // which actually uses it. This would allow LLVM to use $1 for inline
6989 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006990 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006991 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006992
Craig Topper3164f332014-03-11 03:39:26 +00006993 bool handleTargetFeatures(std::vector<std::string> &Features,
6994 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006995 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006996 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006997 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006998 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006999 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007000 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007001 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007002
Eric Christopher610fe112015-08-26 08:21:55 +00007003 for (const auto &Feature : Features) {
7004 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007005 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007006 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007007 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007008 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007009 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007010 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007011 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007012 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007013 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007014 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007015 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007016 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007017 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007018 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007019 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007020 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007021 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007022 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007023 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007024 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007025 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007026 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007027
James Y Knightb214cbc2016-03-04 19:00:41 +00007028 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007029
Rafael Espindolaeb265472013-08-21 21:59:03 +00007030 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007031 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007032
Craig Topper3164f332014-03-11 03:39:26 +00007033 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007034 if (RegNo == 0) return 4;
7035 if (RegNo == 1) return 5;
7036 return -1;
7037 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007038
7039 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007040};
7041
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007042const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007043#define BUILTIN(ID, TYPE, ATTRS) \
7044 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7045#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7046 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007047#include "clang/Basic/BuiltinsMips.def"
7048};
7049
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007050class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007051public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007052 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007053 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007054 SizeType = UnsignedInt;
7055 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007056 Int64Type = SignedLongLong;
7057 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007058 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007059 }
Craig Topper3164f332014-03-11 03:39:26 +00007060 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007061 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007062 ABI = Name;
7063 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007064 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007065 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007066 }
Craig Topper3164f332014-03-11 03:39:26 +00007067 void getTargetDefines(const LangOptions &Opts,
7068 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007069 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007070
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007071 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007072 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7073
7074 const std::string& CPUStr = getCPU();
7075 if (CPUStr == "mips32")
7076 Builder.defineMacro("__mips_isa_rev", "1");
7077 else if (CPUStr == "mips32r2")
7078 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007079 else if (CPUStr == "mips32r3")
7080 Builder.defineMacro("__mips_isa_rev", "3");
7081 else if (CPUStr == "mips32r5")
7082 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007083 else if (CPUStr == "mips32r6")
7084 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007085
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007086 if (ABI == "o32") {
7087 Builder.defineMacro("__mips_o32");
7088 Builder.defineMacro("_ABIO32", "1");
7089 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7090 }
7091 else if (ABI == "eabi")
7092 Builder.defineMacro("__mips_eabi");
7093 else
David Blaikie83d382b2011-09-23 05:06:16 +00007094 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007095 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007096 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007097 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7098 { { "at" }, "$1" },
7099 { { "v0" }, "$2" },
7100 { { "v1" }, "$3" },
7101 { { "a0" }, "$4" },
7102 { { "a1" }, "$5" },
7103 { { "a2" }, "$6" },
7104 { { "a3" }, "$7" },
7105 { { "t0" }, "$8" },
7106 { { "t1" }, "$9" },
7107 { { "t2" }, "$10" },
7108 { { "t3" }, "$11" },
7109 { { "t4" }, "$12" },
7110 { { "t5" }, "$13" },
7111 { { "t6" }, "$14" },
7112 { { "t7" }, "$15" },
7113 { { "s0" }, "$16" },
7114 { { "s1" }, "$17" },
7115 { { "s2" }, "$18" },
7116 { { "s3" }, "$19" },
7117 { { "s4" }, "$20" },
7118 { { "s5" }, "$21" },
7119 { { "s6" }, "$22" },
7120 { { "s7" }, "$23" },
7121 { { "t8" }, "$24" },
7122 { { "t9" }, "$25" },
7123 { { "k0" }, "$26" },
7124 { { "k1" }, "$27" },
7125 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007126 { { "sp","$sp" }, "$29" },
7127 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007128 { { "ra" }, "$31" }
7129 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007130 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007131 }
7132};
7133
7134class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007135 void setDataLayout() override {
7136 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007137 }
7138
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007139public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007140 Mips32EBTargetInfo(const llvm::Triple &Triple)
7141 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007142 }
Craig Topper3164f332014-03-11 03:39:26 +00007143 void getTargetDefines(const LangOptions &Opts,
7144 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007145 DefineStd(Builder, "MIPSEB", Opts);
7146 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007147 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007148 }
7149};
7150
7151class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007152 void setDataLayout() override {
7153 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007154 }
7155
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007156public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007157 Mips32ELTargetInfo(const llvm::Triple &Triple)
7158 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007159 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007160 }
Craig Topper3164f332014-03-11 03:39:26 +00007161 void getTargetDefines(const LangOptions &Opts,
7162 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007163 DefineStd(Builder, "MIPSEL", Opts);
7164 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007165 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007166 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007167};
Akira Hatanakabef17452011-09-20 19:21:49 +00007168
7169class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007170public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007171 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007172 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007173 LongDoubleWidth = LongDoubleAlign = 128;
7174 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007175 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7176 LongDoubleWidth = LongDoubleAlign = 64;
7177 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7178 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007179 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007180 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007181 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007182 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007183
7184 void setN64ABITypes() {
7185 LongWidth = LongAlign = 64;
7186 PointerWidth = PointerAlign = 64;
7187 SizeType = UnsignedLong;
7188 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007189 Int64Type = SignedLong;
7190 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007191 }
7192
7193 void setN32ABITypes() {
7194 LongWidth = LongAlign = 32;
7195 PointerWidth = PointerAlign = 32;
7196 SizeType = UnsignedInt;
7197 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007198 Int64Type = SignedLongLong;
7199 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007200 }
7201
Craig Topper3164f332014-03-11 03:39:26 +00007202 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007203 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007204 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007205 ABI = Name;
7206 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007207 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007208 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007209 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007210 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007211 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007212 }
7213 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007214 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007215
Craig Topper3164f332014-03-11 03:39:26 +00007216 void getTargetDefines(const LangOptions &Opts,
7217 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007218 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007219
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007220 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007221 Builder.defineMacro("__mips64");
7222 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007223 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7224
7225 const std::string& CPUStr = getCPU();
7226 if (CPUStr == "mips64")
7227 Builder.defineMacro("__mips_isa_rev", "1");
7228 else if (CPUStr == "mips64r2")
7229 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007230 else if (CPUStr == "mips64r3")
7231 Builder.defineMacro("__mips_isa_rev", "3");
7232 else if (CPUStr == "mips64r5")
7233 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007234 else if (CPUStr == "mips64r6")
7235 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007236
Akira Hatanakabef17452011-09-20 19:21:49 +00007237 if (ABI == "n32") {
7238 Builder.defineMacro("__mips_n32");
7239 Builder.defineMacro("_ABIN32", "2");
7240 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7241 }
7242 else if (ABI == "n64") {
7243 Builder.defineMacro("__mips_n64");
7244 Builder.defineMacro("_ABI64", "3");
7245 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7246 }
7247 else
David Blaikie83d382b2011-09-23 05:06:16 +00007248 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007249
7250 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007251 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007252 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007253 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7254 { { "at" }, "$1" },
7255 { { "v0" }, "$2" },
7256 { { "v1" }, "$3" },
7257 { { "a0" }, "$4" },
7258 { { "a1" }, "$5" },
7259 { { "a2" }, "$6" },
7260 { { "a3" }, "$7" },
7261 { { "a4" }, "$8" },
7262 { { "a5" }, "$9" },
7263 { { "a6" }, "$10" },
7264 { { "a7" }, "$11" },
7265 { { "t0" }, "$12" },
7266 { { "t1" }, "$13" },
7267 { { "t2" }, "$14" },
7268 { { "t3" }, "$15" },
7269 { { "s0" }, "$16" },
7270 { { "s1" }, "$17" },
7271 { { "s2" }, "$18" },
7272 { { "s3" }, "$19" },
7273 { { "s4" }, "$20" },
7274 { { "s5" }, "$21" },
7275 { { "s6" }, "$22" },
7276 { { "s7" }, "$23" },
7277 { { "t8" }, "$24" },
7278 { { "t9" }, "$25" },
7279 { { "k0" }, "$26" },
7280 { { "k1" }, "$27" },
7281 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007282 { { "sp","$sp" }, "$29" },
7283 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007284 { { "ra" }, "$31" }
7285 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007286 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007287 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007288
7289 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007290};
7291
7292class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007293 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007294 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007295 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 +00007296 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007297 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007298 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007299
Akira Hatanakabef17452011-09-20 19:21:49 +00007300public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007301 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007302 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007303 void getTargetDefines(const LangOptions &Opts,
7304 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007305 DefineStd(Builder, "MIPSEB", Opts);
7306 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007307 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007308 }
7309};
7310
7311class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007312 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007313 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007314 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 +00007315 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007316 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007317 }
7318public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007319 Mips64ELTargetInfo(const llvm::Triple &Triple)
7320 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007321 // Default ABI is n64.
7322 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007323 }
Craig Topper3164f332014-03-11 03:39:26 +00007324 void getTargetDefines(const LangOptions &Opts,
7325 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007326 DefineStd(Builder, "MIPSEL", Opts);
7327 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007328 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007329 }
7330};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007331
Ivan Krasindd7403e2011-08-24 20:22:22 +00007332class PNaClTargetInfo : public TargetInfo {
7333public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007334 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007335 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007336 this->LongAlign = 32;
7337 this->LongWidth = 32;
7338 this->PointerAlign = 32;
7339 this->PointerWidth = 32;
7340 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007341 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007342 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007343 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007344 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007345 this->SizeType = TargetInfo::UnsignedInt;
7346 this->PtrDiffType = TargetInfo::SignedInt;
7347 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007348 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007349 }
7350
Craig Toppere6f17d02014-03-11 04:07:52 +00007351 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007352 Builder.defineMacro("__le32__");
7353 Builder.defineMacro("__pnacl__");
7354 }
Craig Topper3164f332014-03-11 03:39:26 +00007355 void getTargetDefines(const LangOptions &Opts,
7356 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007357 getArchDefines(Opts, Builder);
7358 }
Craig Topper3164f332014-03-11 03:39:26 +00007359 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007360 return Feature == "pnacl";
7361 }
Craig Topper6c03a542015-10-19 04:51:35 +00007362 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007363 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007364 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007365 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007366 ArrayRef<const char *> getGCCRegNames() const override;
7367 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007368 bool validateAsmConstraint(const char *&Name,
7369 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007370 return false;
7371 }
7372
Craig Topper3164f332014-03-11 03:39:26 +00007373 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007374 return "";
7375 }
7376};
7377
Craig Topperf054e3a2015-10-19 03:52:27 +00007378ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7379 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007380}
7381
Craig Topperf054e3a2015-10-19 03:52:27 +00007382ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7383 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007384}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007385
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007386// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7387class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7388public:
7389 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007390 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007391 }
7392
7393 BuiltinVaListKind getBuiltinVaListKind() const override {
7394 return TargetInfo::PNaClABIBuiltinVaList;
7395 }
7396};
7397
JF Bastien643817d2014-09-12 17:52:47 +00007398class Le64TargetInfo : public TargetInfo {
7399 static const Builtin::Info BuiltinInfo[];
7400
7401public:
7402 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7403 BigEndian = false;
7404 NoAsmVariants = true;
7405 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7406 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007407 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007408 }
7409
7410 void getTargetDefines(const LangOptions &Opts,
7411 MacroBuilder &Builder) const override {
7412 DefineStd(Builder, "unix", Opts);
7413 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7414 Builder.defineMacro("__ELF__");
7415 }
Craig Topper6c03a542015-10-19 04:51:35 +00007416 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7417 return llvm::makeArrayRef(BuiltinInfo,
7418 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007419 }
7420 BuiltinVaListKind getBuiltinVaListKind() const override {
7421 return TargetInfo::PNaClABIBuiltinVaList;
7422 }
7423 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007424 ArrayRef<const char *> getGCCRegNames() const override {
7425 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007426 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007427 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7428 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007429 }
7430 bool validateAsmConstraint(const char *&Name,
7431 TargetInfo::ConstraintInfo &Info) const override {
7432 return false;
7433 }
7434
7435 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007436};
Dan Gohmanc2853072015-09-03 22:51:53 +00007437
7438class WebAssemblyTargetInfo : public TargetInfo {
7439 static const Builtin::Info BuiltinInfo[];
7440
7441 enum SIMDEnum {
7442 NoSIMD,
7443 SIMD128,
7444 } SIMDLevel;
7445
7446public:
7447 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7448 : TargetInfo(T), SIMDLevel(NoSIMD) {
7449 BigEndian = false;
7450 NoAsmVariants = true;
7451 SuitableAlign = 128;
7452 LargeArrayMinWidth = 128;
7453 LargeArrayAlign = 128;
7454 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007455 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007456 LongDoubleWidth = LongDoubleAlign = 128;
7457 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007458 }
7459
7460protected:
7461 void getTargetDefines(const LangOptions &Opts,
7462 MacroBuilder &Builder) const override {
7463 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7464 if (SIMDLevel >= SIMD128)
7465 Builder.defineMacro("__wasm_simd128__");
7466 }
7467
7468private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007469 bool
7470 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7471 StringRef CPU,
7472 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007473 if (CPU == "bleeding-edge")
7474 Features["simd128"] = true;
7475 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7476 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007477 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007478 return llvm::StringSwitch<bool>(Feature)
7479 .Case("simd128", SIMDLevel >= SIMD128)
7480 .Default(false);
7481 }
7482 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007483 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007484 for (const auto &Feature : Features) {
7485 if (Feature == "+simd128") {
7486 SIMDLevel = std::max(SIMDLevel, SIMD128);
7487 continue;
7488 }
7489 if (Feature == "-simd128") {
7490 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7491 continue;
7492 }
7493
7494 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7495 << "-target-feature";
7496 return false;
7497 }
7498 return true;
7499 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007500 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007501 return llvm::StringSwitch<bool>(Name)
7502 .Case("mvp", true)
7503 .Case("bleeding-edge", true)
7504 .Case("generic", true)
7505 .Default(false);
7506 }
Craig Topper6c03a542015-10-19 04:51:35 +00007507 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7508 return llvm::makeArrayRef(BuiltinInfo,
7509 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007510 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007511 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007512 return VoidPtrBuiltinVaList;
7513 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007514 ArrayRef<const char *> getGCCRegNames() const final {
7515 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007516 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007517 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7518 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007519 }
7520 bool
7521 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007522 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007523 return false;
7524 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007525 const char *getClobbers() const final { return ""; }
7526 bool isCLZForZeroUndef() const final { return false; }
7527 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007528 IntType getIntTypeByWidth(unsigned BitWidth,
7529 bool IsSigned) const final {
7530 // WebAssembly prefers long long for explicitly 64-bit integers.
7531 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7532 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7533 }
7534 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7535 bool IsSigned) const final {
7536 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7537 return BitWidth == 64
7538 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7539 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7540 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007541};
7542
7543const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7544#define BUILTIN(ID, TYPE, ATTRS) \
7545 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7546#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7547 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7548#include "clang/Basic/BuiltinsWebAssembly.def"
7549};
7550
7551class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7552public:
7553 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7554 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007555 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007556 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007557 }
7558
7559protected:
7560 void getTargetDefines(const LangOptions &Opts,
7561 MacroBuilder &Builder) const override {
7562 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7563 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7564 }
7565};
7566
7567class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7568public:
7569 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7570 : WebAssemblyTargetInfo(T) {
7571 LongAlign = LongWidth = 64;
7572 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007573 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007574 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007575 }
7576
7577protected:
7578 void getTargetDefines(const LangOptions &Opts,
7579 MacroBuilder &Builder) const override {
7580 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7581 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7582 }
7583};
7584
JF Bastien643817d2014-09-12 17:52:47 +00007585const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7586#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007587 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007588#include "clang/Basic/BuiltinsLe64.def"
7589};
7590
Eric Christopherc48497a2015-09-18 21:26:24 +00007591static const unsigned SPIRAddrSpaceMap[] = {
7592 1, // opencl_global
7593 3, // opencl_local
7594 2, // opencl_constant
7595 4, // opencl_generic
7596 0, // cuda_device
7597 0, // cuda_constant
7598 0 // cuda_shared
7599};
7600class SPIRTargetInfo : public TargetInfo {
7601public:
7602 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7603 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7604 "SPIR target must use unknown OS");
7605 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7606 "SPIR target must use unknown environment type");
7607 BigEndian = false;
7608 TLSSupported = false;
7609 LongWidth = LongAlign = 64;
7610 AddrSpaceMap = &SPIRAddrSpaceMap;
7611 UseAddrSpaceMapMangling = true;
7612 // Define available target features
7613 // These must be defined in sorted order!
7614 NoAsmVariants = true;
7615 }
7616 void getTargetDefines(const LangOptions &Opts,
7617 MacroBuilder &Builder) const override {
7618 DefineStd(Builder, "SPIR", Opts);
7619 }
7620 bool hasFeature(StringRef Feature) const override {
7621 return Feature == "spir";
7622 }
Craig Topper3164f332014-03-11 03:39:26 +00007623
Craig Topper6c03a542015-10-19 04:51:35 +00007624 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007625 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007626 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007627 bool validateAsmConstraint(const char *&Name,
7628 TargetInfo::ConstraintInfo &info) const override {
7629 return true;
7630 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007631 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7632 return None;
7633 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007634 BuiltinVaListKind getBuiltinVaListKind() const override {
7635 return TargetInfo::VoidPtrBuiltinVaList;
7636 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007637
Eric Christopherc48497a2015-09-18 21:26:24 +00007638 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7639 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7640 : CCCR_Warning;
7641 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007642
Eric Christopherc48497a2015-09-18 21:26:24 +00007643 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7644 return CC_SpirFunction;
7645 }
7646};
Guy Benyeib798fc92012-12-11 21:38:14 +00007647
Eric Christopherc48497a2015-09-18 21:26:24 +00007648class SPIR32TargetInfo : public SPIRTargetInfo {
7649public:
7650 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7651 PointerWidth = PointerAlign = 32;
7652 SizeType = TargetInfo::UnsignedInt;
7653 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007654 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7655 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007656 }
7657 void getTargetDefines(const LangOptions &Opts,
7658 MacroBuilder &Builder) const override {
7659 DefineStd(Builder, "SPIR32", Opts);
7660 }
7661};
Guy Benyeib798fc92012-12-11 21:38:14 +00007662
Eric Christopherc48497a2015-09-18 21:26:24 +00007663class SPIR64TargetInfo : public SPIRTargetInfo {
7664public:
7665 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7666 PointerWidth = PointerAlign = 64;
7667 SizeType = TargetInfo::UnsignedLong;
7668 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007669 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7670 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007671 }
7672 void getTargetDefines(const LangOptions &Opts,
7673 MacroBuilder &Builder) const override {
7674 DefineStd(Builder, "SPIR64", Opts);
7675 }
7676};
Guy Benyeib798fc92012-12-11 21:38:14 +00007677
Robert Lytton0e076492013-08-13 09:43:10 +00007678class XCoreTargetInfo : public TargetInfo {
7679 static const Builtin::Info BuiltinInfo[];
7680public:
7681 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7682 BigEndian = false;
7683 NoAsmVariants = true;
7684 LongLongAlign = 32;
7685 SuitableAlign = 32;
7686 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007687 SizeType = UnsignedInt;
7688 PtrDiffType = SignedInt;
7689 IntPtrType = SignedInt;
7690 WCharType = UnsignedChar;
7691 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007692 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007693 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7694 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007695 }
Craig Topper3164f332014-03-11 03:39:26 +00007696 void getTargetDefines(const LangOptions &Opts,
7697 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007698 Builder.defineMacro("__XS1B__");
7699 }
Craig Topper6c03a542015-10-19 04:51:35 +00007700 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7701 return llvm::makeArrayRef(BuiltinInfo,
7702 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007703 }
Craig Topper3164f332014-03-11 03:39:26 +00007704 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007705 return TargetInfo::VoidPtrBuiltinVaList;
7706 }
Craig Topper3164f332014-03-11 03:39:26 +00007707 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007708 return "";
7709 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007710 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007711 static const char * const GCCRegNames[] = {
7712 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7713 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7714 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007715 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007716 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007717 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7718 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007719 }
Craig Topper3164f332014-03-11 03:39:26 +00007720 bool validateAsmConstraint(const char *&Name,
7721 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007722 return false;
7723 }
Craig Topper3164f332014-03-11 03:39:26 +00007724 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007725 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7726 return (RegNo < 2)? RegNo : -1;
7727 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007728 bool allowsLargerPreferedTypeAlignment() const override {
7729 return false;
7730 }
Robert Lytton0e076492013-08-13 09:43:10 +00007731};
7732
7733const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007734#define BUILTIN(ID, TYPE, ATTRS) \
7735 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7736#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7737 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007738#include "clang/Basic/BuiltinsXCore.def"
7739};
Robert Lytton0e076492013-08-13 09:43:10 +00007740
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007741// x86_32 Android target
7742class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7743public:
7744 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7745 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7746 SuitableAlign = 32;
7747 LongDoubleWidth = 64;
7748 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7749 }
7750};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007751
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007752// x86_64 Android target
7753class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7754public:
7755 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7756 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7757 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7758 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007759
7760 bool useFloat128ManglingForLongDouble() const override {
7761 return true;
7762 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007763};
7764} // end anonymous namespace
7765
Chris Lattner5ba61f02006-10-14 07:39:34 +00007766//===----------------------------------------------------------------------===//
7767// Driver code
7768//===----------------------------------------------------------------------===//
7769
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007770static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007771 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007772
Daniel Dunbar52322032009-08-18 05:47:58 +00007773 switch (Triple.getArch()) {
7774 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007775 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007776
Tim Northover2a0783d2014-05-30 14:14:07 +00007777 case llvm::Triple::xcore:
7778 return new XCoreTargetInfo(Triple);
7779
7780 case llvm::Triple::hexagon:
7781 return new HexagonTargetInfo(Triple);
7782
Jacques Pienaard964cc22016-03-28 21:02:54 +00007783 case llvm::Triple::lanai:
7784 return new LanaiTargetInfo(Triple);
7785
Tim Northover2a0783d2014-05-30 14:14:07 +00007786 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007787 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007788 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007789
7790 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007791 case llvm::Triple::CloudABI:
7792 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007793 case llvm::Triple::FreeBSD:
7794 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007795 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007796 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007797 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007798 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007799 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007800 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007801 }
7802
Christian Pirker9b019ae2014-02-25 13:51:00 +00007803 case llvm::Triple::aarch64_be:
7804 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007805 case llvm::Triple::FreeBSD:
7806 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007807 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007808 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007809 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007810 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007811 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007812 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007813 }
7814
Daniel Dunbar52322032009-08-18 05:47:58 +00007815 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007816 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007817 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007818 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007819
Daniel Dunbar52322032009-08-18 05:47:58 +00007820 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007821 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007822 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007823 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007824 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007825 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007826 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007827 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007828 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007829 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007830 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007831 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007832 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007833 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007834 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007835 case llvm::Triple::Win32:
7836 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007837 case llvm::Triple::Cygnus:
7838 return new CygwinARMTargetInfo(Triple);
7839 case llvm::Triple::GNU:
7840 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007841 case llvm::Triple::Itanium:
7842 return new ItaniumWindowsARMleTargetInfo(Triple);
7843 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007844 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007845 return new MicrosoftARMleTargetInfo(Triple);
7846 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007847 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007848 return new ARMleTargetInfo(Triple);
7849 }
7850
7851 case llvm::Triple::armeb:
7852 case llvm::Triple::thumbeb:
7853 if (Triple.isOSDarwin())
7854 return new DarwinARMTargetInfo(Triple);
7855
7856 switch (os) {
7857 case llvm::Triple::Linux:
7858 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7859 case llvm::Triple::FreeBSD:
7860 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7861 case llvm::Triple::NetBSD:
7862 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7863 case llvm::Triple::OpenBSD:
7864 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7865 case llvm::Triple::Bitrig:
7866 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7867 case llvm::Triple::RTEMS:
7868 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7869 case llvm::Triple::NaCl:
7870 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7871 default:
7872 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007873 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007874
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007875 case llvm::Triple::bpfeb:
7876 case llvm::Triple::bpfel:
7877 return new BPFTargetInfo(Triple);
7878
Daniel Dunbar52322032009-08-18 05:47:58 +00007879 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007880 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007881
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007882 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007883 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007884 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007885 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007886 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007887 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007888 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007889 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007890 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007891 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007892 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007893 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007894 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007895
7896 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007897 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007898 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007899 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007900 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007901 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007902 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007903 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007904 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007905 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007906 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007907 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007908 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007909 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007910 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007911
Akira Hatanakabef17452011-09-20 19:21:49 +00007912 case llvm::Triple::mips64:
7913 switch (os) {
7914 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007915 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007916 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007917 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007918 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007919 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007920 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007921 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007922 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007923 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007924 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007925 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007926 }
7927
7928 case llvm::Triple::mips64el:
7929 switch (os) {
7930 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007931 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007932 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007933 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007934 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007935 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007936 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007937 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007938 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007939 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007940 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007941 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007942 }
7943
Ivan Krasindd7403e2011-08-24 20:22:22 +00007944 case llvm::Triple::le32:
7945 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007946 case llvm::Triple::NaCl:
7947 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7948 default:
7949 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007950 }
7951
JF Bastien643817d2014-09-12 17:52:47 +00007952 case llvm::Triple::le64:
7953 return new Le64TargetInfo(Triple);
7954
Daniel Dunbar52322032009-08-18 05:47:58 +00007955 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007956 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007957 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007958 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007959 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007960 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007961 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007962 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007963 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007964 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007965 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007966 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007967 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007968 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007969 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007970 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007971 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007972
7973 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007974 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007975 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007976 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007977 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007978 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007979 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007980 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007981 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007982 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007983 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007984 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007985 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007986 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007987 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007988
Bill Schmidt778d3872013-07-26 01:36:11 +00007989 case llvm::Triple::ppc64le:
7990 switch (os) {
7991 case llvm::Triple::Linux:
7992 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007993 case llvm::Triple::NetBSD:
7994 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007995 default:
7996 return new PPC64TargetInfo(Triple);
7997 }
7998
Peter Collingbournec947aae2012-05-20 23:28:41 +00007999 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008000 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008001 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008002 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008003
Tom Stellardd8e38a32015-01-06 20:34:47 +00008004 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008005 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00008006 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008007
Daniel Dunbar52322032009-08-18 05:47:58 +00008008 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008009 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008010 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008011 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008012 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00008013 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008014 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008015 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008016 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008017 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008018 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008019 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008020 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008021 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008022 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008023
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008024 // The 'sparcel' architecture copies all the above cases except for Solaris.
8025 case llvm::Triple::sparcel:
8026 switch (os) {
8027 case llvm::Triple::Linux:
8028 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
8029 case llvm::Triple::NetBSD:
8030 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
8031 case llvm::Triple::OpenBSD:
8032 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
8033 case llvm::Triple::RTEMS:
8034 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
8035 default:
8036 return new SparcV8elTargetInfo(Triple);
8037 }
8038
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008039 case llvm::Triple::sparcv9:
8040 switch (os) {
8041 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008042 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008043 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008044 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008045 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008046 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008047 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008048 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008049 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008050 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008051 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008052 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008053 }
8054
Ulrich Weigand47445072013-05-06 16:26:41 +00008055 case llvm::Triple::systemz:
8056 switch (os) {
8057 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008058 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00008059 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008060 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00008061 }
8062
Eli Friedmana9c3d712009-08-19 20:47:07 +00008063 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008064 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008065
Daniel Dunbar52322032009-08-18 05:47:58 +00008066 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008067 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008068 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008069
Daniel Dunbar52322032009-08-18 05:47:58 +00008070 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008071 case llvm::Triple::CloudABI:
8072 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008073 case llvm::Triple::Linux: {
8074 switch (Triple.getEnvironment()) {
8075 default:
8076 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
8077 case llvm::Triple::Android:
8078 return new AndroidX86_32TargetInfo(Triple);
8079 }
8080 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008081 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008082 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008083 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008084 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008085 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008086 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008087 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008088 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008089 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008090 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008091 case llvm::Triple::KFreeBSD:
8092 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008093 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008094 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008095 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008096 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008097 case llvm::Triple::Win32: {
8098 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008099 case llvm::Triple::Cygnus:
8100 return new CygwinX86_32TargetInfo(Triple);
8101 case llvm::Triple::GNU:
8102 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008103 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008104 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008105 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008106 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008107 }
8108 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008109 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008110 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008111 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008112 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008113 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008114 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008115 case llvm::Triple::ELFIAMCU:
8116 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008117 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008118 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008119 }
8120
8121 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008122 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008123 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008124
Daniel Dunbar52322032009-08-18 05:47:58 +00008125 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008126 case llvm::Triple::CloudABI:
8127 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008128 case llvm::Triple::Linux: {
8129 switch (Triple.getEnvironment()) {
8130 default:
8131 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
8132 case llvm::Triple::Android:
8133 return new AndroidX86_64TargetInfo(Triple);
8134 }
8135 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008136 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008137 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008138 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008139 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008140 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008141 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008142 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008143 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008144 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008145 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008146 case llvm::Triple::KFreeBSD:
8147 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008148 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008149 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008150 case llvm::Triple::Win32: {
8151 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008152 case llvm::Triple::Cygnus:
8153 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008154 case llvm::Triple::GNU:
8155 return new MinGWX86_64TargetInfo(Triple);
8156 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008157 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008158 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008159 }
8160 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008161 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008162 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008163 case llvm::Triple::PS4:
8164 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008165 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008166 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008167 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008168
Douglas Katzman78d7c542015-05-12 21:18:10 +00008169 case llvm::Triple::spir: {
8170 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8171 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8172 return nullptr;
8173 return new SPIR32TargetInfo(Triple);
8174 }
8175 case llvm::Triple::spir64: {
8176 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8177 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8178 return nullptr;
8179 return new SPIR64TargetInfo(Triple);
8180 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008181 case llvm::Triple::wasm32:
8182 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8183 return nullptr;
8184 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
8185 case llvm::Triple::wasm64:
8186 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8187 return nullptr;
8188 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008189 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008190}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008191
8192/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008193/// options.
Alp Toker80758082014-07-06 05:26:44 +00008194TargetInfo *
8195TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
8196 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008197 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008198
8199 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00008200 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008201 if (!Target) {
8202 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008203 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008204 }
Alp Toker80758082014-07-06 05:26:44 +00008205 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008206
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008207 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008208 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8209 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008210 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008211 }
8212
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008213 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008214 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8215 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008216 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008217 }
8218
Rafael Espindolaeb265472013-08-21 21:59:03 +00008219 // Set the fp math unit.
8220 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8221 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008222 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008223 }
8224
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008225 // Compute the default target features, we need the target to handle this
8226 // because features may have dependencies on one another.
8227 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008228 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8229 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008230 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008231
8232 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008233 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008234 for (const auto &F : Features)
8235 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8236
Eric Christopher3ff21b32013-10-16 21:26:26 +00008237 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008238 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008239
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008240 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008241}