blob: 01b100820476031bc0086ad75d4d6ae6fd677555 [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"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000030#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000033
Chris Lattner5ba61f02006-10-14 07:39:34 +000034using namespace clang;
35
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000037// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000038//===----------------------------------------------------------------------===//
39
Chris Lattner1e1c0b92009-03-20 16:06:38 +000040/// DefineStd - Define a macro name and standard variants. For example if
41/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
42/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 const LangOptions &Opts) {
45 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000046
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
48 // in the user's namespace.
49 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057}
58
Benjamin Kramere3b442d2012-01-10 11:50:09 +000059static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
60 bool Tuning = true) {
61 Builder.defineMacro("__" + CPUName);
62 Builder.defineMacro("__" + CPUName + "__");
63 if (Tuning)
64 Builder.defineMacro("__tune_" + CPUName + "__");
65}
66
Chris Lattner09d98f52008-10-05 21:50:58 +000067//===----------------------------------------------------------------------===//
68// Defines specific to certain operating systems.
69//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000070
Torok Edwinb2b37c62009-06-30 17:10:35 +000071namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000072template<typename TgtInfo>
73class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000074protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000075 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000076 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000077public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000078 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000079 void getTargetDefines(const LangOptions &Opts,
80 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000081 TgtInfo::getTargetDefines(Opts, Builder);
82 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000083 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000084
85};
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Eric Christopher7d0c7252015-09-24 21:17:04 +000087// CloudABI Target
88template <typename Target>
89class CloudABITargetInfo : public OSTargetInfo<Target> {
90protected:
91 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
92 MacroBuilder &Builder) const override {
93 Builder.defineMacro("__CloudABI__");
94 Builder.defineMacro("__ELF__");
95
96 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
97 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
98 Builder.defineMacro("__STDC_UTF_16__");
99 Builder.defineMacro("__STDC_UTF_32__");
100 }
101
102public:
103 CloudABITargetInfo(const llvm::Triple &Triple)
104 : OSTargetInfo<Target>(Triple) {
105 this->UserLabelPrefix = "";
106 }
107};
108
Daniel Dunbard86666f2010-01-26 01:44:04 +0000109static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000110 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000112 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000113 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000116 // AddressSanitizer doesn't play well with source fortification, which is on
117 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000118 if (Opts.Sanitize.has(SanitizerKind::Address))
119 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000120
John McCall5d36a8c2011-06-16 00:03:19 +0000121 if (!Opts.ObjCAutoRefCount) {
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)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000124
John McCall31168b02011-06-15 23:02:42 +0000125 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000126 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000127 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
128 else
129 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000130
John McCall31168b02011-06-15 23:02:42 +0000131 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
132 // allow this in C, since one might have block pointers in structs that
133 // are used in pure C code and in Objective-C ARC.
134 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000135 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000136
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000137 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000139 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000141
142 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000143 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000144
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000146 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000147 if (Triple.isMacOSX()) {
148 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000149 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000151 Triple.getOSVersion(Maj, Min, Rev);
152 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000153 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000154
Sebastian Pop422377c2012-01-20 22:01:23 +0000155 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000156 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000157 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
158 if (PlatformName == "win32") {
159 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
160 return;
161 }
162
Evan Cheng31dd9a62014-01-26 23:12:43 +0000163 // Set the appropriate OS version define.
164 if (Triple.isiOS()) {
165 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
166 char Str[6];
167 Str[0] = '0' + Maj;
168 Str[1] = '0' + (Min / 10);
169 Str[2] = '0' + (Min % 10);
170 Str[3] = '0' + (Rev / 10);
171 Str[4] = '0' + (Rev % 10);
172 Str[5] = '\0';
Eric Christopher7d0c7252015-09-24 21:17:04 +0000173 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000174 } else if (Triple.isMacOSX()) {
175 // Note that the Driver allows versions which aren't representable in the
176 // define (because we only get a single digit for the minor and micro
177 // revision numbers). So, we limit them to the maximum representable
178 // version.
179 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000180 char Str[7];
181 if (Maj < 10 || (Maj == 10 && Min < 10)) {
182 Str[0] = '0' + (Maj / 10);
183 Str[1] = '0' + (Maj % 10);
184 Str[2] = '0' + std::min(Min, 9U);
185 Str[3] = '0' + std::min(Rev, 9U);
186 Str[4] = '\0';
187 } else {
188 // Handle versions > 10.9.
189 Str[0] = '0' + (Maj / 10);
190 Str[1] = '0' + (Maj % 10);
191 Str[2] = '0' + (Min / 10);
192 Str[3] = '0' + (Min % 10);
193 Str[4] = '0' + (Rev / 10);
194 Str[5] = '0' + (Rev % 10);
195 Str[6] = '\0';
196 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000198 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000199
Tim Northover157d9112014-01-16 08:48:16 +0000200 // Tell users about the kernel if there is one.
201 if (Triple.isOSDarwin())
202 Builder.defineMacro("__MACH__");
203
Daniel Dunbarecf13562011-04-19 21:40:34 +0000204 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000205}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000206
Torok Edwinb2b37c62009-06-30 17:10:35 +0000207template<typename Target>
208class DarwinTargetInfo : public OSTargetInfo<Target> {
209protected:
Craig Topper3164f332014-03-11 03:39:26 +0000210 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
211 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000212 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000213 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000214 }
Mike Stump11289f42009-09-09 15:08:12 +0000215
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000217 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
218 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
219 this->MCountName = "\01mcount";
220 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221
Craig Topper3164f332014-03-11 03:39:26 +0000222 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000223 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000224 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000226 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000230
Craig Topper3164f332014-03-11 03:39:26 +0000231 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000232 // FIXME: We should return 0 when building kexts.
233 return "__TEXT,__StaticInit,regular,pure_instructions";
234 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000235
John McCalleed64c72012-01-29 01:20:30 +0000236 /// Darwin does not support protected visibility. Darwin's "default"
237 /// is very similar to ELF's "protected"; Darwin requires a "weak"
238 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000239 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000240 return false;
241 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000242};
243
Chris Lattner30ba6742009-08-10 19:03:04 +0000244
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245// DragonFlyBSD Target
246template<typename Target>
247class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
248protected:
Craig Topper3164f332014-03-11 03:39:26 +0000249 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
250 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000252 Builder.defineMacro("__DragonFly__");
253 Builder.defineMacro("__DragonFly_cc_version", "100001");
254 Builder.defineMacro("__ELF__");
255 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
256 Builder.defineMacro("__tune_i386__");
257 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000258 }
259public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000260 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
261 : OSTargetInfo<Target>(Triple) {
262 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 switch (Triple.getArch()) {
265 default:
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->MCountName = ".mcount";
269 break;
270 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000271 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272};
273
274// FreeBSD Target
275template<typename Target>
276class FreeBSDTargetInfo : public OSTargetInfo<Target> {
277protected:
Craig Topper3164f332014-03-11 03:39:26 +0000278 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
279 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000280 // FreeBSD defines; list based off of gcc output
281
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000282 unsigned Release = Triple.getOSMajorVersion();
283 if (Release == 0U)
284 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000285
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000286 Builder.defineMacro("__FreeBSD__", Twine(Release));
287 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000288 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
289 DefineStd(Builder, "unix", Opts);
290 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000291
292 // On FreeBSD, wchar_t contains the number of the code point as
293 // used by the character set of the locale. These character sets are
294 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000295 //
296 // FIXME: This is wrong; the macro refers to the numerical values
297 // of wchar_t *literals*, which are not locale-dependent. However,
298 // FreeBSD systems apparently depend on us getting this wrong, and
299 // setting this to 1 is conforming even if all the basic source
300 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000301 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000302 }
303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000304 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
305 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000306
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000307 switch (Triple.getArch()) {
308 default:
309 case llvm::Triple::x86:
310 case llvm::Triple::x86_64:
311 this->MCountName = ".mcount";
312 break;
313 case llvm::Triple::mips:
314 case llvm::Triple::mipsel:
315 case llvm::Triple::ppc:
316 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000317 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000318 this->MCountName = "_mcount";
319 break;
320 case llvm::Triple::arm:
321 this->MCountName = "__mcount";
322 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000323 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000324 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000325};
326
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000327// GNU/kFreeBSD Target
328template<typename Target>
329class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
330protected:
Craig Topper3164f332014-03-11 03:39:26 +0000331 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
332 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000333 // GNU/kFreeBSD defines; list based off of gcc output
334
335 DefineStd(Builder, "unix", Opts);
336 Builder.defineMacro("__FreeBSD_kernel__");
337 Builder.defineMacro("__GLIBC__");
338 Builder.defineMacro("__ELF__");
339 if (Opts.POSIXThreads)
340 Builder.defineMacro("_REENTRANT");
341 if (Opts.CPlusPlus)
342 Builder.defineMacro("_GNU_SOURCE");
343 }
344public:
Eric Christopher917e9522014-11-18 22:36:15 +0000345 KFreeBSDTargetInfo(const llvm::Triple &Triple)
346 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000347 this->UserLabelPrefix = "";
348 }
349};
350
Chris Lattner3e2ee142010-07-07 16:01:42 +0000351// Minix Target
352template<typename Target>
353class MinixTargetInfo : public OSTargetInfo<Target> {
354protected:
Craig Topper3164f332014-03-11 03:39:26 +0000355 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
356 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000357 // Minix defines
358
359 Builder.defineMacro("__minix", "3");
360 Builder.defineMacro("_EM_WSIZE", "4");
361 Builder.defineMacro("_EM_PSIZE", "4");
362 Builder.defineMacro("_EM_SSIZE", "2");
363 Builder.defineMacro("_EM_LSIZE", "4");
364 Builder.defineMacro("_EM_FSIZE", "4");
365 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000366 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000367 DefineStd(Builder, "unix", Opts);
368 }
369public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000370 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
371 this->UserLabelPrefix = "";
372 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000373};
374
Torok Edwinb2b37c62009-06-30 17:10:35 +0000375// Linux target
376template<typename Target>
377class LinuxTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 DefineStd(Builder, "unix", Opts);
383 DefineStd(Builder, "linux", Opts);
384 Builder.defineMacro("__gnu_linux__");
385 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000386 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000387 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000388 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000389 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000390 this->PlatformName = "android";
391 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
392 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000393 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000395 if (Opts.CPlusPlus)
396 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397 }
398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000399 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000401 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000402
403 switch (Triple.getArch()) {
404 default:
405 break;
406 case llvm::Triple::ppc:
407 case llvm::Triple::ppc64:
408 case llvm::Triple::ppc64le:
409 this->MCountName = "_mcount";
410 break;
411 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000412 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000413
Craig Topper3164f332014-03-11 03:39:26 +0000414 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000415 return ".text.startup";
416 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000417};
418
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000419// NetBSD Target
420template<typename Target>
421class NetBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Craig Topper3164f332014-03-11 03:39:26 +0000423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000425 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000426 Builder.defineMacro("__NetBSD__");
427 Builder.defineMacro("__unix__");
428 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000429 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000430 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000431
432 switch (Triple.getArch()) {
433 default:
434 break;
435 case llvm::Triple::arm:
436 case llvm::Triple::armeb:
437 case llvm::Triple::thumb:
438 case llvm::Triple::thumbeb:
439 Builder.defineMacro("__ARM_DWARF_EH__");
440 break;
441 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000442 }
443public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000444 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
445 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000446 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000447 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000448};
449
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450// OpenBSD Target
451template<typename Target>
452class OpenBSDTargetInfo : public OSTargetInfo<Target> {
453protected:
Craig Topper3164f332014-03-11 03:39:26 +0000454 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
455 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000456 // OpenBSD defines; list based off of gcc output
457
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 Builder.defineMacro("__OpenBSD__");
459 DefineStd(Builder, "unix", Opts);
460 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000461 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000462 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
466 this->UserLabelPrefix = "";
467 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000468
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469 switch (Triple.getArch()) {
470 default:
471 case llvm::Triple::x86:
472 case llvm::Triple::x86_64:
473 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000474 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000475 this->MCountName = "__mcount";
476 break;
477 case llvm::Triple::mips64:
478 case llvm::Triple::mips64el:
479 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000480 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000481 this->MCountName = "_mcount";
482 break;
483 }
484 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000485};
486
Eli Friedman9fa28852012-08-08 23:57:20 +0000487// Bitrig Target
488template<typename Target>
489class BitrigTargetInfo : public OSTargetInfo<Target> {
490protected:
Craig Topper3164f332014-03-11 03:39:26 +0000491 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
492 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000493 // Bitrig defines; list based off of gcc output
494
495 Builder.defineMacro("__Bitrig__");
496 DefineStd(Builder, "unix", Opts);
497 Builder.defineMacro("__ELF__");
498 if (Opts.POSIXThreads)
499 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000500
501 switch (Triple.getArch()) {
502 default:
503 break;
504 case llvm::Triple::arm:
505 case llvm::Triple::armeb:
506 case llvm::Triple::thumb:
507 case llvm::Triple::thumbeb:
508 Builder.defineMacro("__ARM_DWARF_EH__");
509 break;
510 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000511 }
512public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000513 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
514 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000515 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000516 }
517};
518
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000519// PSP Target
520template<typename Target>
521class PSPTargetInfo : public OSTargetInfo<Target> {
522protected:
Craig Topper3164f332014-03-11 03:39:26 +0000523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000525 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000526 Builder.defineMacro("PSP");
527 Builder.defineMacro("_PSP");
528 Builder.defineMacro("__psp__");
529 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000530 }
531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 this->UserLabelPrefix = "";
534 }
535};
536
John Thompsone467e192009-11-19 17:18:50 +0000537// PS3 PPU Target
538template<typename Target>
539class PS3PPUTargetInfo : public OSTargetInfo<Target> {
540protected:
Craig Topper3164f332014-03-11 03:39:26 +0000541 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
542 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000543 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000544 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__PPU__");
546 Builder.defineMacro("__CELLOS_LV2__");
547 Builder.defineMacro("__ELF__");
548 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000549 Builder.defineMacro("_ARCH_PPC64");
550 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000551 }
552public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000553 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000554 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000555 this->LongWidth = this->LongAlign = 32;
556 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000557 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000559 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000560 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000561 }
562};
563
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000564template <typename Target>
565class PS4OSTargetInfo : public OSTargetInfo<Target> {
566protected:
567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568 MacroBuilder &Builder) const override {
569 Builder.defineMacro("__FreeBSD__", "9");
570 Builder.defineMacro("__FreeBSD_cc_version", "900001");
571 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
572 DefineStd(Builder, "unix", Opts);
573 Builder.defineMacro("__ELF__");
574 Builder.defineMacro("__PS4__");
575 }
576public:
577 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
578 this->WCharType = this->UnsignedShort;
579
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000580 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
581 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Torok Edwinb2b37c62009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Craig Topper3164f332014-03-11 03:39:26 +0000597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000607 // with a new version.
608 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Craig Topper3164f332014-03-11 03:39:26 +0000631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000638 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Reid Kleckner16514352015-01-30 21:42:55 +0000641 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
David Majnemer6a658902015-07-22 22:36:26 +0000645 if (Opts.Bool)
646 Builder.defineMacro("__BOOL_DEFINED");
647
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000648 if (!Opts.CharIsSigned)
649 Builder.defineMacro("_CHAR_UNSIGNED");
650
651 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
652 // but it works for now.
653 if (Opts.POSIXThreads)
654 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000655
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000656 if (Opts.MSCompatibilityVersion) {
657 Builder.defineMacro("_MSC_VER",
658 Twine(Opts.MSCompatibilityVersion / 100000));
659 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000660 // FIXME We cannot encode the revision information into 32-bits
661 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000662
David Majnemerb710a932015-05-11 03:57:49 +0000663 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000664 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000665 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000666
667 if (Opts.MicrosoftExt) {
668 Builder.defineMacro("_MSC_EXTENSIONS");
669
670 if (Opts.CPlusPlus11) {
671 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
672 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
673 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
674 }
675 }
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000678 }
679
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000681 WindowsTargetInfo(const llvm::Triple &Triple)
682 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000683};
684
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000685template <typename Target>
686class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000687protected:
Craig Topper3164f332014-03-11 03:39:26 +0000688 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
689 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000690 if (Opts.POSIXThreads)
691 Builder.defineMacro("_REENTRANT");
692 if (Opts.CPlusPlus)
693 Builder.defineMacro("_GNU_SOURCE");
694
695 DefineStd(Builder, "unix", Opts);
696 Builder.defineMacro("__ELF__");
697 Builder.defineMacro("__native_client__");
698 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000699
700public:
701 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000702 this->UserLabelPrefix = "";
703 this->LongAlign = 32;
704 this->LongWidth = 32;
705 this->PointerAlign = 32;
706 this->PointerWidth = 32;
707 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000708 this->Int64Type = TargetInfo::SignedLongLong;
709 this->DoubleAlign = 64;
710 this->LongDoubleWidth = 64;
711 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000712 this->LongLongWidth = 64;
713 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714 this->SizeType = TargetInfo::UnsignedInt;
715 this->PtrDiffType = TargetInfo::SignedInt;
716 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000717 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000718 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000720 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000722 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000724 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000725 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000726 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 } else {
728 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000729 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000731 }
732};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000733
Dan Gohmanc2853072015-09-03 22:51:53 +0000734// WebAssembly target
735template <typename Target>
736class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
737 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000738 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000739 // A common platform macro.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_REENTRANT");
742 // Follow g++ convention and predefine _GNU_SOURCE for C++.
743 if (Opts.CPlusPlus)
744 Builder.defineMacro("_GNU_SOURCE");
745 }
746
747 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000748 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000749 return ".text.__startup";
750 }
751
752public:
753 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
754 : OSTargetInfo<Target>(Triple) {
755 this->MCountName = "__mcount";
756 this->UserLabelPrefix = "";
757 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
758 }
759};
Dan Gohmanc2853072015-09-03 22:51:53 +0000760
Chris Lattner09d98f52008-10-05 21:50:58 +0000761//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000762// Specific target implementations.
763//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000764
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000765// PPC abstract base class
766class PPCTargetInfo : public TargetInfo {
767 static const Builtin::Info BuiltinInfo[];
768 static const char * const GCCRegNames[];
769 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000770 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000771
772 // Target cpu features.
773 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000774 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000775 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000776 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000777 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000778 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000779 bool HasBPERMD;
780 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000781
Ulrich Weigand8afad612014-07-28 13:17:52 +0000782protected:
783 std::string ABI;
784
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000785public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000786 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000787 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000788 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000789 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000790 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000791 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000792 LongDoubleWidth = LongDoubleAlign = 128;
793 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
794 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000795
Hal Finkel6b984f02012-07-03 16:51:04 +0000796 /// \brief Flags for architecture specific defines.
797 typedef enum {
798 ArchDefineNone = 0,
799 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
800 ArchDefinePpcgr = 1 << 1,
801 ArchDefinePpcsq = 1 << 2,
802 ArchDefine440 = 1 << 3,
803 ArchDefine603 = 1 << 4,
804 ArchDefine604 = 1 << 5,
805 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000806 ArchDefinePwr5 = 1 << 7,
807 ArchDefinePwr5x = 1 << 8,
808 ArchDefinePwr6 = 1 << 9,
809 ArchDefinePwr6x = 1 << 10,
810 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000811 ArchDefinePwr8 = 1 << 12,
812 ArchDefineA2 = 1 << 13,
813 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000814 } ArchDefineTypes;
815
Bill Schmidt38378a02013-02-01 20:23:10 +0000816 // Note: GCC recognizes the following additional cpus:
817 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
818 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
819 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000820 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000821 bool CPUKnown = llvm::StringSwitch<bool>(Name)
822 .Case("generic", true)
823 .Case("440", true)
824 .Case("450", true)
825 .Case("601", true)
826 .Case("602", true)
827 .Case("603", true)
828 .Case("603e", true)
829 .Case("603ev", true)
830 .Case("604", true)
831 .Case("604e", true)
832 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000833 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("g3", true)
835 .Case("7400", true)
836 .Case("g4", true)
837 .Case("7450", true)
838 .Case("g4+", true)
839 .Case("750", true)
840 .Case("970", true)
841 .Case("g5", true)
842 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000843 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000844 .Case("e500mc", true)
845 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000846 .Case("power3", true)
847 .Case("pwr3", true)
848 .Case("power4", true)
849 .Case("pwr4", true)
850 .Case("power5", true)
851 .Case("pwr5", true)
852 .Case("power5x", true)
853 .Case("pwr5x", true)
854 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000855 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000856 .Case("power6x", true)
857 .Case("pwr6x", true)
858 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000859 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000860 .Case("power8", true)
861 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000865 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000866 .Case("powerpc64le", true)
867 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000868 .Default(false);
869
870 if (CPUKnown)
871 CPU = Name;
872
873 return CPUKnown;
874 }
875
Ulrich Weigand8afad612014-07-28 13:17:52 +0000876
877 StringRef getABI() const override { return ABI; }
878
Craig Topper6c03a542015-10-19 04:51:35 +0000879 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
880 return llvm::makeArrayRef(BuiltinInfo,
881 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000882 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000883
Craig Topper3164f332014-03-11 03:39:26 +0000884 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000885
Craig Topper3164f332014-03-11 03:39:26 +0000886 void getTargetDefines(const LangOptions &Opts,
887 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000888
Eric Christopher8c47b422015-10-09 18:39:55 +0000889 bool
890 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
891 StringRef CPU,
892 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000893
Craig Topper3164f332014-03-11 03:39:26 +0000894 bool handleTargetFeatures(std::vector<std::string> &Features,
895 DiagnosticsEngine &Diags) override;
896 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000897 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
898 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000899
Craig Topperf054e3a2015-10-19 03:52:27 +0000900 ArrayRef<const char *> getGCCRegNames() const override;
901 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000902 bool validateAsmConstraint(const char *&Name,
903 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000904 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000905 default: return false;
906 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000907 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000908 case 'b': // Base register
909 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000910 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000911 break;
912 // FIXME: The following are added to allow parsing.
913 // I just took a guess at what the actions should be.
914 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000915 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000916 case 'v': // Altivec vector register
917 Info.setAllowsRegister();
918 break;
919 case 'w':
920 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000921 case 'd':// VSX vector register to hold vector double data
922 case 'f':// VSX vector register to hold vector float data
923 case 's':// VSX vector register to hold scalar float data
924 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000925 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000926 break;
927 default:
928 return false;
929 }
930 Info.setAllowsRegister();
931 Name++; // Skip over 'w'.
932 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000933 case 'h': // `MQ', `CTR', or `LINK' register
934 case 'q': // `MQ' register
935 case 'c': // `CTR' register
936 case 'l': // `LINK' register
937 case 'x': // `CR' register (condition register) number 0
938 case 'y': // `CR' register (condition register)
939 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000940 Info.setAllowsRegister();
941 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000942 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000943 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000944 // (use `L' instead for SImode constants)
945 case 'K': // Unsigned 16-bit constant
946 case 'L': // Signed 16-bit constant shifted left 16 bits
947 case 'M': // Constant larger than 31
948 case 'N': // Exact power of 2
949 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000950 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000951 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000952 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000954 break;
955 case 'm': // Memory operand. Note that on PowerPC targets, m can
956 // include addresses that update the base register. It
957 // is therefore only safe to use `m' in an asm statement
958 // if that asm statement accesses the operand exactly once.
959 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000960 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000962 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000963 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000964 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
965 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000966 // register to be updated.
967 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000968 if (Name[1] != 's')
969 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000970 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000971 // include any automodification of the base register. Unlike
972 // `m', this constraint can be used in asm statements that
973 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000974 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000975 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000976 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000977 break;
978 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000979 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000980 case 'Z': // Memory operand that is an indexed or indirect from a
981 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000982 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000983 Info.setAllowsMemory();
984 Info.setAllowsRegister();
985 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000986 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000987 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000988 // register (`p' is preferable for asm statements)
989 case 'S': // Constant suitable as a 64-bit mask operand
990 case 'T': // Constant suitable as a 32-bit mask operand
991 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000992 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000993 // instructions
994 case 'W': // Vector constant that does not require memory
995 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000996 break;
997 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000998 }
John Thompson07a61a42010-06-24 22:44:13 +0000999 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 }
Craig Topper3164f332014-03-11 03:39:26 +00001001 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001002 std::string R;
1003 switch (*Constraint) {
1004 case 'e':
1005 case 'w':
1006 // Two-character constraint; add "^" hint for later parsing.
1007 R = std::string("^") + std::string(Constraint, 2);
1008 Constraint++;
1009 break;
1010 default:
1011 return TargetInfo::convertConstraint(Constraint);
1012 }
1013 return R;
1014 }
Craig Topper3164f332014-03-11 03:39:26 +00001015 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001016 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001017 }
Craig Topper3164f332014-03-11 03:39:26 +00001018 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001019 if (RegNo == 0) return 3;
1020 if (RegNo == 1) return 4;
1021 return -1;
1022 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001023
1024 bool hasSjLjLowering() const override {
1025 return true;
1026 }
David Majnemer2617ea62015-06-09 18:05:33 +00001027
1028 bool useFloat128ManglingForLongDouble() const override {
1029 return LongDoubleWidth == 128 &&
1030 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1031 getTriple().isOSBinFormatELF();
1032 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001033};
Anders Carlssonf511f642007-11-27 04:11:28 +00001034
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001035const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001036#define BUILTIN(ID, TYPE, ATTRS) \
1037 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1038#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1039 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001040#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001041};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001042
Eric Christopher917e9522014-11-18 22:36:15 +00001043/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001044/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001045bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001046 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001047 for (const auto &Feature : Features) {
1048 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001049 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001050 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001051 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001052 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001053 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001054 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001055 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001056 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001057 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001059 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001061 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001063 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001064 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001065 // TODO: Finish this list and add an assert that we've handled them
1066 // all.
1067 }
Eric Christopher02c33352015-08-25 00:59:11 +00001068
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001069 return true;
1070}
1071
Chris Lattnerecd49032009-03-02 22:27:17 +00001072/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1073/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001074void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001075 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001076 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001078 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001079 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001080 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001081 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001082 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001084 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001086 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001087 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001088
Chris Lattnerecd49032009-03-02 22:27:17 +00001089 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001090 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1091 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001092 } else {
1093 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1094 getTriple().getOS() != llvm::Triple::OpenBSD)
1095 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001096 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001097
Ulrich Weigand8afad612014-07-28 13:17:52 +00001098 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001099 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001100 Builder.defineMacro("_CALL_ELF", "1");
1101 if (ABI == "elfv2")
1102 Builder.defineMacro("_CALL_ELF", "2");
1103
Chris Lattnerecd49032009-03-02 22:27:17 +00001104 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001105 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1106 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001107
Chris Lattnerecd49032009-03-02 22:27:17 +00001108 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001109 if (LongDoubleWidth == 128)
1110 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001111
John Thompsone467e192009-11-19 17:18:50 +00001112 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__VEC__", "10206");
1114 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001115 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001116
1117 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001118 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1119 .Case("440", ArchDefineName)
1120 .Case("450", ArchDefineName | ArchDefine440)
1121 .Case("601", ArchDefineName)
1122 .Case("602", ArchDefineName | ArchDefinePpcgr)
1123 .Case("603", ArchDefineName | ArchDefinePpcgr)
1124 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1125 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1126 .Case("604", ArchDefineName | ArchDefinePpcgr)
1127 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1128 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001129 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001130 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1131 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1132 .Case("750", ArchDefineName | ArchDefinePpcgr)
1133 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1134 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001135 .Case("a2", ArchDefineA2)
1136 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001137 .Case("pwr3", ArchDefinePpcgr)
1138 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1139 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1140 | ArchDefinePpcsq)
1141 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1142 | ArchDefinePpcgr | ArchDefinePpcsq)
1143 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1144 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1145 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1146 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1147 | ArchDefinePpcsq)
1148 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1149 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001150 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1152 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1153 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001154 .Case("power3", ArchDefinePpcgr)
1155 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1156 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1157 | ArchDefinePpcsq)
1158 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1159 | ArchDefinePpcgr | ArchDefinePpcsq)
1160 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1161 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1162 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1163 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1164 | ArchDefinePpcsq)
1165 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1166 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001167 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1169 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1170 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001171 .Default(ArchDefineNone);
1172
1173 if (defs & ArchDefineName)
1174 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1175 if (defs & ArchDefinePpcgr)
1176 Builder.defineMacro("_ARCH_PPCGR");
1177 if (defs & ArchDefinePpcsq)
1178 Builder.defineMacro("_ARCH_PPCSQ");
1179 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001180 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001181 if (defs & ArchDefine603)
1182 Builder.defineMacro("_ARCH_603");
1183 if (defs & ArchDefine604)
1184 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001185 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001186 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001187 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001188 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001189 if (defs & ArchDefinePwr5x)
1190 Builder.defineMacro("_ARCH_PWR5X");
1191 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001192 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001193 if (defs & ArchDefinePwr6x)
1194 Builder.defineMacro("_ARCH_PWR6X");
1195 if (defs & ArchDefinePwr7)
1196 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001197 if (defs & ArchDefinePwr8)
1198 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001199 if (defs & ArchDefineA2)
1200 Builder.defineMacro("_ARCH_A2");
1201 if (defs & ArchDefineA2q) {
1202 Builder.defineMacro("_ARCH_A2Q");
1203 Builder.defineMacro("_ARCH_QP");
1204 }
1205
1206 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1207 Builder.defineMacro("__bg__");
1208 Builder.defineMacro("__THW_BLUEGENE__");
1209 Builder.defineMacro("__bgq__");
1210 Builder.defineMacro("__TOS_BGQ__");
1211 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001212
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001213 if (HasVSX)
1214 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001215 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001216 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001217 if (HasP8Crypto)
1218 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001219 if (HasHTM)
1220 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001221
1222 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1223 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1224 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1225 if (PointerWidth == 64)
1226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001227
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 // FIXME: The following are not yet generated here by Clang, but are
1229 // generated by GCC:
1230 //
1231 // _SOFT_FLOAT_
1232 // __RECIP_PRECISION__
1233 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001234 // __RECIP__
1235 // __RECIPF__
1236 // __RSQRTE__
1237 // __RSQRTEF__
1238 // _SOFT_DOUBLE_
1239 // __NO_LWSYNC__
1240 // __HAVE_BSWAP__
1241 // __LONGDOUBLE128
1242 // __CMODEL_MEDIUM__
1243 // __CMODEL_LARGE__
1244 // _CALL_SYSV
1245 // _CALL_DARWIN
1246 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001247}
1248
Eric Christophera8a14c32015-08-31 18:39:16 +00001249// Handle explicit options being passed to the compiler here: if we've
1250// explicitly turned off vsx and turned on power8-vector or direct-move then
1251// go ahead and error since the customer has expressed a somewhat incompatible
1252// set of options.
1253static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001254 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001255
1256 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1257 FeaturesVec.end()) {
1258 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1259 FeaturesVec.end()) {
1260 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1261 << "-mno-vsx";
1262 return false;
1263 }
1264
1265 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1266 FeaturesVec.end()) {
1267 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1268 << "-mno-vsx";
1269 return false;
1270 }
1271 }
1272
1273 return true;
1274}
1275
Eric Christopher8c47b422015-10-09 18:39:55 +00001276bool PPCTargetInfo::initFeatureMap(
1277 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1278 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001279 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1280 .Case("7400", true)
1281 .Case("g4", true)
1282 .Case("7450", true)
1283 .Case("g4+", true)
1284 .Case("970", true)
1285 .Case("g5", true)
1286 .Case("pwr6", true)
1287 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001288 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001289 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001290 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001291 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001292
1293 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001294 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1295 .Case("ppc64le", true)
1296 .Case("pwr8", true)
1297 .Default(false);
1298 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1299 .Case("ppc64le", true)
1300 .Case("pwr8", true)
1301 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001302 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1303 .Case("ppc64le", true)
1304 .Case("pwr8", true)
1305 .Case("pwr7", true)
1306 .Default(false);
1307 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1308 .Case("ppc64le", true)
1309 .Case("pwr8", true)
1310 .Case("pwr7", true)
1311 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001312 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1313 .Case("ppc64le", true)
1314 .Case("pwr8", true)
1315 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001316 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1317 .Case("ppc64le", true)
1318 .Case("pwr8", true)
1319 .Case("pwr7", true)
1320 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001321
Eric Christophera8a14c32015-08-31 18:39:16 +00001322 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1323 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001324
Eric Christopher007b0a02015-08-28 22:32:01 +00001325 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001326}
1327
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001328bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001329 return llvm::StringSwitch<bool>(Feature)
1330 .Case("powerpc", true)
1331 .Case("vsx", HasVSX)
1332 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001333 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001334 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001335 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001336 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001337 .Case("bpermd", HasBPERMD)
1338 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001339 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001340}
Chris Lattner17df24e2008-04-21 18:56:49 +00001341
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001342void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1343 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001344 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1345 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1346 // incompatible options.
1347 if (Enabled) {
1348 if (Name == "vsx") {
1349 Features[Name] = true;
1350 } else if (Name == "direct-move") {
1351 Features[Name] = Features["vsx"] = true;
1352 } else if (Name == "power8-vector") {
1353 Features[Name] = Features["vsx"] = true;
1354 } else {
1355 Features[Name] = true;
1356 }
1357 } else {
1358 if (Name == "vsx") {
1359 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1360 false;
1361 } else {
1362 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001363 }
1364 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001365}
1366
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001367const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001368 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1369 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1370 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1371 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1372 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1373 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1374 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1375 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001376 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001377 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001378 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001379 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1380 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1381 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1382 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001383 "vrsave", "vscr",
1384 "spe_acc", "spefscr",
1385 "sfp"
1386};
Chris Lattner10a5b382007-01-29 05:24:35 +00001387
Craig Topperf054e3a2015-10-19 03:52:27 +00001388ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1389 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001390}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001391
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001392const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1393 // While some of these aliases do map to different registers
1394 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001395 { { "0" }, "r0" },
1396 { { "1"}, "r1" },
1397 { { "2" }, "r2" },
1398 { { "3" }, "r3" },
1399 { { "4" }, "r4" },
1400 { { "5" }, "r5" },
1401 { { "6" }, "r6" },
1402 { { "7" }, "r7" },
1403 { { "8" }, "r8" },
1404 { { "9" }, "r9" },
1405 { { "10" }, "r10" },
1406 { { "11" }, "r11" },
1407 { { "12" }, "r12" },
1408 { { "13" }, "r13" },
1409 { { "14" }, "r14" },
1410 { { "15" }, "r15" },
1411 { { "16" }, "r16" },
1412 { { "17" }, "r17" },
1413 { { "18" }, "r18" },
1414 { { "19" }, "r19" },
1415 { { "20" }, "r20" },
1416 { { "21" }, "r21" },
1417 { { "22" }, "r22" },
1418 { { "23" }, "r23" },
1419 { { "24" }, "r24" },
1420 { { "25" }, "r25" },
1421 { { "26" }, "r26" },
1422 { { "27" }, "r27" },
1423 { { "28" }, "r28" },
1424 { { "29" }, "r29" },
1425 { { "30" }, "r30" },
1426 { { "31" }, "r31" },
1427 { { "fr0" }, "f0" },
1428 { { "fr1" }, "f1" },
1429 { { "fr2" }, "f2" },
1430 { { "fr3" }, "f3" },
1431 { { "fr4" }, "f4" },
1432 { { "fr5" }, "f5" },
1433 { { "fr6" }, "f6" },
1434 { { "fr7" }, "f7" },
1435 { { "fr8" }, "f8" },
1436 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001437 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001438 { { "fr11" }, "f11" },
1439 { { "fr12" }, "f12" },
1440 { { "fr13" }, "f13" },
1441 { { "fr14" }, "f14" },
1442 { { "fr15" }, "f15" },
1443 { { "fr16" }, "f16" },
1444 { { "fr17" }, "f17" },
1445 { { "fr18" }, "f18" },
1446 { { "fr19" }, "f19" },
1447 { { "fr20" }, "f20" },
1448 { { "fr21" }, "f21" },
1449 { { "fr22" }, "f22" },
1450 { { "fr23" }, "f23" },
1451 { { "fr24" }, "f24" },
1452 { { "fr25" }, "f25" },
1453 { { "fr26" }, "f26" },
1454 { { "fr27" }, "f27" },
1455 { { "fr28" }, "f28" },
1456 { { "fr29" }, "f29" },
1457 { { "fr30" }, "f30" },
1458 { { "fr31" }, "f31" },
1459 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001460};
1461
Craig Topperf054e3a2015-10-19 03:52:27 +00001462ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1463 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001464}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001465
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001466class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001467public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001468 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001469 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001470
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001471 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001472 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001473 case llvm::Triple::FreeBSD:
1474 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001475 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001476 PtrDiffType = SignedInt;
1477 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001478 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001479 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001480 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001481 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001482
Roman Divacky3ffe7462012-03-13 19:20:17 +00001483 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1484 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001485 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001486 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001487
1488 // PPC32 supports atomics up to 4 bytes.
1489 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001490 }
1491
Craig Topper3164f332014-03-11 03:39:26 +00001492 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001493 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001494 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001495 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001496};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001497
Bill Schmidt778d3872013-07-26 01:36:11 +00001498// Note: ABI differences may eventually require us to have a separate
1499// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001500class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001501public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001502 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001503 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001504 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001505 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001506
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001507 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001508 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001509 ABI = "elfv2";
1510 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001511 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001512 ABI = "elfv1";
1513 }
1514
1515 switch (getTriple().getOS()) {
1516 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001517 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001518 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001519 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001520 case llvm::Triple::NetBSD:
1521 IntMaxType = SignedLongLong;
1522 Int64Type = SignedLongLong;
1523 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001524 default:
1525 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001526 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001527
1528 // PPC64 supports atomics up to 8 bytes.
1529 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001530 }
Craig Topper3164f332014-03-11 03:39:26 +00001531 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001532 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001533 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001534 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001535 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001536 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001537 ABI = Name;
1538 return true;
1539 }
1540 return false;
1541 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001542};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543
Roman Divacky965b0b72011-01-06 08:27:10 +00001544class DarwinPPC32TargetInfo :
1545 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001546public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001547 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1548 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001549 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001550 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001551 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001552 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001553 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001554 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001555 }
Craig Topper3164f332014-03-11 03:39:26 +00001556 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001557 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001558 }
1559};
1560
1561class DarwinPPC64TargetInfo :
1562 public DarwinTargetInfo<PPC64TargetInfo> {
1563public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001564 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1565 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001566 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001567 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001568 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001569 }
1570};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001571
Eric Christopherc48497a2015-09-18 21:26:24 +00001572static const unsigned NVPTXAddrSpaceMap[] = {
1573 1, // opencl_global
1574 3, // opencl_local
1575 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001576 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001577 0, // opencl_generic
1578 1, // cuda_device
1579 4, // cuda_constant
1580 3, // cuda_shared
1581};
1582
1583class NVPTXTargetInfo : public TargetInfo {
1584 static const char *const GCCRegNames[];
1585 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001586
1587 // The GPU profiles supported by the NVPTX backend
1588 enum GPUKind {
1589 GK_NONE,
1590 GK_SM20,
1591 GK_SM21,
1592 GK_SM30,
1593 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001594 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001595 } GPU;
1596
Eric Christopherc48497a2015-09-18 21:26:24 +00001597public:
1598 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1599 BigEndian = false;
1600 TLSSupported = false;
1601 LongWidth = LongAlign = 64;
1602 AddrSpaceMap = &NVPTXAddrSpaceMap;
1603 UseAddrSpaceMapMangling = true;
1604 // Define available target features
1605 // These must be defined in sorted order!
1606 NoAsmVariants = true;
1607 // Set the default GPU to sm20
1608 GPU = GK_SM20;
1609 }
1610 void getTargetDefines(const LangOptions &Opts,
1611 MacroBuilder &Builder) const override {
1612 Builder.defineMacro("__PTX__");
1613 Builder.defineMacro("__NVPTX__");
1614 if (Opts.CUDAIsDevice) {
1615 // Set __CUDA_ARCH__ for the GPU specified.
1616 std::string CUDAArchCode;
1617 switch (GPU) {
1618 case GK_SM20:
1619 CUDAArchCode = "200";
1620 break;
1621 case GK_SM21:
1622 CUDAArchCode = "210";
1623 break;
1624 case GK_SM30:
1625 CUDAArchCode = "300";
1626 break;
1627 case GK_SM35:
1628 CUDAArchCode = "350";
1629 break;
1630 case GK_SM37:
1631 CUDAArchCode = "370";
1632 break;
1633 default:
1634 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001635 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001636 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001637 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001638 }
Craig Topper6c03a542015-10-19 04:51:35 +00001639 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1640 return llvm::makeArrayRef(BuiltinInfo,
1641 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001642 }
1643 bool hasFeature(StringRef Feature) const override {
1644 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 }
1646
Craig Topperf054e3a2015-10-19 03:52:27 +00001647 ArrayRef<const char *> getGCCRegNames() const override;
1648 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001649 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001650 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001651 }
1652 bool validateAsmConstraint(const char *&Name,
1653 TargetInfo::ConstraintInfo &Info) const override {
1654 switch (*Name) {
1655 default:
1656 return false;
1657 case 'c':
1658 case 'h':
1659 case 'r':
1660 case 'l':
1661 case 'f':
1662 case 'd':
1663 Info.setAllowsRegister();
1664 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001665 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001666 }
1667 const char *getClobbers() const override {
1668 // FIXME: Is this really right?
1669 return "";
1670 }
1671 BuiltinVaListKind getBuiltinVaListKind() const override {
1672 // FIXME: implement
1673 return TargetInfo::CharPtrBuiltinVaList;
1674 }
1675 bool setCPU(const std::string &Name) override {
1676 GPU = llvm::StringSwitch<GPUKind>(Name)
1677 .Case("sm_20", GK_SM20)
1678 .Case("sm_21", GK_SM21)
1679 .Case("sm_30", GK_SM30)
1680 .Case("sm_35", GK_SM35)
1681 .Case("sm_37", GK_SM37)
1682 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001683
Eric Christopherc48497a2015-09-18 21:26:24 +00001684 return GPU != GK_NONE;
1685 }
1686};
1687
1688const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1689#define BUILTIN(ID, TYPE, ATTRS) \
1690 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1691#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1692 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1693#include "clang/Basic/BuiltinsNVPTX.def"
1694};
1695
1696const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1697
Craig Topperf054e3a2015-10-19 03:52:27 +00001698ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1699 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001700}
1701
1702class NVPTX32TargetInfo : public NVPTXTargetInfo {
1703public:
1704 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001705 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001706 PointerWidth = PointerAlign = 32;
1707 SizeType = TargetInfo::UnsignedInt;
1708 PtrDiffType = TargetInfo::SignedInt;
1709 IntPtrType = TargetInfo::SignedInt;
1710 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1711 }
1712};
1713
1714class NVPTX64TargetInfo : public NVPTXTargetInfo {
1715public:
1716 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1717 PointerWidth = PointerAlign = 64;
1718 SizeType = TargetInfo::UnsignedLong;
1719 PtrDiffType = TargetInfo::SignedLong;
1720 IntPtrType = TargetInfo::SignedLong;
1721 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1722 }
1723};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001724
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001725static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001726 1, // opencl_global
1727 3, // opencl_local
1728 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001729 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001730 1, // cuda_device
1731 2, // cuda_constant
1732 3 // cuda_shared
1733};
1734
Tom Stellarda96344b2014-08-21 13:58:40 +00001735// If you edit the description strings, make sure you update
1736// getPointerWidthV().
1737
Craig Topper273dbc62015-10-18 05:29:26 +00001738static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001739 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1740 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001741
Craig Topper273dbc62015-10-18 05:29:26 +00001742static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001743 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1744 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001745
Craig Topper273dbc62015-10-18 05:29:26 +00001746static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001747 "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 +00001748 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1749 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001750
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001751class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001752 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001753 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001754
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001755 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001756 enum GPUKind {
1757 GK_NONE,
1758 GK_R600,
1759 GK_R600_DOUBLE_OPS,
1760 GK_R700,
1761 GK_R700_DOUBLE_OPS,
1762 GK_EVERGREEN,
1763 GK_EVERGREEN_DOUBLE_OPS,
1764 GK_NORTHERN_ISLANDS,
1765 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001766 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001767 GK_SEA_ISLANDS,
1768 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001769 } GPU;
1770
Jan Veselyeebeaea2015-05-04 19:53:36 +00001771 bool hasFP64:1;
1772 bool hasFMAF:1;
1773 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001774
Eli Friedmand13b41e2012-10-12 23:32:00 +00001775public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001776 AMDGPUTargetInfo(const llvm::Triple &Triple)
1777 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001778
1779 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001780 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001781 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001782 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001783 hasFMAF = true;
1784 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001785 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001786 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001787 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001788 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001789 hasFMAF = false;
1790 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001791 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001792 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001793 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001794 }
1795
Tom Stellarda96344b2014-08-21 13:58:40 +00001796 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1797 if (GPU <= GK_CAYMAN)
1798 return 32;
1799
1800 switch(AddrSpace) {
1801 default:
1802 return 64;
1803 case 0:
1804 case 3:
1805 case 5:
1806 return 32;
1807 }
1808 }
1809
Craig Topper3164f332014-03-11 03:39:26 +00001810 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001811 return "";
1812 }
1813
Craig Topperf054e3a2015-10-19 03:52:27 +00001814 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001815
Craig Topperf054e3a2015-10-19 03:52:27 +00001816 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1817 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001818 }
1819
Craig Topper3164f332014-03-11 03:39:26 +00001820 bool validateAsmConstraint(const char *&Name,
1821 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001822 return true;
1823 }
1824
Craig Topper6c03a542015-10-19 04:51:35 +00001825 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1826 return llvm::makeArrayRef(BuiltinInfo,
1827 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001828 }
1829
Craig Topper3164f332014-03-11 03:39:26 +00001830 void getTargetDefines(const LangOptions &Opts,
1831 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001832 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001833 if (hasFMAF)
1834 Builder.defineMacro("__HAS_FMAF__");
1835 if (hasLDEXPF)
1836 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001837 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001838 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001839 if (Opts.OpenCL) {
1840 if (GPU >= GK_NORTHERN_ISLANDS) {
1841 Builder.defineMacro("cl_khr_byte_addressable_store");
1842 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1843 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1844 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1845 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1846 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001847 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001848 }
1849
Craig Topper3164f332014-03-11 03:39:26 +00001850 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001851 return TargetInfo::CharPtrBuiltinVaList;
1852 }
1853
Craig Topper3164f332014-03-11 03:39:26 +00001854 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001855 GPU = llvm::StringSwitch<GPUKind>(Name)
1856 .Case("r600" , GK_R600)
1857 .Case("rv610", GK_R600)
1858 .Case("rv620", GK_R600)
1859 .Case("rv630", GK_R600)
1860 .Case("rv635", GK_R600)
1861 .Case("rs780", GK_R600)
1862 .Case("rs880", GK_R600)
1863 .Case("rv670", GK_R600_DOUBLE_OPS)
1864 .Case("rv710", GK_R700)
1865 .Case("rv730", GK_R700)
1866 .Case("rv740", GK_R700_DOUBLE_OPS)
1867 .Case("rv770", GK_R700_DOUBLE_OPS)
1868 .Case("palm", GK_EVERGREEN)
1869 .Case("cedar", GK_EVERGREEN)
1870 .Case("sumo", GK_EVERGREEN)
1871 .Case("sumo2", GK_EVERGREEN)
1872 .Case("redwood", GK_EVERGREEN)
1873 .Case("juniper", GK_EVERGREEN)
1874 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1875 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1876 .Case("barts", GK_NORTHERN_ISLANDS)
1877 .Case("turks", GK_NORTHERN_ISLANDS)
1878 .Case("caicos", GK_NORTHERN_ISLANDS)
1879 .Case("cayman", GK_CAYMAN)
1880 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001881 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001882 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1883 .Case("verde", GK_SOUTHERN_ISLANDS)
1884 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001885 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001886 .Case("bonaire", GK_SEA_ISLANDS)
1887 .Case("kabini", GK_SEA_ISLANDS)
1888 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001889 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001890 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001891 .Case("tonga", GK_VOLCANIC_ISLANDS)
1892 .Case("iceland", GK_VOLCANIC_ISLANDS)
1893 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001894 .Default(GK_NONE);
1895
1896 if (GPU == GK_NONE) {
1897 return false;
1898 }
1899
1900 // Set the correct data layout
1901 switch (GPU) {
1902 case GK_NONE:
1903 case GK_R600:
1904 case GK_R700:
1905 case GK_EVERGREEN:
1906 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001907 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001908 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001909 hasFMAF = false;
1910 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001911 break;
1912 case GK_R600_DOUBLE_OPS:
1913 case GK_R700_DOUBLE_OPS:
1914 case GK_EVERGREEN_DOUBLE_OPS:
1915 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001916 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001917 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001918 hasFMAF = true;
1919 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001920 break;
1921 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001922 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001923 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001924 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001925 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001926 hasFMAF = true;
1927 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001928 break;
1929 }
1930
1931 return true;
1932 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001933};
1934
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001935const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001936#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001937 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001938#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001939};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001940const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001941 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1942 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1943 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1944 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1945 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1946 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1947 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1948 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1949 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1950 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1951 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1952 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1953 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1954 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1955 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1956 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1957 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1958 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1959 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1960 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1961 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1962 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1963 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1964 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1965 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1966 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1967 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1968 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1969 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1970 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1971 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1972 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1973 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1974 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1975 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1976 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1977 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1978 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1979 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1980 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1981 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1982 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1983 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1984 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1985 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1986 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1987 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1988 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1989 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1990 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1991};
1992
Craig Topperf054e3a2015-10-19 03:52:27 +00001993ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
1994 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00001995}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001996
Eli Friedman3fd920a2008-08-20 02:34:37 +00001997// Namespace for x86 abstract base class
1998const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001999#define BUILTIN(ID, TYPE, ATTRS) \
2000 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002001#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002002 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002003#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002004 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002005#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002006};
Eli Friedmanb5366062008-05-20 14:21:01 +00002007
Nuno Lopescfca1f02009-12-23 17:49:57 +00002008static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002009 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2010 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002011 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002012 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2013 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2014 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002015 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002016 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2017 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002018};
2019
Eric Christophercdd36352011-06-21 00:05:20 +00002020const TargetInfo::AddlRegName AddlRegNames[] = {
2021 { { "al", "ah", "eax", "rax" }, 0 },
2022 { { "bl", "bh", "ebx", "rbx" }, 3 },
2023 { { "cl", "ch", "ecx", "rcx" }, 2 },
2024 { { "dl", "dh", "edx", "rdx" }, 1 },
2025 { { "esi", "rsi" }, 4 },
2026 { { "edi", "rdi" }, 5 },
2027 { { "esp", "rsp" }, 7 },
2028 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002029 { { "r8d", "r8w", "r8b" }, 38 },
2030 { { "r9d", "r9w", "r9b" }, 39 },
2031 { { "r10d", "r10w", "r10b" }, 40 },
2032 { { "r11d", "r11w", "r11b" }, 41 },
2033 { { "r12d", "r12w", "r12b" }, 42 },
2034 { { "r13d", "r13w", "r13b" }, 43 },
2035 { { "r14d", "r14w", "r14b" }, 44 },
2036 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002037};
2038
2039// X86 target abstract base class; x86-32 and x86-64 are very close, so
2040// most of the implementation can be shared.
2041class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002042 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002043 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002044 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002045 enum MMX3DNowEnum {
2046 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002047 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002048 enum XOPEnum {
2049 NoXOP,
2050 SSE4A,
2051 FMA4,
2052 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002053 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002054
Craig Topper543f3bd2015-10-14 23:47:57 +00002055 bool HasAES = false;
2056 bool HasPCLMUL = false;
2057 bool HasLZCNT = false;
2058 bool HasRDRND = false;
2059 bool HasFSGSBASE = false;
2060 bool HasBMI = false;
2061 bool HasBMI2 = false;
2062 bool HasPOPCNT = false;
2063 bool HasRTM = false;
2064 bool HasPRFCHW = false;
2065 bool HasRDSEED = false;
2066 bool HasADX = false;
2067 bool HasTBM = false;
2068 bool HasFMA = false;
2069 bool HasF16C = false;
2070 bool HasAVX512CD = false;
2071 bool HasAVX512ER = false;
2072 bool HasAVX512PF = false;
2073 bool HasAVX512DQ = false;
2074 bool HasAVX512BW = false;
2075 bool HasAVX512VL = false;
2076 bool HasSHA = false;
2077 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002078 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002079 bool HasXSAVE = false;
2080 bool HasXSAVEOPT = false;
2081 bool HasXSAVEC = false;
2082 bool HasXSAVES = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002083
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002084 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2085 ///
2086 /// Each enumeration represents a particular CPU supported by Clang. These
2087 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2088 enum CPUKind {
2089 CK_Generic,
2090
2091 /// \name i386
2092 /// i386-generation processors.
2093 //@{
2094 CK_i386,
2095 //@}
2096
2097 /// \name i486
2098 /// i486-generation processors.
2099 //@{
2100 CK_i486,
2101 CK_WinChipC6,
2102 CK_WinChip2,
2103 CK_C3,
2104 //@}
2105
2106 /// \name i586
2107 /// i586-generation processors, P5 microarchitecture based.
2108 //@{
2109 CK_i586,
2110 CK_Pentium,
2111 CK_PentiumMMX,
2112 //@}
2113
2114 /// \name i686
2115 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2116 //@{
2117 CK_i686,
2118 CK_PentiumPro,
2119 CK_Pentium2,
2120 CK_Pentium3,
2121 CK_Pentium3M,
2122 CK_PentiumM,
2123 CK_C3_2,
2124
2125 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2126 /// Clang however has some logic to suport this.
2127 // FIXME: Warn, deprecate, and potentially remove this.
2128 CK_Yonah,
2129 //@}
2130
2131 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002132 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002133 //@{
2134 CK_Pentium4,
2135 CK_Pentium4M,
2136 CK_Prescott,
2137 CK_Nocona,
2138 //@}
2139
2140 /// \name Core
2141 /// Core microarchitecture based processors.
2142 //@{
2143 CK_Core2,
2144
2145 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2146 /// codename which GCC no longer accepts as an option to -march, but Clang
2147 /// has some logic for recognizing it.
2148 // FIXME: Warn, deprecate, and potentially remove this.
2149 CK_Penryn,
2150 //@}
2151
2152 /// \name Atom
2153 /// Atom processors
2154 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002155 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002156 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002157 //@}
2158
2159 /// \name Nehalem
2160 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002161 CK_Nehalem,
2162
2163 /// \name Westmere
2164 /// Westmere microarchitecture based processors.
2165 CK_Westmere,
2166
2167 /// \name Sandy Bridge
2168 /// Sandy Bridge microarchitecture based processors.
2169 CK_SandyBridge,
2170
2171 /// \name Ivy Bridge
2172 /// Ivy Bridge microarchitecture based processors.
2173 CK_IvyBridge,
2174
2175 /// \name Haswell
2176 /// Haswell microarchitecture based processors.
2177 CK_Haswell,
2178
2179 /// \name Broadwell
2180 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002181 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002182
2183 /// \name Skylake
2184 /// Skylake microarchitecture based processors.
2185 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002186
Craig Topper449314e2013-08-20 07:09:39 +00002187 /// \name Knights Landing
2188 /// Knights Landing processor.
2189 CK_KNL,
2190
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002191 /// \name K6
2192 /// K6 architecture processors.
2193 //@{
2194 CK_K6,
2195 CK_K6_2,
2196 CK_K6_3,
2197 //@}
2198
2199 /// \name K7
2200 /// K7 architecture processors.
2201 //@{
2202 CK_Athlon,
2203 CK_AthlonThunderbird,
2204 CK_Athlon4,
2205 CK_AthlonXP,
2206 CK_AthlonMP,
2207 //@}
2208
2209 /// \name K8
2210 /// K8 architecture processors.
2211 //@{
2212 CK_Athlon64,
2213 CK_Athlon64SSE3,
2214 CK_AthlonFX,
2215 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002216 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002217 CK_Opteron,
2218 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002219 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002220 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002221
Benjamin Kramer569f2152012-01-10 11:50:18 +00002222 /// \name Bobcat
2223 /// Bobcat architecture processors.
2224 //@{
2225 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002226 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002227 //@}
2228
2229 /// \name Bulldozer
2230 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002231 //@{
2232 CK_BDVER1,
2233 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002234 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002235 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002236 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002237
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002238 /// This specification is deprecated and will be removed in the future.
2239 /// Users should prefer \see CK_K8.
2240 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002241 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002242 CK_x86_64,
2243 //@}
2244
2245 /// \name Geode
2246 /// Geode processors.
2247 //@{
2248 CK_Geode
2249 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002250 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002251
Eric Christopherc50738f2015-08-27 00:05:50 +00002252 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002253 return llvm::StringSwitch<CPUKind>(CPU)
2254 .Case("i386", CK_i386)
2255 .Case("i486", CK_i486)
2256 .Case("winchip-c6", CK_WinChipC6)
2257 .Case("winchip2", CK_WinChip2)
2258 .Case("c3", CK_C3)
2259 .Case("i586", CK_i586)
2260 .Case("pentium", CK_Pentium)
2261 .Case("pentium-mmx", CK_PentiumMMX)
2262 .Case("i686", CK_i686)
2263 .Case("pentiumpro", CK_PentiumPro)
2264 .Case("pentium2", CK_Pentium2)
2265 .Case("pentium3", CK_Pentium3)
2266 .Case("pentium3m", CK_Pentium3M)
2267 .Case("pentium-m", CK_PentiumM)
2268 .Case("c3-2", CK_C3_2)
2269 .Case("yonah", CK_Yonah)
2270 .Case("pentium4", CK_Pentium4)
2271 .Case("pentium4m", CK_Pentium4M)
2272 .Case("prescott", CK_Prescott)
2273 .Case("nocona", CK_Nocona)
2274 .Case("core2", CK_Core2)
2275 .Case("penryn", CK_Penryn)
2276 .Case("bonnell", CK_Bonnell)
2277 .Case("atom", CK_Bonnell) // Legacy name.
2278 .Case("silvermont", CK_Silvermont)
2279 .Case("slm", CK_Silvermont) // Legacy name.
2280 .Case("nehalem", CK_Nehalem)
2281 .Case("corei7", CK_Nehalem) // Legacy name.
2282 .Case("westmere", CK_Westmere)
2283 .Case("sandybridge", CK_SandyBridge)
2284 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2285 .Case("ivybridge", CK_IvyBridge)
2286 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2287 .Case("haswell", CK_Haswell)
2288 .Case("core-avx2", CK_Haswell) // Legacy name.
2289 .Case("broadwell", CK_Broadwell)
2290 .Case("skylake", CK_Skylake)
2291 .Case("skx", CK_Skylake) // Legacy name.
2292 .Case("knl", CK_KNL)
2293 .Case("k6", CK_K6)
2294 .Case("k6-2", CK_K6_2)
2295 .Case("k6-3", CK_K6_3)
2296 .Case("athlon", CK_Athlon)
2297 .Case("athlon-tbird", CK_AthlonThunderbird)
2298 .Case("athlon-4", CK_Athlon4)
2299 .Case("athlon-xp", CK_AthlonXP)
2300 .Case("athlon-mp", CK_AthlonMP)
2301 .Case("athlon64", CK_Athlon64)
2302 .Case("athlon64-sse3", CK_Athlon64SSE3)
2303 .Case("athlon-fx", CK_AthlonFX)
2304 .Case("k8", CK_K8)
2305 .Case("k8-sse3", CK_K8SSE3)
2306 .Case("opteron", CK_Opteron)
2307 .Case("opteron-sse3", CK_OpteronSSE3)
2308 .Case("barcelona", CK_AMDFAM10)
2309 .Case("amdfam10", CK_AMDFAM10)
2310 .Case("btver1", CK_BTVER1)
2311 .Case("btver2", CK_BTVER2)
2312 .Case("bdver1", CK_BDVER1)
2313 .Case("bdver2", CK_BDVER2)
2314 .Case("bdver3", CK_BDVER3)
2315 .Case("bdver4", CK_BDVER4)
2316 .Case("x86-64", CK_x86_64)
2317 .Case("geode", CK_Geode)
2318 .Default(CK_Generic);
2319 }
2320
Rafael Espindolaeb265472013-08-21 21:59:03 +00002321 enum FPMathKind {
2322 FP_Default,
2323 FP_SSE,
2324 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002325 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002326
Eli Friedman3fd920a2008-08-20 02:34:37 +00002327public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002328 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002329 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002330 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002331 }
Craig Topper3164f332014-03-11 03:39:26 +00002332 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002333 // X87 evaluates with 80 bits "long double" precision.
2334 return SSELevel == NoSSE ? 2 : 0;
2335 }
Craig Topper6c03a542015-10-19 04:51:35 +00002336 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2337 return llvm::makeArrayRef(BuiltinInfo,
2338 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002339 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002340 ArrayRef<const char *> getGCCRegNames() const override {
2341 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002342 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002343 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2344 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002345 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002346 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2347 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002348 }
Eric Christopherd9832702015-06-29 21:00:05 +00002349 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002350 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002351 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002352
Akira Hatanaka974131e2014-09-18 18:17:18 +00002353 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2354
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002355 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2356
Akira Hatanaka974131e2014-09-18 18:17:18 +00002357 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2358
Craig Topper3164f332014-03-11 03:39:26 +00002359 std::string convertConstraint(const char *&Constraint) const override;
2360 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002361 return "~{dirflag},~{fpsr},~{flags}";
2362 }
Craig Topper3164f332014-03-11 03:39:26 +00002363 void getTargetDefines(const LangOptions &Opts,
2364 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002365 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2366 bool Enabled);
2367 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2368 bool Enabled);
2369 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2370 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002371 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2372 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002373 setFeatureEnabledImpl(Features, Name, Enabled);
2374 }
2375 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002376 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002377 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2378 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002379 bool
2380 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2381 StringRef CPU,
2382 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002383 bool hasFeature(StringRef Feature) const override;
2384 bool handleTargetFeatures(std::vector<std::string> &Features,
2385 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002386 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002387 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2388 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002389 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002390 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002391 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002392 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002393 return "no-mmx";
2394 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002395 }
Craig Topper3164f332014-03-11 03:39:26 +00002396 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002397 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002398
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002399 // Perform any per-CPU checks necessary to determine if this CPU is
2400 // acceptable.
2401 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2402 // invalid without explaining *why*.
2403 switch (CPU) {
2404 case CK_Generic:
2405 // No processor selected!
2406 return false;
2407
2408 case CK_i386:
2409 case CK_i486:
2410 case CK_WinChipC6:
2411 case CK_WinChip2:
2412 case CK_C3:
2413 case CK_i586:
2414 case CK_Pentium:
2415 case CK_PentiumMMX:
2416 case CK_i686:
2417 case CK_PentiumPro:
2418 case CK_Pentium2:
2419 case CK_Pentium3:
2420 case CK_Pentium3M:
2421 case CK_PentiumM:
2422 case CK_Yonah:
2423 case CK_C3_2:
2424 case CK_Pentium4:
2425 case CK_Pentium4M:
2426 case CK_Prescott:
2427 case CK_K6:
2428 case CK_K6_2:
2429 case CK_K6_3:
2430 case CK_Athlon:
2431 case CK_AthlonThunderbird:
2432 case CK_Athlon4:
2433 case CK_AthlonXP:
2434 case CK_AthlonMP:
2435 case CK_Geode:
2436 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002437 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002438 return false;
2439
2440 // Fallthrough
2441 case CK_Nocona:
2442 case CK_Core2:
2443 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002444 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002445 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002446 case CK_Nehalem:
2447 case CK_Westmere:
2448 case CK_SandyBridge:
2449 case CK_IvyBridge:
2450 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002451 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002452 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002453 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002454 case CK_Athlon64:
2455 case CK_Athlon64SSE3:
2456 case CK_AthlonFX:
2457 case CK_K8:
2458 case CK_K8SSE3:
2459 case CK_Opteron:
2460 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002461 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002462 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002463 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002464 case CK_BDVER1:
2465 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002466 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002467 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002468 case CK_x86_64:
2469 return true;
2470 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002471 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002472 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002473
Craig Topper3164f332014-03-11 03:39:26 +00002474 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002475
Craig Topper3164f332014-03-11 03:39:26 +00002476 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002477 // We accept all non-ARM calling conventions
2478 return (CC == CC_X86ThisCall ||
2479 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002480 CC == CC_X86StdCall ||
2481 CC == CC_X86VectorCall ||
2482 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002483 CC == CC_X86Pascal ||
2484 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002485 }
2486
Craig Topper3164f332014-03-11 03:39:26 +00002487 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002488 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002489 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002490
2491 bool hasSjLjLowering() const override {
2492 return true;
2493 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002494};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002495
Rafael Espindolaeb265472013-08-21 21:59:03 +00002496bool X86TargetInfo::setFPMath(StringRef Name) {
2497 if (Name == "387") {
2498 FPMath = FP_387;
2499 return true;
2500 }
2501 if (Name == "sse") {
2502 FPMath = FP_SSE;
2503 return true;
2504 }
2505 return false;
2506}
2507
Eric Christopher007b0a02015-08-28 22:32:01 +00002508bool X86TargetInfo::initFeatureMap(
2509 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002510 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002511 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002512 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002513 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002514 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002515
Eric Christopher2b4a7252015-08-27 00:05:52 +00002516 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002517 case CK_Generic:
2518 case CK_i386:
2519 case CK_i486:
2520 case CK_i586:
2521 case CK_Pentium:
2522 case CK_i686:
2523 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002524 break;
2525 case CK_PentiumMMX:
2526 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002527 case CK_K6:
2528 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002529 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002530 break;
2531 case CK_Pentium3:
2532 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002533 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002534 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002535 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002536 break;
2537 case CK_PentiumM:
2538 case CK_Pentium4:
2539 case CK_Pentium4M:
2540 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002541 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002542 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002543 break;
2544 case CK_Yonah:
2545 case CK_Prescott:
2546 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002547 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002548 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002549 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002550 break;
2551 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002552 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002553 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002554 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002555 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002556 break;
2557 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002558 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002559 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002560 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002561 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002562 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002563 setFeatureEnabledImpl(Features, "avx512f", true);
2564 setFeatureEnabledImpl(Features, "avx512cd", true);
2565 setFeatureEnabledImpl(Features, "avx512dq", true);
2566 setFeatureEnabledImpl(Features, "avx512bw", true);
2567 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002568 setFeatureEnabledImpl(Features, "xsavec", true);
2569 setFeatureEnabledImpl(Features, "xsaves", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002570 // FALLTHROUGH
2571 case CK_Broadwell:
2572 setFeatureEnabledImpl(Features, "rdseed", true);
2573 setFeatureEnabledImpl(Features, "adx", true);
2574 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002575 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002576 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002577 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002578 setFeatureEnabledImpl(Features, "bmi", true);
2579 setFeatureEnabledImpl(Features, "bmi2", true);
2580 setFeatureEnabledImpl(Features, "rtm", true);
2581 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002582 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002583 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002584 setFeatureEnabledImpl(Features, "rdrnd", true);
2585 setFeatureEnabledImpl(Features, "f16c", true);
2586 setFeatureEnabledImpl(Features, "fsgsbase", true);
2587 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002588 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002589 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002590 setFeatureEnabledImpl(Features, "xsave", true);
2591 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002592 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002593 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002594 case CK_Silvermont:
2595 setFeatureEnabledImpl(Features, "aes", true);
2596 setFeatureEnabledImpl(Features, "pclmul", true);
2597 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002598 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002599 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002600 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002601 setFeatureEnabledImpl(Features, "cx16", true);
2602 break;
2603 case CK_KNL:
2604 setFeatureEnabledImpl(Features, "avx512f", true);
2605 setFeatureEnabledImpl(Features, "avx512cd", true);
2606 setFeatureEnabledImpl(Features, "avx512er", true);
2607 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002608 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002609 setFeatureEnabledImpl(Features, "rdseed", true);
2610 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002611 setFeatureEnabledImpl(Features, "lzcnt", true);
2612 setFeatureEnabledImpl(Features, "bmi", true);
2613 setFeatureEnabledImpl(Features, "bmi2", true);
2614 setFeatureEnabledImpl(Features, "rtm", true);
2615 setFeatureEnabledImpl(Features, "fma", true);
2616 setFeatureEnabledImpl(Features, "rdrnd", true);
2617 setFeatureEnabledImpl(Features, "f16c", true);
2618 setFeatureEnabledImpl(Features, "fsgsbase", true);
2619 setFeatureEnabledImpl(Features, "aes", true);
2620 setFeatureEnabledImpl(Features, "pclmul", true);
2621 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002622 setFeatureEnabledImpl(Features, "xsaveopt", true);
2623 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 break;
2625 case CK_K6_2:
2626 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002627 case CK_WinChip2:
2628 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002629 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002630 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002631 case CK_Athlon:
2632 case CK_AthlonThunderbird:
2633 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002634 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002635 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002636 case CK_Athlon4:
2637 case CK_AthlonXP:
2638 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002639 setFeatureEnabledImpl(Features, "sse", true);
2640 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002641 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
2643 case CK_K8:
2644 case CK_Opteron:
2645 case CK_Athlon64:
2646 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002647 setFeatureEnabledImpl(Features, "sse2", true);
2648 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002649 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002650 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002651 case CK_AMDFAM10:
2652 setFeatureEnabledImpl(Features, "sse4a", true);
2653 setFeatureEnabledImpl(Features, "lzcnt", true);
2654 setFeatureEnabledImpl(Features, "popcnt", true);
2655 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002656 case CK_K8SSE3:
2657 case CK_OpteronSSE3:
2658 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002659 setFeatureEnabledImpl(Features, "sse3", true);
2660 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002661 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002662 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002663 case CK_BTVER2:
2664 setFeatureEnabledImpl(Features, "avx", true);
2665 setFeatureEnabledImpl(Features, "aes", true);
2666 setFeatureEnabledImpl(Features, "pclmul", true);
2667 setFeatureEnabledImpl(Features, "bmi", true);
2668 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002669 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002670 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002671 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002672 setFeatureEnabledImpl(Features, "ssse3", true);
2673 setFeatureEnabledImpl(Features, "sse4a", true);
2674 setFeatureEnabledImpl(Features, "lzcnt", true);
2675 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002676 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002677 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002678 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002679 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002680 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002681 case CK_BDVER4:
2682 setFeatureEnabledImpl(Features, "avx2", true);
2683 setFeatureEnabledImpl(Features, "bmi2", true);
2684 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002685 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002686 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002687 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002688 // FALLTHROUGH
2689 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002690 setFeatureEnabledImpl(Features, "bmi", true);
2691 setFeatureEnabledImpl(Features, "fma", true);
2692 setFeatureEnabledImpl(Features, "f16c", true);
2693 setFeatureEnabledImpl(Features, "tbm", true);
2694 // FALLTHROUGH
2695 case CK_BDVER1:
2696 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002697 setFeatureEnabledImpl(Features, "xop", true);
2698 setFeatureEnabledImpl(Features, "lzcnt", true);
2699 setFeatureEnabledImpl(Features, "aes", true);
2700 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002701 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002702 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002703 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002704 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002705 break;
Eli Friedman33465822011-07-08 23:31:17 +00002706 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002707 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2708 return false;
2709
2710 // Can't do this earlier because we need to be able to explicitly enable
2711 // or disable these features and the things that they depend upon.
2712
2713 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2714 auto I = Features.find("sse4.2");
2715 if (I != Features.end() && I->getValue() == true &&
2716 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2717 FeaturesVec.end())
2718 Features["popcnt"] = true;
2719
2720 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2721 I = Features.find("3dnow");
2722 if (I != Features.end() && I->getValue() == true &&
2723 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2724 FeaturesVec.end())
2725 Features["prfchw"] = true;
2726
Eric Christophera7260af2015-10-08 20:10:18 +00002727 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2728 // then enable MMX.
2729 I = Features.find("sse");
2730 if (I != Features.end() && I->getValue() == true &&
2731 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2732 FeaturesVec.end())
2733 Features["mmx"] = true;
2734
Eric Christopherbbd746d2015-10-08 20:10:14 +00002735 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002736}
2737
Rafael Espindolae62e2792013-08-20 13:44:29 +00002738void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002739 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002740 if (Enabled) {
2741 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002742 case AVX512F:
2743 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002744 case AVX2:
2745 Features["avx2"] = true;
2746 case AVX:
2747 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002748 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002749 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002750 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002751 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002752 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002753 case SSSE3:
2754 Features["ssse3"] = true;
2755 case SSE3:
2756 Features["sse3"] = true;
2757 case SSE2:
2758 Features["sse2"] = true;
2759 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002760 Features["sse"] = true;
2761 case NoSSE:
2762 break;
2763 }
2764 return;
2765 }
2766
2767 switch (Level) {
2768 case NoSSE:
2769 case SSE1:
2770 Features["sse"] = false;
2771 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002772 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2773 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002774 case SSE3:
2775 Features["sse3"] = false;
2776 setXOPLevel(Features, NoXOP, false);
2777 case SSSE3:
2778 Features["ssse3"] = false;
2779 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002780 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002781 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002782 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002783 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002784 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2785 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002786 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002787 case AVX2:
2788 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002789 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002790 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002791 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2792 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002793 }
2794}
2795
2796void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002797 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002798 if (Enabled) {
2799 switch (Level) {
2800 case AMD3DNowAthlon:
2801 Features["3dnowa"] = true;
2802 case AMD3DNow:
2803 Features["3dnow"] = true;
2804 case MMX:
2805 Features["mmx"] = true;
2806 case NoMMX3DNow:
2807 break;
2808 }
2809 return;
2810 }
2811
2812 switch (Level) {
2813 case NoMMX3DNow:
2814 case MMX:
2815 Features["mmx"] = false;
2816 case AMD3DNow:
2817 Features["3dnow"] = false;
2818 case AMD3DNowAthlon:
2819 Features["3dnowa"] = false;
2820 }
2821}
2822
2823void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002824 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002825 if (Enabled) {
2826 switch (Level) {
2827 case XOP:
2828 Features["xop"] = true;
2829 case FMA4:
2830 Features["fma4"] = true;
2831 setSSELevel(Features, AVX, true);
2832 case SSE4A:
2833 Features["sse4a"] = true;
2834 setSSELevel(Features, SSE3, true);
2835 case NoXOP:
2836 break;
2837 }
2838 return;
2839 }
2840
2841 switch (Level) {
2842 case NoXOP:
2843 case SSE4A:
2844 Features["sse4a"] = false;
2845 case FMA4:
2846 Features["fma4"] = false;
2847 case XOP:
2848 Features["xop"] = false;
2849 }
2850}
2851
Craig Topper86d79ef2013-09-17 04:51:29 +00002852void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2853 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002854 // This is a bit of a hack to deal with the sse4 target feature when used
2855 // as part of the target attribute. We handle sse4 correctly everywhere
2856 // else. See below for more information on how we handle the sse4 options.
2857 if (Name != "sse4")
2858 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002859
Craig Topper29561122013-09-19 01:13:07 +00002860 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002861 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002862 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002863 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002864 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002865 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002866 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002867 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002868 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002870 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002871 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002872 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002873 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002874 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002875 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002876 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002877 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002878 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002879 if (Enabled)
2880 setSSELevel(Features, SSE2, Enabled);
2881 } else if (Name == "pclmul") {
2882 if (Enabled)
2883 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002884 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002885 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002886 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002888 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002889 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002890 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2891 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002892 if (Enabled)
2893 setSSELevel(Features, AVX512F, Enabled);
2894 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002895 if (Enabled)
2896 setSSELevel(Features, AVX, Enabled);
2897 } else if (Name == "fma4") {
2898 setXOPLevel(Features, FMA4, Enabled);
2899 } else if (Name == "xop") {
2900 setXOPLevel(Features, XOP, Enabled);
2901 } else if (Name == "sse4a") {
2902 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002903 } else if (Name == "f16c") {
2904 if (Enabled)
2905 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002906 } else if (Name == "sha") {
2907 if (Enabled)
2908 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002909 } else if (Name == "sse4") {
2910 // We can get here via the __target__ attribute since that's not controlled
2911 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2912 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2913 // disabled.
2914 if (Enabled)
2915 setSSELevel(Features, SSE42, Enabled);
2916 else
2917 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002918 } else if (Name == "xsave") {
2919 if (Enabled)
2920 setSSELevel(Features, AVX, Enabled);
2921 else
2922 Features["xsaveopt"] = false;
2923 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2924 if (Enabled) {
2925 Features["xsave"] = true;
2926 setSSELevel(Features, AVX, Enabled);
2927 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002928 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002929}
2930
Eric Christopher3ff21b32013-10-16 21:26:26 +00002931/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002932/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002933bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002934 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002935 for (const auto &Feature : Features) {
2936 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002937 continue;
2938
Eric Christopher610fe112015-08-26 08:21:55 +00002939 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002940 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002941 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002942 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002943 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002944 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002945 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002946 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002947 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002948 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002949 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002950 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002951 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002952 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002953 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002954 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002955 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002956 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002957 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002958 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002959 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002960 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002961 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002962 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002963 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002964 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002965 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002966 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002967 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002968 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002969 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002970 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002971 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002972 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002973 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002974 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002975 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002976 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002977 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002978 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002979 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002980 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002981 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002982 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002983 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002984 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00002985 } else if (Feature == "+fxsr") {
2986 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002987 } else if (Feature == "+xsave") {
2988 HasXSAVE = true;
2989 } else if (Feature == "+xsaveopt") {
2990 HasXSAVEOPT = true;
2991 } else if (Feature == "+xsavec") {
2992 HasXSAVEC = true;
2993 } else if (Feature == "+xsaves") {
2994 HasXSAVES = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002995 }
2996
Benjamin Kramer27402c62012-03-05 15:10:44 +00002997 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002998 .Case("+avx512f", AVX512F)
2999 .Case("+avx2", AVX2)
3000 .Case("+avx", AVX)
3001 .Case("+sse4.2", SSE42)
3002 .Case("+sse4.1", SSE41)
3003 .Case("+ssse3", SSSE3)
3004 .Case("+sse3", SSE3)
3005 .Case("+sse2", SSE2)
3006 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003007 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003008 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003009
Eli Friedman33465822011-07-08 23:31:17 +00003010 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003011 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003012 .Case("+3dnowa", AMD3DNowAthlon)
3013 .Case("+3dnow", AMD3DNow)
3014 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003015 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003016 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003017
3018 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003019 .Case("+xop", XOP)
3020 .Case("+fma4", FMA4)
3021 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003022 .Default(NoXOP);
3023 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003024 }
Eli Friedman33465822011-07-08 23:31:17 +00003025
Rafael Espindolaeb265472013-08-21 21:59:03 +00003026 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3027 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003028 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3029 (FPMath == FP_387 && SSELevel >= SSE1)) {
3030 Diags.Report(diag::err_target_unsupported_fpmath) <<
3031 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003032 return false;
3033 }
3034
Alexey Bataev00396512015-07-02 03:40:19 +00003035 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003036 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003037 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003038}
Chris Lattnerecd49032009-03-02 22:27:17 +00003039
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003040/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3041/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003042void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003043 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003044 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003045 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003046 Builder.defineMacro("__amd64__");
3047 Builder.defineMacro("__amd64");
3048 Builder.defineMacro("__x86_64");
3049 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003050 if (getTriple().getArchName() == "x86_64h") {
3051 Builder.defineMacro("__x86_64h");
3052 Builder.defineMacro("__x86_64h__");
3053 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003054 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003055 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003056 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003057
Chris Lattnerecd49032009-03-02 22:27:17 +00003058 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003059 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3060 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003061 switch (CPU) {
3062 case CK_Generic:
3063 break;
3064 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003065 // The rest are coming from the i386 define above.
3066 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003067 break;
3068 case CK_i486:
3069 case CK_WinChipC6:
3070 case CK_WinChip2:
3071 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003072 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003073 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003074 case CK_PentiumMMX:
3075 Builder.defineMacro("__pentium_mmx__");
3076 Builder.defineMacro("__tune_pentium_mmx__");
3077 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003078 case CK_i586:
3079 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003080 defineCPUMacros(Builder, "i586");
3081 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003082 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003083 case CK_Pentium3:
3084 case CK_Pentium3M:
3085 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003086 Builder.defineMacro("__tune_pentium3__");
3087 // Fallthrough
3088 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003089 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003090 Builder.defineMacro("__tune_pentium2__");
3091 // Fallthrough
3092 case CK_PentiumPro:
3093 Builder.defineMacro("__tune_i686__");
3094 Builder.defineMacro("__tune_pentiumpro__");
3095 // Fallthrough
3096 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003097 Builder.defineMacro("__i686");
3098 Builder.defineMacro("__i686__");
3099 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3100 Builder.defineMacro("__pentiumpro");
3101 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003102 break;
3103 case CK_Pentium4:
3104 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003105 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003106 break;
3107 case CK_Yonah:
3108 case CK_Prescott:
3109 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003110 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003111 break;
3112 case CK_Core2:
3113 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003114 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003115 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003116 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003117 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003118 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003119 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003120 defineCPUMacros(Builder, "slm");
3121 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003122 case CK_Nehalem:
3123 case CK_Westmere:
3124 case CK_SandyBridge:
3125 case CK_IvyBridge:
3126 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003127 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003128 // FIXME: Historically, we defined this legacy name, it would be nice to
3129 // remove it at some point. We've never exposed fine-grained names for
3130 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003131 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003132 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003133 case CK_Skylake:
3134 // FIXME: Historically, we defined this legacy name, it would be nice to
3135 // remove it at some point. This is the only fine-grained CPU macro in the
3136 // main intel CPU line, and it would be better to not have these and force
3137 // people to use ISA macros.
3138 defineCPUMacros(Builder, "skx");
3139 break;
Craig Topper449314e2013-08-20 07:09:39 +00003140 case CK_KNL:
3141 defineCPUMacros(Builder, "knl");
3142 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003143 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003144 Builder.defineMacro("__k6_2__");
3145 Builder.defineMacro("__tune_k6_2__");
3146 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003147 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003148 if (CPU != CK_K6_2) { // In case of fallthrough
3149 // FIXME: GCC may be enabling these in cases where some other k6
3150 // architecture is specified but -m3dnow is explicitly provided. The
3151 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003152 Builder.defineMacro("__k6_3__");
3153 Builder.defineMacro("__tune_k6_3__");
3154 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003155 // Fallthrough
3156 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003157 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003158 break;
3159 case CK_Athlon:
3160 case CK_AthlonThunderbird:
3161 case CK_Athlon4:
3162 case CK_AthlonXP:
3163 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003164 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003165 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003166 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003167 Builder.defineMacro("__tune_athlon_sse__");
3168 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003169 break;
3170 case CK_K8:
3171 case CK_K8SSE3:
3172 case CK_x86_64:
3173 case CK_Opteron:
3174 case CK_OpteronSSE3:
3175 case CK_Athlon64:
3176 case CK_Athlon64SSE3:
3177 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003178 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003179 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003180 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003181 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003182 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003183 case CK_BTVER1:
3184 defineCPUMacros(Builder, "btver1");
3185 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003186 case CK_BTVER2:
3187 defineCPUMacros(Builder, "btver2");
3188 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003189 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003190 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003191 break;
3192 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003193 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003194 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003195 case CK_BDVER3:
3196 defineCPUMacros(Builder, "bdver3");
3197 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003198 case CK_BDVER4:
3199 defineCPUMacros(Builder, "bdver4");
3200 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003201 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003202 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003203 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003204 }
Chris Lattner96e43572009-03-02 22:40:39 +00003205
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003206 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003207 Builder.defineMacro("__REGISTER_PREFIX__", "");
3208
Chris Lattner6df41af2009-04-19 17:32:33 +00003209 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3210 // functions in glibc header files that use FP Stack inline asm which the
3211 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003212 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003213
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003214 if (HasAES)
3215 Builder.defineMacro("__AES__");
3216
Craig Topper3f122a72012-05-31 05:18:48 +00003217 if (HasPCLMUL)
3218 Builder.defineMacro("__PCLMUL__");
3219
Craig Topper22967d42011-12-25 05:06:45 +00003220 if (HasLZCNT)
3221 Builder.defineMacro("__LZCNT__");
3222
Benjamin Kramer1e250392012-07-07 09:39:18 +00003223 if (HasRDRND)
3224 Builder.defineMacro("__RDRND__");
3225
Craig Topper8c7f2512014-11-03 06:51:41 +00003226 if (HasFSGSBASE)
3227 Builder.defineMacro("__FSGSBASE__");
3228
Craig Topper22967d42011-12-25 05:06:45 +00003229 if (HasBMI)
3230 Builder.defineMacro("__BMI__");
3231
3232 if (HasBMI2)
3233 Builder.defineMacro("__BMI2__");
3234
Craig Topper1de83482011-12-29 16:10:46 +00003235 if (HasPOPCNT)
3236 Builder.defineMacro("__POPCNT__");
3237
Michael Liao625a8752012-11-10 05:17:46 +00003238 if (HasRTM)
3239 Builder.defineMacro("__RTM__");
3240
Michael Liao74f4eaf2013-03-26 17:52:08 +00003241 if (HasPRFCHW)
3242 Builder.defineMacro("__PRFCHW__");
3243
Michael Liaoffaae352013-03-29 05:17:55 +00003244 if (HasRDSEED)
3245 Builder.defineMacro("__RDSEED__");
3246
Robert Khasanov50e6f582014-09-19 09:53:48 +00003247 if (HasADX)
3248 Builder.defineMacro("__ADX__");
3249
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003250 if (HasTBM)
3251 Builder.defineMacro("__TBM__");
3252
Rafael Espindolae62e2792013-08-20 13:44:29 +00003253 switch (XOPLevel) {
3254 case XOP:
3255 Builder.defineMacro("__XOP__");
3256 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003257 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003258 case SSE4A:
3259 Builder.defineMacro("__SSE4A__");
3260 case NoXOP:
3261 break;
3262 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003263
Craig Topperbba778b2012-06-03 21:46:30 +00003264 if (HasFMA)
3265 Builder.defineMacro("__FMA__");
3266
Manman Rena45358c2012-10-11 00:59:55 +00003267 if (HasF16C)
3268 Builder.defineMacro("__F16C__");
3269
Craig Topper679b53a2013-08-21 05:29:10 +00003270 if (HasAVX512CD)
3271 Builder.defineMacro("__AVX512CD__");
3272 if (HasAVX512ER)
3273 Builder.defineMacro("__AVX512ER__");
3274 if (HasAVX512PF)
3275 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003276 if (HasAVX512DQ)
3277 Builder.defineMacro("__AVX512DQ__");
3278 if (HasAVX512BW)
3279 Builder.defineMacro("__AVX512BW__");
3280 if (HasAVX512VL)
3281 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003282
Ben Langmuir58078d02013-09-19 13:22:04 +00003283 if (HasSHA)
3284 Builder.defineMacro("__SHA__");
3285
Craig Toppere33f51f2015-10-16 06:22:36 +00003286 if (HasFXSR)
3287 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003288 if (HasXSAVE)
3289 Builder.defineMacro("__XSAVE__");
3290 if (HasXSAVEOPT)
3291 Builder.defineMacro("__XSAVEOPT__");
3292 if (HasXSAVEC)
3293 Builder.defineMacro("__XSAVEC__");
3294 if (HasXSAVES)
3295 Builder.defineMacro("__XSAVES__");
3296
Nick Lewycky50e8f482013-10-05 20:14:27 +00003297 if (HasCX16)
3298 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3299
Chris Lattner96e43572009-03-02 22:40:39 +00003300 // Each case falls through to the previous one here.
3301 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003302 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003303 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003304 case AVX2:
3305 Builder.defineMacro("__AVX2__");
3306 case AVX:
3307 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003308 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003309 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003310 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003311 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003312 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003313 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003314 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003315 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003316 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003317 Builder.defineMacro("__SSE2__");
3318 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003319 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003320 Builder.defineMacro("__SSE__");
3321 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003322 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003323 break;
3324 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003325
Derek Schuffc7dd7222012-10-11 15:52:22 +00003326 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003327 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003328 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003329 case AVX2:
3330 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003331 case SSE42:
3332 case SSE41:
3333 case SSSE3:
3334 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003335 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003336 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003337 break;
3338 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003339 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003340 break;
3341 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003342 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003343 }
3344 }
3345
Anders Carlssone437c682010-01-27 03:47:49 +00003346 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003347 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003348 case AMD3DNowAthlon:
3349 Builder.defineMacro("__3dNOW_A__");
3350 case AMD3DNow:
3351 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003352 case MMX:
3353 Builder.defineMacro("__MMX__");
3354 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003355 break;
3356 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003357
3358 if (CPU >= CK_i486) {
3359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3362 }
3363 if (CPU >= CK_i586)
3364 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003365}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003366
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003367bool X86TargetInfo::hasFeature(StringRef Feature) const {
3368 return llvm::StringSwitch<bool>(Feature)
3369 .Case("aes", HasAES)
3370 .Case("avx", SSELevel >= AVX)
3371 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003372 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003373 .Case("avx512cd", HasAVX512CD)
3374 .Case("avx512er", HasAVX512ER)
3375 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003376 .Case("avx512dq", HasAVX512DQ)
3377 .Case("avx512bw", HasAVX512BW)
3378 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003379 .Case("bmi", HasBMI)
3380 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003381 .Case("cx16", HasCX16)
3382 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003383 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003384 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003385 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003386 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003387 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003388 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3389 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3390 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003391 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003392 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003393 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003394 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003395 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003396 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003397 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003398 .Case("sse", SSELevel >= SSE1)
3399 .Case("sse2", SSELevel >= SSE2)
3400 .Case("sse3", SSELevel >= SSE3)
3401 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003402 .Case("sse4.1", SSELevel >= SSE41)
3403 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003404 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003405 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003406 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003407 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3408 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003409 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003410 .Case("xsave", HasXSAVE)
3411 .Case("xsavec", HasXSAVEC)
3412 .Case("xsaves", HasXSAVES)
3413 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003414 .Default(false);
3415}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003416
Eric Christopherd9832702015-06-29 21:00:05 +00003417// We can't use a generic validation scheme for the features accepted here
3418// versus subtarget features accepted in the target attribute because the
3419// bitfield structure that's initialized in the runtime only supports the
3420// below currently rather than the full range of subtarget features. (See
3421// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3422bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3423 return llvm::StringSwitch<bool>(FeatureStr)
3424 .Case("cmov", true)
3425 .Case("mmx", true)
3426 .Case("popcnt", true)
3427 .Case("sse", true)
3428 .Case("sse2", true)
3429 .Case("sse3", true)
3430 .Case("sse4.1", true)
3431 .Case("sse4.2", true)
3432 .Case("avx", true)
3433 .Case("avx2", true)
3434 .Case("sse4a", true)
3435 .Case("fma4", true)
3436 .Case("xop", true)
3437 .Case("fma", true)
3438 .Case("avx512f", true)
3439 .Case("bmi", true)
3440 .Case("bmi2", true)
3441 .Default(false);
3442}
3443
Eli Friedman3fd920a2008-08-20 02:34:37 +00003444bool
Anders Carlsson58436352009-02-28 17:11:49 +00003445X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003446 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003447 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003448 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003449 // Constant constraints.
3450 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3451 // instructions.
3452 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3453 // x86_64 instructions.
3454 case 's':
3455 Info.setRequiresImmediate();
3456 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003457 case 'I':
3458 Info.setRequiresImmediate(0, 31);
3459 return true;
3460 case 'J':
3461 Info.setRequiresImmediate(0, 63);
3462 return true;
3463 case 'K':
3464 Info.setRequiresImmediate(-128, 127);
3465 return true;
3466 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003467 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003468 return true;
3469 case 'M':
3470 Info.setRequiresImmediate(0, 3);
3471 return true;
3472 case 'N':
3473 Info.setRequiresImmediate(0, 255);
3474 return true;
3475 case 'O':
3476 Info.setRequiresImmediate(0, 127);
3477 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003478 // Register constraints.
3479 case 'Y': // 'Y' is the first character for several 2-character constraints.
3480 // Shift the pointer to the second character of the constraint.
3481 Name++;
3482 switch (*Name) {
3483 default:
3484 return false;
3485 case '0': // First SSE register.
3486 case 't': // Any SSE register, when SSE2 is enabled.
3487 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3488 case 'm': // Any MMX register, when inter-unit moves enabled.
3489 Info.setAllowsRegister();
3490 return true;
3491 }
3492 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003493 // Constraint 'f' cannot be used for output operands.
3494 if (Info.ConstraintStr[0] == '=')
3495 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003496 Info.setAllowsRegister();
3497 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003498 case 'a': // eax.
3499 case 'b': // ebx.
3500 case 'c': // ecx.
3501 case 'd': // edx.
3502 case 'S': // esi.
3503 case 'D': // edi.
3504 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003505 case 't': // Top of floating point stack.
3506 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003507 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003508 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003509 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003510 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003511 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3512 case 'l': // "Index" registers: any general register that can be used as an
3513 // index in a base+index memory access.
3514 Info.setAllowsRegister();
3515 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003516 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003517 case 'C': // SSE floating point constant.
3518 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003519 return true;
3520 }
3521}
3522
Akira Hatanaka974131e2014-09-18 18:17:18 +00003523bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3524 unsigned Size) const {
3525 // Strip off constraint modifiers.
3526 while (Constraint[0] == '=' ||
3527 Constraint[0] == '+' ||
3528 Constraint[0] == '&')
3529 Constraint = Constraint.substr(1);
3530
3531 return validateOperandSize(Constraint, Size);
3532}
3533
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003534bool X86TargetInfo::validateInputSize(StringRef Constraint,
3535 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003536 return validateOperandSize(Constraint, Size);
3537}
3538
3539bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3540 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003541 switch (Constraint[0]) {
3542 default: break;
3543 case 'y':
3544 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003545 case 'f':
3546 case 't':
3547 case 'u':
3548 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003549 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003550 if (SSELevel >= AVX512F)
3551 // 512-bit zmm registers can be used if target supports AVX512F.
3552 return Size <= 512U;
3553 else if (SSELevel >= AVX)
3554 // 256-bit ymm registers can be used if target supports AVX.
3555 return Size <= 256U;
3556 return Size <= 128U;
3557 case 'Y':
3558 // 'Y' is the first character for several 2-character constraints.
3559 switch (Constraint[1]) {
3560 default: break;
3561 case 'm':
3562 // 'Ym' is synonymous with 'y'.
3563 return Size <= 64;
3564 case 'i':
3565 case 't':
3566 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3567 if (SSELevel >= AVX512F)
3568 return Size <= 512U;
3569 else if (SSELevel >= AVX)
3570 return Size <= 256U;
3571 return SSELevel >= SSE2 && Size <= 128U;
3572 }
3573
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003574 }
3575
3576 return true;
3577}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003578
Eli Friedman3fd920a2008-08-20 02:34:37 +00003579std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003580X86TargetInfo::convertConstraint(const char *&Constraint) const {
3581 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003582 case 'a': return std::string("{ax}");
3583 case 'b': return std::string("{bx}");
3584 case 'c': return std::string("{cx}");
3585 case 'd': return std::string("{dx}");
3586 case 'S': return std::string("{si}");
3587 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003588 case 'p': // address
3589 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003590 case 't': // top of floating point stack.
3591 return std::string("{st}");
3592 case 'u': // second from top of floating point stack.
3593 return std::string("{st(1)}"); // second from top of floating point stack.
3594 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003595 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003596 }
3597}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003598
Eli Friedman3fd920a2008-08-20 02:34:37 +00003599// X86-32 generic target
3600class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003601public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003602 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003603 DoubleAlign = LongLongAlign = 32;
3604 LongDoubleWidth = 96;
3605 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003606 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003607 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003608 SizeType = UnsignedInt;
3609 PtrDiffType = SignedInt;
3610 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003611 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003612
3613 // Use fpret for all types.
3614 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3615 (1 << TargetInfo::Double) |
3616 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003617
3618 // x86-32 has atomics up to 8 bytes
3619 // FIXME: Check that we actually have cmpxchg8b before setting
3620 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3621 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003622 }
Craig Topper3164f332014-03-11 03:39:26 +00003623 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003624 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003625 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003626
Craig Topper3164f332014-03-11 03:39:26 +00003627 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003628 if (RegNo == 0) return 0;
3629 if (RegNo == 1) return 2;
3630 return -1;
3631 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003632 bool validateOperandSize(StringRef Constraint,
3633 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003634 switch (Constraint[0]) {
3635 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003636 case 'R':
3637 case 'q':
3638 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003639 case 'a':
3640 case 'b':
3641 case 'c':
3642 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003643 case 'S':
3644 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003645 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003646 case 'A':
3647 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003648 }
3649
Akira Hatanaka974131e2014-09-18 18:17:18 +00003650 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003651 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003652};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003653
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003654class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3655public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003656 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3657 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003658
Craig Topper3164f332014-03-11 03:39:26 +00003659 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003660 unsigned Major, Minor, Micro;
3661 getTriple().getOSVersion(Major, Minor, Micro);
3662 // New NetBSD uses the default rounding mode.
3663 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3664 return X86_32TargetInfo::getFloatEvalMethod();
3665 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003666 return 1;
3667 }
3668};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003669
Eli Friedmane3aa4542009-07-05 18:47:56 +00003670class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3671public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003672 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3673 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003674 SizeType = UnsignedLong;
3675 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003676 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003677 }
3678};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003679
Eli Friedman9fa28852012-08-08 23:57:20 +00003680class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3681public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003682 BitrigI386TargetInfo(const llvm::Triple &Triple)
3683 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003684 SizeType = UnsignedLong;
3685 IntPtrType = SignedLong;
3686 PtrDiffType = SignedLong;
3687 }
3688};
Eli Friedman9fa28852012-08-08 23:57:20 +00003689
Torok Edwinb2b37c62009-06-30 17:10:35 +00003690class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003691public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003692 DarwinI386TargetInfo(const llvm::Triple &Triple)
3693 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003694 LongDoubleWidth = 128;
3695 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003696 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003697 SizeType = UnsignedLong;
3698 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003699 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003700 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003701 }
3702
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003703 bool handleTargetFeatures(std::vector<std::string> &Features,
3704 DiagnosticsEngine &Diags) override {
3705 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3706 Diags))
3707 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003708 // We now know the features we have: we can decide how to align vectors.
3709 MaxVectorAlign =
3710 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003711 return true;
3712 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003713};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003714
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003715// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003716class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003717public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003718 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3719 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003720 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003721 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003722 bool IsWinCOFF =
3723 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003724 DataLayoutString = IsWinCOFF
3725 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3726 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003727 }
Craig Topper3164f332014-03-11 03:39:26 +00003728 void getTargetDefines(const LangOptions &Opts,
3729 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003730 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3731 }
3732};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003733
3734// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003735class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003736public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003737 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003738 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003739 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003740 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3741 }
Craig Topper3164f332014-03-11 03:39:26 +00003742 void getTargetDefines(const LangOptions &Opts,
3743 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003744 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3745 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3746 // The value of the following reflects processor type.
3747 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3748 // We lost the original triple, so we use the default.
3749 Builder.defineMacro("_M_IX86", "600");
3750 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003751};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003752
David Majnemerae1ed0e2015-05-28 04:36:18 +00003753static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003754 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3755 // supports __declspec natively under -fms-extensions, but we define a no-op
3756 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003757 if (Opts.MicrosoftExt)
3758 Builder.defineMacro("__declspec", "__declspec");
3759 else
3760 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3761
3762 if (!Opts.MicrosoftExt) {
3763 // Provide macros for all the calling convention keywords. Provide both
3764 // single and double underscore prefixed variants. These are available on
3765 // x64 as well as x86, even though they have no effect.
3766 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3767 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003768 std::string GCCSpelling = "__attribute__((__";
3769 GCCSpelling += CC;
3770 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003771 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3772 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3773 }
3774 }
3775}
3776
David Majnemerae1ed0e2015-05-28 04:36:18 +00003777static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3778 Builder.defineMacro("__MSVCRT__");
3779 Builder.defineMacro("__MINGW32__");
3780 addCygMingDefines(Opts, Builder);
3781}
3782
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003783// x86-32 MinGW target
3784class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3785public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003786 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003787 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003788 void getTargetDefines(const LangOptions &Opts,
3789 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003790 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003791 DefineStd(Builder, "WIN32", Opts);
3792 DefineStd(Builder, "WINNT", Opts);
3793 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003794 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003795 }
3796};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003797
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003798// x86-32 Cygwin target
3799class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3800public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003801 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3802 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003803 TLSSupported = false;
3804 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003805 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003806 DataLayoutString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003807 }
Craig Topper3164f332014-03-11 03:39:26 +00003808 void getTargetDefines(const LangOptions &Opts,
3809 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003810 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003811 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003812 Builder.defineMacro("__CYGWIN__");
3813 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003814 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003815 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003816 if (Opts.CPlusPlus)
3817 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003818 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003819};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003820
Chris Lattnerb986aba2010-04-11 19:29:39 +00003821// x86-32 Haiku target
3822class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3823public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003824 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003825 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003826 IntPtrType = SignedLong;
3827 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003828 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003829 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003830 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003831 }
Craig Topper3164f332014-03-11 03:39:26 +00003832 void getTargetDefines(const LangOptions &Opts,
3833 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003834 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3835 Builder.defineMacro("__INTEL__");
3836 Builder.defineMacro("__HAIKU__");
3837 }
3838};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003839
Douglas Gregor9fabd852011-07-01 22:41:14 +00003840// RTEMS Target
3841template<typename Target>
3842class RTEMSTargetInfo : public OSTargetInfo<Target> {
3843protected:
Craig Topper3164f332014-03-11 03:39:26 +00003844 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3845 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003846 // RTEMS defines; list based off of gcc output
3847
Douglas Gregor9fabd852011-07-01 22:41:14 +00003848 Builder.defineMacro("__rtems__");
3849 Builder.defineMacro("__ELF__");
3850 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003851
Douglas Gregor9fabd852011-07-01 22:41:14 +00003852public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003853 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3854 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003855
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003856 switch (Triple.getArch()) {
3857 default:
3858 case llvm::Triple::x86:
3859 // this->MCountName = ".mcount";
3860 break;
3861 case llvm::Triple::mips:
3862 case llvm::Triple::mipsel:
3863 case llvm::Triple::ppc:
3864 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003865 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003866 // this->MCountName = "_mcount";
3867 break;
3868 case llvm::Triple::arm:
3869 // this->MCountName = "__mcount";
3870 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003871 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003872 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003873};
3874
Douglas Gregor9fabd852011-07-01 22:41:14 +00003875// x86-32 RTEMS target
3876class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3877public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003878 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003879 SizeType = UnsignedLong;
3880 IntPtrType = SignedLong;
3881 PtrDiffType = SignedLong;
3882 this->UserLabelPrefix = "";
3883 }
Craig Topper3164f332014-03-11 03:39:26 +00003884 void getTargetDefines(const LangOptions &Opts,
3885 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003886 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3887 Builder.defineMacro("__INTEL__");
3888 Builder.defineMacro("__rtems__");
3889 }
3890};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003891
Eli Friedman3fd920a2008-08-20 02:34:37 +00003892// x86-64 generic target
3893class X86_64TargetInfo : public X86TargetInfo {
3894public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003895 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003896 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003897 bool IsWinCOFF =
3898 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003899 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003900 LongDoubleWidth = 128;
3901 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003902 LargeArrayMinWidth = 128;
3903 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003904 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003905 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3906 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3907 IntPtrType = IsX32 ? SignedInt : SignedLong;
3908 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003909 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003910 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003911
Eric Christopher917e9522014-11-18 22:36:15 +00003912 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003913 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3914 : IsWinCOFF
3915 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3916 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003917
3918 // Use fpret only for long double.
3919 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003920
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003921 // Use fp2ret for _Complex long double.
3922 ComplexLongDoubleUsesFP2Ret = true;
3923
Charles Davisc7d5c942015-09-17 20:55:33 +00003924 // Make __builtin_ms_va_list available.
3925 HasBuiltinMSVaList = true;
3926
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003927 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003928 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003929 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003930 }
Craig Topper3164f332014-03-11 03:39:26 +00003931 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003932 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003933 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003934
Craig Topper3164f332014-03-11 03:39:26 +00003935 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003936 if (RegNo == 0) return 0;
3937 if (RegNo == 1) return 1;
3938 return -1;
3939 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003940
Craig Topper3164f332014-03-11 03:39:26 +00003941 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003942 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003943 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003944 CC == CC_IntelOclBicc ||
3945 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003946 }
3947
Craig Topper3164f332014-03-11 03:39:26 +00003948 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003949 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003950 }
3951
Pavel Chupinfd223e12014-08-04 12:39:43 +00003952 // for x32 we need it here explicitly
3953 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003954};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003955
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003956// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003957class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003958public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003959 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3960 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003961 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003962 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003963 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003964 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003965 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003966 SizeType = UnsignedLongLong;
3967 PtrDiffType = SignedLongLong;
3968 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003969 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003970 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003971
Craig Topper3164f332014-03-11 03:39:26 +00003972 void getTargetDefines(const LangOptions &Opts,
3973 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003974 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003975 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003976 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003977
Craig Topper3164f332014-03-11 03:39:26 +00003978 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003979 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003980 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003981
Craig Topper3164f332014-03-11 03:39:26 +00003982 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003983 switch (CC) {
3984 case CC_X86StdCall:
3985 case CC_X86ThisCall:
3986 case CC_X86FastCall:
3987 return CCCR_Ignore;
3988 case CC_C:
3989 case CC_X86VectorCall:
3990 case CC_IntelOclBicc:
3991 case CC_X86_64SysV:
3992 return CCCR_OK;
3993 default:
3994 return CCCR_Warning;
3995 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003996 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003997};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003998
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003999// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004000class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004001public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004002 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004003 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004004 LongDoubleWidth = LongDoubleAlign = 64;
4005 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004006 }
Craig Topper3164f332014-03-11 03:39:26 +00004007 void getTargetDefines(const LangOptions &Opts,
4008 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004009 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4010 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004011 Builder.defineMacro("_M_X64", "100");
4012 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004013 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004014};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004015
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004016// x86-64 MinGW target
4017class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4018public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004019 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00004020 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00004021 void getTargetDefines(const LangOptions &Opts,
4022 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004023 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004024 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004025 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004026 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004027
4028 // GCC defines this macro when it is using __gxx_personality_seh0.
4029 if (!Opts.SjLjExceptions)
4030 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004031 }
4032};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004033
Yaron Kerend030d112015-07-22 17:38:19 +00004034// x86-64 Cygwin target
4035class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4036public:
4037 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4038 : X86_64TargetInfo(Triple) {
4039 TLSSupported = false;
4040 WCharType = UnsignedShort;
4041 }
4042 void getTargetDefines(const LangOptions &Opts,
4043 MacroBuilder &Builder) const override {
4044 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4045 Builder.defineMacro("__x86_64__");
4046 Builder.defineMacro("__CYGWIN__");
4047 Builder.defineMacro("__CYGWIN64__");
4048 addCygMingDefines(Opts, Builder);
4049 DefineStd(Builder, "unix", Opts);
4050 if (Opts.CPlusPlus)
4051 Builder.defineMacro("_GNU_SOURCE");
4052
4053 // GCC defines this macro when it is using __gxx_personality_seh0.
4054 if (!Opts.SjLjExceptions)
4055 Builder.defineMacro("__SEH__");
4056 }
4057};
4058
Eli Friedman2857ccb2009-07-01 03:36:11 +00004059class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4060public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004061 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4062 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004063 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004064 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4065 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004066 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004067 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004068 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004069 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004070
4071 bool handleTargetFeatures(std::vector<std::string> &Features,
4072 DiagnosticsEngine &Diags) override {
4073 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4074 Diags))
4075 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004076 // We now know the features we have: we can decide how to align vectors.
4077 MaxVectorAlign =
4078 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004079 return true;
4080 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004081};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004082
Eli Friedman245f2292009-07-05 22:31:18 +00004083class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4084public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004085 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4086 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004087 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004088 Int64Type = SignedLongLong;
4089 }
4090};
Eli Friedman245f2292009-07-05 22:31:18 +00004091
Eli Friedman9fa28852012-08-08 23:57:20 +00004092class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4093public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004094 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4095 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4096 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004097 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004098 }
4099};
Tim Northover9bb857a2013-01-31 12:13:10 +00004100
Eli Friedmanf05b7722008-08-20 07:44:10 +00004101class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004102 // Possible FPU choices.
4103 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004104 VFP2FPU = (1 << 0),
4105 VFP3FPU = (1 << 1),
4106 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004107 NeonFPU = (1 << 3),
4108 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004109 };
4110
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004111 // Possible HWDiv features.
4112 enum HWDivMode {
4113 HWDivThumb = (1 << 0),
4114 HWDivARM = (1 << 1)
4115 };
4116
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004117 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004118 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004119 }
4120
4121 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4122 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004123
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004124 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004125
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004126 StringRef CPUProfile;
4127 StringRef CPUAttr;
4128
Rafael Espindolaeb265472013-08-21 21:59:03 +00004129 enum {
4130 FP_Default,
4131 FP_VFP,
4132 FP_Neon
4133 } FPMath;
4134
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004135 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004136 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004137 unsigned ArchProfile;
4138 unsigned ArchVersion;
4139
Bernard Ogdenda13af32013-10-24 18:32:51 +00004140 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004141
Logan Chien57086ce2012-10-10 06:56:20 +00004142 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004143 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004144
4145 // Initialized via features.
4146 unsigned SoftFloat : 1;
4147 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004148
Bernard Ogden18b57012013-10-29 09:47:51 +00004149 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004150 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004151 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004152 unsigned Unaligned : 1;
4153
4154 enum {
4155 LDREX_B = (1 << 0), /// byte (8-bit)
4156 LDREX_H = (1 << 1), /// half (16-bit)
4157 LDREX_W = (1 << 2), /// word (32-bit)
4158 LDREX_D = (1 << 3), /// double (64-bit)
4159 };
4160
4161 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004162
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004163 // ACLE 6.5.1 Hardware floating point
4164 enum {
4165 HW_FP_HP = (1 << 1), /// half (16-bit)
4166 HW_FP_SP = (1 << 2), /// single (32-bit)
4167 HW_FP_DP = (1 << 3), /// double (64-bit)
4168 };
4169 uint32_t HW_FP;
4170
Chris Lattner5cc15e02010-03-03 19:03:45 +00004171 static const Builtin::Info BuiltinInfo[];
4172
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004173 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004174 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004175
4176 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004177 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004178
Renato Golin9ba39232015-02-27 16:35:48 +00004179 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4180 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4181 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004182 SizeType = UnsignedLong;
4183 else
4184 SizeType = UnsignedInt;
4185
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004186 switch (T.getOS()) {
4187 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004188 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004189 break;
4190 case llvm::Triple::Win32:
4191 WCharType = UnsignedShort;
4192 break;
4193 case llvm::Triple::Linux:
4194 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004195 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4196 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004197 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004198 }
4199
4200 UseBitFieldTypeAlignment = true;
4201
4202 ZeroLengthBitfieldBoundary = 0;
4203
Tim Northover147cd2f2014-10-14 22:12:21 +00004204 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4205 // so set preferred for small types to 32.
4206 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004207 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004208 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4209 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4210 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004211 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004212 DataLayoutString = "e"
4213 "-m:w"
4214 "-p:32:32"
4215 "-i64:64"
4216 "-v128:64:128"
4217 "-a:0:32"
4218 "-n32"
4219 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004220 } else if (T.isOSNaCl()) {
4221 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004222 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004223 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004224 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004225 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4226 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004227 }
4228
4229 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004230 }
4231
4232 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004233 const llvm::Triple &T = getTriple();
4234
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004235 IsAAPCS = false;
4236
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004237 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004238
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004239 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004240 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004241 SizeType = UnsignedInt;
4242 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004243 SizeType = UnsignedLong;
4244
4245 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4246 WCharType = SignedInt;
4247
4248 // Do not respect the alignment of bit-field types when laying out
4249 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4250 UseBitFieldTypeAlignment = false;
4251
4252 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4253 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4254 /// gcc.
4255 ZeroLengthBitfieldBoundary = 32;
4256
Tim Northover147cd2f2014-10-14 22:12:21 +00004257 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004258 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004259 BigEndian
4260 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4261 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4262 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004263 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004264 BigEndian
4265 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4266 : "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 +00004267
4268 // FIXME: Override "preferred align" for double and long long.
4269 }
4270
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004271 void setArchInfo() {
4272 StringRef ArchName = getTriple().getArchName();
4273
Renato Goline84b0002015-10-08 16:43:26 +00004274 ArchISA = llvm::ARM::parseArchISA(ArchName);
4275 CPU = llvm::ARM::getDefaultCPU(ArchName);
4276 unsigned AK = llvm::ARM::parseArch(ArchName);
4277 if (AK != llvm::ARM::AK_INVALID)
4278 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004279 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004280 }
4281
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004282 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004283 StringRef SubArch;
4284
4285 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004286 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004287 SubArch = llvm::ARM::getSubArch(ArchKind);
4288 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4289 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004290
4291 // cache CPU related strings
4292 CPUAttr = getCPUAttr();
4293 CPUProfile = getCPUProfile();
4294 }
4295
4296 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004297 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004298 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004299 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004300 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4301 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004302 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004303 if (ArchProfile == llvm::ARM::PK_M) {
4304 MaxAtomicPromoteWidth = 32;
4305 if (ShouldUseInlineAtomic)
4306 MaxAtomicInlineWidth = 32;
4307 }
4308 else {
4309 MaxAtomicPromoteWidth = 64;
4310 if (ShouldUseInlineAtomic)
4311 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004312 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004313 }
4314
4315 bool isThumb() const {
4316 return (ArchISA == llvm::ARM::IK_THUMB);
4317 }
4318
4319 bool supportsThumb() const {
4320 return CPUAttr.count('T') || ArchVersion >= 6;
4321 }
4322
4323 bool supportsThumb2() const {
4324 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4325 }
4326
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004327 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004328 // For most sub-arches, the build attribute CPU name is enough.
4329 // For Cortex variants, it's slightly different.
4330 switch(ArchKind) {
4331 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004332 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004333 case llvm::ARM::AK_ARMV6M:
4334 case llvm::ARM::AK_ARMV6SM:
4335 case llvm::ARM::AK_ARMV6HL:
4336 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004337 case llvm::ARM::AK_ARMV7S:
4338 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004339 case llvm::ARM::AK_ARMV7:
4340 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004341 case llvm::ARM::AK_ARMV7L:
4342 case llvm::ARM::AK_ARMV7HL:
4343 return "7A";
4344 case llvm::ARM::AK_ARMV7R:
4345 return "7R";
4346 case llvm::ARM::AK_ARMV7M:
4347 return "7M";
4348 case llvm::ARM::AK_ARMV7EM:
4349 return "7EM";
4350 case llvm::ARM::AK_ARMV8A:
4351 return "8A";
4352 case llvm::ARM::AK_ARMV8_1A:
4353 return "8_1A";
4354 }
4355 }
4356
4357 StringRef getCPUProfile() const {
4358 switch(ArchProfile) {
4359 case llvm::ARM::PK_A:
4360 return "A";
4361 case llvm::ARM::PK_R:
4362 return "R";
4363 case llvm::ARM::PK_M:
4364 return "M";
4365 default:
4366 return "";
4367 }
4368 }
4369
Chris Lattner17df24e2008-04-21 18:56:49 +00004370public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004371 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004372 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004373 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004374 BigEndian = IsBigEndian;
4375
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004376 switch (getTriple().getOS()) {
4377 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004378 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004379 break;
4380 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004381 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004382 break;
4383 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004384
Renato Goline84b0002015-10-08 16:43:26 +00004385 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004386 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004387
Chris Lattner1a8f3942010-04-23 16:29:58 +00004388 // {} in inline assembly are neon specifiers, not assembly variant
4389 // specifiers.
4390 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004391
Eric Christopher0e261882014-12-05 01:06:59 +00004392 // FIXME: This duplicates code from the driver that sets the -target-abi
4393 // option - this code is used if -target-abi isn't passed and should
4394 // be unified in some way.
4395 if (Triple.isOSBinFormatMachO()) {
4396 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4397 // the frontend matches that.
4398 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4399 Triple.getOS() == llvm::Triple::UnknownOS ||
4400 StringRef(CPU).startswith("cortex-m")) {
4401 setABI("aapcs");
4402 } else {
4403 setABI("apcs-gnu");
4404 }
4405 } else if (Triple.isOSWindows()) {
4406 // FIXME: this is invalid for WindowsCE
4407 setABI("aapcs");
4408 } else {
4409 // Select the default based on the platform.
4410 switch (Triple.getEnvironment()) {
4411 case llvm::Triple::Android:
4412 case llvm::Triple::GNUEABI:
4413 case llvm::Triple::GNUEABIHF:
4414 setABI("aapcs-linux");
4415 break;
4416 case llvm::Triple::EABIHF:
4417 case llvm::Triple::EABI:
4418 setABI("aapcs");
4419 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004420 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004421 setABI("apcs-gnu");
4422 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004423 default:
4424 if (Triple.getOS() == llvm::Triple::NetBSD)
4425 setABI("apcs-gnu");
4426 else
4427 setABI("aapcs");
4428 break;
4429 }
4430 }
John McCall86353412010-08-21 22:46:04 +00004431
4432 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004433 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004434
Renato Golin15b86152015-07-03 16:41:13 +00004435 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004436 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004437
James Molloya7139222012-03-12 09:14:10 +00004438 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004439 // the alignment of the zero-length bitfield is greater than the member
4440 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004441 // zero length bitfield.
4442 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004443 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004444
Alp Toker4925ba72014-06-07 23:30:42 +00004445 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004446
Craig Topper3164f332014-03-11 03:39:26 +00004447 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004448 ABI = Name;
4449
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004450 // The defaults (above) are for AAPCS, check if we need to change them.
4451 //
4452 // FIXME: We need support for -meabi... we could just mangle it into the
4453 // name.
4454 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004455 setABIAPCS();
4456 return true;
4457 }
4458 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4459 setABIAAPCS();
4460 return true;
4461 }
4462 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004463 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004464
Renato Golinf5c4dec2015-05-27 13:33:00 +00004465 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004466 bool
4467 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4468 StringRef CPU,
4469 const std::vector<std::string> &FeaturesVec) const override {
4470
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004471 std::vector<const char*> TargetFeatures;
4472
4473 // get default FPU features
4474 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4475 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4476
4477 // get default Extension features
4478 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4479 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4480
4481 for (const char *Feature : TargetFeatures)
4482 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004483 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004484
Eric Christopher007b0a02015-08-28 22:32:01 +00004485 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004486 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004487
Craig Topper3164f332014-03-11 03:39:26 +00004488 bool handleTargetFeatures(std::vector<std::string> &Features,
4489 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004490 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004491 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004492 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004493 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004494 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004495 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004496 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004497
Ranjeet Singhac08e532015-06-24 23:39:25 +00004498 // This does not diagnose illegal cases like having both
4499 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4500 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004501 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004502 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004503 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004504 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004505 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004506 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004507 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004508 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004509 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004510 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004511 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004512 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004513 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004514 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004515 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004516 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004517 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004518 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004519 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004520 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004521 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004522 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004523 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004524 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004525 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004526 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004527 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004528 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004529 } else if (Feature == "+t2dsp") {
4530 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004531 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004532 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004533 } else if (Feature == "+strict-align") {
4534 Unaligned = 0;
4535 } else if (Feature == "+fp16") {
4536 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004537 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004538 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004539 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004540
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004541 switch (ArchVersion) {
4542 case 6:
4543 if (ArchProfile == llvm::ARM::PK_M)
4544 LDREX = 0;
4545 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4546 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4547 else
4548 LDREX = LDREX_W;
4549 break;
4550 case 7:
4551 if (ArchProfile == llvm::ARM::PK_M)
4552 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4553 else
4554 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4555 break;
4556 case 8:
4557 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4558 }
4559
Rafael Espindolaeb265472013-08-21 21:59:03 +00004560 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4561 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4562 return false;
4563 }
4564
4565 if (FPMath == FP_Neon)
4566 Features.push_back("+neonfp");
4567 else if (FPMath == FP_VFP)
4568 Features.push_back("-neonfp");
4569
Daniel Dunbar893d4752009-12-19 04:15:38 +00004570 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004571 auto Feature =
4572 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4573 if (Feature != Features.end())
4574 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004575
Rafael Espindolaeb265472013-08-21 21:59:03 +00004576 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004577 }
4578
Craig Topper3164f332014-03-11 03:39:26 +00004579 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004580 return llvm::StringSwitch<bool>(Feature)
4581 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004582 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004583 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004584 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004585 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004586 .Case("hwdiv", HWDiv & HWDivThumb)
4587 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004588 .Default(false);
4589 }
Renato Golin15b86152015-07-03 16:41:13 +00004590
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004591 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004592 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004593 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004594
Renato Golin15b86152015-07-03 16:41:13 +00004595 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004596 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004597 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004598 CPU = Name;
4599 return true;
4600 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004601
Craig Topper3164f332014-03-11 03:39:26 +00004602 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004603
Craig Topper3164f332014-03-11 03:39:26 +00004604 void getTargetDefines(const LangOptions &Opts,
4605 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004606 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004607 Builder.defineMacro("__arm");
4608 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004609
Chris Lattnerecd49032009-03-02 22:27:17 +00004610 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004611 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004612 if (!CPUAttr.empty())
4613 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004614
4615 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004616 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004617 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004618
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004619 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004620 // ACLE 6.5.7 Crypto Extension
4621 if (Crypto)
4622 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4623 // ACLE 6.5.8 CRC32 Extension
4624 if (CRC)
4625 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4626 // ACLE 6.5.10 Numeric Maximum and Minimum
4627 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4628 // ACLE 6.5.9 Directed Rounding
4629 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004630 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004631
4632 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4633 // is not defined for the M-profile.
4634 // NOTE that the deffault profile is assumed to be 'A'
4635 if (CPUProfile.empty() || CPUProfile != "M")
4636 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4637
4638 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4639 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4640 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004641 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004642 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004643 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004644 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4645
4646 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4647 // instruction set such as ARM or Thumb.
4648 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4649
4650 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4651
4652 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004653 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004654 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004655
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004656 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004657 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004658 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004659
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004660 // ACLE 6.4.4 LDREX/STREX
4661 if (LDREX)
4662 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4663
4664 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004665 if (ArchVersion == 5 ||
4666 (ArchVersion == 6 && CPUProfile != "M") ||
4667 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004668 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4669
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004670 // ACLE 6.5.1 Hardware Floating Point
4671 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004672 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004673
Yi Konga44c4d72014-06-27 21:25:42 +00004674 // ACLE predefines.
4675 Builder.defineMacro("__ARM_ACLE", "200");
4676
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004677 // FP16 support (we currently only support IEEE format).
4678 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4679 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4680
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004681 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4682 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4683 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4684
Mike Stump9d54bd72009-04-08 02:07:04 +00004685 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004686
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004687 // FIXME: It's more complicated than this and we don't really support
4688 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004689 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004690 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004691 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004692
David Tweed8f676532012-10-25 13:33:01 +00004693 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004694 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004695 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4696 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004697 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004698 Builder.defineMacro("__ARM_PCS", "1");
4699
David Tweed8f676532012-10-25 13:33:01 +00004700 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004701 Builder.defineMacro("__ARM_PCS_VFP", "1");
4702 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004703
Daniel Dunbar893d4752009-12-19 04:15:38 +00004704 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004705 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004706
4707 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004708 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004709
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004710 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004711 Builder.defineMacro("__THUMBEL__");
4712 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004713 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004714 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004715 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004716
4717 // ACLE 6.4.9 32-bit SIMD instructions
4718 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4719 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4720
4721 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004722 if (((HWDiv & HWDivThumb) && isThumb()) ||
4723 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004724 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004725 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004726 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004727
4728 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004729 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004730
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004731 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004732 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004733 if (FPU & VFP2FPU)
4734 Builder.defineMacro("__ARM_VFPV2__");
4735 if (FPU & VFP3FPU)
4736 Builder.defineMacro("__ARM_VFPV3__");
4737 if (FPU & VFP4FPU)
4738 Builder.defineMacro("__ARM_VFPV4__");
4739 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004740
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004741 // This only gets set when Neon instructions are actually available, unlike
4742 // the VFP define, hence the soft float and arch check. This is subtly
4743 // different from gcc, we follow the intent which was that it should be set
4744 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004745 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004746 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004747 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004748 // current AArch32 NEON implementations do not support double-precision
4749 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004750 Builder.defineMacro("__ARM_NEON_FP",
4751 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004752 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004753
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004754 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4755 Opts.ShortWChar ? "2" : "4");
4756
4757 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4758 Opts.ShortEnums ? "1" : "4");
4759
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004760 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004761 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4762 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4763 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4764 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4765 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004766
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004767 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004768 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004769 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004770 }
4771
4772 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004773 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004774 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4775 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004776 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004777 }
4778
4779 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004780 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004781 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004782
4783 if (Opts.UnsafeFPMath)
4784 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004785 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004786
Craig Topper6c03a542015-10-19 04:51:35 +00004787 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4788 return llvm::makeArrayRef(BuiltinInfo,
4789 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004790 }
Craig Topper3164f332014-03-11 03:39:26 +00004791 bool isCLZForZeroUndef() const override { return false; }
4792 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004793 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004794 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004795 ArrayRef<const char *> getGCCRegNames() const override;
4796 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004797 bool validateAsmConstraint(const char *&Name,
4798 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004799 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004800 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004801 case 'l': // r0-r7
4802 case 'h': // r8-r15
4803 case 'w': // VFP Floating point register single precision
4804 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004805 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004806 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004807 case 'I':
4808 case 'J':
4809 case 'K':
4810 case 'L':
4811 case 'M':
4812 // FIXME
4813 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004814 case 'Q': // A memory address that is a single base register.
4815 Info.setAllowsMemory();
4816 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004817 case 'U': // a memory reference...
4818 switch (Name[1]) {
4819 case 'q': // ...ARMV4 ldrsb
4820 case 'v': // ...VFP load/store (reg+constant offset)
4821 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004822 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004823 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004824 case 'n': // valid address for Neon doubleword vector load/store
4825 case 'm': // valid address for Neon element and structure load/store
4826 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004827 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004828 Info.setAllowsMemory();
4829 Name++;
4830 return true;
4831 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004832 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004833 return false;
4834 }
Craig Topper3164f332014-03-11 03:39:26 +00004835 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004836 std::string R;
4837 switch (*Constraint) {
4838 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004839 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004840 Constraint++;
4841 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004842 case 'p': // 'p' should be translated to 'r' by default.
4843 R = std::string("r");
4844 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004845 default:
4846 return std::string(1, *Constraint);
4847 }
4848 return R;
4849 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004850 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004851 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004852 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004853 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004854 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004855
Bill Wendling9d1ee112012-10-25 23:28:48 +00004856 // Strip off constraint modifiers.
4857 while (Constraint[0] == '=' ||
4858 Constraint[0] == '+' ||
4859 Constraint[0] == '&')
4860 Constraint = Constraint.substr(1);
4861
4862 switch (Constraint[0]) {
4863 default: break;
4864 case 'r': {
4865 switch (Modifier) {
4866 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004867 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004868 case 'q':
4869 // A register of size 32 cannot fit a vector type.
4870 return false;
4871 }
4872 }
4873 }
4874
4875 return true;
4876 }
Craig Topper3164f332014-03-11 03:39:26 +00004877 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004878 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004879 return "";
4880 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004881
Craig Topper3164f332014-03-11 03:39:26 +00004882 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004883 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4884 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004885
Craig Topper3164f332014-03-11 03:39:26 +00004886 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004887 if (RegNo == 0) return 0;
4888 if (RegNo == 1) return 1;
4889 return -1;
4890 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004891
4892 bool hasSjLjLowering() const override {
4893 return true;
4894 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004895};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004896
Rafael Espindolaeb265472013-08-21 21:59:03 +00004897bool ARMTargetInfo::setFPMath(StringRef Name) {
4898 if (Name == "neon") {
4899 FPMath = FP_Neon;
4900 return true;
4901 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4902 Name == "vfp4") {
4903 FPMath = FP_VFP;
4904 return true;
4905 }
4906 return false;
4907}
4908
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004909const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004910 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004911 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004912 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4913
4914 // Float registers
4915 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4916 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4917 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004918 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004919
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004920 // Double registers
4921 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4922 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004923 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4924 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004925
4926 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004927 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4928 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004929};
4930
Craig Topperf054e3a2015-10-19 03:52:27 +00004931ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
4932 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004933}
4934
4935const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004936 { { "a1" }, "r0" },
4937 { { "a2" }, "r1" },
4938 { { "a3" }, "r2" },
4939 { { "a4" }, "r3" },
4940 { { "v1" }, "r4" },
4941 { { "v2" }, "r5" },
4942 { { "v3" }, "r6" },
4943 { { "v4" }, "r7" },
4944 { { "v5" }, "r8" },
4945 { { "v6", "rfp" }, "r9" },
4946 { { "sl" }, "r10" },
4947 { { "fp" }, "r11" },
4948 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004949 { { "r13" }, "sp" },
4950 { { "r14" }, "lr" },
4951 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004952 // The S, D and Q registers overlap, but aren't really aliases; we
4953 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004954};
4955
Craig Topperf054e3a2015-10-19 03:52:27 +00004956ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
4957 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004958}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004959
4960const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004961#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004962 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004963#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4964 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004965#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004966
Craig Topper07d3b622015-08-07 05:14:44 +00004967#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004968 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004969#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004970 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004971#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4972 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004973#include "clang/Basic/BuiltinsARM.def"
4974};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004975
4976class ARMleTargetInfo : public ARMTargetInfo {
4977public:
4978 ARMleTargetInfo(const llvm::Triple &Triple)
4979 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004980 void getTargetDefines(const LangOptions &Opts,
4981 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004982 Builder.defineMacro("__ARMEL__");
4983 ARMTargetInfo::getTargetDefines(Opts, Builder);
4984 }
4985};
4986
4987class ARMbeTargetInfo : public ARMTargetInfo {
4988public:
4989 ARMbeTargetInfo(const llvm::Triple &Triple)
4990 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004991 void getTargetDefines(const LangOptions &Opts,
4992 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004993 Builder.defineMacro("__ARMEB__");
4994 Builder.defineMacro("__ARM_BIG_ENDIAN");
4995 ARMTargetInfo::getTargetDefines(Opts, Builder);
4996 }
4997};
Chris Lattner17df24e2008-04-21 18:56:49 +00004998
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004999class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5000 const llvm::Triple Triple;
5001public:
5002 WindowsARMTargetInfo(const llvm::Triple &Triple)
5003 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
5004 TLSSupported = false;
5005 WCharType = UnsignedShort;
5006 SizeType = UnsignedInt;
5007 UserLabelPrefix = "";
5008 }
5009 void getVisualStudioDefines(const LangOptions &Opts,
5010 MacroBuilder &Builder) const {
5011 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5012
5013 // FIXME: this is invalid for WindowsCE
5014 Builder.defineMacro("_M_ARM_NT", "1");
5015 Builder.defineMacro("_M_ARMT", "_M_ARM");
5016 Builder.defineMacro("_M_THUMB", "_M_ARM");
5017
5018 assert((Triple.getArch() == llvm::Triple::arm ||
5019 Triple.getArch() == llvm::Triple::thumb) &&
5020 "invalid architecture for Windows ARM target info");
5021 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5022 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5023
5024 // TODO map the complete set of values
5025 // 31: VFPv3 40: VFPv4
5026 Builder.defineMacro("_M_ARM_FP", "31");
5027 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005028 BuiltinVaListKind getBuiltinVaListKind() const override {
5029 return TargetInfo::CharPtrBuiltinVaList;
5030 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005031 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5032 switch (CC) {
5033 case CC_X86StdCall:
5034 case CC_X86ThisCall:
5035 case CC_X86FastCall:
5036 case CC_X86VectorCall:
5037 return CCCR_Ignore;
5038 case CC_C:
5039 return CCCR_OK;
5040 default:
5041 return CCCR_Warning;
5042 }
5043 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005044};
5045
5046// Windows ARM + Itanium C++ ABI Target
5047class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5048public:
5049 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5050 : WindowsARMTargetInfo(Triple) {
5051 TheCXXABI.set(TargetCXXABI::GenericARM);
5052 }
5053
5054 void getTargetDefines(const LangOptions &Opts,
5055 MacroBuilder &Builder) const override {
5056 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5057
5058 if (Opts.MSVCCompat)
5059 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5060 }
5061};
5062
5063// Windows ARM, MS (C++) ABI
5064class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5065public:
5066 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5067 : WindowsARMTargetInfo(Triple) {
5068 TheCXXABI.set(TargetCXXABI::Microsoft);
5069 }
5070
5071 void getTargetDefines(const LangOptions &Opts,
5072 MacroBuilder &Builder) const override {
5073 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5074 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5075 }
5076};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005077
Yaron Keren321249c2015-07-15 13:32:23 +00005078// ARM MinGW target
5079class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5080public:
5081 MinGWARMTargetInfo(const llvm::Triple &Triple)
5082 : WindowsARMTargetInfo(Triple) {
5083 TheCXXABI.set(TargetCXXABI::GenericARM);
5084 }
5085
5086 void getTargetDefines(const LangOptions &Opts,
5087 MacroBuilder &Builder) const override {
5088 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5089 DefineStd(Builder, "WIN32", Opts);
5090 DefineStd(Builder, "WINNT", Opts);
5091 Builder.defineMacro("_ARM_");
5092 addMinGWDefines(Opts, Builder);
5093 }
5094};
5095
5096// ARM Cygwin target
5097class CygwinARMTargetInfo : public ARMleTargetInfo {
5098public:
5099 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5100 TLSSupported = false;
5101 WCharType = UnsignedShort;
5102 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005103 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005104 }
5105 void getTargetDefines(const LangOptions &Opts,
5106 MacroBuilder &Builder) const override {
5107 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5108 Builder.defineMacro("_ARM_");
5109 Builder.defineMacro("__CYGWIN__");
5110 Builder.defineMacro("__CYGWIN32__");
5111 DefineStd(Builder, "unix", Opts);
5112 if (Opts.CPlusPlus)
5113 Builder.defineMacro("_GNU_SOURCE");
5114 }
5115};
5116
Mike Stump11289f42009-09-09 15:08:12 +00005117class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005118 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005119protected:
Craig Topper3164f332014-03-11 03:39:26 +00005120 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5121 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005122 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005123 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005124
Torok Edwinb2b37c62009-06-30 17:10:35 +00005125public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005126 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005127 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005128 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005129 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005130 // FIXME: This should be based off of the target features in
5131 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005132 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005133
5134 // Darwin on iOS uses a variant of the ARM C++ ABI.
5135 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005136 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005137};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005138
Tim Northover573cbee2014-05-24 12:52:07 +00005139class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005140 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005141 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5142 static const char *const GCCRegNames[];
5143
James Molloy75f5f9e2014-04-16 15:33:48 +00005144 enum FPUModeEnum {
5145 FPUMode,
5146 NeonMode
5147 };
5148
5149 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005150 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005151 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005152 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005153
Tim Northovera2ee4332014-03-29 15:09:45 +00005154 static const Builtin::Info BuiltinInfo[];
5155
5156 std::string ABI;
5157
5158public:
Tim Northover573cbee2014-05-24 12:52:07 +00005159 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005160 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005161
5162 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5163 WCharType = SignedInt;
5164
5165 // NetBSD apparently prefers consistency across ARM targets to consistency
5166 // across 64-bit targets.
5167 Int64Type = SignedLongLong;
5168 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005169 } else {
5170 WCharType = UnsignedInt;
5171 Int64Type = SignedLong;
5172 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005173 }
5174
Tim Northovera2ee4332014-03-29 15:09:45 +00005175 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005176 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005177 MaxAtomicInlineWidth = 128;
5178 MaxAtomicPromoteWidth = 128;
5179
Tim Northovera6a19f12015-02-06 01:25:07 +00005180 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005181 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5182
Tim Northovera2ee4332014-03-29 15:09:45 +00005183 // {} in inline assembly are neon specifiers, not assembly variant
5184 // specifiers.
5185 NoAsmVariants = true;
5186
Tim Northover7ad87af2015-01-16 18:44:04 +00005187 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5188 // contributes to the alignment of the containing aggregate in the same way
5189 // a plain (non bit-field) member of that type would, without exception for
5190 // zero-sized or anonymous bit-fields."
5191 UseBitFieldTypeAlignment = true;
5192 UseZeroLengthBitfieldAlignment = true;
5193
Tim Northover573cbee2014-05-24 12:52:07 +00005194 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005195 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5196 }
5197
Alp Toker4925ba72014-06-07 23:30:42 +00005198 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005199 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005200 if (Name != "aapcs" && Name != "darwinpcs")
5201 return false;
5202
5203 ABI = Name;
5204 return true;
5205 }
5206
David Blaikie1cbb9712014-11-14 19:09:44 +00005207 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005208 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005209 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005210 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005211 .Case("cyclone", true)
5212 .Default(false);
5213 return CPUKnown;
5214 }
5215
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005216 void getTargetDefines(const LangOptions &Opts,
5217 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005218 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005219 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005220
5221 // Target properties.
5222 Builder.defineMacro("_LP64");
5223 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005224
5225 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5226 Builder.defineMacro("__ARM_ACLE", "200");
5227 Builder.defineMacro("__ARM_ARCH", "8");
5228 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5229
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005230 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005231 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005232 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005233
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005234 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5235 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5236 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5237 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005238 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005239 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5240 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005241
5242 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5243
5244 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005245 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005246
5247 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5248 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005249 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5250 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005251
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005252 if (Opts.UnsafeFPMath)
5253 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005254
5255 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5256
5257 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5258 Opts.ShortEnums ? "1" : "4");
5259
James Molloy75f5f9e2014-04-16 15:33:48 +00005260 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005261 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005262 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005263 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005264 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005265
Bradley Smith418c5932014-05-02 15:17:51 +00005266 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005267 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005268
James Molloy75f5f9e2014-04-16 15:33:48 +00005269 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005270 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5271
5272 if (Unaligned)
5273 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005274
5275 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5276 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5277 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5278 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5279 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005280 }
5281
Craig Topper6c03a542015-10-19 04:51:35 +00005282 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5283 return llvm::makeArrayRef(BuiltinInfo,
5284 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005285 }
5286
David Blaikie1cbb9712014-11-14 19:09:44 +00005287 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005288 return Feature == "aarch64" ||
5289 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005290 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005291 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005292 }
5293
James Molloy5e73df52014-04-16 15:06:20 +00005294 bool handleTargetFeatures(std::vector<std::string> &Features,
5295 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005296 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005297 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005298 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005299 Unaligned = 1;
5300
Eric Christopher610fe112015-08-26 08:21:55 +00005301 for (const auto &Feature : Features) {
5302 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005303 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005304 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005305 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005306 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005307 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005308 if (Feature == "+strict-align")
5309 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005310 }
5311
Eric Christopher964a5f32015-08-05 23:48:05 +00005312 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005313
5314 return true;
5315 }
5316
David Blaikie1cbb9712014-11-14 19:09:44 +00005317 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005318
David Blaikie1cbb9712014-11-14 19:09:44 +00005319 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005320 return TargetInfo::AArch64ABIBuiltinVaList;
5321 }
5322
Craig Topperf054e3a2015-10-19 03:52:27 +00005323 ArrayRef<const char *> getGCCRegNames() const override;
5324 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005325
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005326 bool validateAsmConstraint(const char *&Name,
5327 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005328 switch (*Name) {
5329 default:
5330 return false;
5331 case 'w': // Floating point and SIMD registers (V0-V31)
5332 Info.setAllowsRegister();
5333 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005334 case 'I': // Constant that can be used with an ADD instruction
5335 case 'J': // Constant that can be used with a SUB instruction
5336 case 'K': // Constant that can be used with a 32-bit logical instruction
5337 case 'L': // Constant that can be used with a 64-bit logical instruction
5338 case 'M': // Constant that can be used as a 32-bit MOV immediate
5339 case 'N': // Constant that can be used as a 64-bit MOV immediate
5340 case 'Y': // Floating point constant zero
5341 case 'Z': // Integer constant zero
5342 return true;
5343 case 'Q': // A memory reference with base register and no offset
5344 Info.setAllowsMemory();
5345 return true;
5346 case 'S': // A symbolic address
5347 Info.setAllowsRegister();
5348 return true;
5349 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005350 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5351 // Utf: A memory address suitable for ldp/stp in TF mode.
5352 // Usa: An absolute symbolic address.
5353 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5354 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005355 case 'z': // Zero register, wzr or xzr
5356 Info.setAllowsRegister();
5357 return true;
5358 case 'x': // Floating point and SIMD registers (V0-V15)
5359 Info.setAllowsRegister();
5360 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005361 }
5362 return false;
5363 }
5364
Akira Hatanaka987f1862014-08-22 06:05:21 +00005365 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005366 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005367 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005368 // Strip off constraint modifiers.
5369 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5370 Constraint = Constraint.substr(1);
5371
5372 switch (Constraint[0]) {
5373 default:
5374 return true;
5375 case 'z':
5376 case 'r': {
5377 switch (Modifier) {
5378 case 'x':
5379 case 'w':
5380 // For now assume that the person knows what they're
5381 // doing with the modifier.
5382 return true;
5383 default:
5384 // By default an 'r' constraint will be in the 'x'
5385 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005386 if (Size == 64)
5387 return true;
5388
5389 SuggestedModifier = "w";
5390 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005391 }
5392 }
5393 }
5394 }
5395
David Blaikie1cbb9712014-11-14 19:09:44 +00005396 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005397
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005398 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005399 if (RegNo == 0)
5400 return 0;
5401 if (RegNo == 1)
5402 return 1;
5403 return -1;
5404 }
5405};
5406
Tim Northover573cbee2014-05-24 12:52:07 +00005407const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005408 // 32-bit Integer registers
5409 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5410 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5411 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5412
5413 // 64-bit Integer registers
5414 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5415 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5416 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5417
5418 // 32-bit floating point regsisters
5419 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5420 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5421 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5422
5423 // 64-bit floating point regsisters
5424 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5425 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5426 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5427
5428 // Vector registers
5429 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5430 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5431 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5432};
5433
Craig Topperf054e3a2015-10-19 03:52:27 +00005434ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5435 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005436}
5437
Tim Northover573cbee2014-05-24 12:52:07 +00005438const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005439 { { "w31" }, "wsp" },
5440 { { "x29" }, "fp" },
5441 { { "x30" }, "lr" },
5442 { { "x31" }, "sp" },
5443 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5444 // don't want to substitute one of these for a different-sized one.
5445};
5446
Craig Topperf054e3a2015-10-19 03:52:27 +00005447ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5448 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005449}
5450
Tim Northover573cbee2014-05-24 12:52:07 +00005451const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005452#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005453 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005454#include "clang/Basic/BuiltinsNEON.def"
5455
5456#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005457 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005458#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005459};
James Molloy5e73df52014-04-16 15:06:20 +00005460
Tim Northover573cbee2014-05-24 12:52:07 +00005461class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005462 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005463 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005464 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005465 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005466 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005467 }
5468
5469public:
Tim Northover573cbee2014-05-24 12:52:07 +00005470 AArch64leTargetInfo(const llvm::Triple &Triple)
5471 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005472 BigEndian = false;
5473 }
5474 void getTargetDefines(const LangOptions &Opts,
5475 MacroBuilder &Builder) const override {
5476 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005477 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005478 }
5479};
5480
Tim Northover573cbee2014-05-24 12:52:07 +00005481class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005482 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005483 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005484 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005485 }
5486
5487public:
Tim Northover573cbee2014-05-24 12:52:07 +00005488 AArch64beTargetInfo(const llvm::Triple &Triple)
5489 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005490 void getTargetDefines(const LangOptions &Opts,
5491 MacroBuilder &Builder) const override {
5492 Builder.defineMacro("__AARCH64EB__");
5493 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5494 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005495 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005496 }
5497};
Tim Northovera2ee4332014-03-29 15:09:45 +00005498
Tim Northover573cbee2014-05-24 12:52:07 +00005499class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005500protected:
5501 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5502 MacroBuilder &Builder) const override {
5503 Builder.defineMacro("__AARCH64_SIMD__");
5504 Builder.defineMacro("__ARM64_ARCH_8__");
5505 Builder.defineMacro("__ARM_NEON__");
5506 Builder.defineMacro("__LITTLE_ENDIAN__");
5507 Builder.defineMacro("__REGISTER_PREFIX__", "");
5508 Builder.defineMacro("__arm64", "1");
5509 Builder.defineMacro("__arm64__", "1");
5510
5511 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5512 }
5513
Tim Northovera2ee4332014-03-29 15:09:45 +00005514public:
Tim Northover573cbee2014-05-24 12:52:07 +00005515 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5516 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005517 Int64Type = SignedLongLong;
5518 WCharType = SignedInt;
5519 UseSignedCharForObjCBool = false;
5520
Tim Northovera6a19f12015-02-06 01:25:07 +00005521 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005522 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5523
5524 TheCXXABI.set(TargetCXXABI::iOS64);
5525 }
5526
David Blaikie1cbb9712014-11-14 19:09:44 +00005527 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005528 return TargetInfo::CharPtrBuiltinVaList;
5529 }
5530};
Tim Northovera2ee4332014-03-29 15:09:45 +00005531
Tony Linthicum76329bf2011-12-12 21:14:55 +00005532// Hexagon abstract base class
5533class HexagonTargetInfo : public TargetInfo {
5534 static const Builtin::Info BuiltinInfo[];
5535 static const char * const GCCRegNames[];
5536 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5537 std::string CPU;
5538public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005539 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005540 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005541 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005542
5543 // {} in inline assembly are packet specifiers, not assembly variant
5544 // specifiers.
5545 NoAsmVariants = true;
5546 }
5547
Craig Topper6c03a542015-10-19 04:51:35 +00005548 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5549 return llvm::makeArrayRef(BuiltinInfo,
5550 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005551 }
5552
Craig Topper3164f332014-03-11 03:39:26 +00005553 bool validateAsmConstraint(const char *&Name,
5554 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005555 return true;
5556 }
5557
Craig Topper3164f332014-03-11 03:39:26 +00005558 void getTargetDefines(const LangOptions &Opts,
5559 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005560
Craig Topper3164f332014-03-11 03:39:26 +00005561 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005562 return Feature == "hexagon";
5563 }
Craig Topper3164f332014-03-11 03:39:26 +00005564
5565 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005566 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005567 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005568 ArrayRef<const char *> getGCCRegNames() const override;
5569 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005570 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005571 return "";
5572 }
Sebastian Pop86500282012-01-13 20:37:10 +00005573
5574 static const char *getHexagonCPUSuffix(StringRef Name) {
5575 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005576 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005577 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005578 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005579 }
5580
Craig Topper3164f332014-03-11 03:39:26 +00005581 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005582 if (!getHexagonCPUSuffix(Name))
5583 return false;
5584
Tony Linthicum76329bf2011-12-12 21:14:55 +00005585 CPU = Name;
5586 return true;
5587 }
5588};
5589
5590void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5591 MacroBuilder &Builder) const {
5592 Builder.defineMacro("qdsp6");
5593 Builder.defineMacro("__qdsp6", "1");
5594 Builder.defineMacro("__qdsp6__", "1");
5595
5596 Builder.defineMacro("hexagon");
5597 Builder.defineMacro("__hexagon", "1");
5598 Builder.defineMacro("__hexagon__", "1");
5599
5600 if(CPU == "hexagonv1") {
5601 Builder.defineMacro("__HEXAGON_V1__");
5602 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5603 if(Opts.HexagonQdsp6Compat) {
5604 Builder.defineMacro("__QDSP6_V1__");
5605 Builder.defineMacro("__QDSP6_ARCH__", "1");
5606 }
5607 }
5608 else if(CPU == "hexagonv2") {
5609 Builder.defineMacro("__HEXAGON_V2__");
5610 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5611 if(Opts.HexagonQdsp6Compat) {
5612 Builder.defineMacro("__QDSP6_V2__");
5613 Builder.defineMacro("__QDSP6_ARCH__", "2");
5614 }
5615 }
5616 else if(CPU == "hexagonv3") {
5617 Builder.defineMacro("__HEXAGON_V3__");
5618 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5619 if(Opts.HexagonQdsp6Compat) {
5620 Builder.defineMacro("__QDSP6_V3__");
5621 Builder.defineMacro("__QDSP6_ARCH__", "3");
5622 }
5623 }
5624 else if(CPU == "hexagonv4") {
5625 Builder.defineMacro("__HEXAGON_V4__");
5626 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5627 if(Opts.HexagonQdsp6Compat) {
5628 Builder.defineMacro("__QDSP6_V4__");
5629 Builder.defineMacro("__QDSP6_ARCH__", "4");
5630 }
5631 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005632 else if(CPU == "hexagonv5") {
5633 Builder.defineMacro("__HEXAGON_V5__");
5634 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5635 if(Opts.HexagonQdsp6Compat) {
5636 Builder.defineMacro("__QDSP6_V5__");
5637 Builder.defineMacro("__QDSP6_ARCH__", "5");
5638 }
5639 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005640}
5641
5642const char * const HexagonTargetInfo::GCCRegNames[] = {
5643 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5644 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5645 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5646 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5647 "p0", "p1", "p2", "p3",
5648 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5649};
5650
Craig Topperf054e3a2015-10-19 03:52:27 +00005651ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const {
5652 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005653}
5654
5655
5656const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5657 { { "sp" }, "r29" },
5658 { { "fp" }, "r30" },
5659 { { "lr" }, "r31" },
5660 };
5661
Craig Topperf054e3a2015-10-19 03:52:27 +00005662ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5663 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005664}
5665
5666
5667const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005668#define BUILTIN(ID, TYPE, ATTRS) \
5669 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5670#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5671 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005672#include "clang/Basic/BuiltinsHexagon.def"
5673};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005674
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005675// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5676class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005677 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5678 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005679 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005680public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005681 SparcTargetInfo(const llvm::Triple &Triple)
5682 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005683
Craig Topper3164f332014-03-11 03:39:26 +00005684 bool handleTargetFeatures(std::vector<std::string> &Features,
5685 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005686 // The backend doesn't actually handle soft float yet, but in case someone
5687 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005688 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5689 if (Feature != Features.end()) {
5690 SoftFloat = true;
5691 Features.erase(Feature);
5692 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005693 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005694 }
Craig Topper3164f332014-03-11 03:39:26 +00005695 void getTargetDefines(const LangOptions &Opts,
5696 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005697 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005698 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005699
5700 if (SoftFloat)
5701 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005702 }
Craig Topper3164f332014-03-11 03:39:26 +00005703
5704 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005705 return llvm::StringSwitch<bool>(Feature)
5706 .Case("softfloat", SoftFloat)
5707 .Case("sparc", true)
5708 .Default(false);
5709 }
Craig Topper3164f332014-03-11 03:39:26 +00005710
Craig Topper6c03a542015-10-19 04:51:35 +00005711 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005712 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005713 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005714 }
Craig Topper3164f332014-03-11 03:39:26 +00005715 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005716 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005717 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005718 ArrayRef<const char *> getGCCRegNames() const override;
5719 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005720 bool validateAsmConstraint(const char *&Name,
5721 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005722 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005723 switch (*Name) {
5724 case 'I': // Signed 13-bit constant
5725 case 'J': // Zero
5726 case 'K': // 32-bit constant with the low 12 bits clear
5727 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5728 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5729 case 'N': // Same as 'K' but zext (required for SIMode)
5730 case 'O': // The constant 4096
5731 return true;
5732 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005733 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005734 }
Craig Topper3164f332014-03-11 03:39:26 +00005735 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005736 // FIXME: Implement!
5737 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005738 }
5739};
5740
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005741const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005742 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5743 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5744 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5745 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5746};
5747
Craig Topperf054e3a2015-10-19 03:52:27 +00005748ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
5749 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00005750}
5751
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005752const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005753 { { "g0" }, "r0" },
5754 { { "g1" }, "r1" },
5755 { { "g2" }, "r2" },
5756 { { "g3" }, "r3" },
5757 { { "g4" }, "r4" },
5758 { { "g5" }, "r5" },
5759 { { "g6" }, "r6" },
5760 { { "g7" }, "r7" },
5761 { { "o0" }, "r8" },
5762 { { "o1" }, "r9" },
5763 { { "o2" }, "r10" },
5764 { { "o3" }, "r11" },
5765 { { "o4" }, "r12" },
5766 { { "o5" }, "r13" },
5767 { { "o6", "sp" }, "r14" },
5768 { { "o7" }, "r15" },
5769 { { "l0" }, "r16" },
5770 { { "l1" }, "r17" },
5771 { { "l2" }, "r18" },
5772 { { "l3" }, "r19" },
5773 { { "l4" }, "r20" },
5774 { { "l5" }, "r21" },
5775 { { "l6" }, "r22" },
5776 { { "l7" }, "r23" },
5777 { { "i0" }, "r24" },
5778 { { "i1" }, "r25" },
5779 { { "i2" }, "r26" },
5780 { { "i3" }, "r27" },
5781 { { "i4" }, "r28" },
5782 { { "i5" }, "r29" },
5783 { { "i6", "fp" }, "r30" },
5784 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005785};
5786
Craig Topperf054e3a2015-10-19 03:52:27 +00005787ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
5788 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00005789}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005790
5791// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5792class SparcV8TargetInfo : public SparcTargetInfo {
5793public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005794 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005795 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005796 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5797 switch (getTriple().getOS()) {
5798 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005799 SizeType = UnsignedInt;
5800 IntPtrType = SignedInt;
5801 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005802 break;
5803 case llvm::Triple::NetBSD:
5804 case llvm::Triple::OpenBSD:
5805 SizeType = UnsignedLong;
5806 IntPtrType = SignedLong;
5807 PtrDiffType = SignedLong;
5808 break;
Brad Smith56495d52015-08-13 22:00:53 +00005809 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005810 }
5811
Craig Topper3164f332014-03-11 03:39:26 +00005812 void getTargetDefines(const LangOptions &Opts,
5813 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005814 SparcTargetInfo::getTargetDefines(Opts, Builder);
5815 Builder.defineMacro("__sparcv8");
5816 }
5817};
5818
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005819// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5820class SparcV8elTargetInfo : public SparcV8TargetInfo {
5821 public:
5822 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005823 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005824 BigEndian = false;
5825 }
5826};
5827
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005828// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5829class SparcV9TargetInfo : public SparcTargetInfo {
5830public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005831 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005832 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005833 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005834 // This is an LP64 platform.
5835 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005836
5837 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005838 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005839 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005840 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005841 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005842 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005843
5844 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5845 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5846 LongDoubleWidth = 128;
5847 LongDoubleAlign = 128;
5848 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005849 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005850 }
5851
Craig Topper3164f332014-03-11 03:39:26 +00005852 void getTargetDefines(const LangOptions &Opts,
5853 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005854 SparcTargetInfo::getTargetDefines(Opts, Builder);
5855 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005856 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005857 // Solaris doesn't need these variants, but the BSDs do.
5858 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005859 Builder.defineMacro("__sparc64__");
5860 Builder.defineMacro("__sparc_v9__");
5861 Builder.defineMacro("__sparcv9__");
5862 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005863 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005864
Craig Topper3164f332014-03-11 03:39:26 +00005865 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005866 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5867 .Case("v9", true)
5868 .Case("ultrasparc", true)
5869 .Case("ultrasparc3", true)
5870 .Case("niagara", true)
5871 .Case("niagara2", true)
5872 .Case("niagara3", true)
5873 .Case("niagara4", true)
5874 .Default(false);
5875
5876 // No need to store the CPU yet. There aren't any CPU-specific
5877 // macros to define.
5878 return CPUKnown;
5879 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005880};
5881
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005882class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005883 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005884 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005885 std::string CPU;
5886 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005887 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005888
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005889public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005890 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00005891 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
5892 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005893 IntMaxType = SignedLong;
5894 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005895 TLSSupported = true;
5896 IntWidth = IntAlign = 32;
5897 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5898 PointerWidth = PointerAlign = 64;
5899 LongDoubleWidth = 128;
5900 LongDoubleAlign = 64;
5901 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005902 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005903 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005904 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005905 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5906 }
5907 void getTargetDefines(const LangOptions &Opts,
5908 MacroBuilder &Builder) const override {
5909 Builder.defineMacro("__s390__");
5910 Builder.defineMacro("__s390x__");
5911 Builder.defineMacro("__zarch__");
5912 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005913 if (HasTransactionalExecution)
5914 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005915 if (Opts.ZVector)
5916 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005917 }
Craig Topper6c03a542015-10-19 04:51:35 +00005918 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5919 return llvm::makeArrayRef(BuiltinInfo,
5920 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00005921 }
5922
Craig Topperf054e3a2015-10-19 03:52:27 +00005923 ArrayRef<const char *> getGCCRegNames() const override;
5924 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005925 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00005926 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00005927 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005928 bool validateAsmConstraint(const char *&Name,
5929 TargetInfo::ConstraintInfo &info) const override;
5930 const char *getClobbers() const override {
5931 // FIXME: Is this really right?
5932 return "";
5933 }
5934 BuiltinVaListKind getBuiltinVaListKind() const override {
5935 return TargetInfo::SystemZBuiltinVaList;
5936 }
5937 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005938 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005939 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5940 .Case("z10", true)
5941 .Case("z196", true)
5942 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005943 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005944 .Default(false);
5945
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005946 return CPUKnown;
5947 }
Eric Christopher8c47b422015-10-09 18:39:55 +00005948 bool
5949 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5950 StringRef CPU,
5951 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005952 if (CPU == "zEC12")
5953 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005954 if (CPU == "z13") {
5955 Features["transactional-execution"] = true;
5956 Features["vector"] = true;
5957 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005958 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005959 }
5960
5961 bool handleTargetFeatures(std::vector<std::string> &Features,
5962 DiagnosticsEngine &Diags) override {
5963 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005964 for (const auto &Feature : Features) {
5965 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005966 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005967 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005968 HasVector = true;
5969 }
5970 // If we use the vector ABI, vector types are 64-bit aligned.
5971 if (HasVector) {
5972 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005973 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5974 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005975 }
5976 return true;
5977 }
5978
5979 bool hasFeature(StringRef Feature) const override {
5980 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005981 .Case("systemz", true)
5982 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005983 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005984 .Default(false);
5985 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005986
5987 StringRef getABI() const override {
5988 if (HasVector)
5989 return "vector";
5990 return "";
5991 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005992
5993 bool useFloat128ManglingForLongDouble() const override {
5994 return true;
5995 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005996};
5997
5998const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5999#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006000 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006001#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006002};
6003
6004const char *const SystemZTargetInfo::GCCRegNames[] = {
6005 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6006 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6007 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6008 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6009};
6010
Craig Topperf054e3a2015-10-19 03:52:27 +00006011ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6012 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006013}
6014
6015bool SystemZTargetInfo::
6016validateAsmConstraint(const char *&Name,
6017 TargetInfo::ConstraintInfo &Info) const {
6018 switch (*Name) {
6019 default:
6020 return false;
6021
6022 case 'a': // Address register
6023 case 'd': // Data register (equivalent to 'r')
6024 case 'f': // Floating-point register
6025 Info.setAllowsRegister();
6026 return true;
6027
6028 case 'I': // Unsigned 8-bit constant
6029 case 'J': // Unsigned 12-bit constant
6030 case 'K': // Signed 16-bit constant
6031 case 'L': // Signed 20-bit displacement (on all targets we support)
6032 case 'M': // 0x7fffffff
6033 return true;
6034
6035 case 'Q': // Memory with base and unsigned 12-bit displacement
6036 case 'R': // Likewise, plus an index
6037 case 'S': // Memory with base and signed 20-bit displacement
6038 case 'T': // Likewise, plus an index
6039 Info.setAllowsMemory();
6040 return true;
6041 }
6042}
Ulrich Weigand47445072013-05-06 16:26:41 +00006043
Eric Christopherc48497a2015-09-18 21:26:24 +00006044class MSP430TargetInfo : public TargetInfo {
6045 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006046
Eric Christopherc48497a2015-09-18 21:26:24 +00006047public:
6048 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6049 BigEndian = false;
6050 TLSSupported = false;
6051 IntWidth = 16;
6052 IntAlign = 16;
6053 LongWidth = 32;
6054 LongLongWidth = 64;
6055 LongAlign = LongLongAlign = 16;
6056 PointerWidth = 16;
6057 PointerAlign = 16;
6058 SuitableAlign = 16;
6059 SizeType = UnsignedInt;
6060 IntMaxType = SignedLongLong;
6061 IntPtrType = SignedInt;
6062 PtrDiffType = SignedInt;
6063 SigAtomicType = SignedLong;
6064 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006065 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006066 void getTargetDefines(const LangOptions &Opts,
6067 MacroBuilder &Builder) const override {
6068 Builder.defineMacro("MSP430");
6069 Builder.defineMacro("__MSP430__");
6070 // FIXME: defines for different 'flavours' of MCU
6071 }
Craig Topper6c03a542015-10-19 04:51:35 +00006072 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006073 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006074 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006075 }
6076 bool hasFeature(StringRef Feature) const override {
6077 return Feature == "msp430";
6078 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006079 ArrayRef<const char *> getGCCRegNames() const override;
6080 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006081 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006082 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006083 }
6084 bool validateAsmConstraint(const char *&Name,
6085 TargetInfo::ConstraintInfo &info) const override {
6086 // FIXME: implement
6087 switch (*Name) {
6088 case 'K': // the constant 1
6089 case 'L': // constant -1^20 .. 1^19
6090 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006091 return true;
6092 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006093 // No target constraints for now.
6094 return false;
6095 }
6096 const char *getClobbers() const override {
6097 // FIXME: Is this really right?
6098 return "";
6099 }
6100 BuiltinVaListKind getBuiltinVaListKind() const override {
6101 // FIXME: implement
6102 return TargetInfo::CharPtrBuiltinVaList;
6103 }
6104};
6105
6106const char *const MSP430TargetInfo::GCCRegNames[] = {
6107 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6108 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6109
Craig Topperf054e3a2015-10-19 03:52:27 +00006110ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6111 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006112}
6113
6114// LLVM and Clang cannot be used directly to output native binaries for
6115// target, but is used to compile C code to llvm bitcode with correct
6116// type and alignment information.
6117//
6118// TCE uses the llvm bitcode as input and uses it for generating customized
6119// target processor and program binary. TCE co-design environment is
6120// publicly available in http://tce.cs.tut.fi
6121
6122static const unsigned TCEOpenCLAddrSpaceMap[] = {
6123 3, // opencl_global
6124 4, // opencl_local
6125 5, // opencl_constant
6126 // FIXME: generic has to be added to the target
6127 0, // opencl_generic
6128 0, // cuda_device
6129 0, // cuda_constant
6130 0 // cuda_shared
6131};
6132
6133class TCETargetInfo : public TargetInfo {
6134public:
6135 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6136 TLSSupported = false;
6137 IntWidth = 32;
6138 LongWidth = LongLongWidth = 32;
6139 PointerWidth = 32;
6140 IntAlign = 32;
6141 LongAlign = LongLongAlign = 32;
6142 PointerAlign = 32;
6143 SuitableAlign = 32;
6144 SizeType = UnsignedInt;
6145 IntMaxType = SignedLong;
6146 IntPtrType = SignedInt;
6147 PtrDiffType = SignedInt;
6148 FloatWidth = 32;
6149 FloatAlign = 32;
6150 DoubleWidth = 32;
6151 DoubleAlign = 32;
6152 LongDoubleWidth = 32;
6153 LongDoubleAlign = 32;
6154 FloatFormat = &llvm::APFloat::IEEEsingle;
6155 DoubleFormat = &llvm::APFloat::IEEEsingle;
6156 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6157 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6158 "-f64:32-v64:32-v128:32-a:0:32-n32";
6159 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6160 UseAddrSpaceMapMangling = true;
6161 }
6162
6163 void getTargetDefines(const LangOptions &Opts,
6164 MacroBuilder &Builder) const override {
6165 DefineStd(Builder, "tce", Opts);
6166 Builder.defineMacro("__TCE__");
6167 Builder.defineMacro("__TCE_V1__");
6168 }
6169 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6170
Craig Topper6c03a542015-10-19 04:51:35 +00006171 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006172 const char *getClobbers() const override { return ""; }
6173 BuiltinVaListKind getBuiltinVaListKind() const override {
6174 return TargetInfo::VoidPtrBuiltinVaList;
6175 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006176 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006177 bool validateAsmConstraint(const char *&Name,
6178 TargetInfo::ConstraintInfo &info) const override {
6179 return true;
6180 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006181 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6182 return None;
6183 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006184};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006185
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006186class BPFTargetInfo : public TargetInfo {
6187public:
6188 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6189 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6190 SizeType = UnsignedLong;
6191 PtrDiffType = SignedLong;
6192 IntPtrType = SignedLong;
6193 IntMaxType = SignedLong;
6194 Int64Type = SignedLong;
6195 RegParmMax = 5;
6196 if (Triple.getArch() == llvm::Triple::bpfeb) {
6197 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006198 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006199 } else {
6200 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006201 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006202 }
6203 MaxAtomicPromoteWidth = 64;
6204 MaxAtomicInlineWidth = 64;
6205 TLSSupported = false;
6206 }
6207 void getTargetDefines(const LangOptions &Opts,
6208 MacroBuilder &Builder) const override {
6209 DefineStd(Builder, "bpf", Opts);
6210 Builder.defineMacro("__BPF__");
6211 }
6212 bool hasFeature(StringRef Feature) const override {
6213 return Feature == "bpf";
6214 }
6215
Craig Topper6c03a542015-10-19 04:51:35 +00006216 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006217 const char *getClobbers() const override {
6218 return "";
6219 }
6220 BuiltinVaListKind getBuiltinVaListKind() const override {
6221 return TargetInfo::VoidPtrBuiltinVaList;
6222 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006223 ArrayRef<const char *> getGCCRegNames() const override {
6224 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006225 }
6226 bool validateAsmConstraint(const char *&Name,
6227 TargetInfo::ConstraintInfo &info) const override {
6228 return true;
6229 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006230 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6231 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006232 }
6233};
6234
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006235class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006236 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006237
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006238 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006239 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006240 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006241 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006242 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006243 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006244 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006245 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006246 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006247 enum DspRevEnum {
6248 NoDSP, DSP1, DSP2
6249 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006250 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006251
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006252protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006253 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006254 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006255
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006256public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006257 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6258 const std::string &CPUStr)
6259 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006260 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006261 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6262 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6263 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006264
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006265 bool isNaN2008Default() const {
6266 return CPU == "mips32r6" || CPU == "mips64r6";
6267 }
6268
6269 bool isFP64Default() const {
6270 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6271 }
6272
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006273 bool isNan2008() const override {
6274 return IsNan2008;
6275 }
6276
Alp Toker4925ba72014-06-07 23:30:42 +00006277 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006278 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006279 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6280 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006281 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006282 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006283 .Case("mips1", IsMips32)
6284 .Case("mips2", IsMips32)
6285 .Case("mips3", true)
6286 .Case("mips4", true)
6287 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006288 .Case("mips32", IsMips32)
6289 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006290 .Case("mips32r3", IsMips32)
6291 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006292 .Case("mips32r6", IsMips32)
6293 .Case("mips64", true)
6294 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006295 .Case("mips64r3", true)
6296 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006297 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006298 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006299 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006300 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006301 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006302 const std::string& getCPU() const { return CPU; }
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 {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006307 if (CPU == "octeon")
6308 Features["mips64r2"] = Features["cnmips"] = true;
6309 else
6310 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006311 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006312 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006313
Craig Topper3164f332014-03-11 03:39:26 +00006314 void getTargetDefines(const LangOptions &Opts,
6315 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006316 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006317 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006318 if (Opts.GNUMode)
6319 Builder.defineMacro("mips");
6320
Simon Atanasyan683535b2012-08-29 19:14:58 +00006321 Builder.defineMacro("__REGISTER_PREFIX__", "");
6322
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006323 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006324 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006325 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006326 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006327 case SoftFloat:
6328 Builder.defineMacro("__mips_soft_float", Twine(1));
6329 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006330 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006331
Simon Atanasyan16071912013-04-14 14:07:30 +00006332 if (IsSingleFloat)
6333 Builder.defineMacro("__mips_single_float", Twine(1));
6334
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006335 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6336 Builder.defineMacro("_MIPS_FPSET",
6337 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6338
Simon Atanasyan72244b62012-07-05 16:06:06 +00006339 if (IsMips16)
6340 Builder.defineMacro("__mips16", Twine(1));
6341
Simon Atanasyan60777612013-04-14 14:07:51 +00006342 if (IsMicromips)
6343 Builder.defineMacro("__mips_micromips", Twine(1));
6344
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006345 if (IsNan2008)
6346 Builder.defineMacro("__mips_nan2008", Twine(1));
6347
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006348 switch (DspRev) {
6349 default:
6350 break;
6351 case DSP1:
6352 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6353 Builder.defineMacro("__mips_dsp", Twine(1));
6354 break;
6355 case DSP2:
6356 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6357 Builder.defineMacro("__mips_dspr2", Twine(1));
6358 Builder.defineMacro("__mips_dsp", Twine(1));
6359 break;
6360 }
6361
Jack Carter44ff1e52013-08-12 17:20:29 +00006362 if (HasMSA)
6363 Builder.defineMacro("__mips_msa", Twine(1));
6364
Simon Atanasyan26f19672012-04-05 19:28:31 +00006365 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6366 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6367 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006368
6369 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6370 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006371 }
6372
Craig Topper6c03a542015-10-19 04:51:35 +00006373 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6374 return llvm::makeArrayRef(BuiltinInfo,
6375 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006376 }
Craig Topper3164f332014-03-11 03:39:26 +00006377 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006378 return llvm::StringSwitch<bool>(Feature)
6379 .Case("mips", true)
6380 .Case("fp64", HasFP64)
6381 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006382 }
Craig Topper3164f332014-03-11 03:39:26 +00006383 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006384 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006385 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006386 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006387 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006388 // CPU register names
6389 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006390 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6391 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6392 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006393 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6394 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006395 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6396 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6397 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6398 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006399 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006400 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006401 "$fcc5","$fcc6","$fcc7",
6402 // MSA register names
6403 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6404 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6405 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6406 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6407 // MSA control register names
6408 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6409 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006410 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006411 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006412 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006413 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006414 bool validateAsmConstraint(const char *&Name,
6415 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006416 switch (*Name) {
6417 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006418 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006419 case 'r': // CPU registers.
6420 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006421 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006422 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006423 case 'c': // $25 for indirect jumps
6424 case 'l': // lo register
6425 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006426 Info.setAllowsRegister();
6427 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006428 case 'I': // Signed 16-bit constant
6429 case 'J': // Integer 0
6430 case 'K': // Unsigned 16-bit constant
6431 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6432 case 'M': // Constants not loadable via lui, addiu, or ori
6433 case 'N': // Constant -1 to -65535
6434 case 'O': // A signed 15-bit constant
6435 case 'P': // A constant between 1 go 65535
6436 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006437 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006438 Info.setAllowsMemory();
6439 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006440 case 'Z':
6441 if (Name[1] == 'C') { // An address usable by ll, and sc.
6442 Info.setAllowsMemory();
6443 Name++; // Skip over 'Z'.
6444 return true;
6445 }
6446 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006447 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006448 }
6449
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006450 std::string convertConstraint(const char *&Constraint) const override {
6451 std::string R;
6452 switch (*Constraint) {
6453 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6454 if (Constraint[1] == 'C') {
6455 R = std::string("^") + std::string(Constraint, 2);
6456 Constraint++;
6457 return R;
6458 }
6459 break;
6460 }
6461 return TargetInfo::convertConstraint(Constraint);
6462 }
6463
Craig Topper3164f332014-03-11 03:39:26 +00006464 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006465 // In GCC, $1 is not widely used in generated code (it's used only in a few
6466 // specific situations), so there is no real need for users to add it to
6467 // the clobbers list if they want to use it in their inline assembly code.
6468 //
6469 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6470 // code generation, so using it in inline assembly without adding it to the
6471 // clobbers list can cause conflicts between the inline assembly code and
6472 // the surrounding generated code.
6473 //
6474 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6475 // operands, which will conflict with the ".set at" assembler option (which
6476 // we use only for inline assembly, in order to maintain compatibility with
6477 // GCC) and will also conflict with the user's usage of $1.
6478 //
6479 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6480 // register for generated code is to automatically clobber $1 for all inline
6481 // assembly code.
6482 //
6483 // FIXME: We should automatically clobber $1 only for inline assembly code
6484 // which actually uses it. This would allow LLVM to use $1 for inline
6485 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006486 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006487 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006488
Craig Topper3164f332014-03-11 03:39:26 +00006489 bool handleTargetFeatures(std::vector<std::string> &Features,
6490 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006491 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006492 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006493 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006494 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006495 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006496 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006497 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006498
Eric Christopher610fe112015-08-26 08:21:55 +00006499 for (const auto &Feature : Features) {
6500 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006501 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006502 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006503 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006504 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006505 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006506 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006507 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006508 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006509 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006510 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006511 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006512 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006513 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006514 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006515 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006516 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006517 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006518 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006519 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006520 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006521 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006522 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006523
Eric Christopher964a5f32015-08-05 23:48:05 +00006524 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006525
Rafael Espindolaeb265472013-08-21 21:59:03 +00006526 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006527 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006528
Craig Topper3164f332014-03-11 03:39:26 +00006529 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006530 if (RegNo == 0) return 4;
6531 if (RegNo == 1) return 5;
6532 return -1;
6533 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006534
6535 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006536};
6537
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006538const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006539#define BUILTIN(ID, TYPE, ATTRS) \
6540 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6541#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6542 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006543#include "clang/Basic/BuiltinsMips.def"
6544};
6545
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006546class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006547public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006548 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006549 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006550 SizeType = UnsignedInt;
6551 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006552 Int64Type = SignedLongLong;
6553 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006554 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006555 }
Craig Topper3164f332014-03-11 03:39:26 +00006556 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006557 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006558 ABI = Name;
6559 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006560 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006561 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006562 }
Craig Topper3164f332014-03-11 03:39:26 +00006563 void getTargetDefines(const LangOptions &Opts,
6564 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006565 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006566
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006567 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006568 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6569
6570 const std::string& CPUStr = getCPU();
6571 if (CPUStr == "mips32")
6572 Builder.defineMacro("__mips_isa_rev", "1");
6573 else if (CPUStr == "mips32r2")
6574 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006575 else if (CPUStr == "mips32r3")
6576 Builder.defineMacro("__mips_isa_rev", "3");
6577 else if (CPUStr == "mips32r5")
6578 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006579 else if (CPUStr == "mips32r6")
6580 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006581
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006582 if (ABI == "o32") {
6583 Builder.defineMacro("__mips_o32");
6584 Builder.defineMacro("_ABIO32", "1");
6585 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6586 }
6587 else if (ABI == "eabi")
6588 Builder.defineMacro("__mips_eabi");
6589 else
David Blaikie83d382b2011-09-23 05:06:16 +00006590 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006591 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006592 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006593 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6594 { { "at" }, "$1" },
6595 { { "v0" }, "$2" },
6596 { { "v1" }, "$3" },
6597 { { "a0" }, "$4" },
6598 { { "a1" }, "$5" },
6599 { { "a2" }, "$6" },
6600 { { "a3" }, "$7" },
6601 { { "t0" }, "$8" },
6602 { { "t1" }, "$9" },
6603 { { "t2" }, "$10" },
6604 { { "t3" }, "$11" },
6605 { { "t4" }, "$12" },
6606 { { "t5" }, "$13" },
6607 { { "t6" }, "$14" },
6608 { { "t7" }, "$15" },
6609 { { "s0" }, "$16" },
6610 { { "s1" }, "$17" },
6611 { { "s2" }, "$18" },
6612 { { "s3" }, "$19" },
6613 { { "s4" }, "$20" },
6614 { { "s5" }, "$21" },
6615 { { "s6" }, "$22" },
6616 { { "s7" }, "$23" },
6617 { { "t8" }, "$24" },
6618 { { "t9" }, "$25" },
6619 { { "k0" }, "$26" },
6620 { { "k1" }, "$27" },
6621 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006622 { { "sp","$sp" }, "$29" },
6623 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006624 { { "ra" }, "$31" }
6625 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006626 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006627 }
6628};
6629
6630class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006631 void setDataLayoutString() override {
6632 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006633 }
6634
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006635public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006636 Mips32EBTargetInfo(const llvm::Triple &Triple)
6637 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006638 }
Craig Topper3164f332014-03-11 03:39:26 +00006639 void getTargetDefines(const LangOptions &Opts,
6640 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006641 DefineStd(Builder, "MIPSEB", Opts);
6642 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006643 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006644 }
6645};
6646
6647class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006648 void setDataLayoutString() override {
6649 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006650 }
6651
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006652public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006653 Mips32ELTargetInfo(const llvm::Triple &Triple)
6654 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006655 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006656 }
Craig Topper3164f332014-03-11 03:39:26 +00006657 void getTargetDefines(const LangOptions &Opts,
6658 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006659 DefineStd(Builder, "MIPSEL", Opts);
6660 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006661 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006662 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006663};
Akira Hatanakabef17452011-09-20 19:21:49 +00006664
6665class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006666public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006667 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006668 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006669 LongDoubleWidth = LongDoubleAlign = 128;
6670 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006671 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6672 LongDoubleWidth = LongDoubleAlign = 64;
6673 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6674 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006675 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006676 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006677 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006678 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006679
6680 void setN64ABITypes() {
6681 LongWidth = LongAlign = 64;
6682 PointerWidth = PointerAlign = 64;
6683 SizeType = UnsignedLong;
6684 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006685 Int64Type = SignedLong;
6686 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006687 }
6688
6689 void setN32ABITypes() {
6690 LongWidth = LongAlign = 32;
6691 PointerWidth = PointerAlign = 32;
6692 SizeType = UnsignedInt;
6693 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006694 Int64Type = SignedLongLong;
6695 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006696 }
6697
Craig Topper3164f332014-03-11 03:39:26 +00006698 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006699 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006700 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006701 ABI = Name;
6702 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006703 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006704 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006705 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006706 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006707 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006708 }
6709 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006710 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006711
Craig Topper3164f332014-03-11 03:39:26 +00006712 void getTargetDefines(const LangOptions &Opts,
6713 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006714 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006715
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006716 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006717 Builder.defineMacro("__mips64");
6718 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006719 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6720
6721 const std::string& CPUStr = getCPU();
6722 if (CPUStr == "mips64")
6723 Builder.defineMacro("__mips_isa_rev", "1");
6724 else if (CPUStr == "mips64r2")
6725 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006726 else if (CPUStr == "mips64r3")
6727 Builder.defineMacro("__mips_isa_rev", "3");
6728 else if (CPUStr == "mips64r5")
6729 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006730 else if (CPUStr == "mips64r6")
6731 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006732
Akira Hatanakabef17452011-09-20 19:21:49 +00006733 if (ABI == "n32") {
6734 Builder.defineMacro("__mips_n32");
6735 Builder.defineMacro("_ABIN32", "2");
6736 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6737 }
6738 else if (ABI == "n64") {
6739 Builder.defineMacro("__mips_n64");
6740 Builder.defineMacro("_ABI64", "3");
6741 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6742 }
6743 else
David Blaikie83d382b2011-09-23 05:06:16 +00006744 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006745 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006746 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006747 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6748 { { "at" }, "$1" },
6749 { { "v0" }, "$2" },
6750 { { "v1" }, "$3" },
6751 { { "a0" }, "$4" },
6752 { { "a1" }, "$5" },
6753 { { "a2" }, "$6" },
6754 { { "a3" }, "$7" },
6755 { { "a4" }, "$8" },
6756 { { "a5" }, "$9" },
6757 { { "a6" }, "$10" },
6758 { { "a7" }, "$11" },
6759 { { "t0" }, "$12" },
6760 { { "t1" }, "$13" },
6761 { { "t2" }, "$14" },
6762 { { "t3" }, "$15" },
6763 { { "s0" }, "$16" },
6764 { { "s1" }, "$17" },
6765 { { "s2" }, "$18" },
6766 { { "s3" }, "$19" },
6767 { { "s4" }, "$20" },
6768 { { "s5" }, "$21" },
6769 { { "s6" }, "$22" },
6770 { { "s7" }, "$23" },
6771 { { "t8" }, "$24" },
6772 { { "t9" }, "$25" },
6773 { { "k0" }, "$26" },
6774 { { "k1" }, "$27" },
6775 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006776 { { "sp","$sp" }, "$29" },
6777 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006778 { { "ra" }, "$31" }
6779 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006780 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00006781 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006782
6783 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006784};
6785
6786class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006787 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006788 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006789 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006790 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006791 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006792
Akira Hatanakabef17452011-09-20 19:21:49 +00006793 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006794
Akira Hatanakabef17452011-09-20 19:21:49 +00006795public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006797 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006798 void getTargetDefines(const LangOptions &Opts,
6799 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006800 DefineStd(Builder, "MIPSEB", Opts);
6801 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006802 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006803 }
6804};
6805
6806class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006807 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006808 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006809 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006810 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006811 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006812 }
6813public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006814 Mips64ELTargetInfo(const llvm::Triple &Triple)
6815 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006816 // Default ABI is n64.
6817 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006818 }
Craig Topper3164f332014-03-11 03:39:26 +00006819 void getTargetDefines(const LangOptions &Opts,
6820 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006821 DefineStd(Builder, "MIPSEL", Opts);
6822 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006823 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006824 }
6825};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006826
Ivan Krasindd7403e2011-08-24 20:22:22 +00006827class PNaClTargetInfo : public TargetInfo {
6828public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006829 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006830 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006831 this->UserLabelPrefix = "";
6832 this->LongAlign = 32;
6833 this->LongWidth = 32;
6834 this->PointerAlign = 32;
6835 this->PointerWidth = 32;
6836 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006837 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006838 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006839 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006840 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006841 this->SizeType = TargetInfo::UnsignedInt;
6842 this->PtrDiffType = TargetInfo::SignedInt;
6843 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006844 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006845 }
6846
Craig Toppere6f17d02014-03-11 04:07:52 +00006847 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006848 Builder.defineMacro("__le32__");
6849 Builder.defineMacro("__pnacl__");
6850 }
Craig Topper3164f332014-03-11 03:39:26 +00006851 void getTargetDefines(const LangOptions &Opts,
6852 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006853 getArchDefines(Opts, Builder);
6854 }
Craig Topper3164f332014-03-11 03:39:26 +00006855 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006856 return Feature == "pnacl";
6857 }
Craig Topper6c03a542015-10-19 04:51:35 +00006858 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00006859 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006860 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006861 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006862 ArrayRef<const char *> getGCCRegNames() const override;
6863 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006864 bool validateAsmConstraint(const char *&Name,
6865 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006866 return false;
6867 }
6868
Craig Topper3164f332014-03-11 03:39:26 +00006869 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006870 return "";
6871 }
6872};
6873
Craig Topperf054e3a2015-10-19 03:52:27 +00006874ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
6875 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006876}
6877
Craig Topperf054e3a2015-10-19 03:52:27 +00006878ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
6879 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006880}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006881
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006882// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6883class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6884public:
6885 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006886 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006887 }
6888
6889 BuiltinVaListKind getBuiltinVaListKind() const override {
6890 return TargetInfo::PNaClABIBuiltinVaList;
6891 }
6892};
6893
JF Bastien643817d2014-09-12 17:52:47 +00006894class Le64TargetInfo : public TargetInfo {
6895 static const Builtin::Info BuiltinInfo[];
6896
6897public:
6898 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6899 BigEndian = false;
6900 NoAsmVariants = true;
6901 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6902 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006903 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006904 }
6905
6906 void getTargetDefines(const LangOptions &Opts,
6907 MacroBuilder &Builder) const override {
6908 DefineStd(Builder, "unix", Opts);
6909 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6910 Builder.defineMacro("__ELF__");
6911 }
Craig Topper6c03a542015-10-19 04:51:35 +00006912 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6913 return llvm::makeArrayRef(BuiltinInfo,
6914 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00006915 }
6916 BuiltinVaListKind getBuiltinVaListKind() const override {
6917 return TargetInfo::PNaClABIBuiltinVaList;
6918 }
6919 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00006920 ArrayRef<const char *> getGCCRegNames() const override {
6921 return None;
JF Bastien643817d2014-09-12 17:52:47 +00006922 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006923 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6924 return None;
JF Bastien643817d2014-09-12 17:52:47 +00006925 }
6926 bool validateAsmConstraint(const char *&Name,
6927 TargetInfo::ConstraintInfo &Info) const override {
6928 return false;
6929 }
6930
6931 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006932};
Dan Gohmanc2853072015-09-03 22:51:53 +00006933
6934class WebAssemblyTargetInfo : public TargetInfo {
6935 static const Builtin::Info BuiltinInfo[];
6936
6937 enum SIMDEnum {
6938 NoSIMD,
6939 SIMD128,
6940 } SIMDLevel;
6941
6942public:
6943 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6944 : TargetInfo(T), SIMDLevel(NoSIMD) {
6945 BigEndian = false;
6946 NoAsmVariants = true;
6947 SuitableAlign = 128;
6948 LargeArrayMinWidth = 128;
6949 LargeArrayAlign = 128;
6950 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006951 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006952 }
6953
6954protected:
6955 void getTargetDefines(const LangOptions &Opts,
6956 MacroBuilder &Builder) const override {
6957 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6958 if (SIMDLevel >= SIMD128)
6959 Builder.defineMacro("__wasm_simd128__");
6960 }
6961
6962private:
Eric Christopher8c47b422015-10-09 18:39:55 +00006963 bool
6964 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6965 StringRef CPU,
6966 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00006967 if (CPU == "bleeding-edge")
6968 Features["simd128"] = true;
6969 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6970 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00006971 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006972 return llvm::StringSwitch<bool>(Feature)
6973 .Case("simd128", SIMDLevel >= SIMD128)
6974 .Default(false);
6975 }
6976 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00006977 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006978 for (const auto &Feature : Features) {
6979 if (Feature == "+simd128") {
6980 SIMDLevel = std::max(SIMDLevel, SIMD128);
6981 continue;
6982 }
6983 if (Feature == "-simd128") {
6984 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
6985 continue;
6986 }
6987
6988 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
6989 << "-target-feature";
6990 return false;
6991 }
6992 return true;
6993 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00006994 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006995 return llvm::StringSwitch<bool>(Name)
6996 .Case("mvp", true)
6997 .Case("bleeding-edge", true)
6998 .Case("generic", true)
6999 .Default(false);
7000 }
Craig Topper6c03a542015-10-19 04:51:35 +00007001 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7002 return llvm::makeArrayRef(BuiltinInfo,
7003 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007004 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007005 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007006 // TODO: Implement va_list properly.
7007 return VoidPtrBuiltinVaList;
7008 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007009 ArrayRef<const char *> getGCCRegNames() const final {
7010 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007011 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007012 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7013 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007014 }
7015 bool
7016 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007017 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007018 return false;
7019 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007020 const char *getClobbers() const final { return ""; }
7021 bool isCLZForZeroUndef() const final { return false; }
7022 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007023 IntType getIntTypeByWidth(unsigned BitWidth,
7024 bool IsSigned) const final {
7025 // WebAssembly prefers long long for explicitly 64-bit integers.
7026 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7027 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7028 }
7029 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7030 bool IsSigned) const final {
7031 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7032 return BitWidth == 64
7033 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7034 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7035 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007036};
7037
7038const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7039#define BUILTIN(ID, TYPE, ATTRS) \
7040 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7041#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7042 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7043#include "clang/Basic/BuiltinsWebAssembly.def"
7044};
7045
7046class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7047public:
7048 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7049 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007050 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007051 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7052 }
7053
7054protected:
7055 void getTargetDefines(const LangOptions &Opts,
7056 MacroBuilder &Builder) const override {
7057 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7058 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7059 }
7060};
7061
7062class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7063public:
7064 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7065 : WebAssemblyTargetInfo(T) {
7066 LongAlign = LongWidth = 64;
7067 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007068 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007069 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7070 }
7071
7072protected:
7073 void getTargetDefines(const LangOptions &Opts,
7074 MacroBuilder &Builder) const override {
7075 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7076 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7077 }
7078};
7079
JF Bastien643817d2014-09-12 17:52:47 +00007080const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7081#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007082 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007083#include "clang/Basic/BuiltinsLe64.def"
7084};
7085
Eric Christopherc48497a2015-09-18 21:26:24 +00007086static const unsigned SPIRAddrSpaceMap[] = {
7087 1, // opencl_global
7088 3, // opencl_local
7089 2, // opencl_constant
7090 4, // opencl_generic
7091 0, // cuda_device
7092 0, // cuda_constant
7093 0 // cuda_shared
7094};
7095class SPIRTargetInfo : public TargetInfo {
7096public:
7097 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7098 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7099 "SPIR target must use unknown OS");
7100 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7101 "SPIR target must use unknown environment type");
7102 BigEndian = false;
7103 TLSSupported = false;
7104 LongWidth = LongAlign = 64;
7105 AddrSpaceMap = &SPIRAddrSpaceMap;
7106 UseAddrSpaceMapMangling = true;
7107 // Define available target features
7108 // These must be defined in sorted order!
7109 NoAsmVariants = true;
7110 }
7111 void getTargetDefines(const LangOptions &Opts,
7112 MacroBuilder &Builder) const override {
7113 DefineStd(Builder, "SPIR", Opts);
7114 }
7115 bool hasFeature(StringRef Feature) const override {
7116 return Feature == "spir";
7117 }
Craig Topper3164f332014-03-11 03:39:26 +00007118
Craig Topper6c03a542015-10-19 04:51:35 +00007119 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007120 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007121 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007122 bool validateAsmConstraint(const char *&Name,
7123 TargetInfo::ConstraintInfo &info) const override {
7124 return true;
7125 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007126 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7127 return None;
7128 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007129 BuiltinVaListKind getBuiltinVaListKind() const override {
7130 return TargetInfo::VoidPtrBuiltinVaList;
7131 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007132
Eric Christopherc48497a2015-09-18 21:26:24 +00007133 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7134 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7135 : CCCR_Warning;
7136 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007137
Eric Christopherc48497a2015-09-18 21:26:24 +00007138 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7139 return CC_SpirFunction;
7140 }
7141};
Guy Benyeib798fc92012-12-11 21:38:14 +00007142
Eric Christopherc48497a2015-09-18 21:26:24 +00007143class SPIR32TargetInfo : public SPIRTargetInfo {
7144public:
7145 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7146 PointerWidth = PointerAlign = 32;
7147 SizeType = TargetInfo::UnsignedInt;
7148 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7149 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7150 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7151 }
7152 void getTargetDefines(const LangOptions &Opts,
7153 MacroBuilder &Builder) const override {
7154 DefineStd(Builder, "SPIR32", Opts);
7155 }
7156};
Guy Benyeib798fc92012-12-11 21:38:14 +00007157
Eric Christopherc48497a2015-09-18 21:26:24 +00007158class SPIR64TargetInfo : public SPIRTargetInfo {
7159public:
7160 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7161 PointerWidth = PointerAlign = 64;
7162 SizeType = TargetInfo::UnsignedLong;
7163 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7164 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7165 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7166 }
7167 void getTargetDefines(const LangOptions &Opts,
7168 MacroBuilder &Builder) const override {
7169 DefineStd(Builder, "SPIR64", Opts);
7170 }
7171};
Guy Benyeib798fc92012-12-11 21:38:14 +00007172
Robert Lytton0e076492013-08-13 09:43:10 +00007173class XCoreTargetInfo : public TargetInfo {
7174 static const Builtin::Info BuiltinInfo[];
7175public:
7176 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7177 BigEndian = false;
7178 NoAsmVariants = true;
7179 LongLongAlign = 32;
7180 SuitableAlign = 32;
7181 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007182 SizeType = UnsignedInt;
7183 PtrDiffType = SignedInt;
7184 IntPtrType = SignedInt;
7185 WCharType = UnsignedChar;
7186 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007187 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007188 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7189 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007190 }
Craig Topper3164f332014-03-11 03:39:26 +00007191 void getTargetDefines(const LangOptions &Opts,
7192 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007193 Builder.defineMacro("__XS1B__");
7194 }
Craig Topper6c03a542015-10-19 04:51:35 +00007195 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7196 return llvm::makeArrayRef(BuiltinInfo,
7197 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007198 }
Craig Topper3164f332014-03-11 03:39:26 +00007199 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007200 return TargetInfo::VoidPtrBuiltinVaList;
7201 }
Craig Topper3164f332014-03-11 03:39:26 +00007202 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007203 return "";
7204 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007205 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007206 static const char * const GCCRegNames[] = {
7207 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7208 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7209 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007210 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007211 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007212 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7213 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007214 }
Craig Topper3164f332014-03-11 03:39:26 +00007215 bool validateAsmConstraint(const char *&Name,
7216 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007217 return false;
7218 }
Craig Topper3164f332014-03-11 03:39:26 +00007219 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007220 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7221 return (RegNo < 2)? RegNo : -1;
7222 }
Robert Lytton0e076492013-08-13 09:43:10 +00007223};
7224
7225const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007226#define BUILTIN(ID, TYPE, ATTRS) \
7227 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7228#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7229 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007230#include "clang/Basic/BuiltinsXCore.def"
7231};
Robert Lytton0e076492013-08-13 09:43:10 +00007232
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007233// x86_32 Android target
7234class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7235public:
7236 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7237 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7238 SuitableAlign = 32;
7239 LongDoubleWidth = 64;
7240 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7241 }
7242};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007243
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007244// x86_64 Android target
7245class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7246public:
7247 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7248 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7249 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7250 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007251
7252 bool useFloat128ManglingForLongDouble() const override {
7253 return true;
7254 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007255};
7256} // end anonymous namespace
7257
Chris Lattner5ba61f02006-10-14 07:39:34 +00007258//===----------------------------------------------------------------------===//
7259// Driver code
7260//===----------------------------------------------------------------------===//
7261
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007262static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007263 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007264
Daniel Dunbar52322032009-08-18 05:47:58 +00007265 switch (Triple.getArch()) {
7266 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007267 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007268
Tim Northover2a0783d2014-05-30 14:14:07 +00007269 case llvm::Triple::xcore:
7270 return new XCoreTargetInfo(Triple);
7271
7272 case llvm::Triple::hexagon:
7273 return new HexagonTargetInfo(Triple);
7274
7275 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007276 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007277 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007278
7279 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007280 case llvm::Triple::CloudABI:
7281 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007282 case llvm::Triple::FreeBSD:
7283 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007284 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007285 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007286 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007287 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007288 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007289 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007290 }
7291
Christian Pirker9b019ae2014-02-25 13:51:00 +00007292 case llvm::Triple::aarch64_be:
7293 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007294 case llvm::Triple::FreeBSD:
7295 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007296 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007297 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007298 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007299 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007300 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007301 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007302 }
7303
Daniel Dunbar52322032009-08-18 05:47:58 +00007304 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007305 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007306 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007307 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007308
Daniel Dunbar52322032009-08-18 05:47:58 +00007309 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007310 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007311 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007312 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007313 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007314 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007315 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007316 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007317 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007318 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007319 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007320 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007321 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007322 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007323 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007324 case llvm::Triple::Win32:
7325 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007326 case llvm::Triple::Cygnus:
7327 return new CygwinARMTargetInfo(Triple);
7328 case llvm::Triple::GNU:
7329 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007330 case llvm::Triple::Itanium:
7331 return new ItaniumWindowsARMleTargetInfo(Triple);
7332 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007333 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007334 return new MicrosoftARMleTargetInfo(Triple);
7335 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007336 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007337 return new ARMleTargetInfo(Triple);
7338 }
7339
7340 case llvm::Triple::armeb:
7341 case llvm::Triple::thumbeb:
7342 if (Triple.isOSDarwin())
7343 return new DarwinARMTargetInfo(Triple);
7344
7345 switch (os) {
7346 case llvm::Triple::Linux:
7347 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7348 case llvm::Triple::FreeBSD:
7349 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7350 case llvm::Triple::NetBSD:
7351 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7352 case llvm::Triple::OpenBSD:
7353 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7354 case llvm::Triple::Bitrig:
7355 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7356 case llvm::Triple::RTEMS:
7357 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7358 case llvm::Triple::NaCl:
7359 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7360 default:
7361 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007362 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007363
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007364 case llvm::Triple::bpfeb:
7365 case llvm::Triple::bpfel:
7366 return new BPFTargetInfo(Triple);
7367
Daniel Dunbar52322032009-08-18 05:47:58 +00007368 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007369 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007370
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007371 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007372 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007373 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007374 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007375 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007376 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007377 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007378 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007379 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007380 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007381 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007382 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007383 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007384
7385 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007386 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007387 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007388 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007389 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007390 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007391 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007392 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007393 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007394 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007395 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007396 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007397 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007398 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007399 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007400
Akira Hatanakabef17452011-09-20 19:21:49 +00007401 case llvm::Triple::mips64:
7402 switch (os) {
7403 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007404 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007405 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007406 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007407 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007408 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007409 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007410 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007411 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007412 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007413 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007414 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007415 }
7416
7417 case llvm::Triple::mips64el:
7418 switch (os) {
7419 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007420 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007421 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007422 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007423 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007424 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007425 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007426 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007427 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007428 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007429 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007430 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007431 }
7432
Ivan Krasindd7403e2011-08-24 20:22:22 +00007433 case llvm::Triple::le32:
7434 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007435 case llvm::Triple::NaCl:
7436 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7437 default:
7438 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007439 }
7440
JF Bastien643817d2014-09-12 17:52:47 +00007441 case llvm::Triple::le64:
7442 return new Le64TargetInfo(Triple);
7443
Daniel Dunbar52322032009-08-18 05:47:58 +00007444 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007445 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007446 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007447 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007448 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007450 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007452 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007453 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007454 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007455 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007456 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007457 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007458 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007459 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007460 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007461
7462 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007463 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007464 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007465 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007466 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007467 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007468 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007469 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007470 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007471 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007472 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007473 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007474 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007475 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007476 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007477
Bill Schmidt778d3872013-07-26 01:36:11 +00007478 case llvm::Triple::ppc64le:
7479 switch (os) {
7480 case llvm::Triple::Linux:
7481 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007482 case llvm::Triple::NetBSD:
7483 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007484 default:
7485 return new PPC64TargetInfo(Triple);
7486 }
7487
Peter Collingbournec947aae2012-05-20 23:28:41 +00007488 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007489 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007490 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007491 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007492
Tom Stellardd8e38a32015-01-06 20:34:47 +00007493 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007494 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007495 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007496
Daniel Dunbar52322032009-08-18 05:47:58 +00007497 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007498 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007499 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007500 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007501 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007502 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007503 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007504 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007505 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007506 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007507 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007508 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007509 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007510 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007511 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007512
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007513 // The 'sparcel' architecture copies all the above cases except for Solaris.
7514 case llvm::Triple::sparcel:
7515 switch (os) {
7516 case llvm::Triple::Linux:
7517 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7518 case llvm::Triple::NetBSD:
7519 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7520 case llvm::Triple::OpenBSD:
7521 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7522 case llvm::Triple::RTEMS:
7523 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7524 default:
7525 return new SparcV8elTargetInfo(Triple);
7526 }
7527
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007528 case llvm::Triple::sparcv9:
7529 switch (os) {
7530 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007531 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007532 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007533 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007534 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007535 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007536 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007537 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007538 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007539 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007540 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007541 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007542 }
7543
Ulrich Weigand47445072013-05-06 16:26:41 +00007544 case llvm::Triple::systemz:
7545 switch (os) {
7546 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007547 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007548 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007549 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007550 }
7551
Eli Friedmana9c3d712009-08-19 20:47:07 +00007552 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007553 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007554
Daniel Dunbar52322032009-08-18 05:47:58 +00007555 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007556 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007557 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007558
Daniel Dunbar52322032009-08-18 05:47:58 +00007559 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007560 case llvm::Triple::CloudABI:
7561 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007562 case llvm::Triple::Linux: {
7563 switch (Triple.getEnvironment()) {
7564 default:
7565 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7566 case llvm::Triple::Android:
7567 return new AndroidX86_32TargetInfo(Triple);
7568 }
7569 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007570 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007571 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007572 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007573 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007574 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007575 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007576 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007578 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007579 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007580 case llvm::Triple::KFreeBSD:
7581 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007582 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007583 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007584 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007585 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007586 case llvm::Triple::Win32: {
7587 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007588 case llvm::Triple::Cygnus:
7589 return new CygwinX86_32TargetInfo(Triple);
7590 case llvm::Triple::GNU:
7591 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007592 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007593 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007594 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007595 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007596 }
7597 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007598 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007599 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007600 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007601 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007602 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007603 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007604 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007605 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007606 }
7607
7608 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007609 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007610 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007611
Daniel Dunbar52322032009-08-18 05:47:58 +00007612 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007613 case llvm::Triple::CloudABI:
7614 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007615 case llvm::Triple::Linux: {
7616 switch (Triple.getEnvironment()) {
7617 default:
7618 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7619 case llvm::Triple::Android:
7620 return new AndroidX86_64TargetInfo(Triple);
7621 }
7622 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007623 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007624 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007625 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007626 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007627 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007628 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007629 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007630 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007631 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007632 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007633 case llvm::Triple::KFreeBSD:
7634 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007635 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007636 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007637 case llvm::Triple::Win32: {
7638 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007639 case llvm::Triple::Cygnus:
7640 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007641 case llvm::Triple::GNU:
7642 return new MinGWX86_64TargetInfo(Triple);
7643 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007644 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007645 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007646 }
7647 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007648 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007649 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007650 case llvm::Triple::PS4:
7651 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007652 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007653 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007654 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007655
Douglas Katzman78d7c542015-05-12 21:18:10 +00007656 case llvm::Triple::spir: {
7657 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7658 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7659 return nullptr;
7660 return new SPIR32TargetInfo(Triple);
7661 }
7662 case llvm::Triple::spir64: {
7663 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7664 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7665 return nullptr;
7666 return new SPIR64TargetInfo(Triple);
7667 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007668 case llvm::Triple::wasm32:
7669 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7670 return nullptr;
7671 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7672 case llvm::Triple::wasm64:
7673 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7674 return nullptr;
7675 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007676 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007677}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007678
7679/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007680/// options.
Alp Toker80758082014-07-06 05:26:44 +00007681TargetInfo *
7682TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7683 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007684 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007685
7686 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007687 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007688 if (!Target) {
7689 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007690 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007691 }
Alp Toker80758082014-07-06 05:26:44 +00007692 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007693
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007694 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007695 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7696 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007697 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007698 }
7699
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007700 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007701 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7702 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007703 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007704 }
7705
Rafael Espindolaeb265472013-08-21 21:59:03 +00007706 // Set the fp math unit.
7707 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7708 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007709 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007710 }
7711
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007712 // Compute the default target features, we need the target to handle this
7713 // because features may have dependencies on one another.
7714 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007715 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7716 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007717 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007718
7719 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007720 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007721 for (const auto &F : Features)
7722 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7723
Eric Christopher3ff21b32013-10-16 21:26:26 +00007724 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007725 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007726
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007727 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007728}