blob: 4a9b6dc4d5b4112de736ddc2f0572e51449affa7 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068//===----------------------------------------------------------------------===//
69// Defines specific to certain operating systems.
70//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000071
Torok Edwinb2b37c62009-06-30 17:10:35 +000072namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000073template<typename TgtInfo>
74class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000075protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000076 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000077 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000079 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000080 void getTargetDefines(const LangOptions &Opts,
81 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 TgtInfo::getTargetDefines(Opts, Builder);
83 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000084 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000085
86};
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Eric Christopher7d0c7252015-09-24 21:17:04 +000088// CloudABI Target
89template <typename Target>
90class CloudABITargetInfo : public OSTargetInfo<Target> {
91protected:
92 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
93 MacroBuilder &Builder) const override {
94 Builder.defineMacro("__CloudABI__");
95 Builder.defineMacro("__ELF__");
96
97 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
98 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
99 Builder.defineMacro("__STDC_UTF_16__");
100 Builder.defineMacro("__STDC_UTF_32__");
101 }
102
103public:
104 CloudABITargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000105 : OSTargetInfo<Target>(Triple) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000106};
107
Daniel Dunbard86666f2010-01-26 01:44:04 +0000108static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000109 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000110 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000111 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000112 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000115 // AddressSanitizer doesn't play well with source fortification, which is on
116 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000117 if (Opts.Sanitize.has(SanitizerKind::Address))
118 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000119
John McCall460ce582015-10-22 18:38:17 +0000120 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
121 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000124 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000125 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000126 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000127
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000128 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000129 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000130 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000131 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000132
133 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000134 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000135
Daniel Dunbarecf13562011-04-19 21:40:34 +0000136 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000138 if (Triple.isMacOSX()) {
139 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 Triple.getOSVersion(Maj, Min, Rev);
143 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000145
Sebastian Pop422377c2012-01-20 22:01:23 +0000146 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000147 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000148 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
149 if (PlatformName == "win32") {
150 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
151 return;
152 }
153
Evan Cheng31dd9a62014-01-26 23:12:43 +0000154 // Set the appropriate OS version define.
155 if (Triple.isiOS()) {
156 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
157 char Str[6];
158 Str[0] = '0' + Maj;
159 Str[1] = '0' + (Min / 10);
160 Str[2] = '0' + (Min % 10);
161 Str[3] = '0' + (Rev / 10);
162 Str[4] = '0' + (Rev % 10);
163 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000164 if (Triple.isTvOS())
165 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
166 else
167 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
168 Str);
169
170 } else if (Triple.isWatchOS()) {
171 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
172 char Str[6];
173 Str[0] = '0' + Maj;
174 Str[1] = '0' + (Min / 10);
175 Str[2] = '0' + (Min % 10);
176 Str[3] = '0' + (Rev / 10);
177 Str[4] = '0' + (Rev % 10);
178 Str[5] = '\0';
179 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000180 } else if (Triple.isMacOSX()) {
181 // Note that the Driver allows versions which aren't representable in the
182 // define (because we only get a single digit for the minor and micro
183 // revision numbers). So, we limit them to the maximum representable
184 // version.
185 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000186 char Str[7];
187 if (Maj < 10 || (Maj == 10 && Min < 10)) {
188 Str[0] = '0' + (Maj / 10);
189 Str[1] = '0' + (Maj % 10);
190 Str[2] = '0' + std::min(Min, 9U);
191 Str[3] = '0' + std::min(Rev, 9U);
192 Str[4] = '\0';
193 } else {
194 // Handle versions > 10.9.
195 Str[0] = '0' + (Maj / 10);
196 Str[1] = '0' + (Maj % 10);
197 Str[2] = '0' + (Min / 10);
198 Str[3] = '0' + (Min % 10);
199 Str[4] = '0' + (Rev / 10);
200 Str[5] = '0' + (Rev % 10);
201 Str[6] = '\0';
202 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000203 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000204 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000205
Tim Northover157d9112014-01-16 08:48:16 +0000206 // Tell users about the kernel if there is one.
207 if (Triple.isOSDarwin())
208 Builder.defineMacro("__MACH__");
209
Daniel Dunbarecf13562011-04-19 21:40:34 +0000210 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000211}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213template<typename Target>
214class DarwinTargetInfo : public OSTargetInfo<Target> {
215protected:
Craig Topper3164f332014-03-11 03:39:26 +0000216 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
217 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000218 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000219 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220 }
Mike Stump11289f42009-09-09 15:08:12 +0000221
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000223 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000224 // By default, no TLS, and we whitelist permitted architecture/OS
225 // combinations.
226 this->TLSSupported = false;
227
228 if (Triple.isMacOSX())
229 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
230 else if (Triple.isiOS()) {
231 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
232 if (Triple.getArch() == llvm::Triple::x86_64 ||
233 Triple.getArch() == llvm::Triple::aarch64)
234 this->TLSSupported = !Triple.isOSVersionLT(8);
235 else if (Triple.getArch() == llvm::Triple::x86 ||
236 Triple.getArch() == llvm::Triple::arm ||
237 Triple.getArch() == llvm::Triple::thumb)
238 this->TLSSupported = !Triple.isOSVersionLT(9);
239 } else if (Triple.isWatchOS())
240 this->TLSSupported = !Triple.isOSVersionLT(2);
241
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000242 this->MCountName = "\01mcount";
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244
Craig Topper3164f332014-03-11 03:39:26 +0000245 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000246 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000247 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000248 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000249 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000250 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000251 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000255 // FIXME: We should return 0 when building kexts.
256 return "__TEXT,__StaticInit,regular,pure_instructions";
257 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000258
John McCalleed64c72012-01-29 01:20:30 +0000259 /// Darwin does not support protected visibility. Darwin's "default"
260 /// is very similar to ELF's "protected"; Darwin requires a "weak"
261 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000262 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000263 return false;
264 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000265};
266
Chris Lattner30ba6742009-08-10 19:03:04 +0000267
Torok Edwinb2b37c62009-06-30 17:10:35 +0000268// DragonFlyBSD Target
269template<typename Target>
270class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
271protected:
Craig Topper3164f332014-03-11 03:39:26 +0000272 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
273 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000275 Builder.defineMacro("__DragonFly__");
276 Builder.defineMacro("__DragonFly_cc_version", "100001");
277 Builder.defineMacro("__ELF__");
278 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
279 Builder.defineMacro("__tune_i386__");
280 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281 }
282public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000283 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
284 : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 switch (Triple.getArch()) {
286 default:
287 case llvm::Triple::x86:
288 case llvm::Triple::x86_64:
289 this->MCountName = ".mcount";
290 break;
291 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000292 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000293};
294
295// FreeBSD Target
296template<typename Target>
297class FreeBSDTargetInfo : public OSTargetInfo<Target> {
298protected:
Craig Topper3164f332014-03-11 03:39:26 +0000299 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
300 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000301 // FreeBSD defines; list based off of gcc output
302
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000303 unsigned Release = Triple.getOSMajorVersion();
304 if (Release == 0U)
305 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000307 Builder.defineMacro("__FreeBSD__", Twine(Release));
308 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000309 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
310 DefineStd(Builder, "unix", Opts);
311 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000312
313 // On FreeBSD, wchar_t contains the number of the code point as
314 // used by the character set of the locale. These character sets are
315 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000316 //
317 // FIXME: This is wrong; the macro refers to the numerical values
318 // of wchar_t *literals*, which are not locale-dependent. However,
319 // FreeBSD systems apparently depend on us getting this wrong, and
320 // setting this to 1 is conforming even if all the basic source
321 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000322 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000323 }
324public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000325 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 switch (Triple.getArch()) {
327 default:
328 case llvm::Triple::x86:
329 case llvm::Triple::x86_64:
330 this->MCountName = ".mcount";
331 break;
332 case llvm::Triple::mips:
333 case llvm::Triple::mipsel:
334 case llvm::Triple::ppc:
335 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000336 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000337 this->MCountName = "_mcount";
338 break;
339 case llvm::Triple::arm:
340 this->MCountName = "__mcount";
341 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000342 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000344};
345
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000346// GNU/kFreeBSD Target
347template<typename Target>
348class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
349protected:
Craig Topper3164f332014-03-11 03:39:26 +0000350 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
351 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000352 // GNU/kFreeBSD defines; list based off of gcc output
353
354 DefineStd(Builder, "unix", Opts);
355 Builder.defineMacro("__FreeBSD_kernel__");
356 Builder.defineMacro("__GLIBC__");
357 Builder.defineMacro("__ELF__");
358 if (Opts.POSIXThreads)
359 Builder.defineMacro("_REENTRANT");
360 if (Opts.CPlusPlus)
361 Builder.defineMacro("_GNU_SOURCE");
362 }
363public:
Eric Christopher917e9522014-11-18 22:36:15 +0000364 KFreeBSDTargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000365 : OSTargetInfo<Target>(Triple) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000366};
367
Chris Lattner3e2ee142010-07-07 16:01:42 +0000368// Minix Target
369template<typename Target>
370class MinixTargetInfo : public OSTargetInfo<Target> {
371protected:
Craig Topper3164f332014-03-11 03:39:26 +0000372 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
373 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000374 // Minix defines
375
376 Builder.defineMacro("__minix", "3");
377 Builder.defineMacro("_EM_WSIZE", "4");
378 Builder.defineMacro("_EM_PSIZE", "4");
379 Builder.defineMacro("_EM_SSIZE", "2");
380 Builder.defineMacro("_EM_LSIZE", "4");
381 Builder.defineMacro("_EM_FSIZE", "4");
382 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000383 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000384 DefineStd(Builder, "unix", Opts);
385 }
386public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000387 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000388};
389
Torok Edwinb2b37c62009-06-30 17:10:35 +0000390// Linux target
391template<typename Target>
392class LinuxTargetInfo : public OSTargetInfo<Target> {
393protected:
Craig Topper3164f332014-03-11 03:39:26 +0000394 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
395 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000396 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000397 DefineStd(Builder, "unix", Opts);
398 DefineStd(Builder, "linux", Opts);
399 Builder.defineMacro("__gnu_linux__");
400 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000401 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000402 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000403 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000404 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000405 this->PlatformName = "android";
406 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
407 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000408 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000409 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000410 if (Opts.CPlusPlus)
411 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000412 }
413public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000414 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000415 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000416
417 switch (Triple.getArch()) {
418 default:
419 break;
420 case llvm::Triple::ppc:
421 case llvm::Triple::ppc64:
422 case llvm::Triple::ppc64le:
423 this->MCountName = "_mcount";
424 break;
425 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000426 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000427
Craig Topper3164f332014-03-11 03:39:26 +0000428 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000429 return ".text.startup";
430 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431};
432
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000433// NetBSD Target
434template<typename Target>
435class NetBSDTargetInfo : public OSTargetInfo<Target> {
436protected:
Craig Topper3164f332014-03-11 03:39:26 +0000437 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
438 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000439 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000440 Builder.defineMacro("__NetBSD__");
441 Builder.defineMacro("__unix__");
442 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000443 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000444 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000445
446 switch (Triple.getArch()) {
447 default:
448 break;
449 case llvm::Triple::arm:
450 case llvm::Triple::armeb:
451 case llvm::Triple::thumb:
452 case llvm::Triple::thumbeb:
453 Builder.defineMacro("__ARM_DWARF_EH__");
454 break;
455 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000456 }
457public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000458 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000459 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000460 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000461};
462
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463// OpenBSD Target
464template<typename Target>
465class OpenBSDTargetInfo : public OSTargetInfo<Target> {
466protected:
Craig Topper3164f332014-03-11 03:39:26 +0000467 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
468 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000469 // OpenBSD defines; list based off of gcc output
470
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000471 Builder.defineMacro("__OpenBSD__");
472 DefineStd(Builder, "unix", Opts);
473 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000474 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000475 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000476 }
477public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000478 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000479 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000480
Eli Friedman3715d1f2011-12-15 02:15:56 +0000481 switch (Triple.getArch()) {
482 default:
483 case llvm::Triple::x86:
484 case llvm::Triple::x86_64:
485 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000486 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000487 this->MCountName = "__mcount";
488 break;
489 case llvm::Triple::mips64:
490 case llvm::Triple::mips64el:
491 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000492 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000493 this->MCountName = "_mcount";
494 break;
495 }
496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497};
498
Eli Friedman9fa28852012-08-08 23:57:20 +0000499// Bitrig Target
500template<typename Target>
501class BitrigTargetInfo : public OSTargetInfo<Target> {
502protected:
Craig Topper3164f332014-03-11 03:39:26 +0000503 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
504 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000505 // Bitrig defines; list based off of gcc output
506
507 Builder.defineMacro("__Bitrig__");
508 DefineStd(Builder, "unix", Opts);
509 Builder.defineMacro("__ELF__");
510 if (Opts.POSIXThreads)
511 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000512
513 switch (Triple.getArch()) {
514 default:
515 break;
516 case llvm::Triple::arm:
517 case llvm::Triple::armeb:
518 case llvm::Triple::thumb:
519 case llvm::Triple::thumbeb:
520 Builder.defineMacro("__ARM_DWARF_EH__");
521 break;
522 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000523 }
524public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000525 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000526 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000527 }
528};
529
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000530// PSP Target
531template<typename Target>
532class PSPTargetInfo : public OSTargetInfo<Target> {
533protected:
Craig Topper3164f332014-03-11 03:39:26 +0000534 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
535 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000536 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000537 Builder.defineMacro("PSP");
538 Builder.defineMacro("_PSP");
539 Builder.defineMacro("__psp__");
540 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000541 }
542public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000543 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000544};
545
John Thompsone467e192009-11-19 17:18:50 +0000546// PS3 PPU Target
547template<typename Target>
548class PS3PPUTargetInfo : public OSTargetInfo<Target> {
549protected:
Craig Topper3164f332014-03-11 03:39:26 +0000550 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
551 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000552 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000553 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000554 Builder.defineMacro("__PPU__");
555 Builder.defineMacro("__CELLOS_LV2__");
556 Builder.defineMacro("__ELF__");
557 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000558 Builder.defineMacro("_ARCH_PPC64");
559 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000560 }
561public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000562 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000563 this->LongWidth = this->LongAlign = 32;
564 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000565 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000566 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000567 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000568 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000569 }
570};
571
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000572template <typename Target>
573class PS4OSTargetInfo : public OSTargetInfo<Target> {
574protected:
575 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
576 MacroBuilder &Builder) const override {
577 Builder.defineMacro("__FreeBSD__", "9");
578 Builder.defineMacro("__FreeBSD_cc_version", "900001");
579 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
580 DefineStd(Builder, "unix", Opts);
581 Builder.defineMacro("__ELF__");
582 Builder.defineMacro("__PS4__");
583 }
584public:
585 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
586 this->WCharType = this->UnsignedShort;
587
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000588 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
589 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000590
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000591 // On PS4, do not honor explicit bit field alignment,
592 // as in "__attribute__((aligned(2))) int b : 1;".
593 this->UseExplicitBitFieldAlignment = false;
594
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000595 switch (Triple.getArch()) {
596 default:
597 case llvm::Triple::x86_64:
598 this->MCountName = ".mcount";
599 break;
600 }
601 }
602};
603
Torok Edwinb2b37c62009-06-30 17:10:35 +0000604// Solaris target
605template<typename Target>
606class SolarisTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000610 DefineStd(Builder, "sun", Opts);
611 DefineStd(Builder, "unix", Opts);
612 Builder.defineMacro("__ELF__");
613 Builder.defineMacro("__svr4__");
614 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000615 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
616 // newer, but to 500 for everything else. feature_test.h has a check to
617 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000618 // with a new version.
619 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000620 Builder.defineMacro("_XOPEN_SOURCE", "600");
621 else
622 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000623 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000624 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000625 Builder.defineMacro("_LARGEFILE_SOURCE");
626 Builder.defineMacro("_LARGEFILE64_SOURCE");
627 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000628 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000629 }
630public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000631 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
David Chisnallb526e932012-03-28 18:04:14 +0000632 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000633 // FIXME: WIntType should be SignedLong
634 }
635};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636
637// Windows target
638template<typename Target>
639class WindowsTargetInfo : public OSTargetInfo<Target> {
640protected:
Craig Topper3164f332014-03-11 03:39:26 +0000641 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
642 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000643 Builder.defineMacro("_WIN32");
644 }
645 void getVisualStudioDefines(const LangOptions &Opts,
646 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000647 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000648 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000649 Builder.defineMacro("_CPPRTTI");
650
Reid Kleckner16514352015-01-30 21:42:55 +0000651 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000652 Builder.defineMacro("_CPPUNWIND");
653 }
654
David Majnemer6a658902015-07-22 22:36:26 +0000655 if (Opts.Bool)
656 Builder.defineMacro("__BOOL_DEFINED");
657
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000658 if (!Opts.CharIsSigned)
659 Builder.defineMacro("_CHAR_UNSIGNED");
660
661 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
662 // but it works for now.
663 if (Opts.POSIXThreads)
664 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000665
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000666 if (Opts.MSCompatibilityVersion) {
667 Builder.defineMacro("_MSC_VER",
668 Twine(Opts.MSCompatibilityVersion / 100000));
669 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000670 // FIXME We cannot encode the revision information into 32-bits
671 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000672
David Majnemerb710a932015-05-11 03:57:49 +0000673 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000674 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000675 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000676
677 if (Opts.MicrosoftExt) {
678 Builder.defineMacro("_MSC_EXTENSIONS");
679
680 if (Opts.CPlusPlus11) {
681 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
682 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
683 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
684 }
685 }
686
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000687 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000688 }
689
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000690public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000691 WindowsTargetInfo(const llvm::Triple &Triple)
692 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000693};
694
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000695template <typename Target>
696class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000697protected:
Craig Topper3164f332014-03-11 03:39:26 +0000698 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
699 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000700 if (Opts.POSIXThreads)
701 Builder.defineMacro("_REENTRANT");
702 if (Opts.CPlusPlus)
703 Builder.defineMacro("_GNU_SOURCE");
704
705 DefineStd(Builder, "unix", Opts);
706 Builder.defineMacro("__ELF__");
707 Builder.defineMacro("__native_client__");
708 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000709
710public:
711 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000712 this->LongAlign = 32;
713 this->LongWidth = 32;
714 this->PointerAlign = 32;
715 this->PointerWidth = 32;
716 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000717 this->Int64Type = TargetInfo::SignedLongLong;
718 this->DoubleAlign = 64;
719 this->LongDoubleWidth = 64;
720 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000721 this->LongLongWidth = 64;
722 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000723 this->SizeType = TargetInfo::UnsignedInt;
724 this->PtrDiffType = TargetInfo::SignedInt;
725 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000726 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000727 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000728 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000729 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000731 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000732 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000733 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000734 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000735 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000736 } else {
737 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000738 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000739 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000740 }
741};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000742
Dan Gohmanc2853072015-09-03 22:51:53 +0000743// WebAssembly target
744template <typename Target>
745class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
746 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000747 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000748 // A common platform macro.
749 if (Opts.POSIXThreads)
750 Builder.defineMacro("_REENTRANT");
751 // Follow g++ convention and predefine _GNU_SOURCE for C++.
752 if (Opts.CPlusPlus)
753 Builder.defineMacro("_GNU_SOURCE");
754 }
755
756 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000757 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000758 return ".text.__startup";
759 }
760
761public:
762 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
763 : OSTargetInfo<Target>(Triple) {
764 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000765 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
766 }
767};
Dan Gohmanc2853072015-09-03 22:51:53 +0000768
Chris Lattner09d98f52008-10-05 21:50:58 +0000769//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000770// Specific target implementations.
771//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000772
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000773// PPC abstract base class
774class PPCTargetInfo : public TargetInfo {
775 static const Builtin::Info BuiltinInfo[];
776 static const char * const GCCRegNames[];
777 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000778 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000779
780 // Target cpu features.
781 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000782 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000783 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000784 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000785 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000786 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000787 bool HasBPERMD;
788 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000789
Ulrich Weigand8afad612014-07-28 13:17:52 +0000790protected:
791 std::string ABI;
792
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000793public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000794 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000795 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000796 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000797 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000798 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000799 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000800 LongDoubleWidth = LongDoubleAlign = 128;
801 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
802 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000803
Hal Finkel6b984f02012-07-03 16:51:04 +0000804 /// \brief Flags for architecture specific defines.
805 typedef enum {
806 ArchDefineNone = 0,
807 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
808 ArchDefinePpcgr = 1 << 1,
809 ArchDefinePpcsq = 1 << 2,
810 ArchDefine440 = 1 << 3,
811 ArchDefine603 = 1 << 4,
812 ArchDefine604 = 1 << 5,
813 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000814 ArchDefinePwr5 = 1 << 7,
815 ArchDefinePwr5x = 1 << 8,
816 ArchDefinePwr6 = 1 << 9,
817 ArchDefinePwr6x = 1 << 10,
818 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000819 ArchDefinePwr8 = 1 << 12,
820 ArchDefineA2 = 1 << 13,
821 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000822 } ArchDefineTypes;
823
Bill Schmidt38378a02013-02-01 20:23:10 +0000824 // Note: GCC recognizes the following additional cpus:
825 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
826 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
827 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000828 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000829 bool CPUKnown = llvm::StringSwitch<bool>(Name)
830 .Case("generic", true)
831 .Case("440", true)
832 .Case("450", true)
833 .Case("601", true)
834 .Case("602", true)
835 .Case("603", true)
836 .Case("603e", true)
837 .Case("603ev", true)
838 .Case("604", true)
839 .Case("604e", true)
840 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000841 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000842 .Case("g3", true)
843 .Case("7400", true)
844 .Case("g4", true)
845 .Case("7450", true)
846 .Case("g4+", true)
847 .Case("750", true)
848 .Case("970", true)
849 .Case("g5", true)
850 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000851 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000852 .Case("e500mc", true)
853 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000854 .Case("power3", true)
855 .Case("pwr3", true)
856 .Case("power4", true)
857 .Case("pwr4", true)
858 .Case("power5", true)
859 .Case("pwr5", true)
860 .Case("power5x", true)
861 .Case("pwr5x", true)
862 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("power6x", true)
865 .Case("pwr6x", true)
866 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000867 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000868 .Case("power8", true)
869 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000870 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000871 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000872 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000873 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000874 .Case("powerpc64le", true)
875 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000876 .Default(false);
877
878 if (CPUKnown)
879 CPU = Name;
880
881 return CPUKnown;
882 }
883
Ulrich Weigand8afad612014-07-28 13:17:52 +0000884
885 StringRef getABI() const override { return ABI; }
886
Craig Topper6c03a542015-10-19 04:51:35 +0000887 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
888 return llvm::makeArrayRef(BuiltinInfo,
889 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000890 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000891
Craig Topper3164f332014-03-11 03:39:26 +0000892 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000893
Craig Topper3164f332014-03-11 03:39:26 +0000894 void getTargetDefines(const LangOptions &Opts,
895 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000896
Eric Christopher8c47b422015-10-09 18:39:55 +0000897 bool
898 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
899 StringRef CPU,
900 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000901
Craig Topper3164f332014-03-11 03:39:26 +0000902 bool handleTargetFeatures(std::vector<std::string> &Features,
903 DiagnosticsEngine &Diags) override;
904 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000905 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
906 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000907
Craig Topperf054e3a2015-10-19 03:52:27 +0000908 ArrayRef<const char *> getGCCRegNames() const override;
909 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000910 bool validateAsmConstraint(const char *&Name,
911 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000912 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000913 default: return false;
914 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000915 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000916 case 'b': // Base register
917 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000918 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000919 break;
920 // FIXME: The following are added to allow parsing.
921 // I just took a guess at what the actions should be.
922 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000924 case 'v': // Altivec vector register
925 Info.setAllowsRegister();
926 break;
927 case 'w':
928 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 case 'd':// VSX vector register to hold vector double data
930 case 'f':// VSX vector register to hold vector float data
931 case 's':// VSX vector register to hold scalar float data
932 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000933 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000934 break;
935 default:
936 return false;
937 }
938 Info.setAllowsRegister();
939 Name++; // Skip over 'w'.
940 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 case 'h': // `MQ', `CTR', or `LINK' register
942 case 'q': // `MQ' register
943 case 'c': // `CTR' register
944 case 'l': // `LINK' register
945 case 'x': // `CR' register (condition register) number 0
946 case 'y': // `CR' register (condition register)
947 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000948 Info.setAllowsRegister();
949 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000951 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000952 // (use `L' instead for SImode constants)
953 case 'K': // Unsigned 16-bit constant
954 case 'L': // Signed 16-bit constant shifted left 16 bits
955 case 'M': // Constant larger than 31
956 case 'N': // Exact power of 2
957 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000960 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000962 break;
963 case 'm': // Memory operand. Note that on PowerPC targets, m can
964 // include addresses that update the base register. It
965 // is therefore only safe to use `m' in an asm statement
966 // if that asm statement accesses the operand exactly once.
967 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000968 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000970 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000972 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
973 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 // register to be updated.
975 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000976 if (Name[1] != 's')
977 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000978 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000979 // include any automodification of the base register. Unlike
980 // `m', this constraint can be used in asm statements that
981 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000982 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000983 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000984 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000985 break;
986 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000987 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000988 case 'Z': // Memory operand that is an indexed or indirect from a
989 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000991 Info.setAllowsMemory();
992 Info.setAllowsRegister();
993 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // register (`p' is preferable for asm statements)
997 case 'S': // Constant suitable as a 64-bit mask operand
998 case 'T': // Constant suitable as a 32-bit mask operand
999 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001000 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 // instructions
1002 case 'W': // Vector constant that does not require memory
1003 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001004 break;
1005 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001006 }
John Thompson07a61a42010-06-24 22:44:13 +00001007 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001008 }
Craig Topper3164f332014-03-11 03:39:26 +00001009 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001010 std::string R;
1011 switch (*Constraint) {
1012 case 'e':
1013 case 'w':
1014 // Two-character constraint; add "^" hint for later parsing.
1015 R = std::string("^") + std::string(Constraint, 2);
1016 Constraint++;
1017 break;
1018 default:
1019 return TargetInfo::convertConstraint(Constraint);
1020 }
1021 return R;
1022 }
Craig Topper3164f332014-03-11 03:39:26 +00001023 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001024 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 }
Craig Topper3164f332014-03-11 03:39:26 +00001026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001027 if (RegNo == 0) return 3;
1028 if (RegNo == 1) return 4;
1029 return -1;
1030 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001031
1032 bool hasSjLjLowering() const override {
1033 return true;
1034 }
David Majnemer2617ea62015-06-09 18:05:33 +00001035
1036 bool useFloat128ManglingForLongDouble() const override {
1037 return LongDoubleWidth == 128 &&
1038 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1039 getTriple().isOSBinFormatELF();
1040 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001041};
Anders Carlssonf511f642007-11-27 04:11:28 +00001042
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001043const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001044#define BUILTIN(ID, TYPE, ATTRS) \
1045 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1046#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1047 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001048#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001049};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001050
Eric Christopher917e9522014-11-18 22:36:15 +00001051/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001053bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001055 for (const auto &Feature : Features) {
1056 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001059 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001061 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001063 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001064 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001065 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001066 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001067 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001068 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001069 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001070 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001071 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001072 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001073 // TODO: Finish this list and add an assert that we've handled them
1074 // all.
1075 }
Eric Christopher02c33352015-08-25 00:59:11 +00001076
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001077 return true;
1078}
1079
Chris Lattnerecd49032009-03-02 22:27:17 +00001080/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1081/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001082void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001084 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001086 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001088 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001089 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001091 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001092 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001093 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001094 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001095 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001098 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1099 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001100 } else {
1101 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1102 getTriple().getOS() != llvm::Triple::OpenBSD)
1103 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001104 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001105
Ulrich Weigand8afad612014-07-28 13:17:52 +00001106 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001107 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001108 Builder.defineMacro("_CALL_ELF", "1");
1109 if (ABI == "elfv2")
1110 Builder.defineMacro("_CALL_ELF", "2");
1111
Chris Lattnerecd49032009-03-02 22:27:17 +00001112 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1114 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001115
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001117 if (LongDoubleWidth == 128)
1118 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001119
John Thompsone467e192009-11-19 17:18:50 +00001120 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001121 Builder.defineMacro("__VEC__", "10206");
1122 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001123 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001124
1125 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001126 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1127 .Case("440", ArchDefineName)
1128 .Case("450", ArchDefineName | ArchDefine440)
1129 .Case("601", ArchDefineName)
1130 .Case("602", ArchDefineName | ArchDefinePpcgr)
1131 .Case("603", ArchDefineName | ArchDefinePpcgr)
1132 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1133 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1134 .Case("604", ArchDefineName | ArchDefinePpcgr)
1135 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1136 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001137 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001138 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1139 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1140 .Case("750", ArchDefineName | ArchDefinePpcgr)
1141 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001143 .Case("a2", ArchDefineA2)
1144 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001145 .Case("pwr3", ArchDefinePpcgr)
1146 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1147 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1148 | ArchDefinePpcsq)
1149 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1150 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1152 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1154 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1157 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001158 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1160 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1161 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 .Case("power3", ArchDefinePpcgr)
1163 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1165 | ArchDefinePpcsq)
1166 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1167 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1169 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1171 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1174 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001175 | ArchDefinePpcgr | ArchDefinePpcsq)
1176 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1177 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1178 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001179 .Default(ArchDefineNone);
1180
1181 if (defs & ArchDefineName)
1182 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1183 if (defs & ArchDefinePpcgr)
1184 Builder.defineMacro("_ARCH_PPCGR");
1185 if (defs & ArchDefinePpcsq)
1186 Builder.defineMacro("_ARCH_PPCSQ");
1187 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001188 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 if (defs & ArchDefine603)
1190 Builder.defineMacro("_ARCH_603");
1191 if (defs & ArchDefine604)
1192 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001193 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001194 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001195 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 if (defs & ArchDefinePwr5x)
1198 Builder.defineMacro("_ARCH_PWR5X");
1199 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001200 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001201 if (defs & ArchDefinePwr6x)
1202 Builder.defineMacro("_ARCH_PWR6X");
1203 if (defs & ArchDefinePwr7)
1204 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001205 if (defs & ArchDefinePwr8)
1206 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001207 if (defs & ArchDefineA2)
1208 Builder.defineMacro("_ARCH_A2");
1209 if (defs & ArchDefineA2q) {
1210 Builder.defineMacro("_ARCH_A2Q");
1211 Builder.defineMacro("_ARCH_QP");
1212 }
1213
1214 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1215 Builder.defineMacro("__bg__");
1216 Builder.defineMacro("__THW_BLUEGENE__");
1217 Builder.defineMacro("__bgq__");
1218 Builder.defineMacro("__TOS_BGQ__");
1219 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001220
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001221 if (HasVSX)
1222 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001223 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001224 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001225 if (HasP8Crypto)
1226 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001227 if (HasHTM)
1228 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001229
1230 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1231 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1232 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1233 if (PointerWidth == 64)
1234 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001235
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 // FIXME: The following are not yet generated here by Clang, but are
1237 // generated by GCC:
1238 //
1239 // _SOFT_FLOAT_
1240 // __RECIP_PRECISION__
1241 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 // __RECIP__
1243 // __RECIPF__
1244 // __RSQRTE__
1245 // __RSQRTEF__
1246 // _SOFT_DOUBLE_
1247 // __NO_LWSYNC__
1248 // __HAVE_BSWAP__
1249 // __LONGDOUBLE128
1250 // __CMODEL_MEDIUM__
1251 // __CMODEL_LARGE__
1252 // _CALL_SYSV
1253 // _CALL_DARWIN
1254 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001255}
1256
Eric Christophera8a14c32015-08-31 18:39:16 +00001257// Handle explicit options being passed to the compiler here: if we've
1258// explicitly turned off vsx and turned on power8-vector or direct-move then
1259// go ahead and error since the customer has expressed a somewhat incompatible
1260// set of options.
1261static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001262 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001263
1264 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1265 FeaturesVec.end()) {
1266 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1267 FeaturesVec.end()) {
1268 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1269 << "-mno-vsx";
1270 return false;
1271 }
1272
1273 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1274 FeaturesVec.end()) {
1275 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1276 << "-mno-vsx";
1277 return false;
1278 }
1279 }
1280
1281 return true;
1282}
1283
Eric Christopher8c47b422015-10-09 18:39:55 +00001284bool PPCTargetInfo::initFeatureMap(
1285 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1286 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001287 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1288 .Case("7400", true)
1289 .Case("g4", true)
1290 .Case("7450", true)
1291 .Case("g4+", true)
1292 .Case("970", true)
1293 .Case("g5", true)
1294 .Case("pwr6", true)
1295 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001296 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001297 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001298 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001299 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001300
1301 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001302 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1303 .Case("ppc64le", true)
1304 .Case("pwr8", true)
1305 .Default(false);
1306 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1307 .Case("ppc64le", true)
1308 .Case("pwr8", true)
1309 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001310 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1311 .Case("ppc64le", true)
1312 .Case("pwr8", true)
1313 .Case("pwr7", true)
1314 .Default(false);
1315 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1316 .Case("ppc64le", true)
1317 .Case("pwr8", true)
1318 .Case("pwr7", true)
1319 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001320 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1321 .Case("ppc64le", true)
1322 .Case("pwr8", true)
1323 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001324 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1325 .Case("ppc64le", true)
1326 .Case("pwr8", true)
1327 .Case("pwr7", true)
1328 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001329
Eric Christophera8a14c32015-08-31 18:39:16 +00001330 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1331 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001332
Eric Christopher007b0a02015-08-28 22:32:01 +00001333 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001334}
1335
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001336bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001337 return llvm::StringSwitch<bool>(Feature)
1338 .Case("powerpc", true)
1339 .Case("vsx", HasVSX)
1340 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001341 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001342 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001343 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001344 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001345 .Case("bpermd", HasBPERMD)
1346 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001347 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001348}
Chris Lattner17df24e2008-04-21 18:56:49 +00001349
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001350void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1351 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001352 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1353 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1354 // incompatible options.
1355 if (Enabled) {
1356 if (Name == "vsx") {
1357 Features[Name] = true;
1358 } else if (Name == "direct-move") {
1359 Features[Name] = Features["vsx"] = true;
1360 } else if (Name == "power8-vector") {
1361 Features[Name] = Features["vsx"] = true;
1362 } else {
1363 Features[Name] = true;
1364 }
1365 } else {
1366 if (Name == "vsx") {
1367 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1368 false;
1369 } else {
1370 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001371 }
1372 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001373}
1374
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001375const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001376 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1378 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1379 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1380 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1381 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1382 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1383 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001385 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001387 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1388 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1389 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1390 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001391 "vrsave", "vscr",
1392 "spe_acc", "spefscr",
1393 "sfp"
1394};
Chris Lattner10a5b382007-01-29 05:24:35 +00001395
Craig Topperf054e3a2015-10-19 03:52:27 +00001396ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1397 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001398}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001399
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001400const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1401 // While some of these aliases do map to different registers
1402 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001403 { { "0" }, "r0" },
1404 { { "1"}, "r1" },
1405 { { "2" }, "r2" },
1406 { { "3" }, "r3" },
1407 { { "4" }, "r4" },
1408 { { "5" }, "r5" },
1409 { { "6" }, "r6" },
1410 { { "7" }, "r7" },
1411 { { "8" }, "r8" },
1412 { { "9" }, "r9" },
1413 { { "10" }, "r10" },
1414 { { "11" }, "r11" },
1415 { { "12" }, "r12" },
1416 { { "13" }, "r13" },
1417 { { "14" }, "r14" },
1418 { { "15" }, "r15" },
1419 { { "16" }, "r16" },
1420 { { "17" }, "r17" },
1421 { { "18" }, "r18" },
1422 { { "19" }, "r19" },
1423 { { "20" }, "r20" },
1424 { { "21" }, "r21" },
1425 { { "22" }, "r22" },
1426 { { "23" }, "r23" },
1427 { { "24" }, "r24" },
1428 { { "25" }, "r25" },
1429 { { "26" }, "r26" },
1430 { { "27" }, "r27" },
1431 { { "28" }, "r28" },
1432 { { "29" }, "r29" },
1433 { { "30" }, "r30" },
1434 { { "31" }, "r31" },
1435 { { "fr0" }, "f0" },
1436 { { "fr1" }, "f1" },
1437 { { "fr2" }, "f2" },
1438 { { "fr3" }, "f3" },
1439 { { "fr4" }, "f4" },
1440 { { "fr5" }, "f5" },
1441 { { "fr6" }, "f6" },
1442 { { "fr7" }, "f7" },
1443 { { "fr8" }, "f8" },
1444 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001445 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001446 { { "fr11" }, "f11" },
1447 { { "fr12" }, "f12" },
1448 { { "fr13" }, "f13" },
1449 { { "fr14" }, "f14" },
1450 { { "fr15" }, "f15" },
1451 { { "fr16" }, "f16" },
1452 { { "fr17" }, "f17" },
1453 { { "fr18" }, "f18" },
1454 { { "fr19" }, "f19" },
1455 { { "fr20" }, "f20" },
1456 { { "fr21" }, "f21" },
1457 { { "fr22" }, "f22" },
1458 { { "fr23" }, "f23" },
1459 { { "fr24" }, "f24" },
1460 { { "fr25" }, "f25" },
1461 { { "fr26" }, "f26" },
1462 { { "fr27" }, "f27" },
1463 { { "fr28" }, "f28" },
1464 { { "fr29" }, "f29" },
1465 { { "fr30" }, "f30" },
1466 { { "fr31" }, "f31" },
1467 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001468};
1469
Craig Topperf054e3a2015-10-19 03:52:27 +00001470ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1471 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001472}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001473
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001474class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001476 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001477 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001478
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001479 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001480 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001481 case llvm::Triple::FreeBSD:
1482 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001483 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001484 PtrDiffType = SignedInt;
1485 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001486 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001487 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001488 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001489 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001490
Roman Divacky3ffe7462012-03-13 19:20:17 +00001491 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1492 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001493 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001494 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001495
1496 // PPC32 supports atomics up to 4 bytes.
1497 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001498 }
1499
Craig Topper3164f332014-03-11 03:39:26 +00001500 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001501 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001502 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001503 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001504};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001505
Bill Schmidt778d3872013-07-26 01:36:11 +00001506// Note: ABI differences may eventually require us to have a separate
1507// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001508class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001510 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001511 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001512 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001513 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001514
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001515 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001516 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001517 ABI = "elfv2";
1518 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001519 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001520 ABI = "elfv1";
1521 }
1522
1523 switch (getTriple().getOS()) {
1524 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001525 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001526 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001527 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001528 case llvm::Triple::NetBSD:
1529 IntMaxType = SignedLongLong;
1530 Int64Type = SignedLongLong;
1531 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001532 default:
1533 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001534 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001535
1536 // PPC64 supports atomics up to 8 bytes.
1537 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001538 }
Craig Topper3164f332014-03-11 03:39:26 +00001539 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001540 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001541 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001542 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001543 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001544 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001545 ABI = Name;
1546 return true;
1547 }
1548 return false;
1549 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001551
Roman Divacky965b0b72011-01-06 08:27:10 +00001552class DarwinPPC32TargetInfo :
1553 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001555 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1556 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001557 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001558 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001559 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001560 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001561 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001562 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001563 }
Craig Topper3164f332014-03-11 03:39:26 +00001564 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001565 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001566 }
1567};
1568
1569class DarwinPPC64TargetInfo :
1570 public DarwinTargetInfo<PPC64TargetInfo> {
1571public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001572 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1573 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001574 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001575 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001576 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001577 }
1578};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001579
Eric Christopherc48497a2015-09-18 21:26:24 +00001580static const unsigned NVPTXAddrSpaceMap[] = {
1581 1, // opencl_global
1582 3, // opencl_local
1583 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001584 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001585 0, // opencl_generic
1586 1, // cuda_device
1587 4, // cuda_constant
1588 3, // cuda_shared
1589};
1590
1591class NVPTXTargetInfo : public TargetInfo {
1592 static const char *const GCCRegNames[];
1593 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001594
1595 // The GPU profiles supported by the NVPTX backend
1596 enum GPUKind {
1597 GK_NONE,
1598 GK_SM20,
1599 GK_SM21,
1600 GK_SM30,
1601 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001602 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001603 } GPU;
1604
Eric Christopherc48497a2015-09-18 21:26:24 +00001605public:
1606 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1607 BigEndian = false;
1608 TLSSupported = false;
1609 LongWidth = LongAlign = 64;
1610 AddrSpaceMap = &NVPTXAddrSpaceMap;
1611 UseAddrSpaceMapMangling = true;
1612 // Define available target features
1613 // These must be defined in sorted order!
1614 NoAsmVariants = true;
1615 // Set the default GPU to sm20
1616 GPU = GK_SM20;
1617 }
1618 void getTargetDefines(const LangOptions &Opts,
1619 MacroBuilder &Builder) const override {
1620 Builder.defineMacro("__PTX__");
1621 Builder.defineMacro("__NVPTX__");
1622 if (Opts.CUDAIsDevice) {
1623 // Set __CUDA_ARCH__ for the GPU specified.
1624 std::string CUDAArchCode;
1625 switch (GPU) {
1626 case GK_SM20:
1627 CUDAArchCode = "200";
1628 break;
1629 case GK_SM21:
1630 CUDAArchCode = "210";
1631 break;
1632 case GK_SM30:
1633 CUDAArchCode = "300";
1634 break;
1635 case GK_SM35:
1636 CUDAArchCode = "350";
1637 break;
1638 case GK_SM37:
1639 CUDAArchCode = "370";
1640 break;
1641 default:
1642 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001643 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001644 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001646 }
Craig Topper6c03a542015-10-19 04:51:35 +00001647 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1648 return llvm::makeArrayRef(BuiltinInfo,
1649 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001650 }
1651 bool hasFeature(StringRef Feature) const override {
1652 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001653 }
1654
Craig Topperf054e3a2015-10-19 03:52:27 +00001655 ArrayRef<const char *> getGCCRegNames() const override;
1656 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001657 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001658 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001659 }
1660 bool validateAsmConstraint(const char *&Name,
1661 TargetInfo::ConstraintInfo &Info) const override {
1662 switch (*Name) {
1663 default:
1664 return false;
1665 case 'c':
1666 case 'h':
1667 case 'r':
1668 case 'l':
1669 case 'f':
1670 case 'd':
1671 Info.setAllowsRegister();
1672 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001673 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 }
1675 const char *getClobbers() const override {
1676 // FIXME: Is this really right?
1677 return "";
1678 }
1679 BuiltinVaListKind getBuiltinVaListKind() const override {
1680 // FIXME: implement
1681 return TargetInfo::CharPtrBuiltinVaList;
1682 }
1683 bool setCPU(const std::string &Name) override {
1684 GPU = llvm::StringSwitch<GPUKind>(Name)
1685 .Case("sm_20", GK_SM20)
1686 .Case("sm_21", GK_SM21)
1687 .Case("sm_30", GK_SM30)
1688 .Case("sm_35", GK_SM35)
1689 .Case("sm_37", GK_SM37)
1690 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001691
Eric Christopherc48497a2015-09-18 21:26:24 +00001692 return GPU != GK_NONE;
1693 }
1694};
1695
1696const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1697#define BUILTIN(ID, TYPE, ATTRS) \
1698 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1699#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1700 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1701#include "clang/Basic/BuiltinsNVPTX.def"
1702};
1703
1704const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1705
Craig Topperf054e3a2015-10-19 03:52:27 +00001706ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1707 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001708}
1709
1710class NVPTX32TargetInfo : public NVPTXTargetInfo {
1711public:
1712 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001713 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 PointerWidth = PointerAlign = 32;
1715 SizeType = TargetInfo::UnsignedInt;
1716 PtrDiffType = TargetInfo::SignedInt;
1717 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001718 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001719 }
1720};
1721
1722class NVPTX64TargetInfo : public NVPTXTargetInfo {
1723public:
1724 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1725 PointerWidth = PointerAlign = 64;
1726 SizeType = TargetInfo::UnsignedLong;
1727 PtrDiffType = TargetInfo::SignedLong;
1728 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001729 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001730 }
1731};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001733static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001734 1, // opencl_global
1735 3, // opencl_local
1736 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001737 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001738 1, // cuda_device
1739 2, // cuda_constant
1740 3 // cuda_shared
1741};
1742
Tom Stellarda96344b2014-08-21 13:58:40 +00001743// If you edit the description strings, make sure you update
1744// getPointerWidthV().
1745
Craig Topper273dbc62015-10-18 05:29:26 +00001746static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001747 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1748 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001749
Craig Topper273dbc62015-10-18 05:29:26 +00001750static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001751 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1752 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001753
Craig Topper273dbc62015-10-18 05:29:26 +00001754static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001755 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001756 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1757 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001759class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001760 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001761 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001762
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001763 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001764 enum GPUKind {
1765 GK_NONE,
1766 GK_R600,
1767 GK_R600_DOUBLE_OPS,
1768 GK_R700,
1769 GK_R700_DOUBLE_OPS,
1770 GK_EVERGREEN,
1771 GK_EVERGREEN_DOUBLE_OPS,
1772 GK_NORTHERN_ISLANDS,
1773 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001774 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001775 GK_SEA_ISLANDS,
1776 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001777 } GPU;
1778
Jan Veselyeebeaea2015-05-04 19:53:36 +00001779 bool hasFP64:1;
1780 bool hasFMAF:1;
1781 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001782
Eli Friedmand13b41e2012-10-12 23:32:00 +00001783public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001784 AMDGPUTargetInfo(const llvm::Triple &Triple)
1785 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001786
1787 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001788 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001789 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001790 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001791 hasFMAF = true;
1792 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001793 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001794 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001795 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001796 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001797 hasFMAF = false;
1798 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001799 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001800 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001801 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001802 }
1803
Tom Stellarda96344b2014-08-21 13:58:40 +00001804 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1805 if (GPU <= GK_CAYMAN)
1806 return 32;
1807
1808 switch(AddrSpace) {
1809 default:
1810 return 64;
1811 case 0:
1812 case 3:
1813 case 5:
1814 return 32;
1815 }
1816 }
1817
Craig Topper3164f332014-03-11 03:39:26 +00001818 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001819 return "";
1820 }
1821
Craig Topperf054e3a2015-10-19 03:52:27 +00001822 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823
Craig Topperf054e3a2015-10-19 03:52:27 +00001824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1825 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001826 }
1827
Craig Topper3164f332014-03-11 03:39:26 +00001828 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001829 TargetInfo::ConstraintInfo &Info) const override {
1830 switch (*Name) {
1831 default: break;
1832 case 'v': // vgpr
1833 case 's': // sgpr
1834 Info.setAllowsRegister();
1835 return true;
1836 }
1837 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001838 }
1839
Craig Topper6c03a542015-10-19 04:51:35 +00001840 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1841 return llvm::makeArrayRef(BuiltinInfo,
1842 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001843 }
1844
Craig Topper3164f332014-03-11 03:39:26 +00001845 void getTargetDefines(const LangOptions &Opts,
1846 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001847 if (getTriple().getArch() == llvm::Triple::amdgcn)
1848 Builder.defineMacro("__AMDGCN__");
1849 else
1850 Builder.defineMacro("__R600__");
1851
Jan Veselyeebeaea2015-05-04 19:53:36 +00001852 if (hasFMAF)
1853 Builder.defineMacro("__HAS_FMAF__");
1854 if (hasLDEXPF)
1855 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001856 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001857 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001858 if (Opts.OpenCL) {
1859 if (GPU >= GK_NORTHERN_ISLANDS) {
1860 Builder.defineMacro("cl_khr_byte_addressable_store");
1861 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1862 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1863 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1864 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1865 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001866 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001867 }
1868
Craig Topper3164f332014-03-11 03:39:26 +00001869 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001870 return TargetInfo::CharPtrBuiltinVaList;
1871 }
1872
Craig Topper3164f332014-03-11 03:39:26 +00001873 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001874 GPU = llvm::StringSwitch<GPUKind>(Name)
1875 .Case("r600" , GK_R600)
1876 .Case("rv610", GK_R600)
1877 .Case("rv620", GK_R600)
1878 .Case("rv630", GK_R600)
1879 .Case("rv635", GK_R600)
1880 .Case("rs780", GK_R600)
1881 .Case("rs880", GK_R600)
1882 .Case("rv670", GK_R600_DOUBLE_OPS)
1883 .Case("rv710", GK_R700)
1884 .Case("rv730", GK_R700)
1885 .Case("rv740", GK_R700_DOUBLE_OPS)
1886 .Case("rv770", GK_R700_DOUBLE_OPS)
1887 .Case("palm", GK_EVERGREEN)
1888 .Case("cedar", GK_EVERGREEN)
1889 .Case("sumo", GK_EVERGREEN)
1890 .Case("sumo2", GK_EVERGREEN)
1891 .Case("redwood", GK_EVERGREEN)
1892 .Case("juniper", GK_EVERGREEN)
1893 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1894 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1895 .Case("barts", GK_NORTHERN_ISLANDS)
1896 .Case("turks", GK_NORTHERN_ISLANDS)
1897 .Case("caicos", GK_NORTHERN_ISLANDS)
1898 .Case("cayman", GK_CAYMAN)
1899 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001900 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001901 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1902 .Case("verde", GK_SOUTHERN_ISLANDS)
1903 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001904 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001905 .Case("bonaire", GK_SEA_ISLANDS)
1906 .Case("kabini", GK_SEA_ISLANDS)
1907 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001908 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001909 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001910 .Case("tonga", GK_VOLCANIC_ISLANDS)
1911 .Case("iceland", GK_VOLCANIC_ISLANDS)
1912 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001913 .Case("fiji", GK_VOLCANIC_ISLANDS)
1914 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001915 .Default(GK_NONE);
1916
1917 if (GPU == GK_NONE) {
1918 return false;
1919 }
1920
1921 // Set the correct data layout
1922 switch (GPU) {
1923 case GK_NONE:
1924 case GK_R600:
1925 case GK_R700:
1926 case GK_EVERGREEN:
1927 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001928 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001929 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001930 hasFMAF = false;
1931 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001932 break;
1933 case GK_R600_DOUBLE_OPS:
1934 case GK_R700_DOUBLE_OPS:
1935 case GK_EVERGREEN_DOUBLE_OPS:
1936 case GK_CAYMAN:
James Y Knightb214cbc2016-03-04 19:00:41 +00001937 resetDataLayout(DataLayoutStringR600DoubleOps);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001938 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001939 hasFMAF = true;
1940 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001941 break;
1942 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001943 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001944 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001945 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001946 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001947 hasFMAF = true;
1948 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001949 break;
1950 }
1951
1952 return true;
1953 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001954};
1955
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001956const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001957#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001958 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001959#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001960};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001961const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001962 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1963 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1964 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1965 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1966 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1967 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1968 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1969 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1970 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1971 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1972 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1973 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1974 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1975 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1976 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1977 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1978 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1979 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1980 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1981 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1982 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1983 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1984 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1985 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1986 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1987 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1988 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1989 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1990 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1991 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1992 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1993 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1994 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1995 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1996 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1997 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1998 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1999 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2000 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2001 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2002 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2003 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2004 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2005 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2006 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2007 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2008 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2009 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
Matt Arsenaultb015d622016-02-27 09:06:22 +00002010 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2011 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002012};
2013
Craig Topperf054e3a2015-10-19 03:52:27 +00002014ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2015 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002016}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002017
Eli Friedman3fd920a2008-08-20 02:34:37 +00002018// Namespace for x86 abstract base class
2019const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002020#define BUILTIN(ID, TYPE, ATTRS) \
2021 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002022#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002023 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002024#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002025 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002026#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002027};
Eli Friedmanb5366062008-05-20 14:21:01 +00002028
Nuno Lopescfca1f02009-12-23 17:49:57 +00002029static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002030 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2031 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002032 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002033 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2034 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2035 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002036 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002037 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2038 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002039 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2040 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2041 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2042 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2043 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2044 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2045 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2046 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002047};
2048
Eric Christophercdd36352011-06-21 00:05:20 +00002049const TargetInfo::AddlRegName AddlRegNames[] = {
2050 { { "al", "ah", "eax", "rax" }, 0 },
2051 { { "bl", "bh", "ebx", "rbx" }, 3 },
2052 { { "cl", "ch", "ecx", "rcx" }, 2 },
2053 { { "dl", "dh", "edx", "rdx" }, 1 },
2054 { { "esi", "rsi" }, 4 },
2055 { { "edi", "rdi" }, 5 },
2056 { { "esp", "rsp" }, 7 },
2057 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002058 { { "r8d", "r8w", "r8b" }, 38 },
2059 { { "r9d", "r9w", "r9b" }, 39 },
2060 { { "r10d", "r10w", "r10b" }, 40 },
2061 { { "r11d", "r11w", "r11b" }, 41 },
2062 { { "r12d", "r12w", "r12b" }, 42 },
2063 { { "r13d", "r13w", "r13b" }, 43 },
2064 { { "r14d", "r14w", "r14b" }, 44 },
2065 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002066};
2067
2068// X86 target abstract base class; x86-32 and x86-64 are very close, so
2069// most of the implementation can be shared.
2070class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002071 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002072 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002073 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002074 enum MMX3DNowEnum {
2075 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002076 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002077 enum XOPEnum {
2078 NoXOP,
2079 SSE4A,
2080 FMA4,
2081 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002082 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002083
Craig Topper543f3bd2015-10-14 23:47:57 +00002084 bool HasAES = false;
2085 bool HasPCLMUL = false;
2086 bool HasLZCNT = false;
2087 bool HasRDRND = false;
2088 bool HasFSGSBASE = false;
2089 bool HasBMI = false;
2090 bool HasBMI2 = false;
2091 bool HasPOPCNT = false;
2092 bool HasRTM = false;
2093 bool HasPRFCHW = false;
2094 bool HasRDSEED = false;
2095 bool HasADX = false;
2096 bool HasTBM = false;
2097 bool HasFMA = false;
2098 bool HasF16C = false;
2099 bool HasAVX512CD = false;
2100 bool HasAVX512ER = false;
2101 bool HasAVX512PF = false;
2102 bool HasAVX512DQ = false;
2103 bool HasAVX512BW = false;
2104 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002105 bool HasAVX512VBMI = false;
2106 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002107 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002108 bool HasMPX = false;
2109 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002110 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002111 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002112 bool HasXSAVE = false;
2113 bool HasXSAVEOPT = false;
2114 bool HasXSAVEC = false;
2115 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002116 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002117 bool HasCLFLUSHOPT = false;
2118 bool HasPCOMMIT = false;
2119 bool HasCLWB = false;
2120 bool HasUMIP = false;
2121 bool HasMOVBE = false;
2122 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002123
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002124 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2125 ///
2126 /// Each enumeration represents a particular CPU supported by Clang. These
2127 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2128 enum CPUKind {
2129 CK_Generic,
2130
2131 /// \name i386
2132 /// i386-generation processors.
2133 //@{
2134 CK_i386,
2135 //@}
2136
2137 /// \name i486
2138 /// i486-generation processors.
2139 //@{
2140 CK_i486,
2141 CK_WinChipC6,
2142 CK_WinChip2,
2143 CK_C3,
2144 //@}
2145
2146 /// \name i586
2147 /// i586-generation processors, P5 microarchitecture based.
2148 //@{
2149 CK_i586,
2150 CK_Pentium,
2151 CK_PentiumMMX,
2152 //@}
2153
2154 /// \name i686
2155 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2156 //@{
2157 CK_i686,
2158 CK_PentiumPro,
2159 CK_Pentium2,
2160 CK_Pentium3,
2161 CK_Pentium3M,
2162 CK_PentiumM,
2163 CK_C3_2,
2164
2165 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2166 /// Clang however has some logic to suport this.
2167 // FIXME: Warn, deprecate, and potentially remove this.
2168 CK_Yonah,
2169 //@}
2170
2171 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002172 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002173 //@{
2174 CK_Pentium4,
2175 CK_Pentium4M,
2176 CK_Prescott,
2177 CK_Nocona,
2178 //@}
2179
2180 /// \name Core
2181 /// Core microarchitecture based processors.
2182 //@{
2183 CK_Core2,
2184
2185 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2186 /// codename which GCC no longer accepts as an option to -march, but Clang
2187 /// has some logic for recognizing it.
2188 // FIXME: Warn, deprecate, and potentially remove this.
2189 CK_Penryn,
2190 //@}
2191
2192 /// \name Atom
2193 /// Atom processors
2194 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002195 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002196 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002197 //@}
2198
2199 /// \name Nehalem
2200 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002201 CK_Nehalem,
2202
2203 /// \name Westmere
2204 /// Westmere microarchitecture based processors.
2205 CK_Westmere,
2206
2207 /// \name Sandy Bridge
2208 /// Sandy Bridge microarchitecture based processors.
2209 CK_SandyBridge,
2210
2211 /// \name Ivy Bridge
2212 /// Ivy Bridge microarchitecture based processors.
2213 CK_IvyBridge,
2214
2215 /// \name Haswell
2216 /// Haswell microarchitecture based processors.
2217 CK_Haswell,
2218
2219 /// \name Broadwell
2220 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002221 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002222
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002223 /// \name Skylake Client
2224 /// Skylake client microarchitecture based processors.
2225 CK_SkylakeClient,
2226
2227 /// \name Skylake Server
2228 /// Skylake server microarchitecture based processors.
2229 CK_SkylakeServer,
2230
2231 /// \name Cannonlake Client
2232 /// Cannonlake client microarchitecture based processors.
2233 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002234
Craig Topper449314e2013-08-20 07:09:39 +00002235 /// \name Knights Landing
2236 /// Knights Landing processor.
2237 CK_KNL,
2238
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002239 /// \name K6
2240 /// K6 architecture processors.
2241 //@{
2242 CK_K6,
2243 CK_K6_2,
2244 CK_K6_3,
2245 //@}
2246
2247 /// \name K7
2248 /// K7 architecture processors.
2249 //@{
2250 CK_Athlon,
2251 CK_AthlonThunderbird,
2252 CK_Athlon4,
2253 CK_AthlonXP,
2254 CK_AthlonMP,
2255 //@}
2256
2257 /// \name K8
2258 /// K8 architecture processors.
2259 //@{
2260 CK_Athlon64,
2261 CK_Athlon64SSE3,
2262 CK_AthlonFX,
2263 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002264 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002265 CK_Opteron,
2266 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002267 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002268 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002269
Benjamin Kramer569f2152012-01-10 11:50:18 +00002270 /// \name Bobcat
2271 /// Bobcat architecture processors.
2272 //@{
2273 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002274 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002275 //@}
2276
2277 /// \name Bulldozer
2278 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002279 //@{
2280 CK_BDVER1,
2281 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002282 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002283 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002284 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002285
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002286 /// This specification is deprecated and will be removed in the future.
2287 /// Users should prefer \see CK_K8.
2288 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002289 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002290 CK_x86_64,
2291 //@}
2292
2293 /// \name Geode
2294 /// Geode processors.
2295 //@{
2296 CK_Geode
2297 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002298 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002299
Eric Christopherc50738f2015-08-27 00:05:50 +00002300 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002301 return llvm::StringSwitch<CPUKind>(CPU)
2302 .Case("i386", CK_i386)
2303 .Case("i486", CK_i486)
2304 .Case("winchip-c6", CK_WinChipC6)
2305 .Case("winchip2", CK_WinChip2)
2306 .Case("c3", CK_C3)
2307 .Case("i586", CK_i586)
2308 .Case("pentium", CK_Pentium)
2309 .Case("pentium-mmx", CK_PentiumMMX)
2310 .Case("i686", CK_i686)
2311 .Case("pentiumpro", CK_PentiumPro)
2312 .Case("pentium2", CK_Pentium2)
2313 .Case("pentium3", CK_Pentium3)
2314 .Case("pentium3m", CK_Pentium3M)
2315 .Case("pentium-m", CK_PentiumM)
2316 .Case("c3-2", CK_C3_2)
2317 .Case("yonah", CK_Yonah)
2318 .Case("pentium4", CK_Pentium4)
2319 .Case("pentium4m", CK_Pentium4M)
2320 .Case("prescott", CK_Prescott)
2321 .Case("nocona", CK_Nocona)
2322 .Case("core2", CK_Core2)
2323 .Case("penryn", CK_Penryn)
2324 .Case("bonnell", CK_Bonnell)
2325 .Case("atom", CK_Bonnell) // Legacy name.
2326 .Case("silvermont", CK_Silvermont)
2327 .Case("slm", CK_Silvermont) // Legacy name.
2328 .Case("nehalem", CK_Nehalem)
2329 .Case("corei7", CK_Nehalem) // Legacy name.
2330 .Case("westmere", CK_Westmere)
2331 .Case("sandybridge", CK_SandyBridge)
2332 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2333 .Case("ivybridge", CK_IvyBridge)
2334 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2335 .Case("haswell", CK_Haswell)
2336 .Case("core-avx2", CK_Haswell) // Legacy name.
2337 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002338 .Case("skylake", CK_SkylakeClient)
2339 .Case("skylake-avx512", CK_SkylakeServer)
2340 .Case("skx", CK_SkylakeServer) // Legacy name.
2341 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002342 .Case("knl", CK_KNL)
2343 .Case("k6", CK_K6)
2344 .Case("k6-2", CK_K6_2)
2345 .Case("k6-3", CK_K6_3)
2346 .Case("athlon", CK_Athlon)
2347 .Case("athlon-tbird", CK_AthlonThunderbird)
2348 .Case("athlon-4", CK_Athlon4)
2349 .Case("athlon-xp", CK_AthlonXP)
2350 .Case("athlon-mp", CK_AthlonMP)
2351 .Case("athlon64", CK_Athlon64)
2352 .Case("athlon64-sse3", CK_Athlon64SSE3)
2353 .Case("athlon-fx", CK_AthlonFX)
2354 .Case("k8", CK_K8)
2355 .Case("k8-sse3", CK_K8SSE3)
2356 .Case("opteron", CK_Opteron)
2357 .Case("opteron-sse3", CK_OpteronSSE3)
2358 .Case("barcelona", CK_AMDFAM10)
2359 .Case("amdfam10", CK_AMDFAM10)
2360 .Case("btver1", CK_BTVER1)
2361 .Case("btver2", CK_BTVER2)
2362 .Case("bdver1", CK_BDVER1)
2363 .Case("bdver2", CK_BDVER2)
2364 .Case("bdver3", CK_BDVER3)
2365 .Case("bdver4", CK_BDVER4)
2366 .Case("x86-64", CK_x86_64)
2367 .Case("geode", CK_Geode)
2368 .Default(CK_Generic);
2369 }
2370
Rafael Espindolaeb265472013-08-21 21:59:03 +00002371 enum FPMathKind {
2372 FP_Default,
2373 FP_SSE,
2374 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002375 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002376
Eli Friedman3fd920a2008-08-20 02:34:37 +00002377public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002378 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002379 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002380 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002381 }
Craig Topper3164f332014-03-11 03:39:26 +00002382 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002383 // X87 evaluates with 80 bits "long double" precision.
2384 return SSELevel == NoSSE ? 2 : 0;
2385 }
Craig Topper6c03a542015-10-19 04:51:35 +00002386 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2387 return llvm::makeArrayRef(BuiltinInfo,
2388 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002389 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002390 ArrayRef<const char *> getGCCRegNames() const override {
2391 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002392 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002393 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2394 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002395 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002396 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2397 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002398 }
Eric Christopherd9832702015-06-29 21:00:05 +00002399 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002400 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002401 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002402
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002403 bool validateGlobalRegisterVariable(StringRef RegName,
2404 unsigned RegSize,
2405 bool &HasSizeMismatch) const override {
2406 // esp and ebp are the only 32-bit registers the x86 backend can currently
2407 // handle.
2408 if (RegName.equals("esp") || RegName.equals("ebp")) {
2409 // Check that the register size is 32-bit.
2410 HasSizeMismatch = RegSize != 32;
2411 return true;
2412 }
2413
2414 return false;
2415 }
2416
Akira Hatanaka974131e2014-09-18 18:17:18 +00002417 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2418
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002419 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2420
Akira Hatanaka974131e2014-09-18 18:17:18 +00002421 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2422
Craig Topper3164f332014-03-11 03:39:26 +00002423 std::string convertConstraint(const char *&Constraint) const override;
2424 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002425 return "~{dirflag},~{fpsr},~{flags}";
2426 }
Craig Topper3164f332014-03-11 03:39:26 +00002427 void getTargetDefines(const LangOptions &Opts,
2428 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002429 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2430 bool Enabled);
2431 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2432 bool Enabled);
2433 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2434 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002435 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2436 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002437 setFeatureEnabledImpl(Features, Name, Enabled);
2438 }
2439 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002440 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002441 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2442 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002443 bool
2444 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2445 StringRef CPU,
2446 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002447 bool hasFeature(StringRef Feature) const override;
2448 bool handleTargetFeatures(std::vector<std::string> &Features,
2449 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002450 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002451 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2452 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002453 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002454 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002455 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002456 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002457 return "no-mmx";
2458 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002459 }
Craig Topper3164f332014-03-11 03:39:26 +00002460 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002461 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002462
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002463 // Perform any per-CPU checks necessary to determine if this CPU is
2464 // acceptable.
2465 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2466 // invalid without explaining *why*.
2467 switch (CPU) {
2468 case CK_Generic:
2469 // No processor selected!
2470 return false;
2471
2472 case CK_i386:
2473 case CK_i486:
2474 case CK_WinChipC6:
2475 case CK_WinChip2:
2476 case CK_C3:
2477 case CK_i586:
2478 case CK_Pentium:
2479 case CK_PentiumMMX:
2480 case CK_i686:
2481 case CK_PentiumPro:
2482 case CK_Pentium2:
2483 case CK_Pentium3:
2484 case CK_Pentium3M:
2485 case CK_PentiumM:
2486 case CK_Yonah:
2487 case CK_C3_2:
2488 case CK_Pentium4:
2489 case CK_Pentium4M:
2490 case CK_Prescott:
2491 case CK_K6:
2492 case CK_K6_2:
2493 case CK_K6_3:
2494 case CK_Athlon:
2495 case CK_AthlonThunderbird:
2496 case CK_Athlon4:
2497 case CK_AthlonXP:
2498 case CK_AthlonMP:
2499 case CK_Geode:
2500 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002501 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002502 return false;
2503
2504 // Fallthrough
2505 case CK_Nocona:
2506 case CK_Core2:
2507 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002508 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002509 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002510 case CK_Nehalem:
2511 case CK_Westmere:
2512 case CK_SandyBridge:
2513 case CK_IvyBridge:
2514 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002515 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002516 case CK_SkylakeClient:
2517 case CK_SkylakeServer:
2518 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002519 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002520 case CK_Athlon64:
2521 case CK_Athlon64SSE3:
2522 case CK_AthlonFX:
2523 case CK_K8:
2524 case CK_K8SSE3:
2525 case CK_Opteron:
2526 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002527 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002528 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002529 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002530 case CK_BDVER1:
2531 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002532 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002533 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002534 case CK_x86_64:
2535 return true;
2536 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002537 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002538 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002539
Craig Topper3164f332014-03-11 03:39:26 +00002540 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002541
Craig Topper3164f332014-03-11 03:39:26 +00002542 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002543 // Most of the non-ARM calling conventions are i386 conventions.
2544 switch (CC) {
2545 case CC_X86ThisCall:
2546 case CC_X86FastCall:
2547 case CC_X86StdCall:
2548 case CC_X86VectorCall:
2549 case CC_C:
2550 case CC_Swift:
2551 case CC_X86Pascal:
2552 case CC_IntelOclBicc:
2553 return CCCR_OK;
2554 default:
2555 return CCCR_Warning;
2556 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002557 }
2558
Craig Topper3164f332014-03-11 03:39:26 +00002559 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002560 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002561 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002562
2563 bool hasSjLjLowering() const override {
2564 return true;
2565 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002566};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002567
Rafael Espindolaeb265472013-08-21 21:59:03 +00002568bool X86TargetInfo::setFPMath(StringRef Name) {
2569 if (Name == "387") {
2570 FPMath = FP_387;
2571 return true;
2572 }
2573 if (Name == "sse") {
2574 FPMath = FP_SSE;
2575 return true;
2576 }
2577 return false;
2578}
2579
Eric Christopher007b0a02015-08-28 22:32:01 +00002580bool X86TargetInfo::initFeatureMap(
2581 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002582 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002583 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002584 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002585 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002586 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002587
Eric Christopher2b4a7252015-08-27 00:05:52 +00002588 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002589 case CK_Generic:
2590 case CK_i386:
2591 case CK_i486:
2592 case CK_i586:
2593 case CK_Pentium:
2594 case CK_i686:
2595 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002596 break;
2597 case CK_PentiumMMX:
2598 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002599 case CK_K6:
2600 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002601 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 break;
2603 case CK_Pentium3:
2604 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002605 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002606 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002607 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
2609 case CK_PentiumM:
2610 case CK_Pentium4:
2611 case CK_Pentium4M:
2612 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002613 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002614 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 break;
2616 case CK_Yonah:
2617 case CK_Prescott:
2618 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002619 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002620 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002621 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 break;
2623 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002624 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002625 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002626 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002627 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 break;
2629 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002630 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002631 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002632 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002633 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002634 case CK_Cannonlake:
2635 setFeatureEnabledImpl(Features, "avx512ifma", true);
2636 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2637 setFeatureEnabledImpl(Features, "sha", true);
2638 setFeatureEnabledImpl(Features, "umip", true);
2639 // FALLTHROUGH
2640 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002641 setFeatureEnabledImpl(Features, "avx512f", true);
2642 setFeatureEnabledImpl(Features, "avx512cd", true);
2643 setFeatureEnabledImpl(Features, "avx512dq", true);
2644 setFeatureEnabledImpl(Features, "avx512bw", true);
2645 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002646 setFeatureEnabledImpl(Features, "pku", true);
2647 setFeatureEnabledImpl(Features, "pcommit", true);
2648 setFeatureEnabledImpl(Features, "clwb", true);
2649 // FALLTHROUGH
2650 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002651 setFeatureEnabledImpl(Features, "xsavec", true);
2652 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002653 setFeatureEnabledImpl(Features, "mpx", true);
2654 setFeatureEnabledImpl(Features, "sgx", true);
2655 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002656 // FALLTHROUGH
2657 case CK_Broadwell:
2658 setFeatureEnabledImpl(Features, "rdseed", true);
2659 setFeatureEnabledImpl(Features, "adx", true);
2660 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002661 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002662 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002663 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002664 setFeatureEnabledImpl(Features, "bmi", true);
2665 setFeatureEnabledImpl(Features, "bmi2", true);
2666 setFeatureEnabledImpl(Features, "rtm", true);
2667 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002668 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002669 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002670 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002671 setFeatureEnabledImpl(Features, "rdrnd", true);
2672 setFeatureEnabledImpl(Features, "f16c", true);
2673 setFeatureEnabledImpl(Features, "fsgsbase", true);
2674 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002675 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002676 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002677 setFeatureEnabledImpl(Features, "xsave", true);
2678 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002679 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002680 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002681 case CK_Silvermont:
2682 setFeatureEnabledImpl(Features, "aes", true);
2683 setFeatureEnabledImpl(Features, "pclmul", true);
2684 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002685 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002686 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002687 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002688 setFeatureEnabledImpl(Features, "cx16", true);
2689 break;
2690 case CK_KNL:
2691 setFeatureEnabledImpl(Features, "avx512f", true);
2692 setFeatureEnabledImpl(Features, "avx512cd", true);
2693 setFeatureEnabledImpl(Features, "avx512er", true);
2694 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002695 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002696 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002697 setFeatureEnabledImpl(Features, "rdseed", true);
2698 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002699 setFeatureEnabledImpl(Features, "lzcnt", true);
2700 setFeatureEnabledImpl(Features, "bmi", true);
2701 setFeatureEnabledImpl(Features, "bmi2", true);
2702 setFeatureEnabledImpl(Features, "rtm", true);
2703 setFeatureEnabledImpl(Features, "fma", true);
2704 setFeatureEnabledImpl(Features, "rdrnd", true);
2705 setFeatureEnabledImpl(Features, "f16c", true);
2706 setFeatureEnabledImpl(Features, "fsgsbase", true);
2707 setFeatureEnabledImpl(Features, "aes", true);
2708 setFeatureEnabledImpl(Features, "pclmul", true);
2709 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002710 setFeatureEnabledImpl(Features, "xsaveopt", true);
2711 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002712 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002713 break;
2714 case CK_K6_2:
2715 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002716 case CK_WinChip2:
2717 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002718 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002719 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002720 case CK_Athlon:
2721 case CK_AthlonThunderbird:
2722 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002723 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002724 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002725 case CK_Athlon4:
2726 case CK_AthlonXP:
2727 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002728 setFeatureEnabledImpl(Features, "sse", true);
2729 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002730 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002731 break;
2732 case CK_K8:
2733 case CK_Opteron:
2734 case CK_Athlon64:
2735 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002736 setFeatureEnabledImpl(Features, "sse2", true);
2737 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002738 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002739 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002740 case CK_AMDFAM10:
2741 setFeatureEnabledImpl(Features, "sse4a", true);
2742 setFeatureEnabledImpl(Features, "lzcnt", true);
2743 setFeatureEnabledImpl(Features, "popcnt", true);
2744 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002745 case CK_K8SSE3:
2746 case CK_OpteronSSE3:
2747 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002748 setFeatureEnabledImpl(Features, "sse3", true);
2749 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002750 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002751 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002752 case CK_BTVER2:
2753 setFeatureEnabledImpl(Features, "avx", true);
2754 setFeatureEnabledImpl(Features, "aes", true);
2755 setFeatureEnabledImpl(Features, "pclmul", true);
2756 setFeatureEnabledImpl(Features, "bmi", true);
2757 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002758 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002759 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002760 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002761 setFeatureEnabledImpl(Features, "ssse3", true);
2762 setFeatureEnabledImpl(Features, "sse4a", true);
2763 setFeatureEnabledImpl(Features, "lzcnt", true);
2764 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002765 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002766 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002767 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002768 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002769 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002770 case CK_BDVER4:
2771 setFeatureEnabledImpl(Features, "avx2", true);
2772 setFeatureEnabledImpl(Features, "bmi2", true);
2773 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002774 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002775 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002776 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002777 // FALLTHROUGH
2778 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002779 setFeatureEnabledImpl(Features, "bmi", true);
2780 setFeatureEnabledImpl(Features, "fma", true);
2781 setFeatureEnabledImpl(Features, "f16c", true);
2782 setFeatureEnabledImpl(Features, "tbm", true);
2783 // FALLTHROUGH
2784 case CK_BDVER1:
2785 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002786 setFeatureEnabledImpl(Features, "xop", true);
2787 setFeatureEnabledImpl(Features, "lzcnt", true);
2788 setFeatureEnabledImpl(Features, "aes", true);
2789 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002790 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002791 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002792 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002793 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002794 break;
Eli Friedman33465822011-07-08 23:31:17 +00002795 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002796 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2797 return false;
2798
2799 // Can't do this earlier because we need to be able to explicitly enable
2800 // or disable these features and the things that they depend upon.
2801
2802 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2803 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002804 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002805 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2806 FeaturesVec.end())
2807 Features["popcnt"] = true;
2808
2809 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2810 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002811 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002812 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2813 FeaturesVec.end())
2814 Features["prfchw"] = true;
2815
Eric Christophera7260af2015-10-08 20:10:18 +00002816 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2817 // then enable MMX.
2818 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002819 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002820 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2821 FeaturesVec.end())
2822 Features["mmx"] = true;
2823
Eric Christopherbbd746d2015-10-08 20:10:14 +00002824 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002825}
2826
Rafael Espindolae62e2792013-08-20 13:44:29 +00002827void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002828 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002829 if (Enabled) {
2830 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002831 case AVX512F:
2832 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002833 case AVX2:
2834 Features["avx2"] = true;
2835 case AVX:
2836 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002837 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002838 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002839 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002840 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002841 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842 case SSSE3:
2843 Features["ssse3"] = true;
2844 case SSE3:
2845 Features["sse3"] = true;
2846 case SSE2:
2847 Features["sse2"] = true;
2848 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002849 Features["sse"] = true;
2850 case NoSSE:
2851 break;
2852 }
2853 return;
2854 }
2855
2856 switch (Level) {
2857 case NoSSE:
2858 case SSE1:
2859 Features["sse"] = false;
2860 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002861 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2862 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002863 case SSE3:
2864 Features["sse3"] = false;
2865 setXOPLevel(Features, NoXOP, false);
2866 case SSSE3:
2867 Features["ssse3"] = false;
2868 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002869 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002870 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002871 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002872 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002873 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2874 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002875 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002876 case AVX2:
2877 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002878 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002879 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002880 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002881 Features["avx512vl"] = Features["avx512vbmi"] =
2882 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002883 }
2884}
2885
2886void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002887 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002888 if (Enabled) {
2889 switch (Level) {
2890 case AMD3DNowAthlon:
2891 Features["3dnowa"] = true;
2892 case AMD3DNow:
2893 Features["3dnow"] = true;
2894 case MMX:
2895 Features["mmx"] = true;
2896 case NoMMX3DNow:
2897 break;
2898 }
2899 return;
2900 }
2901
2902 switch (Level) {
2903 case NoMMX3DNow:
2904 case MMX:
2905 Features["mmx"] = false;
2906 case AMD3DNow:
2907 Features["3dnow"] = false;
2908 case AMD3DNowAthlon:
2909 Features["3dnowa"] = false;
2910 }
2911}
2912
2913void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002914 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002915 if (Enabled) {
2916 switch (Level) {
2917 case XOP:
2918 Features["xop"] = true;
2919 case FMA4:
2920 Features["fma4"] = true;
2921 setSSELevel(Features, AVX, true);
2922 case SSE4A:
2923 Features["sse4a"] = true;
2924 setSSELevel(Features, SSE3, true);
2925 case NoXOP:
2926 break;
2927 }
2928 return;
2929 }
2930
2931 switch (Level) {
2932 case NoXOP:
2933 case SSE4A:
2934 Features["sse4a"] = false;
2935 case FMA4:
2936 Features["fma4"] = false;
2937 case XOP:
2938 Features["xop"] = false;
2939 }
2940}
2941
Craig Topper86d79ef2013-09-17 04:51:29 +00002942void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2943 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002944 // This is a bit of a hack to deal with the sse4 target feature when used
2945 // as part of the target attribute. We handle sse4 correctly everywhere
2946 // else. See below for more information on how we handle the sse4 options.
2947 if (Name != "sse4")
2948 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002949
Craig Topper29561122013-09-19 01:13:07 +00002950 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002951 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002952 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002953 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002954 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002955 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002956 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002957 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002958 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002959 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002960 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002961 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002962 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002963 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002964 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002965 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002966 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002967 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002968 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002969 if (Enabled)
2970 setSSELevel(Features, SSE2, Enabled);
2971 } else if (Name == "pclmul") {
2972 if (Enabled)
2973 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002974 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002975 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002976 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002977 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002978 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002979 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00002980 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
2981 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
2982 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00002983 if (Enabled)
2984 setSSELevel(Features, AVX512F, Enabled);
2985 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002986 if (Enabled)
2987 setSSELevel(Features, AVX, Enabled);
2988 } else if (Name == "fma4") {
2989 setXOPLevel(Features, FMA4, Enabled);
2990 } else if (Name == "xop") {
2991 setXOPLevel(Features, XOP, Enabled);
2992 } else if (Name == "sse4a") {
2993 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002994 } else if (Name == "f16c") {
2995 if (Enabled)
2996 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002997 } else if (Name == "sha") {
2998 if (Enabled)
2999 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003000 } else if (Name == "sse4") {
3001 // We can get here via the __target__ attribute since that's not controlled
3002 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3003 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3004 // disabled.
3005 if (Enabled)
3006 setSSELevel(Features, SSE42, Enabled);
3007 else
3008 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003009 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003010 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003011 Features["xsaveopt"] = false;
3012 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003013 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003014 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003015 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003016}
3017
Eric Christopher3ff21b32013-10-16 21:26:26 +00003018/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003019/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003020bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003021 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003022 for (const auto &Feature : Features) {
3023 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003024 continue;
3025
Eric Christopher610fe112015-08-26 08:21:55 +00003026 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003027 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003028 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003029 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003030 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003031 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003032 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003033 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003034 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003035 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003036 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003037 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003038 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003039 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003040 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003041 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003042 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003043 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003044 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003045 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003046 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003047 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003048 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003049 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003050 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003051 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003052 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003053 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003054 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003055 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003056 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003057 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003058 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003059 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003060 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003061 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003062 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003063 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003064 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003065 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003066 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003067 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003068 } else if (Feature == "+avx512vbmi") {
3069 HasAVX512VBMI = true;
3070 } else if (Feature == "+avx512ifma") {
3071 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003072 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003073 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003074 } else if (Feature == "+mpx") {
3075 HasMPX = true;
3076 } else if (Feature == "+movbe") {
3077 HasMOVBE = true;
3078 } else if (Feature == "+sgx") {
3079 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003080 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003081 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003082 } else if (Feature == "+fxsr") {
3083 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003084 } else if (Feature == "+xsave") {
3085 HasXSAVE = true;
3086 } else if (Feature == "+xsaveopt") {
3087 HasXSAVEOPT = true;
3088 } else if (Feature == "+xsavec") {
3089 HasXSAVEC = true;
3090 } else if (Feature == "+xsaves") {
3091 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003092 } else if (Feature == "+pku") {
3093 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003094 } else if (Feature == "+clflushopt") {
3095 HasCLFLUSHOPT = true;
3096 } else if (Feature == "+pcommit") {
3097 HasPCOMMIT = true;
3098 } else if (Feature == "+clwb") {
3099 HasCLWB = true;
3100 } else if (Feature == "+umip") {
3101 HasUMIP = true;
3102 } else if (Feature == "+prefetchwt1") {
3103 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003104 }
3105
Benjamin Kramer27402c62012-03-05 15:10:44 +00003106 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003107 .Case("+avx512f", AVX512F)
3108 .Case("+avx2", AVX2)
3109 .Case("+avx", AVX)
3110 .Case("+sse4.2", SSE42)
3111 .Case("+sse4.1", SSE41)
3112 .Case("+ssse3", SSSE3)
3113 .Case("+sse3", SSE3)
3114 .Case("+sse2", SSE2)
3115 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003116 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003117 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003118
Eli Friedman33465822011-07-08 23:31:17 +00003119 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003120 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003121 .Case("+3dnowa", AMD3DNowAthlon)
3122 .Case("+3dnow", AMD3DNow)
3123 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003124 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003125 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003126
3127 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003128 .Case("+xop", XOP)
3129 .Case("+fma4", FMA4)
3130 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131 .Default(NoXOP);
3132 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003133 }
Eli Friedman33465822011-07-08 23:31:17 +00003134
Rafael Espindolaeb265472013-08-21 21:59:03 +00003135 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3136 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003137 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3138 (FPMath == FP_387 && SSELevel >= SSE1)) {
3139 Diags.Report(diag::err_target_unsupported_fpmath) <<
3140 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003141 return false;
3142 }
3143
Alexey Bataev00396512015-07-02 03:40:19 +00003144 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003145 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003146 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003147}
Chris Lattnerecd49032009-03-02 22:27:17 +00003148
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003149/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3150/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003151void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003152 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003153 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003154 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003155 Builder.defineMacro("__amd64__");
3156 Builder.defineMacro("__amd64");
3157 Builder.defineMacro("__x86_64");
3158 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003159 if (getTriple().getArchName() == "x86_64h") {
3160 Builder.defineMacro("__x86_64h");
3161 Builder.defineMacro("__x86_64h__");
3162 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003163 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003164 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003165 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003166
Chris Lattnerecd49032009-03-02 22:27:17 +00003167 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003168 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3169 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003170 switch (CPU) {
3171 case CK_Generic:
3172 break;
3173 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003174 // The rest are coming from the i386 define above.
3175 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003176 break;
3177 case CK_i486:
3178 case CK_WinChipC6:
3179 case CK_WinChip2:
3180 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003181 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003182 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003183 case CK_PentiumMMX:
3184 Builder.defineMacro("__pentium_mmx__");
3185 Builder.defineMacro("__tune_pentium_mmx__");
3186 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003187 case CK_i586:
3188 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003189 defineCPUMacros(Builder, "i586");
3190 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003191 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003192 case CK_Pentium3:
3193 case CK_Pentium3M:
3194 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003195 Builder.defineMacro("__tune_pentium3__");
3196 // Fallthrough
3197 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003198 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003199 Builder.defineMacro("__tune_pentium2__");
3200 // Fallthrough
3201 case CK_PentiumPro:
3202 Builder.defineMacro("__tune_i686__");
3203 Builder.defineMacro("__tune_pentiumpro__");
3204 // Fallthrough
3205 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003206 Builder.defineMacro("__i686");
3207 Builder.defineMacro("__i686__");
3208 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3209 Builder.defineMacro("__pentiumpro");
3210 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003211 break;
3212 case CK_Pentium4:
3213 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003214 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003215 break;
3216 case CK_Yonah:
3217 case CK_Prescott:
3218 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003219 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003220 break;
3221 case CK_Core2:
3222 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003223 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003224 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003225 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003226 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003227 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003228 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003229 defineCPUMacros(Builder, "slm");
3230 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003231 case CK_Nehalem:
3232 case CK_Westmere:
3233 case CK_SandyBridge:
3234 case CK_IvyBridge:
3235 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003236 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003237 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003238 // FIXME: Historically, we defined this legacy name, it would be nice to
3239 // remove it at some point. We've never exposed fine-grained names for
3240 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003241 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003242 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003243 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003244 defineCPUMacros(Builder, "skx");
3245 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003246 case CK_Cannonlake:
3247 break;
Craig Topper449314e2013-08-20 07:09:39 +00003248 case CK_KNL:
3249 defineCPUMacros(Builder, "knl");
3250 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003251 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003252 Builder.defineMacro("__k6_2__");
3253 Builder.defineMacro("__tune_k6_2__");
3254 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003255 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003256 if (CPU != CK_K6_2) { // In case of fallthrough
3257 // FIXME: GCC may be enabling these in cases where some other k6
3258 // architecture is specified but -m3dnow is explicitly provided. The
3259 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003260 Builder.defineMacro("__k6_3__");
3261 Builder.defineMacro("__tune_k6_3__");
3262 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003263 // Fallthrough
3264 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003265 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003266 break;
3267 case CK_Athlon:
3268 case CK_AthlonThunderbird:
3269 case CK_Athlon4:
3270 case CK_AthlonXP:
3271 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003272 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003273 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003274 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003275 Builder.defineMacro("__tune_athlon_sse__");
3276 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003277 break;
3278 case CK_K8:
3279 case CK_K8SSE3:
3280 case CK_x86_64:
3281 case CK_Opteron:
3282 case CK_OpteronSSE3:
3283 case CK_Athlon64:
3284 case CK_Athlon64SSE3:
3285 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003286 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003287 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003288 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003289 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003290 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003291 case CK_BTVER1:
3292 defineCPUMacros(Builder, "btver1");
3293 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003294 case CK_BTVER2:
3295 defineCPUMacros(Builder, "btver2");
3296 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003297 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003298 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003299 break;
3300 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003301 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003302 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003303 case CK_BDVER3:
3304 defineCPUMacros(Builder, "bdver3");
3305 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003306 case CK_BDVER4:
3307 defineCPUMacros(Builder, "bdver4");
3308 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003309 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003310 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003311 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003312 }
Chris Lattner96e43572009-03-02 22:40:39 +00003313
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003314 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003315 Builder.defineMacro("__REGISTER_PREFIX__", "");
3316
Chris Lattner6df41af2009-04-19 17:32:33 +00003317 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3318 // functions in glibc header files that use FP Stack inline asm which the
3319 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003320 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003321
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003322 if (HasAES)
3323 Builder.defineMacro("__AES__");
3324
Craig Topper3f122a72012-05-31 05:18:48 +00003325 if (HasPCLMUL)
3326 Builder.defineMacro("__PCLMUL__");
3327
Craig Topper22967d42011-12-25 05:06:45 +00003328 if (HasLZCNT)
3329 Builder.defineMacro("__LZCNT__");
3330
Benjamin Kramer1e250392012-07-07 09:39:18 +00003331 if (HasRDRND)
3332 Builder.defineMacro("__RDRND__");
3333
Craig Topper8c7f2512014-11-03 06:51:41 +00003334 if (HasFSGSBASE)
3335 Builder.defineMacro("__FSGSBASE__");
3336
Craig Topper22967d42011-12-25 05:06:45 +00003337 if (HasBMI)
3338 Builder.defineMacro("__BMI__");
3339
3340 if (HasBMI2)
3341 Builder.defineMacro("__BMI2__");
3342
Craig Topper1de83482011-12-29 16:10:46 +00003343 if (HasPOPCNT)
3344 Builder.defineMacro("__POPCNT__");
3345
Michael Liao625a8752012-11-10 05:17:46 +00003346 if (HasRTM)
3347 Builder.defineMacro("__RTM__");
3348
Michael Liao74f4eaf2013-03-26 17:52:08 +00003349 if (HasPRFCHW)
3350 Builder.defineMacro("__PRFCHW__");
3351
Michael Liaoffaae352013-03-29 05:17:55 +00003352 if (HasRDSEED)
3353 Builder.defineMacro("__RDSEED__");
3354
Robert Khasanov50e6f582014-09-19 09:53:48 +00003355 if (HasADX)
3356 Builder.defineMacro("__ADX__");
3357
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003358 if (HasTBM)
3359 Builder.defineMacro("__TBM__");
3360
Rafael Espindolae62e2792013-08-20 13:44:29 +00003361 switch (XOPLevel) {
3362 case XOP:
3363 Builder.defineMacro("__XOP__");
3364 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003365 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003366 case SSE4A:
3367 Builder.defineMacro("__SSE4A__");
3368 case NoXOP:
3369 break;
3370 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003371
Craig Topperbba778b2012-06-03 21:46:30 +00003372 if (HasFMA)
3373 Builder.defineMacro("__FMA__");
3374
Manman Rena45358c2012-10-11 00:59:55 +00003375 if (HasF16C)
3376 Builder.defineMacro("__F16C__");
3377
Craig Topper679b53a2013-08-21 05:29:10 +00003378 if (HasAVX512CD)
3379 Builder.defineMacro("__AVX512CD__");
3380 if (HasAVX512ER)
3381 Builder.defineMacro("__AVX512ER__");
3382 if (HasAVX512PF)
3383 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003384 if (HasAVX512DQ)
3385 Builder.defineMacro("__AVX512DQ__");
3386 if (HasAVX512BW)
3387 Builder.defineMacro("__AVX512BW__");
3388 if (HasAVX512VL)
3389 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003390 if (HasAVX512VBMI)
3391 Builder.defineMacro("__AVX512VBMI__");
3392 if (HasAVX512IFMA)
3393 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003394
Ben Langmuir58078d02013-09-19 13:22:04 +00003395 if (HasSHA)
3396 Builder.defineMacro("__SHA__");
3397
Craig Toppere33f51f2015-10-16 06:22:36 +00003398 if (HasFXSR)
3399 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003400 if (HasXSAVE)
3401 Builder.defineMacro("__XSAVE__");
3402 if (HasXSAVEOPT)
3403 Builder.defineMacro("__XSAVEOPT__");
3404 if (HasXSAVEC)
3405 Builder.defineMacro("__XSAVEC__");
3406 if (HasXSAVES)
3407 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003408 if (HasPKU)
3409 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003410 if (HasCX16)
3411 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3412
Chris Lattner96e43572009-03-02 22:40:39 +00003413 // Each case falls through to the previous one here.
3414 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003415 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003416 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003417 case AVX2:
3418 Builder.defineMacro("__AVX2__");
3419 case AVX:
3420 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003421 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003422 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003423 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003424 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003425 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003426 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003427 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003428 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003429 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003430 Builder.defineMacro("__SSE2__");
3431 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003432 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003433 Builder.defineMacro("__SSE__");
3434 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003435 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003436 break;
3437 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003438
Derek Schuffc7dd7222012-10-11 15:52:22 +00003439 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003440 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003441 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003442 case AVX2:
3443 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003444 case SSE42:
3445 case SSE41:
3446 case SSSE3:
3447 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003448 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003449 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003450 break;
3451 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003452 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003453 break;
3454 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003455 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003456 }
3457 }
3458
Anders Carlssone437c682010-01-27 03:47:49 +00003459 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003460 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003461 case AMD3DNowAthlon:
3462 Builder.defineMacro("__3dNOW_A__");
3463 case AMD3DNow:
3464 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003465 case MMX:
3466 Builder.defineMacro("__MMX__");
3467 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003468 break;
3469 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003470
3471 if (CPU >= CK_i486) {
3472 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3473 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3474 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3475 }
3476 if (CPU >= CK_i586)
3477 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003478}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003479
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003480bool X86TargetInfo::hasFeature(StringRef Feature) const {
3481 return llvm::StringSwitch<bool>(Feature)
3482 .Case("aes", HasAES)
3483 .Case("avx", SSELevel >= AVX)
3484 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003485 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003486 .Case("avx512cd", HasAVX512CD)
3487 .Case("avx512er", HasAVX512ER)
3488 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003489 .Case("avx512dq", HasAVX512DQ)
3490 .Case("avx512bw", HasAVX512BW)
3491 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003492 .Case("avx512vbmi", HasAVX512VBMI)
3493 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003494 .Case("bmi", HasBMI)
3495 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003496 .Case("clflushopt", HasCLFLUSHOPT)
3497 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003498 .Case("cx16", HasCX16)
3499 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003500 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003501 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003502 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003503 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003504 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003505 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3506 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3507 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003508 .Case("movbe", HasMOVBE)
3509 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003510 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003511 .Case("pcommit", HasPCOMMIT)
3512 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003513 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003514 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003515 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003516 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003517 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003518 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003519 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003520 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003521 .Case("sse", SSELevel >= SSE1)
3522 .Case("sse2", SSELevel >= SSE2)
3523 .Case("sse3", SSELevel >= SSE3)
3524 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003525 .Case("sse4.1", SSELevel >= SSE41)
3526 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003527 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003528 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003529 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003530 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003531 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3532 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003533 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003534 .Case("xsave", HasXSAVE)
3535 .Case("xsavec", HasXSAVEC)
3536 .Case("xsaves", HasXSAVES)
3537 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003538 .Default(false);
3539}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003540
Eric Christopherd9832702015-06-29 21:00:05 +00003541// We can't use a generic validation scheme for the features accepted here
3542// versus subtarget features accepted in the target attribute because the
3543// bitfield structure that's initialized in the runtime only supports the
3544// below currently rather than the full range of subtarget features. (See
3545// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3546bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3547 return llvm::StringSwitch<bool>(FeatureStr)
3548 .Case("cmov", true)
3549 .Case("mmx", true)
3550 .Case("popcnt", true)
3551 .Case("sse", true)
3552 .Case("sse2", true)
3553 .Case("sse3", true)
3554 .Case("sse4.1", true)
3555 .Case("sse4.2", true)
3556 .Case("avx", true)
3557 .Case("avx2", true)
3558 .Case("sse4a", true)
3559 .Case("fma4", true)
3560 .Case("xop", true)
3561 .Case("fma", true)
3562 .Case("avx512f", true)
3563 .Case("bmi", true)
3564 .Case("bmi2", true)
3565 .Default(false);
3566}
3567
Eli Friedman3fd920a2008-08-20 02:34:37 +00003568bool
Anders Carlsson58436352009-02-28 17:11:49 +00003569X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003570 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003571 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003572 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003573 // Constant constraints.
3574 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3575 // instructions.
3576 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3577 // x86_64 instructions.
3578 case 's':
3579 Info.setRequiresImmediate();
3580 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003581 case 'I':
3582 Info.setRequiresImmediate(0, 31);
3583 return true;
3584 case 'J':
3585 Info.setRequiresImmediate(0, 63);
3586 return true;
3587 case 'K':
3588 Info.setRequiresImmediate(-128, 127);
3589 return true;
3590 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003591 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003592 return true;
3593 case 'M':
3594 Info.setRequiresImmediate(0, 3);
3595 return true;
3596 case 'N':
3597 Info.setRequiresImmediate(0, 255);
3598 return true;
3599 case 'O':
3600 Info.setRequiresImmediate(0, 127);
3601 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003602 // Register constraints.
3603 case 'Y': // 'Y' is the first character for several 2-character constraints.
3604 // Shift the pointer to the second character of the constraint.
3605 Name++;
3606 switch (*Name) {
3607 default:
3608 return false;
3609 case '0': // First SSE register.
3610 case 't': // Any SSE register, when SSE2 is enabled.
3611 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3612 case 'm': // Any MMX register, when inter-unit moves enabled.
3613 Info.setAllowsRegister();
3614 return true;
3615 }
3616 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003617 // Constraint 'f' cannot be used for output operands.
3618 if (Info.ConstraintStr[0] == '=')
3619 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003620 Info.setAllowsRegister();
3621 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003622 case 'a': // eax.
3623 case 'b': // ebx.
3624 case 'c': // ecx.
3625 case 'd': // edx.
3626 case 'S': // esi.
3627 case 'D': // edi.
3628 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003629 case 't': // Top of floating point stack.
3630 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003631 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003632 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003633 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003634 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003635 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3636 case 'l': // "Index" registers: any general register that can be used as an
3637 // index in a base+index memory access.
3638 Info.setAllowsRegister();
3639 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003640 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003641 case 'C': // SSE floating point constant.
3642 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003643 return true;
3644 }
3645}
3646
Akira Hatanaka974131e2014-09-18 18:17:18 +00003647bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3648 unsigned Size) const {
3649 // Strip off constraint modifiers.
3650 while (Constraint[0] == '=' ||
3651 Constraint[0] == '+' ||
3652 Constraint[0] == '&')
3653 Constraint = Constraint.substr(1);
3654
3655 return validateOperandSize(Constraint, Size);
3656}
3657
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003658bool X86TargetInfo::validateInputSize(StringRef Constraint,
3659 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003660 return validateOperandSize(Constraint, Size);
3661}
3662
3663bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3664 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003665 switch (Constraint[0]) {
3666 default: break;
3667 case 'y':
3668 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003669 case 'f':
3670 case 't':
3671 case 'u':
3672 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003673 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003674 if (SSELevel >= AVX512F)
3675 // 512-bit zmm registers can be used if target supports AVX512F.
3676 return Size <= 512U;
3677 else if (SSELevel >= AVX)
3678 // 256-bit ymm registers can be used if target supports AVX.
3679 return Size <= 256U;
3680 return Size <= 128U;
3681 case 'Y':
3682 // 'Y' is the first character for several 2-character constraints.
3683 switch (Constraint[1]) {
3684 default: break;
3685 case 'm':
3686 // 'Ym' is synonymous with 'y'.
3687 return Size <= 64;
3688 case 'i':
3689 case 't':
3690 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3691 if (SSELevel >= AVX512F)
3692 return Size <= 512U;
3693 else if (SSELevel >= AVX)
3694 return Size <= 256U;
3695 return SSELevel >= SSE2 && Size <= 128U;
3696 }
3697
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003698 }
3699
3700 return true;
3701}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003702
Eli Friedman3fd920a2008-08-20 02:34:37 +00003703std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003704X86TargetInfo::convertConstraint(const char *&Constraint) const {
3705 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003706 case 'a': return std::string("{ax}");
3707 case 'b': return std::string("{bx}");
3708 case 'c': return std::string("{cx}");
3709 case 'd': return std::string("{dx}");
3710 case 'S': return std::string("{si}");
3711 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003712 case 'p': // address
3713 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003714 case 't': // top of floating point stack.
3715 return std::string("{st}");
3716 case 'u': // second from top of floating point stack.
3717 return std::string("{st(1)}"); // second from top of floating point stack.
3718 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003719 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003720 }
3721}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003722
Eli Friedman3fd920a2008-08-20 02:34:37 +00003723// X86-32 generic target
3724class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003725public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003726 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003727 DoubleAlign = LongLongAlign = 32;
3728 LongDoubleWidth = 96;
3729 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003730 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003731 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003732 SizeType = UnsignedInt;
3733 PtrDiffType = SignedInt;
3734 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003735 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003736
3737 // Use fpret for all types.
3738 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3739 (1 << TargetInfo::Double) |
3740 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003741
3742 // x86-32 has atomics up to 8 bytes
3743 // FIXME: Check that we actually have cmpxchg8b before setting
3744 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3745 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003746 }
Craig Topper3164f332014-03-11 03:39:26 +00003747 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003748 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003749 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003750
Craig Topper3164f332014-03-11 03:39:26 +00003751 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003752 if (RegNo == 0) return 0;
3753 if (RegNo == 1) return 2;
3754 return -1;
3755 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003756 bool validateOperandSize(StringRef Constraint,
3757 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003758 switch (Constraint[0]) {
3759 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003760 case 'R':
3761 case 'q':
3762 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003763 case 'a':
3764 case 'b':
3765 case 'c':
3766 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003767 case 'S':
3768 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003769 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003770 case 'A':
3771 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003772 }
3773
Akira Hatanaka974131e2014-09-18 18:17:18 +00003774 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003775 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003776};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003777
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003778class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3779public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003780 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3781 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003782
Craig Topper3164f332014-03-11 03:39:26 +00003783 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003784 unsigned Major, Minor, Micro;
3785 getTriple().getOSVersion(Major, Minor, Micro);
3786 // New NetBSD uses the default rounding mode.
3787 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3788 return X86_32TargetInfo::getFloatEvalMethod();
3789 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003790 return 1;
3791 }
3792};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003793
Eli Friedmane3aa4542009-07-05 18:47:56 +00003794class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3795public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003796 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3797 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003798 SizeType = UnsignedLong;
3799 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003800 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003801 }
3802};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003803
Eli Friedman9fa28852012-08-08 23:57:20 +00003804class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3805public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003806 BitrigI386TargetInfo(const llvm::Triple &Triple)
3807 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003808 SizeType = UnsignedLong;
3809 IntPtrType = SignedLong;
3810 PtrDiffType = SignedLong;
3811 }
3812};
Eli Friedman9fa28852012-08-08 23:57:20 +00003813
Torok Edwinb2b37c62009-06-30 17:10:35 +00003814class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003815public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003816 DarwinI386TargetInfo(const llvm::Triple &Triple)
3817 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003818 LongDoubleWidth = 128;
3819 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003820 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003821 MaxVectorAlign = 256;
3822 // The watchOS simulator uses the builtin bool type for Objective-C.
3823 llvm::Triple T = llvm::Triple(Triple);
3824 if (T.isWatchOS())
3825 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003826 SizeType = UnsignedLong;
3827 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003828 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003829 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003830 }
3831
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003832 bool handleTargetFeatures(std::vector<std::string> &Features,
3833 DiagnosticsEngine &Diags) override {
3834 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3835 Diags))
3836 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003837 // We now know the features we have: we can decide how to align vectors.
3838 MaxVectorAlign =
3839 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003840 return true;
3841 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003842};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003843
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003844// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003845class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003846public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003847 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3848 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003849 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003850 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003851 bool IsWinCOFF =
3852 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003853 resetDataLayout(IsWinCOFF
3854 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3855 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003856 }
Craig Topper3164f332014-03-11 03:39:26 +00003857 void getTargetDefines(const LangOptions &Opts,
3858 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003859 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3860 }
3861};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003862
3863// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003864class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003865public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003866 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003867 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003868 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003869 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3870 }
Craig Topper3164f332014-03-11 03:39:26 +00003871 void getTargetDefines(const LangOptions &Opts,
3872 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003873 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3874 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3875 // The value of the following reflects processor type.
3876 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3877 // We lost the original triple, so we use the default.
3878 Builder.defineMacro("_M_IX86", "600");
3879 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003880};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003881
David Majnemerae1ed0e2015-05-28 04:36:18 +00003882static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003883 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3884 // supports __declspec natively under -fms-extensions, but we define a no-op
3885 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003886 if (Opts.MicrosoftExt)
3887 Builder.defineMacro("__declspec", "__declspec");
3888 else
3889 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3890
3891 if (!Opts.MicrosoftExt) {
3892 // Provide macros for all the calling convention keywords. Provide both
3893 // single and double underscore prefixed variants. These are available on
3894 // x64 as well as x86, even though they have no effect.
3895 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3896 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003897 std::string GCCSpelling = "__attribute__((__";
3898 GCCSpelling += CC;
3899 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003900 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3901 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3902 }
3903 }
3904}
3905
David Majnemerae1ed0e2015-05-28 04:36:18 +00003906static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3907 Builder.defineMacro("__MSVCRT__");
3908 Builder.defineMacro("__MINGW32__");
3909 addCygMingDefines(Opts, Builder);
3910}
3911
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003912// x86-32 MinGW target
3913class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3914public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003915 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003916 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003917 void getTargetDefines(const LangOptions &Opts,
3918 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003919 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003920 DefineStd(Builder, "WIN32", Opts);
3921 DefineStd(Builder, "WINNT", Opts);
3922 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003923 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003924 }
3925};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003926
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003927// x86-32 Cygwin target
3928class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3929public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003930 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3931 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003932 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003933 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00003934 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 +00003935 }
Craig Topper3164f332014-03-11 03:39:26 +00003936 void getTargetDefines(const LangOptions &Opts,
3937 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003938 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003939 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003940 Builder.defineMacro("__CYGWIN__");
3941 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003942 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003943 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003944 if (Opts.CPlusPlus)
3945 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003946 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003947};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003948
Chris Lattnerb986aba2010-04-11 19:29:39 +00003949// x86-32 Haiku target
3950class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3951public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003952 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003953 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003954 IntPtrType = SignedLong;
3955 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003956 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003957 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003958 }
Craig Topper3164f332014-03-11 03:39:26 +00003959 void getTargetDefines(const LangOptions &Opts,
3960 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003961 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3962 Builder.defineMacro("__INTEL__");
3963 Builder.defineMacro("__HAIKU__");
3964 }
3965};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003966
Alexey Bataevc99b0492015-11-25 09:24:26 +00003967// X86-32 MCU target
3968class MCUX86_32TargetInfo : public X86_32TargetInfo {
3969public:
3970 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3971 LongDoubleWidth = 64;
3972 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00003973 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 +00003974 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003975 }
3976
3977 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3978 // On MCU we support only C calling convention.
3979 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3980 }
3981
3982 void getTargetDefines(const LangOptions &Opts,
3983 MacroBuilder &Builder) const override {
3984 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3985 Builder.defineMacro("__iamcu");
3986 Builder.defineMacro("__iamcu__");
3987 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00003988
3989 bool allowsLargerPreferedTypeAlignment() const override {
3990 return false;
3991 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00003992};
3993
Douglas Gregor9fabd852011-07-01 22:41:14 +00003994// RTEMS Target
3995template<typename Target>
3996class RTEMSTargetInfo : public OSTargetInfo<Target> {
3997protected:
Craig Topper3164f332014-03-11 03:39:26 +00003998 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3999 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004000 // RTEMS defines; list based off of gcc output
4001
Douglas Gregor9fabd852011-07-01 22:41:14 +00004002 Builder.defineMacro("__rtems__");
4003 Builder.defineMacro("__ELF__");
4004 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004005
Douglas Gregor9fabd852011-07-01 22:41:14 +00004006public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004007 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004008 switch (Triple.getArch()) {
4009 default:
4010 case llvm::Triple::x86:
4011 // this->MCountName = ".mcount";
4012 break;
4013 case llvm::Triple::mips:
4014 case llvm::Triple::mipsel:
4015 case llvm::Triple::ppc:
4016 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004017 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004018 // this->MCountName = "_mcount";
4019 break;
4020 case llvm::Triple::arm:
4021 // this->MCountName = "__mcount";
4022 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004023 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004024 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004025};
4026
Douglas Gregor9fabd852011-07-01 22:41:14 +00004027// x86-32 RTEMS target
4028class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004030 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004031 SizeType = UnsignedLong;
4032 IntPtrType = SignedLong;
4033 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004034 }
Craig Topper3164f332014-03-11 03:39:26 +00004035 void getTargetDefines(const LangOptions &Opts,
4036 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004037 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4038 Builder.defineMacro("__INTEL__");
4039 Builder.defineMacro("__rtems__");
4040 }
4041};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004042
Eli Friedman3fd920a2008-08-20 02:34:37 +00004043// x86-64 generic target
4044class X86_64TargetInfo : public X86TargetInfo {
4045public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004046 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00004047 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004048 bool IsWinCOFF =
4049 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004050 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004051 LongDoubleWidth = 128;
4052 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004053 LargeArrayMinWidth = 128;
4054 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004055 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004056 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4057 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4058 IntPtrType = IsX32 ? SignedInt : SignedLong;
4059 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004060 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004061 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004062
Eric Christopher917e9522014-11-18 22:36:15 +00004063 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004064 resetDataLayout(IsX32
4065 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4066 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4067 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004068
4069 // Use fpret only for long double.
4070 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004071
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004072 // Use fp2ret for _Complex long double.
4073 ComplexLongDoubleUsesFP2Ret = true;
4074
Charles Davisc7d5c942015-09-17 20:55:33 +00004075 // Make __builtin_ms_va_list available.
4076 HasBuiltinMSVaList = true;
4077
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004078 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004079 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004080 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004081 }
Craig Topper3164f332014-03-11 03:39:26 +00004082 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004083 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004084 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004085
Craig Topper3164f332014-03-11 03:39:26 +00004086 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004087 if (RegNo == 0) return 0;
4088 if (RegNo == 1) return 1;
4089 return -1;
4090 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004091
Craig Topper3164f332014-03-11 03:39:26 +00004092 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004093 switch (CC) {
4094 case CC_C:
4095 case CC_Swift:
4096 case CC_X86VectorCall:
4097 case CC_IntelOclBicc:
4098 case CC_X86_64Win64:
4099 return CCCR_OK;
4100 default:
4101 return CCCR_Warning;
4102 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004103 }
4104
Craig Topper3164f332014-03-11 03:39:26 +00004105 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004106 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004107 }
4108
Pavel Chupinfd223e12014-08-04 12:39:43 +00004109 // for x32 we need it here explicitly
4110 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004111 unsigned getUnwindWordWidth() const override { return 64; }
4112 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004113
4114 bool validateGlobalRegisterVariable(StringRef RegName,
4115 unsigned RegSize,
4116 bool &HasSizeMismatch) const override {
4117 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4118 // handle.
4119 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4120 // Check that the register size is 64-bit.
4121 HasSizeMismatch = RegSize != 64;
4122 return true;
4123 }
4124
4125 // Check if the register is a 32-bit register the backend can handle.
4126 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4127 HasSizeMismatch);
4128 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004129};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004130
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004131// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004132class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004133public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004134 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4135 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004136 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004137 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004138 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004139 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004140 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004141 SizeType = UnsignedLongLong;
4142 PtrDiffType = SignedLongLong;
4143 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004144 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004145
Craig Topper3164f332014-03-11 03:39:26 +00004146 void getTargetDefines(const LangOptions &Opts,
4147 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004148 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004149 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004150 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004151
Craig Topper3164f332014-03-11 03:39:26 +00004152 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004153 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004154 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004155
Craig Topper3164f332014-03-11 03:39:26 +00004156 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004157 switch (CC) {
4158 case CC_X86StdCall:
4159 case CC_X86ThisCall:
4160 case CC_X86FastCall:
4161 return CCCR_Ignore;
4162 case CC_C:
4163 case CC_X86VectorCall:
4164 case CC_IntelOclBicc:
4165 case CC_X86_64SysV:
4166 return CCCR_OK;
4167 default:
4168 return CCCR_Warning;
4169 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004170 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004171};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004172
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004173// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004174class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004175public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004176 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004177 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004178 LongDoubleWidth = LongDoubleAlign = 64;
4179 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004180 }
Craig Topper3164f332014-03-11 03:39:26 +00004181 void getTargetDefines(const LangOptions &Opts,
4182 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004183 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4184 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004185 Builder.defineMacro("_M_X64", "100");
4186 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004187 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004188};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004189
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004190// x86-64 MinGW target
4191class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4192public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004193 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004194 : WindowsX86_64TargetInfo(Triple) {
4195 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4196 // with x86 FP ops. Weird.
4197 LongDoubleWidth = LongDoubleAlign = 128;
4198 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4199 }
4200
Craig Topper3164f332014-03-11 03:39:26 +00004201 void getTargetDefines(const LangOptions &Opts,
4202 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004203 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004204 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004205 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004206 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004207
4208 // GCC defines this macro when it is using __gxx_personality_seh0.
4209 if (!Opts.SjLjExceptions)
4210 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004211 }
4212};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004213
Yaron Kerend030d112015-07-22 17:38:19 +00004214// x86-64 Cygwin target
4215class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4216public:
4217 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4218 : X86_64TargetInfo(Triple) {
4219 TLSSupported = false;
4220 WCharType = UnsignedShort;
4221 }
4222 void getTargetDefines(const LangOptions &Opts,
4223 MacroBuilder &Builder) const override {
4224 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4225 Builder.defineMacro("__x86_64__");
4226 Builder.defineMacro("__CYGWIN__");
4227 Builder.defineMacro("__CYGWIN64__");
4228 addCygMingDefines(Opts, Builder);
4229 DefineStd(Builder, "unix", Opts);
4230 if (Opts.CPlusPlus)
4231 Builder.defineMacro("_GNU_SOURCE");
4232
4233 // GCC defines this macro when it is using __gxx_personality_seh0.
4234 if (!Opts.SjLjExceptions)
4235 Builder.defineMacro("__SEH__");
4236 }
4237};
4238
Eli Friedman2857ccb2009-07-01 03:36:11 +00004239class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004241 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4242 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004243 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004244 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4245 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004246 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004247 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004248 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004249 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004250
4251 bool handleTargetFeatures(std::vector<std::string> &Features,
4252 DiagnosticsEngine &Diags) override {
4253 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4254 Diags))
4255 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004256 // We now know the features we have: we can decide how to align vectors.
4257 MaxVectorAlign =
4258 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004259 return true;
4260 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004261};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004262
Eli Friedman245f2292009-07-05 22:31:18 +00004263class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4264public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004265 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4266 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004267 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004268 Int64Type = SignedLongLong;
4269 }
4270};
Eli Friedman245f2292009-07-05 22:31:18 +00004271
Eli Friedman9fa28852012-08-08 23:57:20 +00004272class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004274 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4275 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4276 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004277 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004278 }
4279};
Tim Northover9bb857a2013-01-31 12:13:10 +00004280
Eli Friedmanf05b7722008-08-20 07:44:10 +00004281class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004282 // Possible FPU choices.
4283 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004284 VFP2FPU = (1 << 0),
4285 VFP3FPU = (1 << 1),
4286 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004287 NeonFPU = (1 << 3),
4288 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004289 };
4290
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004291 // Possible HWDiv features.
4292 enum HWDivMode {
4293 HWDivThumb = (1 << 0),
4294 HWDivARM = (1 << 1)
4295 };
4296
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004297 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004298 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004299 }
4300
4301 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4302 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004303
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004304 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004305
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004306 StringRef CPUProfile;
4307 StringRef CPUAttr;
4308
Rafael Espindolaeb265472013-08-21 21:59:03 +00004309 enum {
4310 FP_Default,
4311 FP_VFP,
4312 FP_Neon
4313 } FPMath;
4314
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004315 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004316 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004317 unsigned ArchProfile;
4318 unsigned ArchVersion;
4319
Bernard Ogdenda13af32013-10-24 18:32:51 +00004320 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004321
Logan Chien57086ce2012-10-10 06:56:20 +00004322 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004323 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004324
4325 // Initialized via features.
4326 unsigned SoftFloat : 1;
4327 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004328
Bernard Ogden18b57012013-10-29 09:47:51 +00004329 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004330 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004331 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004332 unsigned Unaligned : 1;
4333
4334 enum {
4335 LDREX_B = (1 << 0), /// byte (8-bit)
4336 LDREX_H = (1 << 1), /// half (16-bit)
4337 LDREX_W = (1 << 2), /// word (32-bit)
4338 LDREX_D = (1 << 3), /// double (64-bit)
4339 };
4340
4341 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004342
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004343 // ACLE 6.5.1 Hardware floating point
4344 enum {
4345 HW_FP_HP = (1 << 1), /// half (16-bit)
4346 HW_FP_SP = (1 << 2), /// single (32-bit)
4347 HW_FP_DP = (1 << 3), /// double (64-bit)
4348 };
4349 uint32_t HW_FP;
4350
Chris Lattner5cc15e02010-03-03 19:03:45 +00004351 static const Builtin::Info BuiltinInfo[];
4352
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004353 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004354 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004355
4356 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004357 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004358
Renato Golin9ba39232015-02-27 16:35:48 +00004359 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4360 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4361 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004362 SizeType = UnsignedLong;
4363 else
4364 SizeType = UnsignedInt;
4365
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004366 switch (T.getOS()) {
4367 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004368 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004369 break;
4370 case llvm::Triple::Win32:
4371 WCharType = UnsignedShort;
4372 break;
4373 case llvm::Triple::Linux:
4374 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004375 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4376 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004377 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004378 }
4379
4380 UseBitFieldTypeAlignment = true;
4381
4382 ZeroLengthBitfieldBoundary = 0;
4383
Tim Northover147cd2f2014-10-14 22:12:21 +00004384 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4385 // so set preferred for small types to 32.
4386 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004387 resetDataLayout(BigEndian
4388 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4389 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004390 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004391 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004392 resetDataLayout("e"
4393 "-m:w"
4394 "-p:32:32"
4395 "-i64:64"
4396 "-v128:64:128"
4397 "-a:0:32"
4398 "-n32"
4399 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004400 } else if (T.isOSNaCl()) {
4401 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004402 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004403 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004404 resetDataLayout(BigEndian
4405 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4406 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004407 }
4408
4409 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004410 }
4411
Tim Northover5627d392015-10-30 16:30:45 +00004412 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004413 const llvm::Triple &T = getTriple();
4414
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004415 IsAAPCS = false;
4416
Tim Northover5627d392015-10-30 16:30:45 +00004417 if (IsAAPCS16)
4418 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4419 else
4420 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004421
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004422 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004423 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004424 SizeType = UnsignedInt;
4425 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004426 SizeType = UnsignedLong;
4427
4428 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4429 WCharType = SignedInt;
4430
4431 // Do not respect the alignment of bit-field types when laying out
4432 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4433 UseBitFieldTypeAlignment = false;
4434
4435 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4436 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4437 /// gcc.
4438 ZeroLengthBitfieldBoundary = 32;
4439
Tim Northover5627d392015-10-30 16:30:45 +00004440 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4441 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004442 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004443 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004444 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004445 BigEndian
4446 ? "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 +00004447 : "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 +00004448 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004449 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004450 BigEndian
4451 ? "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 +00004452 : "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 +00004453
4454 // FIXME: Override "preferred align" for double and long long.
4455 }
4456
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004457 void setArchInfo() {
4458 StringRef ArchName = getTriple().getArchName();
4459
Renato Goline84b0002015-10-08 16:43:26 +00004460 ArchISA = llvm::ARM::parseArchISA(ArchName);
4461 CPU = llvm::ARM::getDefaultCPU(ArchName);
4462 unsigned AK = llvm::ARM::parseArch(ArchName);
4463 if (AK != llvm::ARM::AK_INVALID)
4464 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004465 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004466 }
4467
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004468 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004469 StringRef SubArch;
4470
4471 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004472 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004473 SubArch = llvm::ARM::getSubArch(ArchKind);
4474 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4475 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004476
4477 // cache CPU related strings
4478 CPUAttr = getCPUAttr();
4479 CPUProfile = getCPUProfile();
4480 }
4481
4482 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004483 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004484 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004485 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004486 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4487 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004488 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004489 if (ArchProfile == llvm::ARM::PK_M) {
4490 MaxAtomicPromoteWidth = 32;
4491 if (ShouldUseInlineAtomic)
4492 MaxAtomicInlineWidth = 32;
4493 }
4494 else {
4495 MaxAtomicPromoteWidth = 64;
4496 if (ShouldUseInlineAtomic)
4497 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004498 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004499 }
4500
4501 bool isThumb() const {
4502 return (ArchISA == llvm::ARM::IK_THUMB);
4503 }
4504
4505 bool supportsThumb() const {
4506 return CPUAttr.count('T') || ArchVersion >= 6;
4507 }
4508
4509 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004510 return CPUAttr.equals("6T2") ||
4511 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004512 }
4513
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004514 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004515 // For most sub-arches, the build attribute CPU name is enough.
4516 // For Cortex variants, it's slightly different.
4517 switch(ArchKind) {
4518 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004519 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004520 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004521 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004522 case llvm::ARM::AK_ARMV7S:
4523 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004524 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004525 return "7A";
4526 case llvm::ARM::AK_ARMV7R:
4527 return "7R";
4528 case llvm::ARM::AK_ARMV7M:
4529 return "7M";
4530 case llvm::ARM::AK_ARMV7EM:
4531 return "7EM";
4532 case llvm::ARM::AK_ARMV8A:
4533 return "8A";
4534 case llvm::ARM::AK_ARMV8_1A:
4535 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004536 case llvm::ARM::AK_ARMV8_2A:
4537 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004538 case llvm::ARM::AK_ARMV8MBaseline:
4539 return "8M_BASE";
4540 case llvm::ARM::AK_ARMV8MMainline:
4541 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004542 }
4543 }
4544
4545 StringRef getCPUProfile() const {
4546 switch(ArchProfile) {
4547 case llvm::ARM::PK_A:
4548 return "A";
4549 case llvm::ARM::PK_R:
4550 return "R";
4551 case llvm::ARM::PK_M:
4552 return "M";
4553 default:
4554 return "";
4555 }
4556 }
4557
Chris Lattner17df24e2008-04-21 18:56:49 +00004558public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004559 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004560 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004561 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004562 BigEndian = IsBigEndian;
4563
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004564 switch (getTriple().getOS()) {
4565 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004566 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004567 break;
4568 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004569 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004570 break;
4571 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004572
Renato Goline84b0002015-10-08 16:43:26 +00004573 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004574 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004575
Chris Lattner1a8f3942010-04-23 16:29:58 +00004576 // {} in inline assembly are neon specifiers, not assembly variant
4577 // specifiers.
4578 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004579
Eric Christopher0e261882014-12-05 01:06:59 +00004580 // FIXME: This duplicates code from the driver that sets the -target-abi
4581 // option - this code is used if -target-abi isn't passed and should
4582 // be unified in some way.
4583 if (Triple.isOSBinFormatMachO()) {
4584 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4585 // the frontend matches that.
4586 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4587 Triple.getOS() == llvm::Triple::UnknownOS ||
4588 StringRef(CPU).startswith("cortex-m")) {
4589 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004590 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004591 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004592 } else {
4593 setABI("apcs-gnu");
4594 }
4595 } else if (Triple.isOSWindows()) {
4596 // FIXME: this is invalid for WindowsCE
4597 setABI("aapcs");
4598 } else {
4599 // Select the default based on the platform.
4600 switch (Triple.getEnvironment()) {
4601 case llvm::Triple::Android:
4602 case llvm::Triple::GNUEABI:
4603 case llvm::Triple::GNUEABIHF:
4604 setABI("aapcs-linux");
4605 break;
4606 case llvm::Triple::EABIHF:
4607 case llvm::Triple::EABI:
4608 setABI("aapcs");
4609 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004610 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004611 setABI("apcs-gnu");
4612 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004613 default:
4614 if (Triple.getOS() == llvm::Triple::NetBSD)
4615 setABI("apcs-gnu");
4616 else
4617 setABI("aapcs");
4618 break;
4619 }
4620 }
John McCall86353412010-08-21 22:46:04 +00004621
4622 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004623 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004624
Renato Golin15b86152015-07-03 16:41:13 +00004625 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004626 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004627
James Molloya7139222012-03-12 09:14:10 +00004628 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004629 // the alignment of the zero-length bitfield is greater than the member
4630 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004631 // zero length bitfield.
4632 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004633 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004634
Alp Toker4925ba72014-06-07 23:30:42 +00004635 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004636
Craig Topper3164f332014-03-11 03:39:26 +00004637 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004638 ABI = Name;
4639
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004640 // The defaults (above) are for AAPCS, check if we need to change them.
4641 //
4642 // FIXME: We need support for -meabi... we could just mangle it into the
4643 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004644 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004645 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004646 return true;
4647 }
4648 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4649 setABIAAPCS();
4650 return true;
4651 }
4652 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004653 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004654
Renato Golinf5c4dec2015-05-27 13:33:00 +00004655 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004656 bool
4657 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4658 StringRef CPU,
4659 const std::vector<std::string> &FeaturesVec) const override {
4660
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004661 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004662 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004663
4664 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004665 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004666 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4667
4668 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004669 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004670 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4671
4672 for (const char *Feature : TargetFeatures)
4673 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004674 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004675
Eric Christopher007b0a02015-08-28 22:32:01 +00004676 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004677 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004678
Craig Topper3164f332014-03-11 03:39:26 +00004679 bool handleTargetFeatures(std::vector<std::string> &Features,
4680 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004681 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004682 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004683 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004684 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004685 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004686 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004687 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004688
Ranjeet Singhac08e532015-06-24 23:39:25 +00004689 // This does not diagnose illegal cases like having both
4690 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4691 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004692 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004693 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004694 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004695 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004696 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004697 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004698 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004699 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004700 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004701 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004702 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004703 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004704 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004705 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004706 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004707 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004708 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004709 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004710 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004711 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004712 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004713 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004714 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004715 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004716 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004717 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004718 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004719 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004720 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004721 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004722 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004723 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004724 } else if (Feature == "+strict-align") {
4725 Unaligned = 0;
4726 } else if (Feature == "+fp16") {
4727 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004728 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004729 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004730 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004731
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004732 switch (ArchVersion) {
4733 case 6:
4734 if (ArchProfile == llvm::ARM::PK_M)
4735 LDREX = 0;
4736 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4737 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4738 else
4739 LDREX = LDREX_W;
4740 break;
4741 case 7:
4742 if (ArchProfile == llvm::ARM::PK_M)
4743 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4744 else
4745 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4746 break;
4747 case 8:
4748 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4749 }
4750
Rafael Espindolaeb265472013-08-21 21:59:03 +00004751 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4752 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4753 return false;
4754 }
4755
4756 if (FPMath == FP_Neon)
4757 Features.push_back("+neonfp");
4758 else if (FPMath == FP_VFP)
4759 Features.push_back("-neonfp");
4760
Daniel Dunbar893d4752009-12-19 04:15:38 +00004761 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004762 auto Feature =
4763 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4764 if (Feature != Features.end())
4765 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004766
Rafael Espindolaeb265472013-08-21 21:59:03 +00004767 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004768 }
4769
Craig Topper3164f332014-03-11 03:39:26 +00004770 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004771 return llvm::StringSwitch<bool>(Feature)
4772 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004773 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004774 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004775 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004776 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004777 .Case("hwdiv", HWDiv & HWDivThumb)
4778 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004779 .Default(false);
4780 }
Renato Golin15b86152015-07-03 16:41:13 +00004781
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004782 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004783 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004784 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004785
Renato Golin15b86152015-07-03 16:41:13 +00004786 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004787 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004788 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004789 CPU = Name;
4790 return true;
4791 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004792
Craig Topper3164f332014-03-11 03:39:26 +00004793 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004794
Craig Topper3164f332014-03-11 03:39:26 +00004795 void getTargetDefines(const LangOptions &Opts,
4796 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004797 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004798 Builder.defineMacro("__arm");
4799 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004800
Chris Lattnerecd49032009-03-02 22:27:17 +00004801 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004802 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004803
4804 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4805 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004806 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004807 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4808
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004809 if (!CPUAttr.empty())
4810 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004811
4812 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004813 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004814 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004815
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004816 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004817 // ACLE 6.5.7 Crypto Extension
4818 if (Crypto)
4819 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4820 // ACLE 6.5.8 CRC32 Extension
4821 if (CRC)
4822 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4823 // ACLE 6.5.10 Numeric Maximum and Minimum
4824 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4825 // ACLE 6.5.9 Directed Rounding
4826 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004827 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004828
4829 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4830 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004831 // NOTE that the default profile is assumed to be 'A'
4832 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004833 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4834
Bradley Smithf4affc12016-03-03 13:52:22 +00004835 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4836 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4837 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4838 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004839 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004840 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004841 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004842 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4843
4844 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4845 // instruction set such as ARM or Thumb.
4846 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4847
4848 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4849
4850 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004851 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004852 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004853
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004854 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004855 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004856 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004857
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004858 // ACLE 6.4.4 LDREX/STREX
4859 if (LDREX)
4860 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4861
4862 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004863 if (ArchVersion == 5 ||
4864 (ArchVersion == 6 && CPUProfile != "M") ||
4865 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004866 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4867
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004868 // ACLE 6.5.1 Hardware Floating Point
4869 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004870 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004871
Yi Konga44c4d72014-06-27 21:25:42 +00004872 // ACLE predefines.
4873 Builder.defineMacro("__ARM_ACLE", "200");
4874
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004875 // FP16 support (we currently only support IEEE format).
4876 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4877 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4878
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004879 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4880 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4881 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4882
Mike Stump9d54bd72009-04-08 02:07:04 +00004883 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004884
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004885 // FIXME: It's more complicated than this and we don't really support
4886 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004887 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004888 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004889 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004890
David Tweed8f676532012-10-25 13:33:01 +00004891 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004892 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004893 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4894 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004895 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004896 Builder.defineMacro("__ARM_PCS", "1");
4897
David Tweed8f676532012-10-25 13:33:01 +00004898 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004899 Builder.defineMacro("__ARM_PCS_VFP", "1");
4900 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004901
Daniel Dunbar893d4752009-12-19 04:15:38 +00004902 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004903 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004904
4905 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004906 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004907
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004908 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004909 Builder.defineMacro("__THUMBEL__");
4910 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004911 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004912 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004913 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004914
4915 // ACLE 6.4.9 32-bit SIMD instructions
4916 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4917 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4918
4919 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004920 if (((HWDiv & HWDivThumb) && isThumb()) ||
4921 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004922 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004923 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004924 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004925
4926 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004927 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004928
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004929 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004930 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004931 if (FPU & VFP2FPU)
4932 Builder.defineMacro("__ARM_VFPV2__");
4933 if (FPU & VFP3FPU)
4934 Builder.defineMacro("__ARM_VFPV3__");
4935 if (FPU & VFP4FPU)
4936 Builder.defineMacro("__ARM_VFPV4__");
4937 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004938
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004939 // This only gets set when Neon instructions are actually available, unlike
4940 // the VFP define, hence the soft float and arch check. This is subtly
4941 // different from gcc, we follow the intent which was that it should be set
4942 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004943 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004944 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004945 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004946 // current AArch32 NEON implementations do not support double-precision
4947 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004948 Builder.defineMacro("__ARM_NEON_FP",
4949 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004950 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004951
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004952 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4953 Opts.ShortWChar ? "2" : "4");
4954
4955 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4956 Opts.ShortEnums ? "1" : "4");
4957
Bradley Smithf4affc12016-03-03 13:52:22 +00004958 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004959 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4960 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4961 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4962 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4963 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004964
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004965 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004966 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004967 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004968 }
4969
4970 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004971 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004972 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4973 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004974 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004975 }
4976
4977 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004978 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004979 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004980
4981 if (Opts.UnsafeFPMath)
4982 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004983
4984 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4985 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004986 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004987
Craig Topper6c03a542015-10-19 04:51:35 +00004988 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4989 return llvm::makeArrayRef(BuiltinInfo,
4990 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004991 }
Craig Topper3164f332014-03-11 03:39:26 +00004992 bool isCLZForZeroUndef() const override { return false; }
4993 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004994 return IsAAPCS
4995 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00004996 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
4997 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00004998 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004999 ArrayRef<const char *> getGCCRegNames() const override;
5000 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005001 bool validateAsmConstraint(const char *&Name,
5002 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005003 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005004 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005005 case 'l': // r0-r7
5006 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005007 case 't': // VFP Floating point register single precision
5008 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005009 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005010 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005011 case 'I':
5012 case 'J':
5013 case 'K':
5014 case 'L':
5015 case 'M':
5016 // FIXME
5017 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005018 case 'Q': // A memory address that is a single base register.
5019 Info.setAllowsMemory();
5020 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005021 case 'U': // a memory reference...
5022 switch (Name[1]) {
5023 case 'q': // ...ARMV4 ldrsb
5024 case 'v': // ...VFP load/store (reg+constant offset)
5025 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005026 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005027 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005028 case 'n': // valid address for Neon doubleword vector load/store
5029 case 'm': // valid address for Neon element and structure load/store
5030 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005031 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005032 Info.setAllowsMemory();
5033 Name++;
5034 return true;
5035 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005036 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005037 return false;
5038 }
Craig Topper3164f332014-03-11 03:39:26 +00005039 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005040 std::string R;
5041 switch (*Constraint) {
5042 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005043 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005044 Constraint++;
5045 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005046 case 'p': // 'p' should be translated to 'r' by default.
5047 R = std::string("r");
5048 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005049 default:
5050 return std::string(1, *Constraint);
5051 }
5052 return R;
5053 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005054 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005055 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005056 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005057 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005058 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005059
Bill Wendling9d1ee112012-10-25 23:28:48 +00005060 // Strip off constraint modifiers.
5061 while (Constraint[0] == '=' ||
5062 Constraint[0] == '+' ||
5063 Constraint[0] == '&')
5064 Constraint = Constraint.substr(1);
5065
5066 switch (Constraint[0]) {
5067 default: break;
5068 case 'r': {
5069 switch (Modifier) {
5070 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005071 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005072 case 'q':
5073 // A register of size 32 cannot fit a vector type.
5074 return false;
5075 }
5076 }
5077 }
5078
5079 return true;
5080 }
Craig Topper3164f332014-03-11 03:39:26 +00005081 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005082 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005083 return "";
5084 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005085
Craig Topper3164f332014-03-11 03:39:26 +00005086 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005087 switch (CC) {
5088 case CC_AAPCS:
5089 case CC_AAPCS_VFP:
5090 case CC_Swift:
5091 return CCCR_OK;
5092 default:
5093 return CCCR_Warning;
5094 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005095 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005096
Craig Topper3164f332014-03-11 03:39:26 +00005097 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005098 if (RegNo == 0) return 0;
5099 if (RegNo == 1) return 1;
5100 return -1;
5101 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005102
5103 bool hasSjLjLowering() const override {
5104 return true;
5105 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005106};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005107
Rafael Espindolaeb265472013-08-21 21:59:03 +00005108bool ARMTargetInfo::setFPMath(StringRef Name) {
5109 if (Name == "neon") {
5110 FPMath = FP_Neon;
5111 return true;
5112 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5113 Name == "vfp4") {
5114 FPMath = FP_VFP;
5115 return true;
5116 }
5117 return false;
5118}
5119
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005120const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005121 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005122 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005123 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5124
5125 // Float registers
5126 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5127 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5128 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005129 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005130
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005131 // Double registers
5132 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5133 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005134 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5135 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005136
5137 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005138 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5139 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005140};
5141
Craig Topperf054e3a2015-10-19 03:52:27 +00005142ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5143 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005144}
5145
5146const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005147 { { "a1" }, "r0" },
5148 { { "a2" }, "r1" },
5149 { { "a3" }, "r2" },
5150 { { "a4" }, "r3" },
5151 { { "v1" }, "r4" },
5152 { { "v2" }, "r5" },
5153 { { "v3" }, "r6" },
5154 { { "v4" }, "r7" },
5155 { { "v5" }, "r8" },
5156 { { "v6", "rfp" }, "r9" },
5157 { { "sl" }, "r10" },
5158 { { "fp" }, "r11" },
5159 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005160 { { "r13" }, "sp" },
5161 { { "r14" }, "lr" },
5162 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005163 // The S, D and Q registers overlap, but aren't really aliases; we
5164 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005165};
5166
Craig Topperf054e3a2015-10-19 03:52:27 +00005167ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5168 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005169}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005170
5171const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005172#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005173 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005174#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5175 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005176#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005177
Craig Topper07d3b622015-08-07 05:14:44 +00005178#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005179 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005180#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005181 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005182#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5183 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005184#include "clang/Basic/BuiltinsARM.def"
5185};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005186
5187class ARMleTargetInfo : public ARMTargetInfo {
5188public:
5189 ARMleTargetInfo(const llvm::Triple &Triple)
5190 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005191 void getTargetDefines(const LangOptions &Opts,
5192 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005193 Builder.defineMacro("__ARMEL__");
5194 ARMTargetInfo::getTargetDefines(Opts, Builder);
5195 }
5196};
5197
5198class ARMbeTargetInfo : public ARMTargetInfo {
5199public:
5200 ARMbeTargetInfo(const llvm::Triple &Triple)
5201 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005202 void getTargetDefines(const LangOptions &Opts,
5203 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005204 Builder.defineMacro("__ARMEB__");
5205 Builder.defineMacro("__ARM_BIG_ENDIAN");
5206 ARMTargetInfo::getTargetDefines(Opts, Builder);
5207 }
5208};
Chris Lattner17df24e2008-04-21 18:56:49 +00005209
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005210class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5211 const llvm::Triple Triple;
5212public:
5213 WindowsARMTargetInfo(const llvm::Triple &Triple)
5214 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005215 WCharType = UnsignedShort;
5216 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005217 }
5218 void getVisualStudioDefines(const LangOptions &Opts,
5219 MacroBuilder &Builder) const {
5220 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5221
5222 // FIXME: this is invalid for WindowsCE
5223 Builder.defineMacro("_M_ARM_NT", "1");
5224 Builder.defineMacro("_M_ARMT", "_M_ARM");
5225 Builder.defineMacro("_M_THUMB", "_M_ARM");
5226
5227 assert((Triple.getArch() == llvm::Triple::arm ||
5228 Triple.getArch() == llvm::Triple::thumb) &&
5229 "invalid architecture for Windows ARM target info");
5230 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5231 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5232
5233 // TODO map the complete set of values
5234 // 31: VFPv3 40: VFPv4
5235 Builder.defineMacro("_M_ARM_FP", "31");
5236 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005237 BuiltinVaListKind getBuiltinVaListKind() const override {
5238 return TargetInfo::CharPtrBuiltinVaList;
5239 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005240 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5241 switch (CC) {
5242 case CC_X86StdCall:
5243 case CC_X86ThisCall:
5244 case CC_X86FastCall:
5245 case CC_X86VectorCall:
5246 return CCCR_Ignore;
5247 case CC_C:
5248 return CCCR_OK;
5249 default:
5250 return CCCR_Warning;
5251 }
5252 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005253};
5254
5255// Windows ARM + Itanium C++ ABI Target
5256class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5257public:
5258 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5259 : WindowsARMTargetInfo(Triple) {
5260 TheCXXABI.set(TargetCXXABI::GenericARM);
5261 }
5262
5263 void getTargetDefines(const LangOptions &Opts,
5264 MacroBuilder &Builder) const override {
5265 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5266
5267 if (Opts.MSVCCompat)
5268 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5269 }
5270};
5271
5272// Windows ARM, MS (C++) ABI
5273class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5274public:
5275 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5276 : WindowsARMTargetInfo(Triple) {
5277 TheCXXABI.set(TargetCXXABI::Microsoft);
5278 }
5279
5280 void getTargetDefines(const LangOptions &Opts,
5281 MacroBuilder &Builder) const override {
5282 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5283 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5284 }
5285};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005286
Yaron Keren321249c2015-07-15 13:32:23 +00005287// ARM MinGW target
5288class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5289public:
5290 MinGWARMTargetInfo(const llvm::Triple &Triple)
5291 : WindowsARMTargetInfo(Triple) {
5292 TheCXXABI.set(TargetCXXABI::GenericARM);
5293 }
5294
5295 void getTargetDefines(const LangOptions &Opts,
5296 MacroBuilder &Builder) const override {
5297 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5298 DefineStd(Builder, "WIN32", Opts);
5299 DefineStd(Builder, "WINNT", Opts);
5300 Builder.defineMacro("_ARM_");
5301 addMinGWDefines(Opts, Builder);
5302 }
5303};
5304
5305// ARM Cygwin target
5306class CygwinARMTargetInfo : public ARMleTargetInfo {
5307public:
5308 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5309 TLSSupported = false;
5310 WCharType = UnsignedShort;
5311 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005312 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005313 }
5314 void getTargetDefines(const LangOptions &Opts,
5315 MacroBuilder &Builder) const override {
5316 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5317 Builder.defineMacro("_ARM_");
5318 Builder.defineMacro("__CYGWIN__");
5319 Builder.defineMacro("__CYGWIN32__");
5320 DefineStd(Builder, "unix", Opts);
5321 if (Opts.CPlusPlus)
5322 Builder.defineMacro("_GNU_SOURCE");
5323 }
5324};
5325
Mike Stump11289f42009-09-09 15:08:12 +00005326class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005327 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005328protected:
Craig Topper3164f332014-03-11 03:39:26 +00005329 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5330 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005331 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005332 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005333
Torok Edwinb2b37c62009-06-30 17:10:35 +00005334public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005335 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005336 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005337 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005338 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005339 // FIXME: This should be based off of the target features in
5340 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005341 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005342
Tim Northoverd88ecb32016-01-27 19:32:40 +00005343 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005344 // Darwin on iOS uses a variant of the ARM C++ ABI.
5345 TheCXXABI.set(TargetCXXABI::WatchOS);
5346
5347 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5348 // size_t is long, it's a bit weird for it to be int.
5349 PtrDiffType = SignedLong;
5350
5351 // BOOL should be a real boolean on the new ABI
5352 UseSignedCharForObjCBool = false;
5353 } else
5354 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005355 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005356};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005357
Tim Northover573cbee2014-05-24 12:52:07 +00005358class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005359 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005360 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5361 static const char *const GCCRegNames[];
5362
James Molloy75f5f9e2014-04-16 15:33:48 +00005363 enum FPUModeEnum {
5364 FPUMode,
5365 NeonMode
5366 };
5367
5368 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005369 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005370 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005371 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005372 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005373
Tim Northovera2ee4332014-03-29 15:09:45 +00005374 static const Builtin::Info BuiltinInfo[];
5375
5376 std::string ABI;
5377
5378public:
Tim Northover573cbee2014-05-24 12:52:07 +00005379 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005380 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005381
5382 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5383 WCharType = SignedInt;
5384
5385 // NetBSD apparently prefers consistency across ARM targets to consistency
5386 // across 64-bit targets.
5387 Int64Type = SignedLongLong;
5388 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005389 } else {
5390 WCharType = UnsignedInt;
5391 Int64Type = SignedLong;
5392 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005393 }
5394
Tim Northovera2ee4332014-03-29 15:09:45 +00005395 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005396 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005397 MaxAtomicInlineWidth = 128;
5398 MaxAtomicPromoteWidth = 128;
5399
Tim Northovera6a19f12015-02-06 01:25:07 +00005400 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005401 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5402
Tim Northovera2ee4332014-03-29 15:09:45 +00005403 // {} in inline assembly are neon specifiers, not assembly variant
5404 // specifiers.
5405 NoAsmVariants = true;
5406
Tim Northover7ad87af2015-01-16 18:44:04 +00005407 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5408 // contributes to the alignment of the containing aggregate in the same way
5409 // a plain (non bit-field) member of that type would, without exception for
5410 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005411 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005412 UseZeroLengthBitfieldAlignment = true;
5413
Tim Northover573cbee2014-05-24 12:52:07 +00005414 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005415 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5416 }
5417
Alp Toker4925ba72014-06-07 23:30:42 +00005418 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005419 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005420 if (Name != "aapcs" && Name != "darwinpcs")
5421 return false;
5422
5423 ABI = Name;
5424 return true;
5425 }
5426
David Blaikie1cbb9712014-11-14 19:09:44 +00005427 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005428 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005429 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005430 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5431 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005432 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005433 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005434 .Default(false);
5435 return CPUKnown;
5436 }
5437
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005438 void getTargetDefines(const LangOptions &Opts,
5439 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005440 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005441 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005442
5443 // Target properties.
5444 Builder.defineMacro("_LP64");
5445 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005446
5447 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5448 Builder.defineMacro("__ARM_ACLE", "200");
5449 Builder.defineMacro("__ARM_ARCH", "8");
5450 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5451
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005452 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005453 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005454 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005455
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005456 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5457 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5458 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5459 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005460 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005461 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5462 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005463
5464 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5465
5466 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005467 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005468
5469 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5470 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005471 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5472 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005473
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005474 if (Opts.UnsafeFPMath)
5475 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005476
5477 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5478
5479 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5480 Opts.ShortEnums ? "1" : "4");
5481
James Molloy75f5f9e2014-04-16 15:33:48 +00005482 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005483 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005484 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005485 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005486 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005487
Bradley Smith418c5932014-05-02 15:17:51 +00005488 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005489 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005490
James Molloy75f5f9e2014-04-16 15:33:48 +00005491 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005492 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5493
5494 if (Unaligned)
5495 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005496
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005497 if (V8_1A)
5498 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5499
Reid Klecknerd167d422015-05-06 15:31:46 +00005500 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5501 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5502 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5503 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5504 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005505 }
5506
Craig Topper6c03a542015-10-19 04:51:35 +00005507 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5508 return llvm::makeArrayRef(BuiltinInfo,
5509 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005510 }
5511
David Blaikie1cbb9712014-11-14 19:09:44 +00005512 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005513 return Feature == "aarch64" ||
5514 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005515 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005516 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005517 }
5518
James Molloy5e73df52014-04-16 15:06:20 +00005519 bool handleTargetFeatures(std::vector<std::string> &Features,
5520 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005521 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005522 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005523 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005524 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005525 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005526
Eric Christopher610fe112015-08-26 08:21:55 +00005527 for (const auto &Feature : Features) {
5528 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005529 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005530 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005531 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005532 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005533 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005534 if (Feature == "+strict-align")
5535 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005536 if (Feature == "+v8.1a")
5537 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005538 }
5539
James Y Knightb214cbc2016-03-04 19:00:41 +00005540 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005541
5542 return true;
5543 }
5544
John McCall477f2bb2016-03-03 06:39:32 +00005545 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5546 switch (CC) {
5547 case CC_C:
5548 case CC_Swift:
5549 return CCCR_OK;
5550 default:
5551 return CCCR_Warning;
5552 }
5553 }
5554
David Blaikie1cbb9712014-11-14 19:09:44 +00005555 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005556
David Blaikie1cbb9712014-11-14 19:09:44 +00005557 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005558 return TargetInfo::AArch64ABIBuiltinVaList;
5559 }
5560
Craig Topperf054e3a2015-10-19 03:52:27 +00005561 ArrayRef<const char *> getGCCRegNames() const override;
5562 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005563
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005564 bool validateAsmConstraint(const char *&Name,
5565 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005566 switch (*Name) {
5567 default:
5568 return false;
5569 case 'w': // Floating point and SIMD registers (V0-V31)
5570 Info.setAllowsRegister();
5571 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005572 case 'I': // Constant that can be used with an ADD instruction
5573 case 'J': // Constant that can be used with a SUB instruction
5574 case 'K': // Constant that can be used with a 32-bit logical instruction
5575 case 'L': // Constant that can be used with a 64-bit logical instruction
5576 case 'M': // Constant that can be used as a 32-bit MOV immediate
5577 case 'N': // Constant that can be used as a 64-bit MOV immediate
5578 case 'Y': // Floating point constant zero
5579 case 'Z': // Integer constant zero
5580 return true;
5581 case 'Q': // A memory reference with base register and no offset
5582 Info.setAllowsMemory();
5583 return true;
5584 case 'S': // A symbolic address
5585 Info.setAllowsRegister();
5586 return true;
5587 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005588 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5589 // Utf: A memory address suitable for ldp/stp in TF mode.
5590 // Usa: An absolute symbolic address.
5591 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5592 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005593 case 'z': // Zero register, wzr or xzr
5594 Info.setAllowsRegister();
5595 return true;
5596 case 'x': // Floating point and SIMD registers (V0-V15)
5597 Info.setAllowsRegister();
5598 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005599 }
5600 return false;
5601 }
5602
Akira Hatanaka987f1862014-08-22 06:05:21 +00005603 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005604 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005605 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005606 // Strip off constraint modifiers.
5607 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5608 Constraint = Constraint.substr(1);
5609
5610 switch (Constraint[0]) {
5611 default:
5612 return true;
5613 case 'z':
5614 case 'r': {
5615 switch (Modifier) {
5616 case 'x':
5617 case 'w':
5618 // For now assume that the person knows what they're
5619 // doing with the modifier.
5620 return true;
5621 default:
5622 // By default an 'r' constraint will be in the 'x'
5623 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005624 if (Size == 64)
5625 return true;
5626
5627 SuggestedModifier = "w";
5628 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005629 }
5630 }
5631 }
5632 }
5633
David Blaikie1cbb9712014-11-14 19:09:44 +00005634 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005635
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005636 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005637 if (RegNo == 0)
5638 return 0;
5639 if (RegNo == 1)
5640 return 1;
5641 return -1;
5642 }
5643};
5644
Tim Northover573cbee2014-05-24 12:52:07 +00005645const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005646 // 32-bit Integer registers
5647 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5648 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5649 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5650
5651 // 64-bit Integer registers
5652 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5653 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5654 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5655
5656 // 32-bit floating point regsisters
5657 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5658 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5659 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5660
5661 // 64-bit floating point regsisters
5662 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5663 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5664 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5665
5666 // Vector registers
5667 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5668 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5669 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5670};
5671
Craig Topperf054e3a2015-10-19 03:52:27 +00005672ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5673 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005674}
5675
Tim Northover573cbee2014-05-24 12:52:07 +00005676const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005677 { { "w31" }, "wsp" },
5678 { { "x29" }, "fp" },
5679 { { "x30" }, "lr" },
5680 { { "x31" }, "sp" },
5681 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5682 // don't want to substitute one of these for a different-sized one.
5683};
5684
Craig Topperf054e3a2015-10-19 03:52:27 +00005685ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5686 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005687}
5688
Tim Northover573cbee2014-05-24 12:52:07 +00005689const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005690#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005691 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005692#include "clang/Basic/BuiltinsNEON.def"
5693
5694#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005695 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005696#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005697};
James Molloy5e73df52014-04-16 15:06:20 +00005698
Tim Northover573cbee2014-05-24 12:52:07 +00005699class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005700 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005701 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005702 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005703 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005704 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005705 }
5706
5707public:
Tim Northover573cbee2014-05-24 12:52:07 +00005708 AArch64leTargetInfo(const llvm::Triple &Triple)
5709 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005710 BigEndian = false;
5711 }
5712 void getTargetDefines(const LangOptions &Opts,
5713 MacroBuilder &Builder) const override {
5714 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005715 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005716 }
5717};
5718
Tim Northover573cbee2014-05-24 12:52:07 +00005719class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005720 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005721 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005722 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005723 }
5724
5725public:
Tim Northover573cbee2014-05-24 12:52:07 +00005726 AArch64beTargetInfo(const llvm::Triple &Triple)
5727 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005728 void getTargetDefines(const LangOptions &Opts,
5729 MacroBuilder &Builder) const override {
5730 Builder.defineMacro("__AARCH64EB__");
5731 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5732 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005733 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005734 }
5735};
Tim Northovera2ee4332014-03-29 15:09:45 +00005736
Tim Northover573cbee2014-05-24 12:52:07 +00005737class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005738protected:
5739 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5740 MacroBuilder &Builder) const override {
5741 Builder.defineMacro("__AARCH64_SIMD__");
5742 Builder.defineMacro("__ARM64_ARCH_8__");
5743 Builder.defineMacro("__ARM_NEON__");
5744 Builder.defineMacro("__LITTLE_ENDIAN__");
5745 Builder.defineMacro("__REGISTER_PREFIX__", "");
5746 Builder.defineMacro("__arm64", "1");
5747 Builder.defineMacro("__arm64__", "1");
5748
5749 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5750 }
5751
Tim Northovera2ee4332014-03-29 15:09:45 +00005752public:
Tim Northover573cbee2014-05-24 12:52:07 +00005753 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5754 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005755 Int64Type = SignedLongLong;
5756 WCharType = SignedInt;
5757 UseSignedCharForObjCBool = false;
5758
Tim Northovera6a19f12015-02-06 01:25:07 +00005759 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005760 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5761
5762 TheCXXABI.set(TargetCXXABI::iOS64);
5763 }
5764
David Blaikie1cbb9712014-11-14 19:09:44 +00005765 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005766 return TargetInfo::CharPtrBuiltinVaList;
5767 }
5768};
Tim Northovera2ee4332014-03-29 15:09:45 +00005769
Tony Linthicum76329bf2011-12-12 21:14:55 +00005770// Hexagon abstract base class
5771class HexagonTargetInfo : public TargetInfo {
5772 static const Builtin::Info BuiltinInfo[];
5773 static const char * const GCCRegNames[];
5774 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5775 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005776 bool HasHVX, HasHVXDouble;
5777
Tony Linthicum76329bf2011-12-12 21:14:55 +00005778public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005779 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005780 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005781 // Specify the vector alignment explicitly. For v512x1, the calculated
5782 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5783 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005784 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005785 "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 +00005786 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005787 SizeType = UnsignedInt;
5788 PtrDiffType = SignedInt;
5789 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005790
5791 // {} in inline assembly are packet specifiers, not assembly variant
5792 // specifiers.
5793 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005794
5795 LargeArrayMinWidth = 64;
5796 LargeArrayAlign = 64;
5797 UseBitFieldTypeAlignment = true;
5798 ZeroLengthBitfieldBoundary = 32;
5799 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005800 }
5801
Craig Topper6c03a542015-10-19 04:51:35 +00005802 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5803 return llvm::makeArrayRef(BuiltinInfo,
5804 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005805 }
5806
Craig Topper3164f332014-03-11 03:39:26 +00005807 bool validateAsmConstraint(const char *&Name,
5808 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005809 return true;
5810 }
5811
Craig Topper3164f332014-03-11 03:39:26 +00005812 void getTargetDefines(const LangOptions &Opts,
5813 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005814
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005815 bool isCLZForZeroUndef() const override { return false; }
5816
Craig Topper3164f332014-03-11 03:39:26 +00005817 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005818 return llvm::StringSwitch<bool>(Feature)
5819 .Case("hexagon", true)
5820 .Case("hvx", HasHVX)
5821 .Case("hvx-double", HasHVXDouble)
5822 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005823 }
Craig Topper3164f332014-03-11 03:39:26 +00005824
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005825 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5826 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5827 const override;
5828
5829 bool handleTargetFeatures(std::vector<std::string> &Features,
5830 DiagnosticsEngine &Diags) override;
5831
Craig Topper3164f332014-03-11 03:39:26 +00005832 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005833 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005834 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005835 ArrayRef<const char *> getGCCRegNames() const override;
5836 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005837 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005838 return "";
5839 }
Sebastian Pop86500282012-01-13 20:37:10 +00005840
5841 static const char *getHexagonCPUSuffix(StringRef Name) {
5842 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005843 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005844 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005845 .Case("hexagonv55", "55")
5846 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005847 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005848 }
5849
Craig Topper3164f332014-03-11 03:39:26 +00005850 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005851 if (!getHexagonCPUSuffix(Name))
5852 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005853 CPU = Name;
5854 return true;
5855 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005856
5857 int getEHDataRegisterNumber(unsigned RegNo) const override {
5858 return RegNo < 2 ? RegNo : -1;
5859 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005860};
5861
5862void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005863 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005864 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005865 Builder.defineMacro("__hexagon__", "1");
5866
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005867 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005868 Builder.defineMacro("__HEXAGON_V4__");
5869 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005870 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005871 Builder.defineMacro("__QDSP6_V4__");
5872 Builder.defineMacro("__QDSP6_ARCH__", "4");
5873 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005874 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005875 Builder.defineMacro("__HEXAGON_V5__");
5876 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5877 if(Opts.HexagonQdsp6Compat) {
5878 Builder.defineMacro("__QDSP6_V5__");
5879 Builder.defineMacro("__QDSP6_ARCH__", "5");
5880 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005881 } else if (CPU == "hexagonv60") {
5882 Builder.defineMacro("__HEXAGON_V60__");
5883 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5884 Builder.defineMacro("__QDSP6_V60__");
5885 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005886 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005887}
5888
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005889bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5890 DiagnosticsEngine &Diags) {
5891 for (auto &F : Features) {
5892 if (F == "+hvx")
5893 HasHVX = true;
5894 else if (F == "-hvx")
5895 HasHVX = HasHVXDouble = false;
5896 else if (F == "+hvx-double")
5897 HasHVX = HasHVXDouble = true;
5898 else if (F == "-hvx-double")
5899 HasHVXDouble = false;
5900 }
5901 return true;
5902}
5903
5904bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5905 DiagnosticsEngine &Diags, StringRef CPU,
5906 const std::vector<std::string> &FeaturesVec) const {
5907 // Default for v60: -hvx, -hvx-double.
5908 Features["hvx"] = false;
5909 Features["hvx-double"] = false;
5910
5911 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5912}
5913
5914
5915const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005916 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5917 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5918 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5919 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5920 "p0", "p1", "p2", "p3",
5921 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5922};
5923
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005924ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005925 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005926}
5927
Tony Linthicum76329bf2011-12-12 21:14:55 +00005928const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5929 { { "sp" }, "r29" },
5930 { { "fp" }, "r30" },
5931 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005932};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005933
Craig Topperf054e3a2015-10-19 03:52:27 +00005934ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5935 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005936}
5937
5938
5939const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005940#define BUILTIN(ID, TYPE, ATTRS) \
5941 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5942#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5943 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005944#include "clang/Basic/BuiltinsHexagon.def"
5945};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005946
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005947// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5948class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005949 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5950 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005951 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005952public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005953 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00005954 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005955
Craig Topper3164f332014-03-11 03:39:26 +00005956 bool handleTargetFeatures(std::vector<std::string> &Features,
5957 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005958 // The backend doesn't actually handle soft float yet, but in case someone
5959 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005960 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5961 if (Feature != Features.end()) {
5962 SoftFloat = true;
5963 Features.erase(Feature);
5964 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005965 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005966 }
Craig Topper3164f332014-03-11 03:39:26 +00005967 void getTargetDefines(const LangOptions &Opts,
5968 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005969 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005970 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005971
5972 if (SoftFloat)
5973 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005974 }
Craig Topper3164f332014-03-11 03:39:26 +00005975
5976 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005977 return llvm::StringSwitch<bool>(Feature)
5978 .Case("softfloat", SoftFloat)
5979 .Case("sparc", true)
5980 .Default(false);
5981 }
Craig Topper3164f332014-03-11 03:39:26 +00005982
Craig Topper6c03a542015-10-19 04:51:35 +00005983 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005984 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005985 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005986 }
Craig Topper3164f332014-03-11 03:39:26 +00005987 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005988 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005989 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005990 ArrayRef<const char *> getGCCRegNames() const override;
5991 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005992 bool validateAsmConstraint(const char *&Name,
5993 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005994 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005995 switch (*Name) {
5996 case 'I': // Signed 13-bit constant
5997 case 'J': // Zero
5998 case 'K': // 32-bit constant with the low 12 bits clear
5999 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6000 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6001 case 'N': // Same as 'K' but zext (required for SIMode)
6002 case 'O': // The constant 4096
6003 return true;
6004 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006005 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006006 }
Craig Topper3164f332014-03-11 03:39:26 +00006007 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006008 // FIXME: Implement!
6009 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006010 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006011
6012 // No Sparc V7 for now, the backend doesn't support it anyway.
6013 enum CPUKind {
6014 CK_GENERIC,
6015 CK_V8,
6016 CK_SUPERSPARC,
6017 CK_SPARCLITE,
6018 CK_F934,
6019 CK_HYPERSPARC,
6020 CK_SPARCLITE86X,
6021 CK_SPARCLET,
6022 CK_TSC701,
6023 CK_V9,
6024 CK_ULTRASPARC,
6025 CK_ULTRASPARC3,
6026 CK_NIAGARA,
6027 CK_NIAGARA2,
6028 CK_NIAGARA3,
6029 CK_NIAGARA4
6030 } CPU = CK_GENERIC;
6031
6032 enum CPUGeneration {
6033 CG_V8,
6034 CG_V9,
6035 };
6036
6037 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6038 switch (Kind) {
6039 case CK_GENERIC:
6040 case CK_V8:
6041 case CK_SUPERSPARC:
6042 case CK_SPARCLITE:
6043 case CK_F934:
6044 case CK_HYPERSPARC:
6045 case CK_SPARCLITE86X:
6046 case CK_SPARCLET:
6047 case CK_TSC701:
6048 return CG_V8;
6049 case CK_V9:
6050 case CK_ULTRASPARC:
6051 case CK_ULTRASPARC3:
6052 case CK_NIAGARA:
6053 case CK_NIAGARA2:
6054 case CK_NIAGARA3:
6055 case CK_NIAGARA4:
6056 return CG_V9;
6057 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006058 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006059 }
6060
6061 CPUKind getCPUKind(StringRef Name) const {
6062 return llvm::StringSwitch<CPUKind>(Name)
6063 .Case("v8", CK_V8)
6064 .Case("supersparc", CK_SUPERSPARC)
6065 .Case("sparclite", CK_SPARCLITE)
6066 .Case("f934", CK_F934)
6067 .Case("hypersparc", CK_HYPERSPARC)
6068 .Case("sparclite86x", CK_SPARCLITE86X)
6069 .Case("sparclet", CK_SPARCLET)
6070 .Case("tsc701", CK_TSC701)
6071 .Case("v9", CK_V9)
6072 .Case("ultrasparc", CK_ULTRASPARC)
6073 .Case("ultrasparc3", CK_ULTRASPARC3)
6074 .Case("niagara", CK_NIAGARA)
6075 .Case("niagara2", CK_NIAGARA2)
6076 .Case("niagara3", CK_NIAGARA3)
6077 .Case("niagara4", CK_NIAGARA4)
6078 .Default(CK_GENERIC);
6079 }
6080
6081 bool setCPU(const std::string &Name) override {
6082 CPU = getCPUKind(Name);
6083 return CPU != CK_GENERIC;
6084 }
Gabor Greif49991682008-02-21 16:29:08 +00006085};
6086
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006087const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006088 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6089 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6090 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6091 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6092};
6093
Craig Topperf054e3a2015-10-19 03:52:27 +00006094ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6095 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006096}
6097
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006098const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006099 { { "g0" }, "r0" },
6100 { { "g1" }, "r1" },
6101 { { "g2" }, "r2" },
6102 { { "g3" }, "r3" },
6103 { { "g4" }, "r4" },
6104 { { "g5" }, "r5" },
6105 { { "g6" }, "r6" },
6106 { { "g7" }, "r7" },
6107 { { "o0" }, "r8" },
6108 { { "o1" }, "r9" },
6109 { { "o2" }, "r10" },
6110 { { "o3" }, "r11" },
6111 { { "o4" }, "r12" },
6112 { { "o5" }, "r13" },
6113 { { "o6", "sp" }, "r14" },
6114 { { "o7" }, "r15" },
6115 { { "l0" }, "r16" },
6116 { { "l1" }, "r17" },
6117 { { "l2" }, "r18" },
6118 { { "l3" }, "r19" },
6119 { { "l4" }, "r20" },
6120 { { "l5" }, "r21" },
6121 { { "l6" }, "r22" },
6122 { { "l7" }, "r23" },
6123 { { "i0" }, "r24" },
6124 { { "i1" }, "r25" },
6125 { { "i2" }, "r26" },
6126 { { "i3" }, "r27" },
6127 { { "i4" }, "r28" },
6128 { { "i5" }, "r29" },
6129 { { "i6", "fp" }, "r30" },
6130 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006131};
6132
Craig Topperf054e3a2015-10-19 03:52:27 +00006133ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6134 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006135}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006136
6137// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6138class SparcV8TargetInfo : public SparcTargetInfo {
6139public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006140 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006141 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006142 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6143 switch (getTriple().getOS()) {
6144 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006145 SizeType = UnsignedInt;
6146 IntPtrType = SignedInt;
6147 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006148 break;
6149 case llvm::Triple::NetBSD:
6150 case llvm::Triple::OpenBSD:
6151 SizeType = UnsignedLong;
6152 IntPtrType = SignedLong;
6153 PtrDiffType = SignedLong;
6154 break;
Brad Smith56495d52015-08-13 22:00:53 +00006155 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006156 }
6157
Craig Topper3164f332014-03-11 03:39:26 +00006158 void getTargetDefines(const LangOptions &Opts,
6159 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006160 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006161 switch (getCPUGeneration(CPU)) {
6162 case CG_V8:
6163 Builder.defineMacro("__sparcv8");
6164 if (getTriple().getOS() != llvm::Triple::Solaris)
6165 Builder.defineMacro("__sparcv8__");
6166 break;
6167 case CG_V9:
6168 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006169 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006170 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006171 Builder.defineMacro("__sparc_v9__");
6172 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006173 break;
6174 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006175 }
6176};
6177
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006178// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6179class SparcV8elTargetInfo : public SparcV8TargetInfo {
6180 public:
6181 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006182 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006183 BigEndian = false;
6184 }
6185};
6186
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006187// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6188class SparcV9TargetInfo : public SparcTargetInfo {
6189public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006190 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006191 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006192 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006193 // This is an LP64 platform.
6194 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006195
6196 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006197 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006198 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006199 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006200 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006201 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006202
6203 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6204 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6205 LongDoubleWidth = 128;
6206 LongDoubleAlign = 128;
6207 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006208 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006209 }
6210
Craig Topper3164f332014-03-11 03:39:26 +00006211 void getTargetDefines(const LangOptions &Opts,
6212 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006213 SparcTargetInfo::getTargetDefines(Opts, Builder);
6214 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006215 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006216 // Solaris doesn't need these variants, but the BSDs do.
6217 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006218 Builder.defineMacro("__sparc64__");
6219 Builder.defineMacro("__sparc_v9__");
6220 Builder.defineMacro("__sparcv9__");
6221 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006222 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006223
Craig Topper3164f332014-03-11 03:39:26 +00006224 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006225 if (!SparcTargetInfo::setCPU(Name))
6226 return false;
6227 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006228 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006229};
6230
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006231class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006232 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006233 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006234 std::string CPU;
6235 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006236 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006237
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006238public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006239 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006240 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6241 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006242 IntMaxType = SignedLong;
6243 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006244 TLSSupported = true;
6245 IntWidth = IntAlign = 32;
6246 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6247 PointerWidth = PointerAlign = 64;
6248 LongDoubleWidth = 128;
6249 LongDoubleAlign = 64;
6250 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006251 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006252 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006253 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 +00006254 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6255 }
6256 void getTargetDefines(const LangOptions &Opts,
6257 MacroBuilder &Builder) const override {
6258 Builder.defineMacro("__s390__");
6259 Builder.defineMacro("__s390x__");
6260 Builder.defineMacro("__zarch__");
6261 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006262
6263 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6264 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6265 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6266 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6267
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006268 if (HasTransactionalExecution)
6269 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006270 if (Opts.ZVector)
6271 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006272 }
Craig Topper6c03a542015-10-19 04:51:35 +00006273 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6274 return llvm::makeArrayRef(BuiltinInfo,
6275 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006276 }
6277
Craig Topperf054e3a2015-10-19 03:52:27 +00006278 ArrayRef<const char *> getGCCRegNames() const override;
6279 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006280 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006281 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006282 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006283 bool validateAsmConstraint(const char *&Name,
6284 TargetInfo::ConstraintInfo &info) const override;
6285 const char *getClobbers() const override {
6286 // FIXME: Is this really right?
6287 return "";
6288 }
6289 BuiltinVaListKind getBuiltinVaListKind() const override {
6290 return TargetInfo::SystemZBuiltinVaList;
6291 }
6292 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006293 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006294 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6295 .Case("z10", true)
6296 .Case("z196", true)
6297 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006298 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006299 .Default(false);
6300
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006301 return CPUKnown;
6302 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006303 bool
6304 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6305 StringRef CPU,
6306 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006307 if (CPU == "zEC12")
6308 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006309 if (CPU == "z13") {
6310 Features["transactional-execution"] = true;
6311 Features["vector"] = true;
6312 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006313 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006314 }
6315
6316 bool handleTargetFeatures(std::vector<std::string> &Features,
6317 DiagnosticsEngine &Diags) override {
6318 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006319 for (const auto &Feature : Features) {
6320 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006321 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006322 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006323 HasVector = true;
6324 }
6325 // If we use the vector ABI, vector types are 64-bit aligned.
6326 if (HasVector) {
6327 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006328 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6329 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006330 }
6331 return true;
6332 }
6333
6334 bool hasFeature(StringRef Feature) const override {
6335 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006336 .Case("systemz", true)
6337 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006338 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006339 .Default(false);
6340 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006341
6342 StringRef getABI() const override {
6343 if (HasVector)
6344 return "vector";
6345 return "";
6346 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006347
6348 bool useFloat128ManglingForLongDouble() const override {
6349 return true;
6350 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006351};
6352
6353const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6354#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006355 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006356#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006357};
6358
6359const char *const SystemZTargetInfo::GCCRegNames[] = {
6360 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6361 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6362 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6363 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6364};
6365
Craig Topperf054e3a2015-10-19 03:52:27 +00006366ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6367 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006368}
6369
6370bool SystemZTargetInfo::
6371validateAsmConstraint(const char *&Name,
6372 TargetInfo::ConstraintInfo &Info) const {
6373 switch (*Name) {
6374 default:
6375 return false;
6376
6377 case 'a': // Address register
6378 case 'd': // Data register (equivalent to 'r')
6379 case 'f': // Floating-point register
6380 Info.setAllowsRegister();
6381 return true;
6382
6383 case 'I': // Unsigned 8-bit constant
6384 case 'J': // Unsigned 12-bit constant
6385 case 'K': // Signed 16-bit constant
6386 case 'L': // Signed 20-bit displacement (on all targets we support)
6387 case 'M': // 0x7fffffff
6388 return true;
6389
6390 case 'Q': // Memory with base and unsigned 12-bit displacement
6391 case 'R': // Likewise, plus an index
6392 case 'S': // Memory with base and signed 20-bit displacement
6393 case 'T': // Likewise, plus an index
6394 Info.setAllowsMemory();
6395 return true;
6396 }
6397}
Ulrich Weigand47445072013-05-06 16:26:41 +00006398
Eric Christopherc48497a2015-09-18 21:26:24 +00006399class MSP430TargetInfo : public TargetInfo {
6400 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006401
Eric Christopherc48497a2015-09-18 21:26:24 +00006402public:
6403 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6404 BigEndian = false;
6405 TLSSupported = false;
6406 IntWidth = 16;
6407 IntAlign = 16;
6408 LongWidth = 32;
6409 LongLongWidth = 64;
6410 LongAlign = LongLongAlign = 16;
6411 PointerWidth = 16;
6412 PointerAlign = 16;
6413 SuitableAlign = 16;
6414 SizeType = UnsignedInt;
6415 IntMaxType = SignedLongLong;
6416 IntPtrType = SignedInt;
6417 PtrDiffType = SignedInt;
6418 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006419 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006420 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006421 void getTargetDefines(const LangOptions &Opts,
6422 MacroBuilder &Builder) const override {
6423 Builder.defineMacro("MSP430");
6424 Builder.defineMacro("__MSP430__");
6425 // FIXME: defines for different 'flavours' of MCU
6426 }
Craig Topper6c03a542015-10-19 04:51:35 +00006427 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006428 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006429 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006430 }
6431 bool hasFeature(StringRef Feature) const override {
6432 return Feature == "msp430";
6433 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006434 ArrayRef<const char *> getGCCRegNames() const override;
6435 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006436 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006437 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006438 }
6439 bool validateAsmConstraint(const char *&Name,
6440 TargetInfo::ConstraintInfo &info) const override {
6441 // FIXME: implement
6442 switch (*Name) {
6443 case 'K': // the constant 1
6444 case 'L': // constant -1^20 .. 1^19
6445 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006446 return true;
6447 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006448 // No target constraints for now.
6449 return false;
6450 }
6451 const char *getClobbers() const override {
6452 // FIXME: Is this really right?
6453 return "";
6454 }
6455 BuiltinVaListKind getBuiltinVaListKind() const override {
6456 // FIXME: implement
6457 return TargetInfo::CharPtrBuiltinVaList;
6458 }
6459};
6460
6461const char *const MSP430TargetInfo::GCCRegNames[] = {
6462 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6463 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6464
Craig Topperf054e3a2015-10-19 03:52:27 +00006465ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6466 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006467}
6468
6469// LLVM and Clang cannot be used directly to output native binaries for
6470// target, but is used to compile C code to llvm bitcode with correct
6471// type and alignment information.
6472//
6473// TCE uses the llvm bitcode as input and uses it for generating customized
6474// target processor and program binary. TCE co-design environment is
6475// publicly available in http://tce.cs.tut.fi
6476
6477static const unsigned TCEOpenCLAddrSpaceMap[] = {
6478 3, // opencl_global
6479 4, // opencl_local
6480 5, // opencl_constant
6481 // FIXME: generic has to be added to the target
6482 0, // opencl_generic
6483 0, // cuda_device
6484 0, // cuda_constant
6485 0 // cuda_shared
6486};
6487
6488class TCETargetInfo : public TargetInfo {
6489public:
6490 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6491 TLSSupported = false;
6492 IntWidth = 32;
6493 LongWidth = LongLongWidth = 32;
6494 PointerWidth = 32;
6495 IntAlign = 32;
6496 LongAlign = LongLongAlign = 32;
6497 PointerAlign = 32;
6498 SuitableAlign = 32;
6499 SizeType = UnsignedInt;
6500 IntMaxType = SignedLong;
6501 IntPtrType = SignedInt;
6502 PtrDiffType = SignedInt;
6503 FloatWidth = 32;
6504 FloatAlign = 32;
6505 DoubleWidth = 32;
6506 DoubleAlign = 32;
6507 LongDoubleWidth = 32;
6508 LongDoubleAlign = 32;
6509 FloatFormat = &llvm::APFloat::IEEEsingle;
6510 DoubleFormat = &llvm::APFloat::IEEEsingle;
6511 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006512 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6513 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006514 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6515 UseAddrSpaceMapMangling = true;
6516 }
6517
6518 void getTargetDefines(const LangOptions &Opts,
6519 MacroBuilder &Builder) const override {
6520 DefineStd(Builder, "tce", Opts);
6521 Builder.defineMacro("__TCE__");
6522 Builder.defineMacro("__TCE_V1__");
6523 }
6524 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6525
Craig Topper6c03a542015-10-19 04:51:35 +00006526 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006527 const char *getClobbers() const override { return ""; }
6528 BuiltinVaListKind getBuiltinVaListKind() const override {
6529 return TargetInfo::VoidPtrBuiltinVaList;
6530 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006531 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006532 bool validateAsmConstraint(const char *&Name,
6533 TargetInfo::ConstraintInfo &info) const override {
6534 return true;
6535 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006536 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6537 return None;
6538 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006539};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006540
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006541class BPFTargetInfo : public TargetInfo {
6542public:
6543 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6544 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6545 SizeType = UnsignedLong;
6546 PtrDiffType = SignedLong;
6547 IntPtrType = SignedLong;
6548 IntMaxType = SignedLong;
6549 Int64Type = SignedLong;
6550 RegParmMax = 5;
6551 if (Triple.getArch() == llvm::Triple::bpfeb) {
6552 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006553 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006554 } else {
6555 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006556 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006557 }
6558 MaxAtomicPromoteWidth = 64;
6559 MaxAtomicInlineWidth = 64;
6560 TLSSupported = false;
6561 }
6562 void getTargetDefines(const LangOptions &Opts,
6563 MacroBuilder &Builder) const override {
6564 DefineStd(Builder, "bpf", Opts);
6565 Builder.defineMacro("__BPF__");
6566 }
6567 bool hasFeature(StringRef Feature) const override {
6568 return Feature == "bpf";
6569 }
6570
Craig Topper6c03a542015-10-19 04:51:35 +00006571 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006572 const char *getClobbers() const override {
6573 return "";
6574 }
6575 BuiltinVaListKind getBuiltinVaListKind() const override {
6576 return TargetInfo::VoidPtrBuiltinVaList;
6577 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006578 ArrayRef<const char *> getGCCRegNames() const override {
6579 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006580 }
6581 bool validateAsmConstraint(const char *&Name,
6582 TargetInfo::ConstraintInfo &info) const override {
6583 return true;
6584 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006585 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6586 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006587 }
6588};
6589
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006590class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006591 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006592
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006593 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006594 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006595 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006596 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006597 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006598 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006599 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006600 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006601 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006602 enum DspRevEnum {
6603 NoDSP, DSP1, DSP2
6604 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006605 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006606
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006607protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006608 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006609 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006610
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006611public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006612 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6613 const std::string &CPUStr)
6614 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006615 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006616 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6617 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6618 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006619
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006620 bool isNaN2008Default() const {
6621 return CPU == "mips32r6" || CPU == "mips64r6";
6622 }
6623
6624 bool isFP64Default() const {
6625 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6626 }
6627
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006628 bool isNan2008() const override {
6629 return IsNan2008;
6630 }
6631
Alp Toker4925ba72014-06-07 23:30:42 +00006632 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006633 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006634 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6635 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006636 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006637 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006638 .Case("mips1", IsMips32)
6639 .Case("mips2", IsMips32)
6640 .Case("mips3", true)
6641 .Case("mips4", true)
6642 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006643 .Case("mips32", IsMips32)
6644 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006645 .Case("mips32r3", IsMips32)
6646 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006647 .Case("mips32r6", IsMips32)
6648 .Case("mips64", true)
6649 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006650 .Case("mips64r3", true)
6651 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006652 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006653 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006654 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006655 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006656 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006657 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006658 bool
6659 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6660 StringRef CPU,
6661 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006662 if (CPU.empty())
6663 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006664 if (CPU == "octeon")
6665 Features["mips64r2"] = Features["cnmips"] = true;
6666 else
6667 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006668 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006669 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006670
Craig Topper3164f332014-03-11 03:39:26 +00006671 void getTargetDefines(const LangOptions &Opts,
6672 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006673 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006674 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006675 if (Opts.GNUMode)
6676 Builder.defineMacro("mips");
6677
Simon Atanasyan683535b2012-08-29 19:14:58 +00006678 Builder.defineMacro("__REGISTER_PREFIX__", "");
6679
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006680 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006681 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006682 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006683 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006684 case SoftFloat:
6685 Builder.defineMacro("__mips_soft_float", Twine(1));
6686 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006687 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006688
Simon Atanasyan16071912013-04-14 14:07:30 +00006689 if (IsSingleFloat)
6690 Builder.defineMacro("__mips_single_float", Twine(1));
6691
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006692 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6693 Builder.defineMacro("_MIPS_FPSET",
6694 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6695
Simon Atanasyan72244b62012-07-05 16:06:06 +00006696 if (IsMips16)
6697 Builder.defineMacro("__mips16", Twine(1));
6698
Simon Atanasyan60777612013-04-14 14:07:51 +00006699 if (IsMicromips)
6700 Builder.defineMacro("__mips_micromips", Twine(1));
6701
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006702 if (IsNan2008)
6703 Builder.defineMacro("__mips_nan2008", Twine(1));
6704
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006705 switch (DspRev) {
6706 default:
6707 break;
6708 case DSP1:
6709 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6710 Builder.defineMacro("__mips_dsp", Twine(1));
6711 break;
6712 case DSP2:
6713 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6714 Builder.defineMacro("__mips_dspr2", Twine(1));
6715 Builder.defineMacro("__mips_dsp", Twine(1));
6716 break;
6717 }
6718
Jack Carter44ff1e52013-08-12 17:20:29 +00006719 if (HasMSA)
6720 Builder.defineMacro("__mips_msa", Twine(1));
6721
Simon Atanasyan26f19672012-04-05 19:28:31 +00006722 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6723 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6724 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006725
6726 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6727 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006728
6729 // These shouldn't be defined for MIPS-I but there's no need to check
6730 // for that since MIPS-I isn't supported.
6731 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6732 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6733 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006734 }
6735
Craig Topper6c03a542015-10-19 04:51:35 +00006736 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6737 return llvm::makeArrayRef(BuiltinInfo,
6738 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006739 }
Craig Topper3164f332014-03-11 03:39:26 +00006740 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006741 return llvm::StringSwitch<bool>(Feature)
6742 .Case("mips", true)
6743 .Case("fp64", HasFP64)
6744 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006745 }
Craig Topper3164f332014-03-11 03:39:26 +00006746 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006747 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006748 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006749 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006750 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006751 // CPU register names
6752 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006753 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6754 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6755 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006756 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6757 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006758 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6759 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6760 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6761 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006762 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006763 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006764 "$fcc5","$fcc6","$fcc7",
6765 // MSA register names
6766 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6767 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6768 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6769 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6770 // MSA control register names
6771 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6772 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006773 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006774 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006775 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006776 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006777 bool validateAsmConstraint(const char *&Name,
6778 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006779 switch (*Name) {
6780 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006781 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006782 case 'r': // CPU registers.
6783 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006784 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006785 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006786 case 'c': // $25 for indirect jumps
6787 case 'l': // lo register
6788 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006789 Info.setAllowsRegister();
6790 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006791 case 'I': // Signed 16-bit constant
6792 case 'J': // Integer 0
6793 case 'K': // Unsigned 16-bit constant
6794 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6795 case 'M': // Constants not loadable via lui, addiu, or ori
6796 case 'N': // Constant -1 to -65535
6797 case 'O': // A signed 15-bit constant
6798 case 'P': // A constant between 1 go 65535
6799 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006800 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006801 Info.setAllowsMemory();
6802 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006803 case 'Z':
6804 if (Name[1] == 'C') { // An address usable by ll, and sc.
6805 Info.setAllowsMemory();
6806 Name++; // Skip over 'Z'.
6807 return true;
6808 }
6809 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006810 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006811 }
6812
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006813 std::string convertConstraint(const char *&Constraint) const override {
6814 std::string R;
6815 switch (*Constraint) {
6816 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6817 if (Constraint[1] == 'C') {
6818 R = std::string("^") + std::string(Constraint, 2);
6819 Constraint++;
6820 return R;
6821 }
6822 break;
6823 }
6824 return TargetInfo::convertConstraint(Constraint);
6825 }
6826
Craig Topper3164f332014-03-11 03:39:26 +00006827 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006828 // In GCC, $1 is not widely used in generated code (it's used only in a few
6829 // specific situations), so there is no real need for users to add it to
6830 // the clobbers list if they want to use it in their inline assembly code.
6831 //
6832 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6833 // code generation, so using it in inline assembly without adding it to the
6834 // clobbers list can cause conflicts between the inline assembly code and
6835 // the surrounding generated code.
6836 //
6837 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6838 // operands, which will conflict with the ".set at" assembler option (which
6839 // we use only for inline assembly, in order to maintain compatibility with
6840 // GCC) and will also conflict with the user's usage of $1.
6841 //
6842 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6843 // register for generated code is to automatically clobber $1 for all inline
6844 // assembly code.
6845 //
6846 // FIXME: We should automatically clobber $1 only for inline assembly code
6847 // which actually uses it. This would allow LLVM to use $1 for inline
6848 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006849 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006850 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006851
Craig Topper3164f332014-03-11 03:39:26 +00006852 bool handleTargetFeatures(std::vector<std::string> &Features,
6853 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006854 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006855 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006856 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006857 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006858 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006859 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006860 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006861
Eric Christopher610fe112015-08-26 08:21:55 +00006862 for (const auto &Feature : Features) {
6863 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006864 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006865 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006866 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006867 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006868 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006869 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006870 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006871 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006872 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006873 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006874 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006875 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006876 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006877 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006878 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006879 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006880 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006881 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006882 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006883 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006884 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006885 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006886
James Y Knightb214cbc2016-03-04 19:00:41 +00006887 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006888
Rafael Espindolaeb265472013-08-21 21:59:03 +00006889 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006890 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006891
Craig Topper3164f332014-03-11 03:39:26 +00006892 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006893 if (RegNo == 0) return 4;
6894 if (RegNo == 1) return 5;
6895 return -1;
6896 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006897
6898 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006899};
6900
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006901const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006902#define BUILTIN(ID, TYPE, ATTRS) \
6903 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6904#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6905 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006906#include "clang/Basic/BuiltinsMips.def"
6907};
6908
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006909class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006910public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006911 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006912 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006913 SizeType = UnsignedInt;
6914 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006915 Int64Type = SignedLongLong;
6916 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006917 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006918 }
Craig Topper3164f332014-03-11 03:39:26 +00006919 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006920 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006921 ABI = Name;
6922 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006923 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006924 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006925 }
Craig Topper3164f332014-03-11 03:39:26 +00006926 void getTargetDefines(const LangOptions &Opts,
6927 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006928 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006929
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006930 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006931 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6932
6933 const std::string& CPUStr = getCPU();
6934 if (CPUStr == "mips32")
6935 Builder.defineMacro("__mips_isa_rev", "1");
6936 else if (CPUStr == "mips32r2")
6937 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006938 else if (CPUStr == "mips32r3")
6939 Builder.defineMacro("__mips_isa_rev", "3");
6940 else if (CPUStr == "mips32r5")
6941 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006942 else if (CPUStr == "mips32r6")
6943 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006944
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006945 if (ABI == "o32") {
6946 Builder.defineMacro("__mips_o32");
6947 Builder.defineMacro("_ABIO32", "1");
6948 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6949 }
6950 else if (ABI == "eabi")
6951 Builder.defineMacro("__mips_eabi");
6952 else
David Blaikie83d382b2011-09-23 05:06:16 +00006953 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006954 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006955 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006956 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6957 { { "at" }, "$1" },
6958 { { "v0" }, "$2" },
6959 { { "v1" }, "$3" },
6960 { { "a0" }, "$4" },
6961 { { "a1" }, "$5" },
6962 { { "a2" }, "$6" },
6963 { { "a3" }, "$7" },
6964 { { "t0" }, "$8" },
6965 { { "t1" }, "$9" },
6966 { { "t2" }, "$10" },
6967 { { "t3" }, "$11" },
6968 { { "t4" }, "$12" },
6969 { { "t5" }, "$13" },
6970 { { "t6" }, "$14" },
6971 { { "t7" }, "$15" },
6972 { { "s0" }, "$16" },
6973 { { "s1" }, "$17" },
6974 { { "s2" }, "$18" },
6975 { { "s3" }, "$19" },
6976 { { "s4" }, "$20" },
6977 { { "s5" }, "$21" },
6978 { { "s6" }, "$22" },
6979 { { "s7" }, "$23" },
6980 { { "t8" }, "$24" },
6981 { { "t9" }, "$25" },
6982 { { "k0" }, "$26" },
6983 { { "k1" }, "$27" },
6984 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006985 { { "sp","$sp" }, "$29" },
6986 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006987 { { "ra" }, "$31" }
6988 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006989 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006990 }
6991};
6992
6993class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00006994 void setDataLayout() override {
6995 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00006996 }
6997
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006998public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006999 Mips32EBTargetInfo(const llvm::Triple &Triple)
7000 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007001 }
Craig Topper3164f332014-03-11 03:39:26 +00007002 void getTargetDefines(const LangOptions &Opts,
7003 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007004 DefineStd(Builder, "MIPSEB", Opts);
7005 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007006 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007007 }
7008};
7009
7010class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007011 void setDataLayout() override {
7012 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007013 }
7014
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007015public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007016 Mips32ELTargetInfo(const llvm::Triple &Triple)
7017 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007018 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007019 }
Craig Topper3164f332014-03-11 03:39:26 +00007020 void getTargetDefines(const LangOptions &Opts,
7021 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007022 DefineStd(Builder, "MIPSEL", Opts);
7023 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007024 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007025 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007026};
Akira Hatanakabef17452011-09-20 19:21:49 +00007027
7028class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007030 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007031 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007032 LongDoubleWidth = LongDoubleAlign = 128;
7033 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007034 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7035 LongDoubleWidth = LongDoubleAlign = 64;
7036 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7037 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007038 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007039 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007040 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007041 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007042
7043 void setN64ABITypes() {
7044 LongWidth = LongAlign = 64;
7045 PointerWidth = PointerAlign = 64;
7046 SizeType = UnsignedLong;
7047 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007048 Int64Type = SignedLong;
7049 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007050 }
7051
7052 void setN32ABITypes() {
7053 LongWidth = LongAlign = 32;
7054 PointerWidth = PointerAlign = 32;
7055 SizeType = UnsignedInt;
7056 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007057 Int64Type = SignedLongLong;
7058 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007059 }
7060
Craig Topper3164f332014-03-11 03:39:26 +00007061 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007062 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007063 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007064 ABI = Name;
7065 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007066 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007067 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007068 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007069 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007070 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007071 }
7072 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007073 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007074
Craig Topper3164f332014-03-11 03:39:26 +00007075 void getTargetDefines(const LangOptions &Opts,
7076 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007077 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007078
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007079 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007080 Builder.defineMacro("__mips64");
7081 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007082 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7083
7084 const std::string& CPUStr = getCPU();
7085 if (CPUStr == "mips64")
7086 Builder.defineMacro("__mips_isa_rev", "1");
7087 else if (CPUStr == "mips64r2")
7088 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007089 else if (CPUStr == "mips64r3")
7090 Builder.defineMacro("__mips_isa_rev", "3");
7091 else if (CPUStr == "mips64r5")
7092 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007093 else if (CPUStr == "mips64r6")
7094 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007095
Akira Hatanakabef17452011-09-20 19:21:49 +00007096 if (ABI == "n32") {
7097 Builder.defineMacro("__mips_n32");
7098 Builder.defineMacro("_ABIN32", "2");
7099 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7100 }
7101 else if (ABI == "n64") {
7102 Builder.defineMacro("__mips_n64");
7103 Builder.defineMacro("_ABI64", "3");
7104 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7105 }
7106 else
David Blaikie83d382b2011-09-23 05:06:16 +00007107 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007108
7109 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007110 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007111 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007112 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7113 { { "at" }, "$1" },
7114 { { "v0" }, "$2" },
7115 { { "v1" }, "$3" },
7116 { { "a0" }, "$4" },
7117 { { "a1" }, "$5" },
7118 { { "a2" }, "$6" },
7119 { { "a3" }, "$7" },
7120 { { "a4" }, "$8" },
7121 { { "a5" }, "$9" },
7122 { { "a6" }, "$10" },
7123 { { "a7" }, "$11" },
7124 { { "t0" }, "$12" },
7125 { { "t1" }, "$13" },
7126 { { "t2" }, "$14" },
7127 { { "t3" }, "$15" },
7128 { { "s0" }, "$16" },
7129 { { "s1" }, "$17" },
7130 { { "s2" }, "$18" },
7131 { { "s3" }, "$19" },
7132 { { "s4" }, "$20" },
7133 { { "s5" }, "$21" },
7134 { { "s6" }, "$22" },
7135 { { "s7" }, "$23" },
7136 { { "t8" }, "$24" },
7137 { { "t9" }, "$25" },
7138 { { "k0" }, "$26" },
7139 { { "k1" }, "$27" },
7140 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007141 { { "sp","$sp" }, "$29" },
7142 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007143 { { "ra" }, "$31" }
7144 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007145 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007146 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007147
7148 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007149};
7150
7151class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007152 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007153 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007154 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 +00007155 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007156 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007157 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007158
Akira Hatanakabef17452011-09-20 19:21:49 +00007159public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007160 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007161 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007162 void getTargetDefines(const LangOptions &Opts,
7163 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007164 DefineStd(Builder, "MIPSEB", Opts);
7165 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007166 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007167 }
7168};
7169
7170class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007171 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007172 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007173 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 +00007174 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007175 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007176 }
7177public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007178 Mips64ELTargetInfo(const llvm::Triple &Triple)
7179 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007180 // Default ABI is n64.
7181 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007182 }
Craig Topper3164f332014-03-11 03:39:26 +00007183 void getTargetDefines(const LangOptions &Opts,
7184 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007185 DefineStd(Builder, "MIPSEL", Opts);
7186 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007187 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007188 }
7189};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007190
Ivan Krasindd7403e2011-08-24 20:22:22 +00007191class PNaClTargetInfo : public TargetInfo {
7192public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007193 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007194 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007195 this->LongAlign = 32;
7196 this->LongWidth = 32;
7197 this->PointerAlign = 32;
7198 this->PointerWidth = 32;
7199 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007200 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007201 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007202 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007203 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007204 this->SizeType = TargetInfo::UnsignedInt;
7205 this->PtrDiffType = TargetInfo::SignedInt;
7206 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007207 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007208 }
7209
Craig Toppere6f17d02014-03-11 04:07:52 +00007210 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007211 Builder.defineMacro("__le32__");
7212 Builder.defineMacro("__pnacl__");
7213 }
Craig Topper3164f332014-03-11 03:39:26 +00007214 void getTargetDefines(const LangOptions &Opts,
7215 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007216 getArchDefines(Opts, Builder);
7217 }
Craig Topper3164f332014-03-11 03:39:26 +00007218 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007219 return Feature == "pnacl";
7220 }
Craig Topper6c03a542015-10-19 04:51:35 +00007221 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007222 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007223 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007224 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007225 ArrayRef<const char *> getGCCRegNames() const override;
7226 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007227 bool validateAsmConstraint(const char *&Name,
7228 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007229 return false;
7230 }
7231
Craig Topper3164f332014-03-11 03:39:26 +00007232 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007233 return "";
7234 }
7235};
7236
Craig Topperf054e3a2015-10-19 03:52:27 +00007237ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7238 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007239}
7240
Craig Topperf054e3a2015-10-19 03:52:27 +00007241ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7242 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007243}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007244
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007245// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7246class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7247public:
7248 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007249 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007250 }
7251
7252 BuiltinVaListKind getBuiltinVaListKind() const override {
7253 return TargetInfo::PNaClABIBuiltinVaList;
7254 }
7255};
7256
JF Bastien643817d2014-09-12 17:52:47 +00007257class Le64TargetInfo : public TargetInfo {
7258 static const Builtin::Info BuiltinInfo[];
7259
7260public:
7261 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7262 BigEndian = false;
7263 NoAsmVariants = true;
7264 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7265 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007266 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007267 }
7268
7269 void getTargetDefines(const LangOptions &Opts,
7270 MacroBuilder &Builder) const override {
7271 DefineStd(Builder, "unix", Opts);
7272 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7273 Builder.defineMacro("__ELF__");
7274 }
Craig Topper6c03a542015-10-19 04:51:35 +00007275 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7276 return llvm::makeArrayRef(BuiltinInfo,
7277 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007278 }
7279 BuiltinVaListKind getBuiltinVaListKind() const override {
7280 return TargetInfo::PNaClABIBuiltinVaList;
7281 }
7282 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007283 ArrayRef<const char *> getGCCRegNames() const override {
7284 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007285 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007286 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7287 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007288 }
7289 bool validateAsmConstraint(const char *&Name,
7290 TargetInfo::ConstraintInfo &Info) const override {
7291 return false;
7292 }
7293
7294 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007295};
Dan Gohmanc2853072015-09-03 22:51:53 +00007296
7297class WebAssemblyTargetInfo : public TargetInfo {
7298 static const Builtin::Info BuiltinInfo[];
7299
7300 enum SIMDEnum {
7301 NoSIMD,
7302 SIMD128,
7303 } SIMDLevel;
7304
7305public:
7306 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7307 : TargetInfo(T), SIMDLevel(NoSIMD) {
7308 BigEndian = false;
7309 NoAsmVariants = true;
7310 SuitableAlign = 128;
7311 LargeArrayMinWidth = 128;
7312 LargeArrayAlign = 128;
7313 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007314 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007315 LongDoubleWidth = LongDoubleAlign = 128;
7316 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007317 }
7318
7319protected:
7320 void getTargetDefines(const LangOptions &Opts,
7321 MacroBuilder &Builder) const override {
7322 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7323 if (SIMDLevel >= SIMD128)
7324 Builder.defineMacro("__wasm_simd128__");
7325 }
7326
7327private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007328 bool
7329 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7330 StringRef CPU,
7331 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007332 if (CPU == "bleeding-edge")
7333 Features["simd128"] = true;
7334 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7335 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007336 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007337 return llvm::StringSwitch<bool>(Feature)
7338 .Case("simd128", SIMDLevel >= SIMD128)
7339 .Default(false);
7340 }
7341 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007342 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007343 for (const auto &Feature : Features) {
7344 if (Feature == "+simd128") {
7345 SIMDLevel = std::max(SIMDLevel, SIMD128);
7346 continue;
7347 }
7348 if (Feature == "-simd128") {
7349 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7350 continue;
7351 }
7352
7353 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7354 << "-target-feature";
7355 return false;
7356 }
7357 return true;
7358 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007359 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007360 return llvm::StringSwitch<bool>(Name)
7361 .Case("mvp", true)
7362 .Case("bleeding-edge", true)
7363 .Case("generic", true)
7364 .Default(false);
7365 }
Craig Topper6c03a542015-10-19 04:51:35 +00007366 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7367 return llvm::makeArrayRef(BuiltinInfo,
7368 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007369 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007370 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007371 return VoidPtrBuiltinVaList;
7372 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007373 ArrayRef<const char *> getGCCRegNames() const final {
7374 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007375 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007376 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7377 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007378 }
7379 bool
7380 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007381 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007382 return false;
7383 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007384 const char *getClobbers() const final { return ""; }
7385 bool isCLZForZeroUndef() const final { return false; }
7386 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007387 IntType getIntTypeByWidth(unsigned BitWidth,
7388 bool IsSigned) const final {
7389 // WebAssembly prefers long long for explicitly 64-bit integers.
7390 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7391 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7392 }
7393 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7394 bool IsSigned) const final {
7395 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7396 return BitWidth == 64
7397 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7398 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7399 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007400};
7401
7402const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7403#define BUILTIN(ID, TYPE, ATTRS) \
7404 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7405#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7406 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7407#include "clang/Basic/BuiltinsWebAssembly.def"
7408};
7409
7410class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7411public:
7412 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7413 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007414 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007415 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007416 }
7417
7418protected:
7419 void getTargetDefines(const LangOptions &Opts,
7420 MacroBuilder &Builder) const override {
7421 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7422 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7423 }
7424};
7425
7426class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7427public:
7428 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7429 : WebAssemblyTargetInfo(T) {
7430 LongAlign = LongWidth = 64;
7431 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007432 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007433 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007434 }
7435
7436protected:
7437 void getTargetDefines(const LangOptions &Opts,
7438 MacroBuilder &Builder) const override {
7439 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7440 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7441 }
7442};
7443
JF Bastien643817d2014-09-12 17:52:47 +00007444const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7445#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007446 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007447#include "clang/Basic/BuiltinsLe64.def"
7448};
7449
Eric Christopherc48497a2015-09-18 21:26:24 +00007450static const unsigned SPIRAddrSpaceMap[] = {
7451 1, // opencl_global
7452 3, // opencl_local
7453 2, // opencl_constant
7454 4, // opencl_generic
7455 0, // cuda_device
7456 0, // cuda_constant
7457 0 // cuda_shared
7458};
7459class SPIRTargetInfo : public TargetInfo {
7460public:
7461 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7462 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7463 "SPIR target must use unknown OS");
7464 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7465 "SPIR target must use unknown environment type");
7466 BigEndian = false;
7467 TLSSupported = false;
7468 LongWidth = LongAlign = 64;
7469 AddrSpaceMap = &SPIRAddrSpaceMap;
7470 UseAddrSpaceMapMangling = true;
7471 // Define available target features
7472 // These must be defined in sorted order!
7473 NoAsmVariants = true;
7474 }
7475 void getTargetDefines(const LangOptions &Opts,
7476 MacroBuilder &Builder) const override {
7477 DefineStd(Builder, "SPIR", Opts);
7478 }
7479 bool hasFeature(StringRef Feature) const override {
7480 return Feature == "spir";
7481 }
Craig Topper3164f332014-03-11 03:39:26 +00007482
Craig Topper6c03a542015-10-19 04:51:35 +00007483 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007484 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007485 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007486 bool validateAsmConstraint(const char *&Name,
7487 TargetInfo::ConstraintInfo &info) const override {
7488 return true;
7489 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007490 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7491 return None;
7492 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007493 BuiltinVaListKind getBuiltinVaListKind() const override {
7494 return TargetInfo::VoidPtrBuiltinVaList;
7495 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007496
Eric Christopherc48497a2015-09-18 21:26:24 +00007497 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7498 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7499 : CCCR_Warning;
7500 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007501
Eric Christopherc48497a2015-09-18 21:26:24 +00007502 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7503 return CC_SpirFunction;
7504 }
7505};
Guy Benyeib798fc92012-12-11 21:38:14 +00007506
Eric Christopherc48497a2015-09-18 21:26:24 +00007507class SPIR32TargetInfo : public SPIRTargetInfo {
7508public:
7509 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7510 PointerWidth = PointerAlign = 32;
7511 SizeType = TargetInfo::UnsignedInt;
7512 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007513 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7514 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007515 }
7516 void getTargetDefines(const LangOptions &Opts,
7517 MacroBuilder &Builder) const override {
7518 DefineStd(Builder, "SPIR32", Opts);
7519 }
7520};
Guy Benyeib798fc92012-12-11 21:38:14 +00007521
Eric Christopherc48497a2015-09-18 21:26:24 +00007522class SPIR64TargetInfo : public SPIRTargetInfo {
7523public:
7524 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7525 PointerWidth = PointerAlign = 64;
7526 SizeType = TargetInfo::UnsignedLong;
7527 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007528 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7529 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007530 }
7531 void getTargetDefines(const LangOptions &Opts,
7532 MacroBuilder &Builder) const override {
7533 DefineStd(Builder, "SPIR64", Opts);
7534 }
7535};
Guy Benyeib798fc92012-12-11 21:38:14 +00007536
Robert Lytton0e076492013-08-13 09:43:10 +00007537class XCoreTargetInfo : public TargetInfo {
7538 static const Builtin::Info BuiltinInfo[];
7539public:
7540 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7541 BigEndian = false;
7542 NoAsmVariants = true;
7543 LongLongAlign = 32;
7544 SuitableAlign = 32;
7545 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007546 SizeType = UnsignedInt;
7547 PtrDiffType = SignedInt;
7548 IntPtrType = SignedInt;
7549 WCharType = UnsignedChar;
7550 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007551 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007552 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7553 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007554 }
Craig Topper3164f332014-03-11 03:39:26 +00007555 void getTargetDefines(const LangOptions &Opts,
7556 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007557 Builder.defineMacro("__XS1B__");
7558 }
Craig Topper6c03a542015-10-19 04:51:35 +00007559 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7560 return llvm::makeArrayRef(BuiltinInfo,
7561 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007562 }
Craig Topper3164f332014-03-11 03:39:26 +00007563 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007564 return TargetInfo::VoidPtrBuiltinVaList;
7565 }
Craig Topper3164f332014-03-11 03:39:26 +00007566 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007567 return "";
7568 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007569 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007570 static const char * const GCCRegNames[] = {
7571 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7572 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7573 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007574 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007575 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007576 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7577 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007578 }
Craig Topper3164f332014-03-11 03:39:26 +00007579 bool validateAsmConstraint(const char *&Name,
7580 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007581 return false;
7582 }
Craig Topper3164f332014-03-11 03:39:26 +00007583 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007584 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7585 return (RegNo < 2)? RegNo : -1;
7586 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007587 bool allowsLargerPreferedTypeAlignment() const override {
7588 return false;
7589 }
Robert Lytton0e076492013-08-13 09:43:10 +00007590};
7591
7592const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007593#define BUILTIN(ID, TYPE, ATTRS) \
7594 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7595#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7596 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007597#include "clang/Basic/BuiltinsXCore.def"
7598};
Robert Lytton0e076492013-08-13 09:43:10 +00007599
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007600// x86_32 Android target
7601class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7602public:
7603 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7604 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7605 SuitableAlign = 32;
7606 LongDoubleWidth = 64;
7607 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7608 }
7609};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007610
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007611// x86_64 Android target
7612class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7613public:
7614 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7615 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7616 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7617 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007618
7619 bool useFloat128ManglingForLongDouble() const override {
7620 return true;
7621 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007622};
7623} // end anonymous namespace
7624
Chris Lattner5ba61f02006-10-14 07:39:34 +00007625//===----------------------------------------------------------------------===//
7626// Driver code
7627//===----------------------------------------------------------------------===//
7628
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007629static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007630 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007631
Daniel Dunbar52322032009-08-18 05:47:58 +00007632 switch (Triple.getArch()) {
7633 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007634 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007635
Tim Northover2a0783d2014-05-30 14:14:07 +00007636 case llvm::Triple::xcore:
7637 return new XCoreTargetInfo(Triple);
7638
7639 case llvm::Triple::hexagon:
7640 return new HexagonTargetInfo(Triple);
7641
7642 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007643 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007644 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007645
7646 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007647 case llvm::Triple::CloudABI:
7648 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007649 case llvm::Triple::FreeBSD:
7650 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007651 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007652 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007653 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007654 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007655 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007656 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007657 }
7658
Christian Pirker9b019ae2014-02-25 13:51:00 +00007659 case llvm::Triple::aarch64_be:
7660 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007661 case llvm::Triple::FreeBSD:
7662 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007663 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007664 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007665 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007666 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007667 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007668 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007669 }
7670
Daniel Dunbar52322032009-08-18 05:47:58 +00007671 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007672 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007673 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007674 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007675
Daniel Dunbar52322032009-08-18 05:47:58 +00007676 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007677 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007678 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007679 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007680 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007681 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007682 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007683 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007684 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007685 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007686 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007687 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007688 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007689 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007690 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007691 case llvm::Triple::Win32:
7692 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007693 case llvm::Triple::Cygnus:
7694 return new CygwinARMTargetInfo(Triple);
7695 case llvm::Triple::GNU:
7696 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007697 case llvm::Triple::Itanium:
7698 return new ItaniumWindowsARMleTargetInfo(Triple);
7699 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007700 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007701 return new MicrosoftARMleTargetInfo(Triple);
7702 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007703 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007704 return new ARMleTargetInfo(Triple);
7705 }
7706
7707 case llvm::Triple::armeb:
7708 case llvm::Triple::thumbeb:
7709 if (Triple.isOSDarwin())
7710 return new DarwinARMTargetInfo(Triple);
7711
7712 switch (os) {
7713 case llvm::Triple::Linux:
7714 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7715 case llvm::Triple::FreeBSD:
7716 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7717 case llvm::Triple::NetBSD:
7718 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7719 case llvm::Triple::OpenBSD:
7720 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7721 case llvm::Triple::Bitrig:
7722 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7723 case llvm::Triple::RTEMS:
7724 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7725 case llvm::Triple::NaCl:
7726 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7727 default:
7728 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007729 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007730
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007731 case llvm::Triple::bpfeb:
7732 case llvm::Triple::bpfel:
7733 return new BPFTargetInfo(Triple);
7734
Daniel Dunbar52322032009-08-18 05:47:58 +00007735 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007736 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007737
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007738 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007739 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007740 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007741 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007742 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007743 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007744 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007745 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007746 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007747 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007748 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007749 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007750 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007751
7752 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007753 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007754 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007755 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007756 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007757 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007758 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007759 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007760 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007761 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007762 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007763 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007764 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007765 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007766 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007767
Akira Hatanakabef17452011-09-20 19:21:49 +00007768 case llvm::Triple::mips64:
7769 switch (os) {
7770 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007771 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007772 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007773 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007774 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007775 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007776 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007777 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007778 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007779 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007780 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007781 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007782 }
7783
7784 case llvm::Triple::mips64el:
7785 switch (os) {
7786 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007787 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007788 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007789 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007790 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007791 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007792 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007793 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007794 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007795 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007796 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007797 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007798 }
7799
Ivan Krasindd7403e2011-08-24 20:22:22 +00007800 case llvm::Triple::le32:
7801 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007802 case llvm::Triple::NaCl:
7803 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7804 default:
7805 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007806 }
7807
JF Bastien643817d2014-09-12 17:52:47 +00007808 case llvm::Triple::le64:
7809 return new Le64TargetInfo(Triple);
7810
Daniel Dunbar52322032009-08-18 05:47:58 +00007811 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007812 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007813 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007814 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007815 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007816 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007817 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007818 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007819 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007820 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007821 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007822 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007823 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007824 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007825 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007826 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007827 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007828
7829 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007830 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007831 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007832 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007833 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007834 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007835 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007836 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007837 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007838 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007839 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007840 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007841 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007842 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007843 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007844
Bill Schmidt778d3872013-07-26 01:36:11 +00007845 case llvm::Triple::ppc64le:
7846 switch (os) {
7847 case llvm::Triple::Linux:
7848 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007849 case llvm::Triple::NetBSD:
7850 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007851 default:
7852 return new PPC64TargetInfo(Triple);
7853 }
7854
Peter Collingbournec947aae2012-05-20 23:28:41 +00007855 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007856 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007857 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007858 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007859
Tom Stellardd8e38a32015-01-06 20:34:47 +00007860 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007861 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007862 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007863
Daniel Dunbar52322032009-08-18 05:47:58 +00007864 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007865 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007866 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007867 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007868 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007869 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007870 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007871 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007872 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007873 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007874 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007875 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007876 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007877 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007878 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007879
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007880 // The 'sparcel' architecture copies all the above cases except for Solaris.
7881 case llvm::Triple::sparcel:
7882 switch (os) {
7883 case llvm::Triple::Linux:
7884 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7885 case llvm::Triple::NetBSD:
7886 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7887 case llvm::Triple::OpenBSD:
7888 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7889 case llvm::Triple::RTEMS:
7890 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7891 default:
7892 return new SparcV8elTargetInfo(Triple);
7893 }
7894
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007895 case llvm::Triple::sparcv9:
7896 switch (os) {
7897 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007898 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007899 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007900 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007901 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007902 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007903 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007904 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007905 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007906 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007907 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007908 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007909 }
7910
Ulrich Weigand47445072013-05-06 16:26:41 +00007911 case llvm::Triple::systemz:
7912 switch (os) {
7913 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007914 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007915 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007916 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007917 }
7918
Eli Friedmana9c3d712009-08-19 20:47:07 +00007919 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007920 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007921
Daniel Dunbar52322032009-08-18 05:47:58 +00007922 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007923 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007924 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007925
Daniel Dunbar52322032009-08-18 05:47:58 +00007926 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007927 case llvm::Triple::CloudABI:
7928 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007929 case llvm::Triple::Linux: {
7930 switch (Triple.getEnvironment()) {
7931 default:
7932 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7933 case llvm::Triple::Android:
7934 return new AndroidX86_32TargetInfo(Triple);
7935 }
7936 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007937 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007938 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007939 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007940 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007941 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007942 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007943 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007944 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007945 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007946 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007947 case llvm::Triple::KFreeBSD:
7948 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007949 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007950 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007951 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007952 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007953 case llvm::Triple::Win32: {
7954 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007955 case llvm::Triple::Cygnus:
7956 return new CygwinX86_32TargetInfo(Triple);
7957 case llvm::Triple::GNU:
7958 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007959 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007960 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007961 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007962 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007963 }
7964 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007965 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007966 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007967 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007968 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007969 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007970 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00007971 case llvm::Triple::ELFIAMCU:
7972 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007973 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007974 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007975 }
7976
7977 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007978 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007979 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007980
Daniel Dunbar52322032009-08-18 05:47:58 +00007981 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007982 case llvm::Triple::CloudABI:
7983 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007984 case llvm::Triple::Linux: {
7985 switch (Triple.getEnvironment()) {
7986 default:
7987 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7988 case llvm::Triple::Android:
7989 return new AndroidX86_64TargetInfo(Triple);
7990 }
7991 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007992 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007993 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007994 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007995 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007996 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007997 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007998 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007999 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008000 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008001 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008002 case llvm::Triple::KFreeBSD:
8003 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008004 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008005 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008006 case llvm::Triple::Win32: {
8007 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008008 case llvm::Triple::Cygnus:
8009 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008010 case llvm::Triple::GNU:
8011 return new MinGWX86_64TargetInfo(Triple);
8012 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008013 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008014 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008015 }
8016 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008017 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008018 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008019 case llvm::Triple::PS4:
8020 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008021 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008022 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008023 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008024
Douglas Katzman78d7c542015-05-12 21:18:10 +00008025 case llvm::Triple::spir: {
8026 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8027 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8028 return nullptr;
8029 return new SPIR32TargetInfo(Triple);
8030 }
8031 case llvm::Triple::spir64: {
8032 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8033 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8034 return nullptr;
8035 return new SPIR64TargetInfo(Triple);
8036 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008037 case llvm::Triple::wasm32:
8038 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8039 return nullptr;
8040 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
8041 case llvm::Triple::wasm64:
8042 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8043 return nullptr;
8044 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008045 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008046}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008047
8048/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008049/// options.
Alp Toker80758082014-07-06 05:26:44 +00008050TargetInfo *
8051TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
8052 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008053 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008054
8055 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00008056 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008057 if (!Target) {
8058 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008059 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008060 }
Alp Toker80758082014-07-06 05:26:44 +00008061 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008062
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008063 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008064 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8065 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008066 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008067 }
8068
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008069 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008070 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8071 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008072 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008073 }
8074
Rafael Espindolaeb265472013-08-21 21:59:03 +00008075 // Set the fp math unit.
8076 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8077 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008078 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008079 }
8080
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008081 // Compute the default target features, we need the target to handle this
8082 // because features may have dependencies on one another.
8083 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008084 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8085 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008086 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008087
8088 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008089 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008090 for (const auto &F : Features)
8091 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8092
Eric Christopher3ff21b32013-10-16 21:26:26 +00008093 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008094 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008095
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008096 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008097}