blob: b38b4e0c6cdb6cdc17eed3ecc69ae61ec02b2439 [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 Topper3164f332014-03-11 03:39:26 +0000879 void getTargetBuiltins(const Builtin::Info *&Records,
880 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000881 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000883 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000884
Craig Topper3164f332014-03-11 03:39:26 +0000885 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000886
Craig Topper3164f332014-03-11 03:39:26 +0000887 void getTargetDefines(const LangOptions &Opts,
888 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000889
Eric Christopher8c47b422015-10-09 18:39:55 +0000890 bool
891 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
892 StringRef CPU,
893 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000894
Craig Topper3164f332014-03-11 03:39:26 +0000895 bool handleTargetFeatures(std::vector<std::string> &Features,
896 DiagnosticsEngine &Diags) override;
897 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000898 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
899 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000900
901 void getGCCRegNames(const char * const *&Names,
902 unsigned &NumNames) const override;
903 void getGCCRegAliases(const GCCRegAlias *&Aliases,
904 unsigned &NumAliases) const override;
905 bool validateAsmConstraint(const char *&Name,
906 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000907 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000908 default: return false;
909 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000910 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000911 case 'b': // Base register
912 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000913 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000914 break;
915 // FIXME: The following are added to allow parsing.
916 // I just took a guess at what the actions should be.
917 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000918 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000919 case 'v': // Altivec vector register
920 Info.setAllowsRegister();
921 break;
922 case 'w':
923 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000924 case 'd':// VSX vector register to hold vector double data
925 case 'f':// VSX vector register to hold vector float data
926 case 's':// VSX vector register to hold scalar float data
927 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000928 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000929 break;
930 default:
931 return false;
932 }
933 Info.setAllowsRegister();
934 Name++; // Skip over 'w'.
935 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000936 case 'h': // `MQ', `CTR', or `LINK' register
937 case 'q': // `MQ' register
938 case 'c': // `CTR' register
939 case 'l': // `LINK' register
940 case 'x': // `CR' register (condition register) number 0
941 case 'y': // `CR' register (condition register)
942 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000943 Info.setAllowsRegister();
944 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000945 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000946 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000947 // (use `L' instead for SImode constants)
948 case 'K': // Unsigned 16-bit constant
949 case 'L': // Signed 16-bit constant shifted left 16 bits
950 case 'M': // Constant larger than 31
951 case 'N': // Exact power of 2
952 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000953 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000955 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000956 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000957 break;
958 case 'm': // Memory operand. Note that on PowerPC targets, m can
959 // include addresses that update the base register. It
960 // is therefore only safe to use `m' in an asm statement
961 // if that asm statement accesses the operand exactly once.
962 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000963 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000964 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000965 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000966 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000967 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
968 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // register to be updated.
970 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000971 if (Name[1] != 's')
972 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000973 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000974 // include any automodification of the base register. Unlike
975 // `m', this constraint can be used in asm statements that
976 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000977 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000978 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000979 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000980 break;
981 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000982 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000983 case 'Z': // Memory operand that is an indexed or indirect from a
984 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000985 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000986 Info.setAllowsMemory();
987 Info.setAllowsRegister();
988 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000990 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000991 // register (`p' is preferable for asm statements)
992 case 'S': // Constant suitable as a 64-bit mask operand
993 case 'T': // Constant suitable as a 32-bit mask operand
994 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // instructions
997 case 'W': // Vector constant that does not require memory
998 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000999 break;
1000 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001001 }
John Thompson07a61a42010-06-24 22:44:13 +00001002 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 }
Craig Topper3164f332014-03-11 03:39:26 +00001004 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001005 std::string R;
1006 switch (*Constraint) {
1007 case 'e':
1008 case 'w':
1009 // Two-character constraint; add "^" hint for later parsing.
1010 R = std::string("^") + std::string(Constraint, 2);
1011 Constraint++;
1012 break;
1013 default:
1014 return TargetInfo::convertConstraint(Constraint);
1015 }
1016 return R;
1017 }
Craig Topper3164f332014-03-11 03:39:26 +00001018 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001019 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001020 }
Craig Topper3164f332014-03-11 03:39:26 +00001021 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001022 if (RegNo == 0) return 3;
1023 if (RegNo == 1) return 4;
1024 return -1;
1025 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001026
1027 bool hasSjLjLowering() const override {
1028 return true;
1029 }
David Majnemer2617ea62015-06-09 18:05:33 +00001030
1031 bool useFloat128ManglingForLongDouble() const override {
1032 return LongDoubleWidth == 128 &&
1033 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1034 getTriple().isOSBinFormatELF();
1035 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001036};
Anders Carlssonf511f642007-11-27 04:11:28 +00001037
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001038const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001039#define BUILTIN(ID, TYPE, ATTRS) \
1040 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1041#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1042 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001043#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001044};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001045
Eric Christopher917e9522014-11-18 22:36:15 +00001046/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001047/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001048bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001049 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001050 for (const auto &Feature : Features) {
1051 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001053 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001054 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001055 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001056 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001057 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001058 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001059 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001060 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001061 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001062 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001063 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001064 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001065 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001066 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001067 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001068 // TODO: Finish this list and add an assert that we've handled them
1069 // all.
1070 }
Eric Christopher02c33352015-08-25 00:59:11 +00001071
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001072 return true;
1073}
1074
Chris Lattnerecd49032009-03-02 22:27:17 +00001075/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1076/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001077void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001078 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001079 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001080 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001081 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001082 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001083 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001084 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001085 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001086 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001087 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001088 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001089 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001091
Chris Lattnerecd49032009-03-02 22:27:17 +00001092 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001093 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1094 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001095 } else {
1096 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1097 getTriple().getOS() != llvm::Triple::OpenBSD)
1098 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001099 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001100
Ulrich Weigand8afad612014-07-28 13:17:52 +00001101 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001102 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001103 Builder.defineMacro("_CALL_ELF", "1");
1104 if (ABI == "elfv2")
1105 Builder.defineMacro("_CALL_ELF", "2");
1106
Chris Lattnerecd49032009-03-02 22:27:17 +00001107 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001108 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1109 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001110
Chris Lattnerecd49032009-03-02 22:27:17 +00001111 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001112 if (LongDoubleWidth == 128)
1113 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001114
John Thompsone467e192009-11-19 17:18:50 +00001115 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001116 Builder.defineMacro("__VEC__", "10206");
1117 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001118 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001119
1120 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001121 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1122 .Case("440", ArchDefineName)
1123 .Case("450", ArchDefineName | ArchDefine440)
1124 .Case("601", ArchDefineName)
1125 .Case("602", ArchDefineName | ArchDefinePpcgr)
1126 .Case("603", ArchDefineName | ArchDefinePpcgr)
1127 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1128 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1129 .Case("604", ArchDefineName | ArchDefinePpcgr)
1130 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1131 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001132 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001133 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1134 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1135 .Case("750", ArchDefineName | ArchDefinePpcgr)
1136 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1137 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001138 .Case("a2", ArchDefineA2)
1139 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001140 .Case("pwr3", ArchDefinePpcgr)
1141 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1142 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1143 | ArchDefinePpcsq)
1144 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1145 | ArchDefinePpcgr | ArchDefinePpcsq)
1146 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1147 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1148 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1149 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1150 | ArchDefinePpcsq)
1151 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1152 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001153 | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1155 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1156 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001157 .Case("power3", ArchDefinePpcgr)
1158 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1160 | ArchDefinePpcsq)
1161 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1162 | ArchDefinePpcgr | ArchDefinePpcsq)
1163 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1164 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1165 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1166 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1167 | ArchDefinePpcsq)
1168 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1169 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001170 | ArchDefinePpcgr | ArchDefinePpcsq)
1171 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1172 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1173 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001174 .Default(ArchDefineNone);
1175
1176 if (defs & ArchDefineName)
1177 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1178 if (defs & ArchDefinePpcgr)
1179 Builder.defineMacro("_ARCH_PPCGR");
1180 if (defs & ArchDefinePpcsq)
1181 Builder.defineMacro("_ARCH_PPCSQ");
1182 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001183 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001184 if (defs & ArchDefine603)
1185 Builder.defineMacro("_ARCH_603");
1186 if (defs & ArchDefine604)
1187 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001188 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001190 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001191 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001192 if (defs & ArchDefinePwr5x)
1193 Builder.defineMacro("_ARCH_PWR5X");
1194 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001195 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001196 if (defs & ArchDefinePwr6x)
1197 Builder.defineMacro("_ARCH_PWR6X");
1198 if (defs & ArchDefinePwr7)
1199 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001200 if (defs & ArchDefinePwr8)
1201 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001202 if (defs & ArchDefineA2)
1203 Builder.defineMacro("_ARCH_A2");
1204 if (defs & ArchDefineA2q) {
1205 Builder.defineMacro("_ARCH_A2Q");
1206 Builder.defineMacro("_ARCH_QP");
1207 }
1208
1209 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1210 Builder.defineMacro("__bg__");
1211 Builder.defineMacro("__THW_BLUEGENE__");
1212 Builder.defineMacro("__bgq__");
1213 Builder.defineMacro("__TOS_BGQ__");
1214 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001215
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001216 if (HasVSX)
1217 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001218 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001219 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001220 if (HasP8Crypto)
1221 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001222 if (HasHTM)
1223 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001224
1225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1227 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1228 if (PointerWidth == 64)
1229 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001230
Bill Schmidt38378a02013-02-01 20:23:10 +00001231 // FIXME: The following are not yet generated here by Clang, but are
1232 // generated by GCC:
1233 //
1234 // _SOFT_FLOAT_
1235 // __RECIP_PRECISION__
1236 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001237 // __RECIP__
1238 // __RECIPF__
1239 // __RSQRTE__
1240 // __RSQRTEF__
1241 // _SOFT_DOUBLE_
1242 // __NO_LWSYNC__
1243 // __HAVE_BSWAP__
1244 // __LONGDOUBLE128
1245 // __CMODEL_MEDIUM__
1246 // __CMODEL_LARGE__
1247 // _CALL_SYSV
1248 // _CALL_DARWIN
1249 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001250}
1251
Eric Christophera8a14c32015-08-31 18:39:16 +00001252// Handle explicit options being passed to the compiler here: if we've
1253// explicitly turned off vsx and turned on power8-vector or direct-move then
1254// go ahead and error since the customer has expressed a somewhat incompatible
1255// set of options.
1256static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001257 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001258
1259 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1260 FeaturesVec.end()) {
1261 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1262 FeaturesVec.end()) {
1263 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1264 << "-mno-vsx";
1265 return false;
1266 }
1267
1268 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1269 FeaturesVec.end()) {
1270 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1271 << "-mno-vsx";
1272 return false;
1273 }
1274 }
1275
1276 return true;
1277}
1278
Eric Christopher8c47b422015-10-09 18:39:55 +00001279bool PPCTargetInfo::initFeatureMap(
1280 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1281 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001282 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1283 .Case("7400", true)
1284 .Case("g4", true)
1285 .Case("7450", true)
1286 .Case("g4+", true)
1287 .Case("970", true)
1288 .Case("g5", true)
1289 .Case("pwr6", true)
1290 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001291 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001292 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001293 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001294 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001295
1296 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001297 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1298 .Case("ppc64le", true)
1299 .Case("pwr8", true)
1300 .Default(false);
1301 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1302 .Case("ppc64le", true)
1303 .Case("pwr8", true)
1304 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001305 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1306 .Case("ppc64le", true)
1307 .Case("pwr8", true)
1308 .Case("pwr7", true)
1309 .Default(false);
1310 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1311 .Case("ppc64le", true)
1312 .Case("pwr8", true)
1313 .Case("pwr7", true)
1314 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001315 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1316 .Case("ppc64le", true)
1317 .Case("pwr8", true)
1318 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001319 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1320 .Case("ppc64le", true)
1321 .Case("pwr8", true)
1322 .Case("pwr7", true)
1323 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001324
Eric Christophera8a14c32015-08-31 18:39:16 +00001325 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1326 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001327
Eric Christopher007b0a02015-08-28 22:32:01 +00001328 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001329}
1330
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001331bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001332 return llvm::StringSwitch<bool>(Feature)
1333 .Case("powerpc", true)
1334 .Case("vsx", HasVSX)
1335 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001336 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001337 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001338 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001339 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001340 .Case("bpermd", HasBPERMD)
1341 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001342 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001343}
Chris Lattner17df24e2008-04-21 18:56:49 +00001344
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001345void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1346 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001347 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1348 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1349 // incompatible options.
1350 if (Enabled) {
1351 if (Name == "vsx") {
1352 Features[Name] = true;
1353 } else if (Name == "direct-move") {
1354 Features[Name] = Features["vsx"] = true;
1355 } else if (Name == "power8-vector") {
1356 Features[Name] = Features["vsx"] = true;
1357 } else {
1358 Features[Name] = true;
1359 }
1360 } else {
1361 if (Name == "vsx") {
1362 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1363 false;
1364 } else {
1365 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001366 }
1367 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001368}
1369
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001370const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001371 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1372 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1373 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1374 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1375 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1376 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1377 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1378 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001379 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001380 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001381 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001382 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1383 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1384 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1385 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "vrsave", "vscr",
1387 "spe_acc", "spefscr",
1388 "sfp"
1389};
Chris Lattner10a5b382007-01-29 05:24:35 +00001390
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001391void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001392 unsigned &NumNames) const {
1393 Names = GCCRegNames;
1394 NumNames = llvm::array_lengthof(GCCRegNames);
1395}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001396
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001397const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1398 // While some of these aliases do map to different registers
1399 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001400 { { "0" }, "r0" },
1401 { { "1"}, "r1" },
1402 { { "2" }, "r2" },
1403 { { "3" }, "r3" },
1404 { { "4" }, "r4" },
1405 { { "5" }, "r5" },
1406 { { "6" }, "r6" },
1407 { { "7" }, "r7" },
1408 { { "8" }, "r8" },
1409 { { "9" }, "r9" },
1410 { { "10" }, "r10" },
1411 { { "11" }, "r11" },
1412 { { "12" }, "r12" },
1413 { { "13" }, "r13" },
1414 { { "14" }, "r14" },
1415 { { "15" }, "r15" },
1416 { { "16" }, "r16" },
1417 { { "17" }, "r17" },
1418 { { "18" }, "r18" },
1419 { { "19" }, "r19" },
1420 { { "20" }, "r20" },
1421 { { "21" }, "r21" },
1422 { { "22" }, "r22" },
1423 { { "23" }, "r23" },
1424 { { "24" }, "r24" },
1425 { { "25" }, "r25" },
1426 { { "26" }, "r26" },
1427 { { "27" }, "r27" },
1428 { { "28" }, "r28" },
1429 { { "29" }, "r29" },
1430 { { "30" }, "r30" },
1431 { { "31" }, "r31" },
1432 { { "fr0" }, "f0" },
1433 { { "fr1" }, "f1" },
1434 { { "fr2" }, "f2" },
1435 { { "fr3" }, "f3" },
1436 { { "fr4" }, "f4" },
1437 { { "fr5" }, "f5" },
1438 { { "fr6" }, "f6" },
1439 { { "fr7" }, "f7" },
1440 { { "fr8" }, "f8" },
1441 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001442 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001443 { { "fr11" }, "f11" },
1444 { { "fr12" }, "f12" },
1445 { { "fr13" }, "f13" },
1446 { { "fr14" }, "f14" },
1447 { { "fr15" }, "f15" },
1448 { { "fr16" }, "f16" },
1449 { { "fr17" }, "f17" },
1450 { { "fr18" }, "f18" },
1451 { { "fr19" }, "f19" },
1452 { { "fr20" }, "f20" },
1453 { { "fr21" }, "f21" },
1454 { { "fr22" }, "f22" },
1455 { { "fr23" }, "f23" },
1456 { { "fr24" }, "f24" },
1457 { { "fr25" }, "f25" },
1458 { { "fr26" }, "f26" },
1459 { { "fr27" }, "f27" },
1460 { { "fr28" }, "f28" },
1461 { { "fr29" }, "f29" },
1462 { { "fr30" }, "f30" },
1463 { { "fr31" }, "f31" },
1464 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001465};
1466
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001467void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001468 unsigned &NumAliases) const {
1469 Aliases = GCCRegAliases;
1470 NumAliases = llvm::array_lengthof(GCCRegAliases);
1471}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001472
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001473class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001474public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001475 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001476 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001477
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001478 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001479 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001480 case llvm::Triple::FreeBSD:
1481 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001482 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001483 PtrDiffType = SignedInt;
1484 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001485 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001486 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001487 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001488 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001489
Roman Divacky3ffe7462012-03-13 19:20:17 +00001490 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1491 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001492 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001493 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001494
1495 // PPC32 supports atomics up to 4 bytes.
1496 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001497 }
1498
Craig Topper3164f332014-03-11 03:39:26 +00001499 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001500 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001501 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001502 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001503};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001504
Bill Schmidt778d3872013-07-26 01:36:11 +00001505// Note: ABI differences may eventually require us to have a separate
1506// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001507class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001508public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001509 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001510 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001511 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001512 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001513
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001514 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001515 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001516 ABI = "elfv2";
1517 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001518 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001519 ABI = "elfv1";
1520 }
1521
1522 switch (getTriple().getOS()) {
1523 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001524 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001525 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001526 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001527 case llvm::Triple::NetBSD:
1528 IntMaxType = SignedLongLong;
1529 Int64Type = SignedLongLong;
1530 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001531 default:
1532 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001533 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001534
1535 // PPC64 supports atomics up to 8 bytes.
1536 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001537 }
Craig Topper3164f332014-03-11 03:39:26 +00001538 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001539 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001540 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001541 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001542 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001543 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001544 ABI = Name;
1545 return true;
1546 }
1547 return false;
1548 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001549};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550
Roman Divacky965b0b72011-01-06 08:27:10 +00001551class DarwinPPC32TargetInfo :
1552 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001553public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001554 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1555 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001556 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001557 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001558 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001559 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001560 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001561 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001562 }
Craig Topper3164f332014-03-11 03:39:26 +00001563 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001564 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001565 }
1566};
1567
1568class DarwinPPC64TargetInfo :
1569 public DarwinTargetInfo<PPC64TargetInfo> {
1570public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001571 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1572 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001573 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001574 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001575 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001576 }
1577};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001578
Eric Christopherc48497a2015-09-18 21:26:24 +00001579static const unsigned NVPTXAddrSpaceMap[] = {
1580 1, // opencl_global
1581 3, // opencl_local
1582 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001583 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001584 0, // opencl_generic
1585 1, // cuda_device
1586 4, // cuda_constant
1587 3, // cuda_shared
1588};
1589
1590class NVPTXTargetInfo : public TargetInfo {
1591 static const char *const GCCRegNames[];
1592 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001593
1594 // The GPU profiles supported by the NVPTX backend
1595 enum GPUKind {
1596 GK_NONE,
1597 GK_SM20,
1598 GK_SM21,
1599 GK_SM30,
1600 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001601 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001602 } GPU;
1603
Eric Christopherc48497a2015-09-18 21:26:24 +00001604public:
1605 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1606 BigEndian = false;
1607 TLSSupported = false;
1608 LongWidth = LongAlign = 64;
1609 AddrSpaceMap = &NVPTXAddrSpaceMap;
1610 UseAddrSpaceMapMangling = true;
1611 // Define available target features
1612 // These must be defined in sorted order!
1613 NoAsmVariants = true;
1614 // Set the default GPU to sm20
1615 GPU = GK_SM20;
1616 }
1617 void getTargetDefines(const LangOptions &Opts,
1618 MacroBuilder &Builder) const override {
1619 Builder.defineMacro("__PTX__");
1620 Builder.defineMacro("__NVPTX__");
1621 if (Opts.CUDAIsDevice) {
1622 // Set __CUDA_ARCH__ for the GPU specified.
1623 std::string CUDAArchCode;
1624 switch (GPU) {
1625 case GK_SM20:
1626 CUDAArchCode = "200";
1627 break;
1628 case GK_SM21:
1629 CUDAArchCode = "210";
1630 break;
1631 case GK_SM30:
1632 CUDAArchCode = "300";
1633 break;
1634 case GK_SM35:
1635 CUDAArchCode = "350";
1636 break;
1637 case GK_SM37:
1638 CUDAArchCode = "370";
1639 break;
1640 default:
1641 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001642 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001643 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001644 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001645 }
1646 void getTargetBuiltins(const Builtin::Info *&Records,
1647 unsigned &NumRecords) const override {
1648 Records = BuiltinInfo;
1649 NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
1650 }
1651 bool hasFeature(StringRef Feature) const override {
1652 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001653 }
1654
Eric Christopherc48497a2015-09-18 21:26:24 +00001655 void getGCCRegNames(const char *const *&Names,
1656 unsigned &NumNames) const override;
1657 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1658 unsigned &NumAliases) const override {
1659 // No aliases.
1660 Aliases = nullptr;
1661 NumAliases = 0;
1662 }
1663 bool validateAsmConstraint(const char *&Name,
1664 TargetInfo::ConstraintInfo &Info) const override {
1665 switch (*Name) {
1666 default:
1667 return false;
1668 case 'c':
1669 case 'h':
1670 case 'r':
1671 case 'l':
1672 case 'f':
1673 case 'd':
1674 Info.setAllowsRegister();
1675 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001676 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001677 }
1678 const char *getClobbers() const override {
1679 // FIXME: Is this really right?
1680 return "";
1681 }
1682 BuiltinVaListKind getBuiltinVaListKind() const override {
1683 // FIXME: implement
1684 return TargetInfo::CharPtrBuiltinVaList;
1685 }
1686 bool setCPU(const std::string &Name) override {
1687 GPU = llvm::StringSwitch<GPUKind>(Name)
1688 .Case("sm_20", GK_SM20)
1689 .Case("sm_21", GK_SM21)
1690 .Case("sm_30", GK_SM30)
1691 .Case("sm_35", GK_SM35)
1692 .Case("sm_37", GK_SM37)
1693 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001694
Eric Christopherc48497a2015-09-18 21:26:24 +00001695 return GPU != GK_NONE;
1696 }
1697};
1698
1699const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1700#define BUILTIN(ID, TYPE, ATTRS) \
1701 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1702#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1703 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1704#include "clang/Basic/BuiltinsNVPTX.def"
1705};
1706
1707const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1708
1709void NVPTXTargetInfo::getGCCRegNames(const char *const *&Names,
1710 unsigned &NumNames) const {
1711 Names = GCCRegNames;
1712 NumNames = llvm::array_lengthof(GCCRegNames);
1713}
1714
1715class NVPTX32TargetInfo : public NVPTXTargetInfo {
1716public:
1717 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001718 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001719 PointerWidth = PointerAlign = 32;
1720 SizeType = TargetInfo::UnsignedInt;
1721 PtrDiffType = TargetInfo::SignedInt;
1722 IntPtrType = TargetInfo::SignedInt;
1723 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1724 }
1725};
1726
1727class NVPTX64TargetInfo : public NVPTXTargetInfo {
1728public:
1729 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1730 PointerWidth = PointerAlign = 64;
1731 SizeType = TargetInfo::UnsignedLong;
1732 PtrDiffType = TargetInfo::SignedLong;
1733 IntPtrType = TargetInfo::SignedLong;
1734 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1735 }
1736};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001737
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001738static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001739 1, // opencl_global
1740 3, // opencl_local
1741 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001742 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001743 1, // cuda_device
1744 2, // cuda_constant
1745 3 // cuda_shared
1746};
1747
Tom Stellarda96344b2014-08-21 13:58:40 +00001748// If you edit the description strings, make sure you update
1749// getPointerWidthV().
1750
Eric Christopher964a5f32015-08-05 23:48:05 +00001751static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001752 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1753 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001754
Eric Christopher964a5f32015-08-05 23:48:05 +00001755static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001756 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1757 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758
Eric Christopher964a5f32015-08-05 23:48:05 +00001759static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001760 "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 +00001761 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1762 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001763
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001764class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001765 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001766 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001767
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001768 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001769 enum GPUKind {
1770 GK_NONE,
1771 GK_R600,
1772 GK_R600_DOUBLE_OPS,
1773 GK_R700,
1774 GK_R700_DOUBLE_OPS,
1775 GK_EVERGREEN,
1776 GK_EVERGREEN_DOUBLE_OPS,
1777 GK_NORTHERN_ISLANDS,
1778 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001779 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001780 GK_SEA_ISLANDS,
1781 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001782 } GPU;
1783
Jan Veselyeebeaea2015-05-04 19:53:36 +00001784 bool hasFP64:1;
1785 bool hasFMAF:1;
1786 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001787
Eli Friedmand13b41e2012-10-12 23:32:00 +00001788public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001789 AMDGPUTargetInfo(const llvm::Triple &Triple)
1790 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001791
1792 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001793 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001794 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001795 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001796 hasFMAF = true;
1797 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001798 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001799 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001800 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001801 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001802 hasFMAF = false;
1803 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001804 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001805 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001806 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001807 }
1808
Tom Stellarda96344b2014-08-21 13:58:40 +00001809 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1810 if (GPU <= GK_CAYMAN)
1811 return 32;
1812
1813 switch(AddrSpace) {
1814 default:
1815 return 64;
1816 case 0:
1817 case 3:
1818 case 5:
1819 return 32;
1820 }
1821 }
1822
Craig Topper3164f332014-03-11 03:39:26 +00001823 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001824 return "";
1825 }
1826
Craig Topper3164f332014-03-11 03:39:26 +00001827 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001828 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001829
Craig Topper3164f332014-03-11 03:39:26 +00001830 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1831 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001832 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001833 NumAliases = 0;
1834 }
1835
Craig Topper3164f332014-03-11 03:39:26 +00001836 bool validateAsmConstraint(const char *&Name,
1837 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001838 return true;
1839 }
1840
Craig Topper3164f332014-03-11 03:39:26 +00001841 void getTargetBuiltins(const Builtin::Info *&Records,
1842 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001843 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001844 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001845 }
1846
Craig Topper3164f332014-03-11 03:39:26 +00001847 void getTargetDefines(const LangOptions &Opts,
1848 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001849 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001850 if (hasFMAF)
1851 Builder.defineMacro("__HAS_FMAF__");
1852 if (hasLDEXPF)
1853 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001854 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001855 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001856 if (Opts.OpenCL) {
1857 if (GPU >= GK_NORTHERN_ISLANDS) {
1858 Builder.defineMacro("cl_khr_byte_addressable_store");
1859 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1860 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1861 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1862 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1863 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001864 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001865 }
1866
Craig Topper3164f332014-03-11 03:39:26 +00001867 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001868 return TargetInfo::CharPtrBuiltinVaList;
1869 }
1870
Craig Topper3164f332014-03-11 03:39:26 +00001871 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001872 GPU = llvm::StringSwitch<GPUKind>(Name)
1873 .Case("r600" , GK_R600)
1874 .Case("rv610", GK_R600)
1875 .Case("rv620", GK_R600)
1876 .Case("rv630", GK_R600)
1877 .Case("rv635", GK_R600)
1878 .Case("rs780", GK_R600)
1879 .Case("rs880", GK_R600)
1880 .Case("rv670", GK_R600_DOUBLE_OPS)
1881 .Case("rv710", GK_R700)
1882 .Case("rv730", GK_R700)
1883 .Case("rv740", GK_R700_DOUBLE_OPS)
1884 .Case("rv770", GK_R700_DOUBLE_OPS)
1885 .Case("palm", GK_EVERGREEN)
1886 .Case("cedar", GK_EVERGREEN)
1887 .Case("sumo", GK_EVERGREEN)
1888 .Case("sumo2", GK_EVERGREEN)
1889 .Case("redwood", GK_EVERGREEN)
1890 .Case("juniper", GK_EVERGREEN)
1891 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1892 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1893 .Case("barts", GK_NORTHERN_ISLANDS)
1894 .Case("turks", GK_NORTHERN_ISLANDS)
1895 .Case("caicos", GK_NORTHERN_ISLANDS)
1896 .Case("cayman", GK_CAYMAN)
1897 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001898 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001899 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1900 .Case("verde", GK_SOUTHERN_ISLANDS)
1901 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001902 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001903 .Case("bonaire", GK_SEA_ISLANDS)
1904 .Case("kabini", GK_SEA_ISLANDS)
1905 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001906 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001907 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001908 .Case("tonga", GK_VOLCANIC_ISLANDS)
1909 .Case("iceland", GK_VOLCANIC_ISLANDS)
1910 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001911 .Default(GK_NONE);
1912
1913 if (GPU == GK_NONE) {
1914 return false;
1915 }
1916
1917 // Set the correct data layout
1918 switch (GPU) {
1919 case GK_NONE:
1920 case GK_R600:
1921 case GK_R700:
1922 case GK_EVERGREEN:
1923 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001924 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001925 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001926 hasFMAF = false;
1927 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001928 break;
1929 case GK_R600_DOUBLE_OPS:
1930 case GK_R700_DOUBLE_OPS:
1931 case GK_EVERGREEN_DOUBLE_OPS:
1932 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001933 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001934 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001935 hasFMAF = true;
1936 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001937 break;
1938 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001939 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001940 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001941 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001942 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001943 hasFMAF = true;
1944 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001945 break;
1946 }
1947
1948 return true;
1949 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001950};
1951
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001952const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001953#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001954 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001955#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001956};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001957const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001958 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1959 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1960 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1961 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1962 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1963 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1964 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1965 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1966 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1967 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1968 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1969 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1970 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1971 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1972 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1973 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1974 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1975 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1976 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1977 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1978 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1979 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1980 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1981 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1982 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1983 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1984 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1985 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1986 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1987 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1988 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1989 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1990 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1991 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1992 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1993 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1994 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1995 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1996 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1997 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1998 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1999 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2000 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2001 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2002 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2003 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2004 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2005 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2006 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2007 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2008};
2009
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002010void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
2011 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002012 Names = GCCRegNames;
2013 NumNames = llvm::array_lengthof(GCCRegNames);
2014}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002015
Eli Friedman3fd920a2008-08-20 02:34:37 +00002016// Namespace for x86 abstract base class
2017const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002018#define BUILTIN(ID, TYPE, ATTRS) \
2019 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002020#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002021 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002022#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002023 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002024#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002025};
Eli Friedmanb5366062008-05-20 14:21:01 +00002026
Nuno Lopescfca1f02009-12-23 17:49:57 +00002027static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002028 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2029 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002030 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002031 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2032 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2033 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002034 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002035 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2036 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002037};
2038
Eric Christophercdd36352011-06-21 00:05:20 +00002039const TargetInfo::AddlRegName AddlRegNames[] = {
2040 { { "al", "ah", "eax", "rax" }, 0 },
2041 { { "bl", "bh", "ebx", "rbx" }, 3 },
2042 { { "cl", "ch", "ecx", "rcx" }, 2 },
2043 { { "dl", "dh", "edx", "rdx" }, 1 },
2044 { { "esi", "rsi" }, 4 },
2045 { { "edi", "rdi" }, 5 },
2046 { { "esp", "rsp" }, 7 },
2047 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002048 { { "r8d", "r8w", "r8b" }, 38 },
2049 { { "r9d", "r9w", "r9b" }, 39 },
2050 { { "r10d", "r10w", "r10b" }, 40 },
2051 { { "r11d", "r11w", "r11b" }, 41 },
2052 { { "r12d", "r12w", "r12b" }, 42 },
2053 { { "r13d", "r13w", "r13b" }, 43 },
2054 { { "r14d", "r14w", "r14b" }, 44 },
2055 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002056};
2057
2058// X86 target abstract base class; x86-32 and x86-64 are very close, so
2059// most of the implementation can be shared.
2060class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002061 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002062 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002063 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002064 enum MMX3DNowEnum {
2065 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002066 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002067 enum XOPEnum {
2068 NoXOP,
2069 SSE4A,
2070 FMA4,
2071 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002072 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002073
Craig Topper543f3bd2015-10-14 23:47:57 +00002074 bool HasAES = false;
2075 bool HasPCLMUL = false;
2076 bool HasLZCNT = false;
2077 bool HasRDRND = false;
2078 bool HasFSGSBASE = false;
2079 bool HasBMI = false;
2080 bool HasBMI2 = false;
2081 bool HasPOPCNT = false;
2082 bool HasRTM = false;
2083 bool HasPRFCHW = false;
2084 bool HasRDSEED = false;
2085 bool HasADX = false;
2086 bool HasTBM = false;
2087 bool HasFMA = false;
2088 bool HasF16C = false;
2089 bool HasAVX512CD = false;
2090 bool HasAVX512ER = false;
2091 bool HasAVX512PF = false;
2092 bool HasAVX512DQ = false;
2093 bool HasAVX512BW = false;
2094 bool HasAVX512VL = false;
2095 bool HasSHA = false;
2096 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002097 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002098 bool HasXSAVE = false;
2099 bool HasXSAVEOPT = false;
2100 bool HasXSAVEC = false;
2101 bool HasXSAVES = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002102
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002103 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2104 ///
2105 /// Each enumeration represents a particular CPU supported by Clang. These
2106 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2107 enum CPUKind {
2108 CK_Generic,
2109
2110 /// \name i386
2111 /// i386-generation processors.
2112 //@{
2113 CK_i386,
2114 //@}
2115
2116 /// \name i486
2117 /// i486-generation processors.
2118 //@{
2119 CK_i486,
2120 CK_WinChipC6,
2121 CK_WinChip2,
2122 CK_C3,
2123 //@}
2124
2125 /// \name i586
2126 /// i586-generation processors, P5 microarchitecture based.
2127 //@{
2128 CK_i586,
2129 CK_Pentium,
2130 CK_PentiumMMX,
2131 //@}
2132
2133 /// \name i686
2134 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2135 //@{
2136 CK_i686,
2137 CK_PentiumPro,
2138 CK_Pentium2,
2139 CK_Pentium3,
2140 CK_Pentium3M,
2141 CK_PentiumM,
2142 CK_C3_2,
2143
2144 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2145 /// Clang however has some logic to suport this.
2146 // FIXME: Warn, deprecate, and potentially remove this.
2147 CK_Yonah,
2148 //@}
2149
2150 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002151 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002152 //@{
2153 CK_Pentium4,
2154 CK_Pentium4M,
2155 CK_Prescott,
2156 CK_Nocona,
2157 //@}
2158
2159 /// \name Core
2160 /// Core microarchitecture based processors.
2161 //@{
2162 CK_Core2,
2163
2164 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2165 /// codename which GCC no longer accepts as an option to -march, but Clang
2166 /// has some logic for recognizing it.
2167 // FIXME: Warn, deprecate, and potentially remove this.
2168 CK_Penryn,
2169 //@}
2170
2171 /// \name Atom
2172 /// Atom processors
2173 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002174 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002175 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002176 //@}
2177
2178 /// \name Nehalem
2179 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002180 CK_Nehalem,
2181
2182 /// \name Westmere
2183 /// Westmere microarchitecture based processors.
2184 CK_Westmere,
2185
2186 /// \name Sandy Bridge
2187 /// Sandy Bridge microarchitecture based processors.
2188 CK_SandyBridge,
2189
2190 /// \name Ivy Bridge
2191 /// Ivy Bridge microarchitecture based processors.
2192 CK_IvyBridge,
2193
2194 /// \name Haswell
2195 /// Haswell microarchitecture based processors.
2196 CK_Haswell,
2197
2198 /// \name Broadwell
2199 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002200 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002201
2202 /// \name Skylake
2203 /// Skylake microarchitecture based processors.
2204 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002205
Craig Topper449314e2013-08-20 07:09:39 +00002206 /// \name Knights Landing
2207 /// Knights Landing processor.
2208 CK_KNL,
2209
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002210 /// \name K6
2211 /// K6 architecture processors.
2212 //@{
2213 CK_K6,
2214 CK_K6_2,
2215 CK_K6_3,
2216 //@}
2217
2218 /// \name K7
2219 /// K7 architecture processors.
2220 //@{
2221 CK_Athlon,
2222 CK_AthlonThunderbird,
2223 CK_Athlon4,
2224 CK_AthlonXP,
2225 CK_AthlonMP,
2226 //@}
2227
2228 /// \name K8
2229 /// K8 architecture processors.
2230 //@{
2231 CK_Athlon64,
2232 CK_Athlon64SSE3,
2233 CK_AthlonFX,
2234 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002235 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002236 CK_Opteron,
2237 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002238 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002239 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002240
Benjamin Kramer569f2152012-01-10 11:50:18 +00002241 /// \name Bobcat
2242 /// Bobcat architecture processors.
2243 //@{
2244 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002245 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002246 //@}
2247
2248 /// \name Bulldozer
2249 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002250 //@{
2251 CK_BDVER1,
2252 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002253 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002254 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002255 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002256
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002257 /// This specification is deprecated and will be removed in the future.
2258 /// Users should prefer \see CK_K8.
2259 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002260 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002261 CK_x86_64,
2262 //@}
2263
2264 /// \name Geode
2265 /// Geode processors.
2266 //@{
2267 CK_Geode
2268 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002269 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002270
Eric Christopherc50738f2015-08-27 00:05:50 +00002271 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002272 return llvm::StringSwitch<CPUKind>(CPU)
2273 .Case("i386", CK_i386)
2274 .Case("i486", CK_i486)
2275 .Case("winchip-c6", CK_WinChipC6)
2276 .Case("winchip2", CK_WinChip2)
2277 .Case("c3", CK_C3)
2278 .Case("i586", CK_i586)
2279 .Case("pentium", CK_Pentium)
2280 .Case("pentium-mmx", CK_PentiumMMX)
2281 .Case("i686", CK_i686)
2282 .Case("pentiumpro", CK_PentiumPro)
2283 .Case("pentium2", CK_Pentium2)
2284 .Case("pentium3", CK_Pentium3)
2285 .Case("pentium3m", CK_Pentium3M)
2286 .Case("pentium-m", CK_PentiumM)
2287 .Case("c3-2", CK_C3_2)
2288 .Case("yonah", CK_Yonah)
2289 .Case("pentium4", CK_Pentium4)
2290 .Case("pentium4m", CK_Pentium4M)
2291 .Case("prescott", CK_Prescott)
2292 .Case("nocona", CK_Nocona)
2293 .Case("core2", CK_Core2)
2294 .Case("penryn", CK_Penryn)
2295 .Case("bonnell", CK_Bonnell)
2296 .Case("atom", CK_Bonnell) // Legacy name.
2297 .Case("silvermont", CK_Silvermont)
2298 .Case("slm", CK_Silvermont) // Legacy name.
2299 .Case("nehalem", CK_Nehalem)
2300 .Case("corei7", CK_Nehalem) // Legacy name.
2301 .Case("westmere", CK_Westmere)
2302 .Case("sandybridge", CK_SandyBridge)
2303 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2304 .Case("ivybridge", CK_IvyBridge)
2305 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2306 .Case("haswell", CK_Haswell)
2307 .Case("core-avx2", CK_Haswell) // Legacy name.
2308 .Case("broadwell", CK_Broadwell)
2309 .Case("skylake", CK_Skylake)
2310 .Case("skx", CK_Skylake) // Legacy name.
2311 .Case("knl", CK_KNL)
2312 .Case("k6", CK_K6)
2313 .Case("k6-2", CK_K6_2)
2314 .Case("k6-3", CK_K6_3)
2315 .Case("athlon", CK_Athlon)
2316 .Case("athlon-tbird", CK_AthlonThunderbird)
2317 .Case("athlon-4", CK_Athlon4)
2318 .Case("athlon-xp", CK_AthlonXP)
2319 .Case("athlon-mp", CK_AthlonMP)
2320 .Case("athlon64", CK_Athlon64)
2321 .Case("athlon64-sse3", CK_Athlon64SSE3)
2322 .Case("athlon-fx", CK_AthlonFX)
2323 .Case("k8", CK_K8)
2324 .Case("k8-sse3", CK_K8SSE3)
2325 .Case("opteron", CK_Opteron)
2326 .Case("opteron-sse3", CK_OpteronSSE3)
2327 .Case("barcelona", CK_AMDFAM10)
2328 .Case("amdfam10", CK_AMDFAM10)
2329 .Case("btver1", CK_BTVER1)
2330 .Case("btver2", CK_BTVER2)
2331 .Case("bdver1", CK_BDVER1)
2332 .Case("bdver2", CK_BDVER2)
2333 .Case("bdver3", CK_BDVER3)
2334 .Case("bdver4", CK_BDVER4)
2335 .Case("x86-64", CK_x86_64)
2336 .Case("geode", CK_Geode)
2337 .Default(CK_Generic);
2338 }
2339
Rafael Espindolaeb265472013-08-21 21:59:03 +00002340 enum FPMathKind {
2341 FP_Default,
2342 FP_SSE,
2343 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002344 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002345
Eli Friedman3fd920a2008-08-20 02:34:37 +00002346public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002347 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002348 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002349 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002350 }
Craig Topper3164f332014-03-11 03:39:26 +00002351 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002352 // X87 evaluates with 80 bits "long double" precision.
2353 return SSELevel == NoSSE ? 2 : 0;
2354 }
Craig Topper3164f332014-03-11 03:39:26 +00002355 void getTargetBuiltins(const Builtin::Info *&Records,
2356 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002357 Records = BuiltinInfo;
2358 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002359 }
Craig Topper3164f332014-03-11 03:39:26 +00002360 void getGCCRegNames(const char * const *&Names,
2361 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002362 Names = GCCRegNames;
2363 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002364 }
Craig Topper3164f332014-03-11 03:39:26 +00002365 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2366 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002367 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002368 NumAliases = 0;
2369 }
Craig Topper3164f332014-03-11 03:39:26 +00002370 void getGCCAddlRegNames(const AddlRegName *&Names,
2371 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002372 Names = AddlRegNames;
2373 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002374 }
Eric Christopherd9832702015-06-29 21:00:05 +00002375 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002376 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002377 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002378
Akira Hatanaka974131e2014-09-18 18:17:18 +00002379 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2380
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002381 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2382
Akira Hatanaka974131e2014-09-18 18:17:18 +00002383 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2384
Craig Topper3164f332014-03-11 03:39:26 +00002385 std::string convertConstraint(const char *&Constraint) const override;
2386 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002387 return "~{dirflag},~{fpsr},~{flags}";
2388 }
Craig Topper3164f332014-03-11 03:39:26 +00002389 void getTargetDefines(const LangOptions &Opts,
2390 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002391 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2392 bool Enabled);
2393 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2394 bool Enabled);
2395 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2396 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002397 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2398 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002399 setFeatureEnabledImpl(Features, Name, Enabled);
2400 }
2401 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002402 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002403 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2404 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002405 bool
2406 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2407 StringRef CPU,
2408 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002409 bool hasFeature(StringRef Feature) const override;
2410 bool handleTargetFeatures(std::vector<std::string> &Features,
2411 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002412 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002413 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2414 return "avx512";
2415 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002416 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002417 else if (getTriple().getArch() == llvm::Triple::x86 &&
2418 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002419 return "no-mmx";
2420 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002421 }
Craig Topper3164f332014-03-11 03:39:26 +00002422 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002423 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002424
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002425 // Perform any per-CPU checks necessary to determine if this CPU is
2426 // acceptable.
2427 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2428 // invalid without explaining *why*.
2429 switch (CPU) {
2430 case CK_Generic:
2431 // No processor selected!
2432 return false;
2433
2434 case CK_i386:
2435 case CK_i486:
2436 case CK_WinChipC6:
2437 case CK_WinChip2:
2438 case CK_C3:
2439 case CK_i586:
2440 case CK_Pentium:
2441 case CK_PentiumMMX:
2442 case CK_i686:
2443 case CK_PentiumPro:
2444 case CK_Pentium2:
2445 case CK_Pentium3:
2446 case CK_Pentium3M:
2447 case CK_PentiumM:
2448 case CK_Yonah:
2449 case CK_C3_2:
2450 case CK_Pentium4:
2451 case CK_Pentium4M:
2452 case CK_Prescott:
2453 case CK_K6:
2454 case CK_K6_2:
2455 case CK_K6_3:
2456 case CK_Athlon:
2457 case CK_AthlonThunderbird:
2458 case CK_Athlon4:
2459 case CK_AthlonXP:
2460 case CK_AthlonMP:
2461 case CK_Geode:
2462 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002463 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002464 return false;
2465
2466 // Fallthrough
2467 case CK_Nocona:
2468 case CK_Core2:
2469 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002470 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002471 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002472 case CK_Nehalem:
2473 case CK_Westmere:
2474 case CK_SandyBridge:
2475 case CK_IvyBridge:
2476 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002477 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002478 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002479 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002480 case CK_Athlon64:
2481 case CK_Athlon64SSE3:
2482 case CK_AthlonFX:
2483 case CK_K8:
2484 case CK_K8SSE3:
2485 case CK_Opteron:
2486 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002487 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002488 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002489 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002490 case CK_BDVER1:
2491 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002492 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002493 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002494 case CK_x86_64:
2495 return true;
2496 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002497 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002498 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002499
Craig Topper3164f332014-03-11 03:39:26 +00002500 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002501
Craig Topper3164f332014-03-11 03:39:26 +00002502 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002503 // We accept all non-ARM calling conventions
2504 return (CC == CC_X86ThisCall ||
2505 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002506 CC == CC_X86StdCall ||
2507 CC == CC_X86VectorCall ||
2508 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002509 CC == CC_X86Pascal ||
2510 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002511 }
2512
Craig Topper3164f332014-03-11 03:39:26 +00002513 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002514 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002515 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002516
2517 bool hasSjLjLowering() const override {
2518 return true;
2519 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002520};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002521
Rafael Espindolaeb265472013-08-21 21:59:03 +00002522bool X86TargetInfo::setFPMath(StringRef Name) {
2523 if (Name == "387") {
2524 FPMath = FP_387;
2525 return true;
2526 }
2527 if (Name == "sse") {
2528 FPMath = FP_SSE;
2529 return true;
2530 }
2531 return false;
2532}
2533
Eric Christopher007b0a02015-08-28 22:32:01 +00002534bool X86TargetInfo::initFeatureMap(
2535 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002536 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002537 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002538 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002539 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002540 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002541
Eric Christopher2b4a7252015-08-27 00:05:52 +00002542 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002543 case CK_Generic:
2544 case CK_i386:
2545 case CK_i486:
2546 case CK_i586:
2547 case CK_Pentium:
2548 case CK_i686:
2549 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002550 break;
2551 case CK_PentiumMMX:
2552 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002553 case CK_K6:
2554 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002555 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002556 break;
2557 case CK_Pentium3:
2558 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002559 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002560 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002561 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002562 break;
2563 case CK_PentiumM:
2564 case CK_Pentium4:
2565 case CK_Pentium4M:
2566 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002567 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002568 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002569 break;
2570 case CK_Yonah:
2571 case CK_Prescott:
2572 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002573 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002574 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002575 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002576 break;
2577 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002578 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002579 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002580 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002581 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002582 break;
2583 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002584 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002585 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002586 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002587 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002588 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002589 setFeatureEnabledImpl(Features, "avx512f", true);
2590 setFeatureEnabledImpl(Features, "avx512cd", true);
2591 setFeatureEnabledImpl(Features, "avx512dq", true);
2592 setFeatureEnabledImpl(Features, "avx512bw", true);
2593 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002594 setFeatureEnabledImpl(Features, "xsavec", true);
2595 setFeatureEnabledImpl(Features, "xsaves", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002596 // FALLTHROUGH
2597 case CK_Broadwell:
2598 setFeatureEnabledImpl(Features, "rdseed", true);
2599 setFeatureEnabledImpl(Features, "adx", true);
2600 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002601 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002602 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002603 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002604 setFeatureEnabledImpl(Features, "bmi", true);
2605 setFeatureEnabledImpl(Features, "bmi2", true);
2606 setFeatureEnabledImpl(Features, "rtm", true);
2607 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002608 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002609 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002610 setFeatureEnabledImpl(Features, "rdrnd", true);
2611 setFeatureEnabledImpl(Features, "f16c", true);
2612 setFeatureEnabledImpl(Features, "fsgsbase", true);
2613 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002614 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002615 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002616 setFeatureEnabledImpl(Features, "xsave", true);
2617 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002618 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002619 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002620 case CK_Silvermont:
2621 setFeatureEnabledImpl(Features, "aes", true);
2622 setFeatureEnabledImpl(Features, "pclmul", true);
2623 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002624 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002625 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002626 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002627 setFeatureEnabledImpl(Features, "cx16", true);
2628 break;
2629 case CK_KNL:
2630 setFeatureEnabledImpl(Features, "avx512f", true);
2631 setFeatureEnabledImpl(Features, "avx512cd", true);
2632 setFeatureEnabledImpl(Features, "avx512er", true);
2633 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002634 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002635 setFeatureEnabledImpl(Features, "rdseed", true);
2636 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002637 setFeatureEnabledImpl(Features, "lzcnt", true);
2638 setFeatureEnabledImpl(Features, "bmi", true);
2639 setFeatureEnabledImpl(Features, "bmi2", true);
2640 setFeatureEnabledImpl(Features, "rtm", true);
2641 setFeatureEnabledImpl(Features, "fma", true);
2642 setFeatureEnabledImpl(Features, "rdrnd", true);
2643 setFeatureEnabledImpl(Features, "f16c", true);
2644 setFeatureEnabledImpl(Features, "fsgsbase", true);
2645 setFeatureEnabledImpl(Features, "aes", true);
2646 setFeatureEnabledImpl(Features, "pclmul", true);
2647 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002648 setFeatureEnabledImpl(Features, "xsaveopt", true);
2649 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002650 break;
2651 case CK_K6_2:
2652 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002653 case CK_WinChip2:
2654 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002655 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002656 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002657 case CK_Athlon:
2658 case CK_AthlonThunderbird:
2659 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002660 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002661 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002662 case CK_Athlon4:
2663 case CK_AthlonXP:
2664 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002665 setFeatureEnabledImpl(Features, "sse", true);
2666 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002667 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002668 break;
2669 case CK_K8:
2670 case CK_Opteron:
2671 case CK_Athlon64:
2672 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002673 setFeatureEnabledImpl(Features, "sse2", true);
2674 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002675 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002676 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002677 case CK_AMDFAM10:
2678 setFeatureEnabledImpl(Features, "sse4a", true);
2679 setFeatureEnabledImpl(Features, "lzcnt", true);
2680 setFeatureEnabledImpl(Features, "popcnt", true);
2681 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002682 case CK_K8SSE3:
2683 case CK_OpteronSSE3:
2684 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002685 setFeatureEnabledImpl(Features, "sse3", true);
2686 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002687 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002688 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002689 case CK_BTVER2:
2690 setFeatureEnabledImpl(Features, "avx", true);
2691 setFeatureEnabledImpl(Features, "aes", true);
2692 setFeatureEnabledImpl(Features, "pclmul", true);
2693 setFeatureEnabledImpl(Features, "bmi", true);
2694 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002695 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002696 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002697 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002698 setFeatureEnabledImpl(Features, "ssse3", true);
2699 setFeatureEnabledImpl(Features, "sse4a", true);
2700 setFeatureEnabledImpl(Features, "lzcnt", true);
2701 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002702 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002703 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002704 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002705 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002706 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002707 case CK_BDVER4:
2708 setFeatureEnabledImpl(Features, "avx2", true);
2709 setFeatureEnabledImpl(Features, "bmi2", true);
2710 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002711 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002712 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002713 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002714 // FALLTHROUGH
2715 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002716 setFeatureEnabledImpl(Features, "bmi", true);
2717 setFeatureEnabledImpl(Features, "fma", true);
2718 setFeatureEnabledImpl(Features, "f16c", true);
2719 setFeatureEnabledImpl(Features, "tbm", true);
2720 // FALLTHROUGH
2721 case CK_BDVER1:
2722 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002723 setFeatureEnabledImpl(Features, "xop", true);
2724 setFeatureEnabledImpl(Features, "lzcnt", true);
2725 setFeatureEnabledImpl(Features, "aes", true);
2726 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002727 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002728 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002729 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002730 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002731 break;
Eli Friedman33465822011-07-08 23:31:17 +00002732 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002733 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2734 return false;
2735
2736 // Can't do this earlier because we need to be able to explicitly enable
2737 // or disable these features and the things that they depend upon.
2738
2739 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2740 auto I = Features.find("sse4.2");
2741 if (I != Features.end() && I->getValue() == true &&
2742 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2743 FeaturesVec.end())
2744 Features["popcnt"] = true;
2745
2746 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2747 I = Features.find("3dnow");
2748 if (I != Features.end() && I->getValue() == true &&
2749 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2750 FeaturesVec.end())
2751 Features["prfchw"] = true;
2752
Eric Christophera7260af2015-10-08 20:10:18 +00002753 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2754 // then enable MMX.
2755 I = Features.find("sse");
2756 if (I != Features.end() && I->getValue() == true &&
2757 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2758 FeaturesVec.end())
2759 Features["mmx"] = true;
2760
Eric Christopherbbd746d2015-10-08 20:10:14 +00002761 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002762}
2763
Rafael Espindolae62e2792013-08-20 13:44:29 +00002764void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002765 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002766 if (Enabled) {
2767 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002768 case AVX512F:
2769 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002770 case AVX2:
2771 Features["avx2"] = true;
2772 case AVX:
2773 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002774 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002775 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002776 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002777 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002778 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002779 case SSSE3:
2780 Features["ssse3"] = true;
2781 case SSE3:
2782 Features["sse3"] = true;
2783 case SSE2:
2784 Features["sse2"] = true;
2785 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002786 Features["sse"] = true;
2787 case NoSSE:
2788 break;
2789 }
2790 return;
2791 }
2792
2793 switch (Level) {
2794 case NoSSE:
2795 case SSE1:
2796 Features["sse"] = false;
2797 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002798 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2799 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002800 case SSE3:
2801 Features["sse3"] = false;
2802 setXOPLevel(Features, NoXOP, false);
2803 case SSSE3:
2804 Features["ssse3"] = false;
2805 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002806 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002807 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002808 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002809 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002810 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2811 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002812 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002813 case AVX2:
2814 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002815 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002816 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002817 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2818 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002819 }
2820}
2821
2822void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002823 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002824 if (Enabled) {
2825 switch (Level) {
2826 case AMD3DNowAthlon:
2827 Features["3dnowa"] = true;
2828 case AMD3DNow:
2829 Features["3dnow"] = true;
2830 case MMX:
2831 Features["mmx"] = true;
2832 case NoMMX3DNow:
2833 break;
2834 }
2835 return;
2836 }
2837
2838 switch (Level) {
2839 case NoMMX3DNow:
2840 case MMX:
2841 Features["mmx"] = false;
2842 case AMD3DNow:
2843 Features["3dnow"] = false;
2844 case AMD3DNowAthlon:
2845 Features["3dnowa"] = false;
2846 }
2847}
2848
2849void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002850 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002851 if (Enabled) {
2852 switch (Level) {
2853 case XOP:
2854 Features["xop"] = true;
2855 case FMA4:
2856 Features["fma4"] = true;
2857 setSSELevel(Features, AVX, true);
2858 case SSE4A:
2859 Features["sse4a"] = true;
2860 setSSELevel(Features, SSE3, true);
2861 case NoXOP:
2862 break;
2863 }
2864 return;
2865 }
2866
2867 switch (Level) {
2868 case NoXOP:
2869 case SSE4A:
2870 Features["sse4a"] = false;
2871 case FMA4:
2872 Features["fma4"] = false;
2873 case XOP:
2874 Features["xop"] = false;
2875 }
2876}
2877
Craig Topper86d79ef2013-09-17 04:51:29 +00002878void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2879 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002880 // This is a bit of a hack to deal with the sse4 target feature when used
2881 // as part of the target attribute. We handle sse4 correctly everywhere
2882 // else. See below for more information on how we handle the sse4 options.
2883 if (Name != "sse4")
2884 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002885
Craig Topper29561122013-09-19 01:13:07 +00002886 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002888 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002889 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002890 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002891 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002892 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002893 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002894 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002895 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002896 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002897 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002898 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002899 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002900 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002901 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002902 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002903 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002904 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002905 if (Enabled)
2906 setSSELevel(Features, SSE2, Enabled);
2907 } else if (Name == "pclmul") {
2908 if (Enabled)
2909 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002910 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002911 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002912 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002913 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002914 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002915 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002916 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2917 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002918 if (Enabled)
2919 setSSELevel(Features, AVX512F, Enabled);
2920 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002921 if (Enabled)
2922 setSSELevel(Features, AVX, Enabled);
2923 } else if (Name == "fma4") {
2924 setXOPLevel(Features, FMA4, Enabled);
2925 } else if (Name == "xop") {
2926 setXOPLevel(Features, XOP, Enabled);
2927 } else if (Name == "sse4a") {
2928 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002929 } else if (Name == "f16c") {
2930 if (Enabled)
2931 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002932 } else if (Name == "sha") {
2933 if (Enabled)
2934 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002935 } else if (Name == "sse4") {
2936 // We can get here via the __target__ attribute since that's not controlled
2937 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2938 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2939 // disabled.
2940 if (Enabled)
2941 setSSELevel(Features, SSE42, Enabled);
2942 else
2943 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002944 } else if (Name == "xsave") {
2945 if (Enabled)
2946 setSSELevel(Features, AVX, Enabled);
2947 else
2948 Features["xsaveopt"] = false;
2949 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2950 if (Enabled) {
2951 Features["xsave"] = true;
2952 setSSELevel(Features, AVX, Enabled);
2953 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002954 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002955}
2956
Eric Christopher3ff21b32013-10-16 21:26:26 +00002957/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002958/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002959bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002960 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002961 for (const auto &Feature : Features) {
2962 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002963 continue;
2964
Eric Christopher610fe112015-08-26 08:21:55 +00002965 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002966 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002967 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002968 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002969 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002970 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002971 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002972 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002973 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002974 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002975 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002976 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002977 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002978 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002979 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002980 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002981 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002982 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002983 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002984 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002985 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002986 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002987 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002988 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002989 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002990 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002991 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002992 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002993 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002994 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002995 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002996 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002997 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002998 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002999 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003000 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003001 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003002 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003003 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003004 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003005 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003006 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003007 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003008 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003009 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003010 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003011 } else if (Feature == "+fxsr") {
3012 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003013 } else if (Feature == "+xsave") {
3014 HasXSAVE = true;
3015 } else if (Feature == "+xsaveopt") {
3016 HasXSAVEOPT = true;
3017 } else if (Feature == "+xsavec") {
3018 HasXSAVEC = true;
3019 } else if (Feature == "+xsaves") {
3020 HasXSAVES = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003021 }
3022
Benjamin Kramer27402c62012-03-05 15:10:44 +00003023 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003024 .Case("+avx512f", AVX512F)
3025 .Case("+avx2", AVX2)
3026 .Case("+avx", AVX)
3027 .Case("+sse4.2", SSE42)
3028 .Case("+sse4.1", SSE41)
3029 .Case("+ssse3", SSSE3)
3030 .Case("+sse3", SSE3)
3031 .Case("+sse2", SSE2)
3032 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003033 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003034 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003035
Eli Friedman33465822011-07-08 23:31:17 +00003036 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003037 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003038 .Case("+3dnowa", AMD3DNowAthlon)
3039 .Case("+3dnow", AMD3DNow)
3040 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003041 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003042 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003043
3044 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003045 .Case("+xop", XOP)
3046 .Case("+fma4", FMA4)
3047 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003048 .Default(NoXOP);
3049 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003050 }
Eli Friedman33465822011-07-08 23:31:17 +00003051
Rafael Espindolaeb265472013-08-21 21:59:03 +00003052 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3053 // matches the selected sse level.
3054 if (FPMath == FP_SSE && SSELevel < SSE1) {
3055 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3056 return false;
3057 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3058 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3059 return false;
3060 }
3061
Alexey Bataev00396512015-07-02 03:40:19 +00003062 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003063 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003064 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003065}
Chris Lattnerecd49032009-03-02 22:27:17 +00003066
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003067/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3068/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003069void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003070 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003071 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003072 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003073 Builder.defineMacro("__amd64__");
3074 Builder.defineMacro("__amd64");
3075 Builder.defineMacro("__x86_64");
3076 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003077 if (getTriple().getArchName() == "x86_64h") {
3078 Builder.defineMacro("__x86_64h");
3079 Builder.defineMacro("__x86_64h__");
3080 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003081 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003082 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003083 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003084
Chris Lattnerecd49032009-03-02 22:27:17 +00003085 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003086 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3087 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003088 switch (CPU) {
3089 case CK_Generic:
3090 break;
3091 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003092 // The rest are coming from the i386 define above.
3093 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 break;
3095 case CK_i486:
3096 case CK_WinChipC6:
3097 case CK_WinChip2:
3098 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003099 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003100 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003101 case CK_PentiumMMX:
3102 Builder.defineMacro("__pentium_mmx__");
3103 Builder.defineMacro("__tune_pentium_mmx__");
3104 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003105 case CK_i586:
3106 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003107 defineCPUMacros(Builder, "i586");
3108 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003109 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003110 case CK_Pentium3:
3111 case CK_Pentium3M:
3112 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003113 Builder.defineMacro("__tune_pentium3__");
3114 // Fallthrough
3115 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003116 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003117 Builder.defineMacro("__tune_pentium2__");
3118 // Fallthrough
3119 case CK_PentiumPro:
3120 Builder.defineMacro("__tune_i686__");
3121 Builder.defineMacro("__tune_pentiumpro__");
3122 // Fallthrough
3123 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003124 Builder.defineMacro("__i686");
3125 Builder.defineMacro("__i686__");
3126 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3127 Builder.defineMacro("__pentiumpro");
3128 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003129 break;
3130 case CK_Pentium4:
3131 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003132 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003133 break;
3134 case CK_Yonah:
3135 case CK_Prescott:
3136 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003137 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003138 break;
3139 case CK_Core2:
3140 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003141 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003142 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003143 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003144 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003145 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003146 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003147 defineCPUMacros(Builder, "slm");
3148 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003149 case CK_Nehalem:
3150 case CK_Westmere:
3151 case CK_SandyBridge:
3152 case CK_IvyBridge:
3153 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003154 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003155 // FIXME: Historically, we defined this legacy name, it would be nice to
3156 // remove it at some point. We've never exposed fine-grained names for
3157 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003158 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003159 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003160 case CK_Skylake:
3161 // FIXME: Historically, we defined this legacy name, it would be nice to
3162 // remove it at some point. This is the only fine-grained CPU macro in the
3163 // main intel CPU line, and it would be better to not have these and force
3164 // people to use ISA macros.
3165 defineCPUMacros(Builder, "skx");
3166 break;
Craig Topper449314e2013-08-20 07:09:39 +00003167 case CK_KNL:
3168 defineCPUMacros(Builder, "knl");
3169 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003170 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003171 Builder.defineMacro("__k6_2__");
3172 Builder.defineMacro("__tune_k6_2__");
3173 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003174 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003175 if (CPU != CK_K6_2) { // In case of fallthrough
3176 // FIXME: GCC may be enabling these in cases where some other k6
3177 // architecture is specified but -m3dnow is explicitly provided. The
3178 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003179 Builder.defineMacro("__k6_3__");
3180 Builder.defineMacro("__tune_k6_3__");
3181 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003182 // Fallthrough
3183 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003184 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003185 break;
3186 case CK_Athlon:
3187 case CK_AthlonThunderbird:
3188 case CK_Athlon4:
3189 case CK_AthlonXP:
3190 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003191 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003192 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003193 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003194 Builder.defineMacro("__tune_athlon_sse__");
3195 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003196 break;
3197 case CK_K8:
3198 case CK_K8SSE3:
3199 case CK_x86_64:
3200 case CK_Opteron:
3201 case CK_OpteronSSE3:
3202 case CK_Athlon64:
3203 case CK_Athlon64SSE3:
3204 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003205 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003206 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003207 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003208 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003209 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003210 case CK_BTVER1:
3211 defineCPUMacros(Builder, "btver1");
3212 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003213 case CK_BTVER2:
3214 defineCPUMacros(Builder, "btver2");
3215 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003216 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003217 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003218 break;
3219 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003220 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003221 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003222 case CK_BDVER3:
3223 defineCPUMacros(Builder, "bdver3");
3224 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003225 case CK_BDVER4:
3226 defineCPUMacros(Builder, "bdver4");
3227 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003228 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003229 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003230 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003231 }
Chris Lattner96e43572009-03-02 22:40:39 +00003232
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003233 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003234 Builder.defineMacro("__REGISTER_PREFIX__", "");
3235
Chris Lattner6df41af2009-04-19 17:32:33 +00003236 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3237 // functions in glibc header files that use FP Stack inline asm which the
3238 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003239 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003240
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003241 if (HasAES)
3242 Builder.defineMacro("__AES__");
3243
Craig Topper3f122a72012-05-31 05:18:48 +00003244 if (HasPCLMUL)
3245 Builder.defineMacro("__PCLMUL__");
3246
Craig Topper22967d42011-12-25 05:06:45 +00003247 if (HasLZCNT)
3248 Builder.defineMacro("__LZCNT__");
3249
Benjamin Kramer1e250392012-07-07 09:39:18 +00003250 if (HasRDRND)
3251 Builder.defineMacro("__RDRND__");
3252
Craig Topper8c7f2512014-11-03 06:51:41 +00003253 if (HasFSGSBASE)
3254 Builder.defineMacro("__FSGSBASE__");
3255
Craig Topper22967d42011-12-25 05:06:45 +00003256 if (HasBMI)
3257 Builder.defineMacro("__BMI__");
3258
3259 if (HasBMI2)
3260 Builder.defineMacro("__BMI2__");
3261
Craig Topper1de83482011-12-29 16:10:46 +00003262 if (HasPOPCNT)
3263 Builder.defineMacro("__POPCNT__");
3264
Michael Liao625a8752012-11-10 05:17:46 +00003265 if (HasRTM)
3266 Builder.defineMacro("__RTM__");
3267
Michael Liao74f4eaf2013-03-26 17:52:08 +00003268 if (HasPRFCHW)
3269 Builder.defineMacro("__PRFCHW__");
3270
Michael Liaoffaae352013-03-29 05:17:55 +00003271 if (HasRDSEED)
3272 Builder.defineMacro("__RDSEED__");
3273
Robert Khasanov50e6f582014-09-19 09:53:48 +00003274 if (HasADX)
3275 Builder.defineMacro("__ADX__");
3276
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003277 if (HasTBM)
3278 Builder.defineMacro("__TBM__");
3279
Rafael Espindolae62e2792013-08-20 13:44:29 +00003280 switch (XOPLevel) {
3281 case XOP:
3282 Builder.defineMacro("__XOP__");
3283 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003284 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003285 case SSE4A:
3286 Builder.defineMacro("__SSE4A__");
3287 case NoXOP:
3288 break;
3289 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003290
Craig Topperbba778b2012-06-03 21:46:30 +00003291 if (HasFMA)
3292 Builder.defineMacro("__FMA__");
3293
Manman Rena45358c2012-10-11 00:59:55 +00003294 if (HasF16C)
3295 Builder.defineMacro("__F16C__");
3296
Craig Topper679b53a2013-08-21 05:29:10 +00003297 if (HasAVX512CD)
3298 Builder.defineMacro("__AVX512CD__");
3299 if (HasAVX512ER)
3300 Builder.defineMacro("__AVX512ER__");
3301 if (HasAVX512PF)
3302 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003303 if (HasAVX512DQ)
3304 Builder.defineMacro("__AVX512DQ__");
3305 if (HasAVX512BW)
3306 Builder.defineMacro("__AVX512BW__");
3307 if (HasAVX512VL)
3308 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003309
Ben Langmuir58078d02013-09-19 13:22:04 +00003310 if (HasSHA)
3311 Builder.defineMacro("__SHA__");
3312
Craig Toppere33f51f2015-10-16 06:22:36 +00003313 if (HasFXSR)
3314 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003315 if (HasXSAVE)
3316 Builder.defineMacro("__XSAVE__");
3317 if (HasXSAVEOPT)
3318 Builder.defineMacro("__XSAVEOPT__");
3319 if (HasXSAVEC)
3320 Builder.defineMacro("__XSAVEC__");
3321 if (HasXSAVES)
3322 Builder.defineMacro("__XSAVES__");
3323
Nick Lewycky50e8f482013-10-05 20:14:27 +00003324 if (HasCX16)
3325 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3326
Chris Lattner96e43572009-03-02 22:40:39 +00003327 // Each case falls through to the previous one here.
3328 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003329 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003330 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003331 case AVX2:
3332 Builder.defineMacro("__AVX2__");
3333 case AVX:
3334 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003335 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003336 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003337 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003338 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003339 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003340 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003341 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003342 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003343 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003344 Builder.defineMacro("__SSE2__");
3345 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003346 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003347 Builder.defineMacro("__SSE__");
3348 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003349 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003350 break;
3351 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003352
Derek Schuffc7dd7222012-10-11 15:52:22 +00003353 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003354 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003355 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003356 case AVX2:
3357 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003358 case SSE42:
3359 case SSE41:
3360 case SSSE3:
3361 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003362 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003363 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003364 break;
3365 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003366 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003367 break;
3368 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003369 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003370 }
3371 }
3372
Anders Carlssone437c682010-01-27 03:47:49 +00003373 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003374 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003375 case AMD3DNowAthlon:
3376 Builder.defineMacro("__3dNOW_A__");
3377 case AMD3DNow:
3378 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003379 case MMX:
3380 Builder.defineMacro("__MMX__");
3381 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003382 break;
3383 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003384
3385 if (CPU >= CK_i486) {
3386 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3387 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3388 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3389 }
3390 if (CPU >= CK_i586)
3391 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003392}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003393
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003394bool X86TargetInfo::hasFeature(StringRef Feature) const {
3395 return llvm::StringSwitch<bool>(Feature)
3396 .Case("aes", HasAES)
3397 .Case("avx", SSELevel >= AVX)
3398 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003399 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003400 .Case("avx512cd", HasAVX512CD)
3401 .Case("avx512er", HasAVX512ER)
3402 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003403 .Case("avx512dq", HasAVX512DQ)
3404 .Case("avx512bw", HasAVX512BW)
3405 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003406 .Case("bmi", HasBMI)
3407 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003408 .Case("cx16", HasCX16)
3409 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003410 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003411 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003412 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003413 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003414 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003415 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3416 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3417 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003418 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003419 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003420 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003421 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003422 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003423 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003424 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003425 .Case("sse", SSELevel >= SSE1)
3426 .Case("sse2", SSELevel >= SSE2)
3427 .Case("sse3", SSELevel >= SSE3)
3428 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003429 .Case("sse4.1", SSELevel >= SSE41)
3430 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003431 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003432 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003433 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003434 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3435 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003436 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003437 .Case("xsave", HasXSAVE)
3438 .Case("xsavec", HasXSAVEC)
3439 .Case("xsaves", HasXSAVES)
3440 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003441 .Default(false);
3442}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003443
Eric Christopherd9832702015-06-29 21:00:05 +00003444// We can't use a generic validation scheme for the features accepted here
3445// versus subtarget features accepted in the target attribute because the
3446// bitfield structure that's initialized in the runtime only supports the
3447// below currently rather than the full range of subtarget features. (See
3448// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3449bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3450 return llvm::StringSwitch<bool>(FeatureStr)
3451 .Case("cmov", true)
3452 .Case("mmx", true)
3453 .Case("popcnt", true)
3454 .Case("sse", true)
3455 .Case("sse2", true)
3456 .Case("sse3", true)
3457 .Case("sse4.1", true)
3458 .Case("sse4.2", true)
3459 .Case("avx", true)
3460 .Case("avx2", true)
3461 .Case("sse4a", true)
3462 .Case("fma4", true)
3463 .Case("xop", true)
3464 .Case("fma", true)
3465 .Case("avx512f", true)
3466 .Case("bmi", true)
3467 .Case("bmi2", true)
3468 .Default(false);
3469}
3470
Eli Friedman3fd920a2008-08-20 02:34:37 +00003471bool
Anders Carlsson58436352009-02-28 17:11:49 +00003472X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003473 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003474 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003475 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003476 // Constant constraints.
3477 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3478 // instructions.
3479 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3480 // x86_64 instructions.
3481 case 's':
3482 Info.setRequiresImmediate();
3483 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003484 case 'I':
3485 Info.setRequiresImmediate(0, 31);
3486 return true;
3487 case 'J':
3488 Info.setRequiresImmediate(0, 63);
3489 return true;
3490 case 'K':
3491 Info.setRequiresImmediate(-128, 127);
3492 return true;
3493 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003494 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003495 return true;
3496 case 'M':
3497 Info.setRequiresImmediate(0, 3);
3498 return true;
3499 case 'N':
3500 Info.setRequiresImmediate(0, 255);
3501 return true;
3502 case 'O':
3503 Info.setRequiresImmediate(0, 127);
3504 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003505 // Register constraints.
3506 case 'Y': // 'Y' is the first character for several 2-character constraints.
3507 // Shift the pointer to the second character of the constraint.
3508 Name++;
3509 switch (*Name) {
3510 default:
3511 return false;
3512 case '0': // First SSE register.
3513 case 't': // Any SSE register, when SSE2 is enabled.
3514 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3515 case 'm': // Any MMX register, when inter-unit moves enabled.
3516 Info.setAllowsRegister();
3517 return true;
3518 }
3519 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003520 // Constraint 'f' cannot be used for output operands.
3521 if (Info.ConstraintStr[0] == '=')
3522 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003523 Info.setAllowsRegister();
3524 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003525 case 'a': // eax.
3526 case 'b': // ebx.
3527 case 'c': // ecx.
3528 case 'd': // edx.
3529 case 'S': // esi.
3530 case 'D': // edi.
3531 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003532 case 't': // Top of floating point stack.
3533 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003534 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003535 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003536 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003537 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003538 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3539 case 'l': // "Index" registers: any general register that can be used as an
3540 // index in a base+index memory access.
3541 Info.setAllowsRegister();
3542 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003543 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003544 case 'C': // SSE floating point constant.
3545 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003546 return true;
3547 }
3548}
3549
Akira Hatanaka974131e2014-09-18 18:17:18 +00003550bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3551 unsigned Size) const {
3552 // Strip off constraint modifiers.
3553 while (Constraint[0] == '=' ||
3554 Constraint[0] == '+' ||
3555 Constraint[0] == '&')
3556 Constraint = Constraint.substr(1);
3557
3558 return validateOperandSize(Constraint, Size);
3559}
3560
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003561bool X86TargetInfo::validateInputSize(StringRef Constraint,
3562 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003563 return validateOperandSize(Constraint, Size);
3564}
3565
3566bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3567 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003568 switch (Constraint[0]) {
3569 default: break;
3570 case 'y':
3571 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003572 case 'f':
3573 case 't':
3574 case 'u':
3575 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003576 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003577 if (SSELevel >= AVX512F)
3578 // 512-bit zmm registers can be used if target supports AVX512F.
3579 return Size <= 512U;
3580 else if (SSELevel >= AVX)
3581 // 256-bit ymm registers can be used if target supports AVX.
3582 return Size <= 256U;
3583 return Size <= 128U;
3584 case 'Y':
3585 // 'Y' is the first character for several 2-character constraints.
3586 switch (Constraint[1]) {
3587 default: break;
3588 case 'm':
3589 // 'Ym' is synonymous with 'y'.
3590 return Size <= 64;
3591 case 'i':
3592 case 't':
3593 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3594 if (SSELevel >= AVX512F)
3595 return Size <= 512U;
3596 else if (SSELevel >= AVX)
3597 return Size <= 256U;
3598 return SSELevel >= SSE2 && Size <= 128U;
3599 }
3600
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003601 }
3602
3603 return true;
3604}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003605
Eli Friedman3fd920a2008-08-20 02:34:37 +00003606std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003607X86TargetInfo::convertConstraint(const char *&Constraint) const {
3608 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003609 case 'a': return std::string("{ax}");
3610 case 'b': return std::string("{bx}");
3611 case 'c': return std::string("{cx}");
3612 case 'd': return std::string("{dx}");
3613 case 'S': return std::string("{si}");
3614 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003615 case 'p': // address
3616 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003617 case 't': // top of floating point stack.
3618 return std::string("{st}");
3619 case 'u': // second from top of floating point stack.
3620 return std::string("{st(1)}"); // second from top of floating point stack.
3621 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003622 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003623 }
3624}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003625
Eli Friedman3fd920a2008-08-20 02:34:37 +00003626// X86-32 generic target
3627class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003628public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003629 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003630 DoubleAlign = LongLongAlign = 32;
3631 LongDoubleWidth = 96;
3632 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003633 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003634 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003635 SizeType = UnsignedInt;
3636 PtrDiffType = SignedInt;
3637 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003638 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003639
3640 // Use fpret for all types.
3641 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3642 (1 << TargetInfo::Double) |
3643 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003644
3645 // x86-32 has atomics up to 8 bytes
3646 // FIXME: Check that we actually have cmpxchg8b before setting
3647 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3648 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003649 }
Craig Topper3164f332014-03-11 03:39:26 +00003650 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003651 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003652 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003653
Craig Topper3164f332014-03-11 03:39:26 +00003654 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003655 if (RegNo == 0) return 0;
3656 if (RegNo == 1) return 2;
3657 return -1;
3658 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003659 bool validateOperandSize(StringRef Constraint,
3660 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003661 switch (Constraint[0]) {
3662 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003663 case 'R':
3664 case 'q':
3665 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003666 case 'a':
3667 case 'b':
3668 case 'c':
3669 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003670 case 'S':
3671 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003672 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003673 case 'A':
3674 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003675 }
3676
Akira Hatanaka974131e2014-09-18 18:17:18 +00003677 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003678 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003679};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003680
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003681class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3682public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003683 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3684 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003685
Craig Topper3164f332014-03-11 03:39:26 +00003686 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003687 unsigned Major, Minor, Micro;
3688 getTriple().getOSVersion(Major, Minor, Micro);
3689 // New NetBSD uses the default rounding mode.
3690 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3691 return X86_32TargetInfo::getFloatEvalMethod();
3692 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003693 return 1;
3694 }
3695};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003696
Eli Friedmane3aa4542009-07-05 18:47:56 +00003697class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3698public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003699 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3700 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003701 SizeType = UnsignedLong;
3702 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003703 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003704 }
3705};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003706
Eli Friedman9fa28852012-08-08 23:57:20 +00003707class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3708public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003709 BitrigI386TargetInfo(const llvm::Triple &Triple)
3710 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003711 SizeType = UnsignedLong;
3712 IntPtrType = SignedLong;
3713 PtrDiffType = SignedLong;
3714 }
3715};
Eli Friedman9fa28852012-08-08 23:57:20 +00003716
Torok Edwinb2b37c62009-06-30 17:10:35 +00003717class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003718public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003719 DarwinI386TargetInfo(const llvm::Triple &Triple)
3720 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003721 LongDoubleWidth = 128;
3722 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003723 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003724 SizeType = UnsignedLong;
3725 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003726 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003727 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003728 }
3729
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003730 bool handleTargetFeatures(std::vector<std::string> &Features,
3731 DiagnosticsEngine &Diags) override {
3732 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3733 Diags))
3734 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003735 // We now know the features we have: we can decide how to align vectors.
3736 MaxVectorAlign =
3737 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003738 return true;
3739 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003740};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003741
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003742// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003743class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003744public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003745 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3746 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003747 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003748 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003749 bool IsWinCOFF =
3750 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003751 DataLayoutString = IsWinCOFF
3752 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3753 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003754 }
Craig Topper3164f332014-03-11 03:39:26 +00003755 void getTargetDefines(const LangOptions &Opts,
3756 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003757 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3758 }
3759};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003760
3761// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003762class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003763public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003764 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003765 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003766 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003767 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3768 }
Craig Topper3164f332014-03-11 03:39:26 +00003769 void getTargetDefines(const LangOptions &Opts,
3770 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003771 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3772 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3773 // The value of the following reflects processor type.
3774 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3775 // We lost the original triple, so we use the default.
3776 Builder.defineMacro("_M_IX86", "600");
3777 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003778};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003779
David Majnemerae1ed0e2015-05-28 04:36:18 +00003780static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003781 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3782 // supports __declspec natively under -fms-extensions, but we define a no-op
3783 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003784 if (Opts.MicrosoftExt)
3785 Builder.defineMacro("__declspec", "__declspec");
3786 else
3787 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3788
3789 if (!Opts.MicrosoftExt) {
3790 // Provide macros for all the calling convention keywords. Provide both
3791 // single and double underscore prefixed variants. These are available on
3792 // x64 as well as x86, even though they have no effect.
3793 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3794 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003795 std::string GCCSpelling = "__attribute__((__";
3796 GCCSpelling += CC;
3797 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003798 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3799 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3800 }
3801 }
3802}
3803
David Majnemerae1ed0e2015-05-28 04:36:18 +00003804static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3805 Builder.defineMacro("__MSVCRT__");
3806 Builder.defineMacro("__MINGW32__");
3807 addCygMingDefines(Opts, Builder);
3808}
3809
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003810// x86-32 MinGW target
3811class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3812public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003813 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003814 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003815 void getTargetDefines(const LangOptions &Opts,
3816 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003817 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003818 DefineStd(Builder, "WIN32", Opts);
3819 DefineStd(Builder, "WINNT", Opts);
3820 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003821 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003822 }
3823};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003824
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003825// x86-32 Cygwin target
3826class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3827public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003828 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3829 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003830 TLSSupported = false;
3831 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003832 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003833 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 +00003834 }
Craig Topper3164f332014-03-11 03:39:26 +00003835 void getTargetDefines(const LangOptions &Opts,
3836 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003837 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003838 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003839 Builder.defineMacro("__CYGWIN__");
3840 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003841 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003842 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003843 if (Opts.CPlusPlus)
3844 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003845 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003846};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003847
Chris Lattnerb986aba2010-04-11 19:29:39 +00003848// x86-32 Haiku target
3849class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3850public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003851 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003852 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003853 IntPtrType = SignedLong;
3854 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003855 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003856 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003857 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003858 }
Craig Topper3164f332014-03-11 03:39:26 +00003859 void getTargetDefines(const LangOptions &Opts,
3860 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003861 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3862 Builder.defineMacro("__INTEL__");
3863 Builder.defineMacro("__HAIKU__");
3864 }
3865};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003866
Douglas Gregor9fabd852011-07-01 22:41:14 +00003867// RTEMS Target
3868template<typename Target>
3869class RTEMSTargetInfo : public OSTargetInfo<Target> {
3870protected:
Craig Topper3164f332014-03-11 03:39:26 +00003871 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3872 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003873 // RTEMS defines; list based off of gcc output
3874
Douglas Gregor9fabd852011-07-01 22:41:14 +00003875 Builder.defineMacro("__rtems__");
3876 Builder.defineMacro("__ELF__");
3877 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003878
Douglas Gregor9fabd852011-07-01 22:41:14 +00003879public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003880 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3881 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003882
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003883 switch (Triple.getArch()) {
3884 default:
3885 case llvm::Triple::x86:
3886 // this->MCountName = ".mcount";
3887 break;
3888 case llvm::Triple::mips:
3889 case llvm::Triple::mipsel:
3890 case llvm::Triple::ppc:
3891 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003892 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003893 // this->MCountName = "_mcount";
3894 break;
3895 case llvm::Triple::arm:
3896 // this->MCountName = "__mcount";
3897 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003898 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003899 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003900};
3901
Douglas Gregor9fabd852011-07-01 22:41:14 +00003902// x86-32 RTEMS target
3903class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3904public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003905 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003906 SizeType = UnsignedLong;
3907 IntPtrType = SignedLong;
3908 PtrDiffType = SignedLong;
3909 this->UserLabelPrefix = "";
3910 }
Craig Topper3164f332014-03-11 03:39:26 +00003911 void getTargetDefines(const LangOptions &Opts,
3912 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003913 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3914 Builder.defineMacro("__INTEL__");
3915 Builder.defineMacro("__rtems__");
3916 }
3917};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003918
Eli Friedman3fd920a2008-08-20 02:34:37 +00003919// x86-64 generic target
3920class X86_64TargetInfo : public X86TargetInfo {
3921public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003922 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003923 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003924 bool IsWinCOFF =
3925 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003926 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003927 LongDoubleWidth = 128;
3928 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003929 LargeArrayMinWidth = 128;
3930 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003931 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003932 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3933 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3934 IntPtrType = IsX32 ? SignedInt : SignedLong;
3935 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003936 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003937 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003938
Eric Christopher917e9522014-11-18 22:36:15 +00003939 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003940 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3941 : IsWinCOFF
3942 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3943 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003944
3945 // Use fpret only for long double.
3946 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003947
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003948 // Use fp2ret for _Complex long double.
3949 ComplexLongDoubleUsesFP2Ret = true;
3950
Charles Davisc7d5c942015-09-17 20:55:33 +00003951 // Make __builtin_ms_va_list available.
3952 HasBuiltinMSVaList = true;
3953
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003954 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003955 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003956 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003957 }
Craig Topper3164f332014-03-11 03:39:26 +00003958 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003959 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003960 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003961
Craig Topper3164f332014-03-11 03:39:26 +00003962 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003963 if (RegNo == 0) return 0;
3964 if (RegNo == 1) return 1;
3965 return -1;
3966 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003967
Craig Topper3164f332014-03-11 03:39:26 +00003968 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003969 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003970 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003971 CC == CC_IntelOclBicc ||
3972 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003973 }
3974
Craig Topper3164f332014-03-11 03:39:26 +00003975 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003976 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003977 }
3978
Pavel Chupinfd223e12014-08-04 12:39:43 +00003979 // for x32 we need it here explicitly
3980 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003981};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003982
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003983// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003984class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003985public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003986 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3987 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003988 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003989 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003990 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003991 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003992 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003993 SizeType = UnsignedLongLong;
3994 PtrDiffType = SignedLongLong;
3995 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003996 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003997 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003998
Craig Topper3164f332014-03-11 03:39:26 +00003999 void getTargetDefines(const LangOptions &Opts,
4000 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004001 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004002 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004003 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004004
Craig Topper3164f332014-03-11 03:39:26 +00004005 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004006 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004007 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004008
Craig Topper3164f332014-03-11 03:39:26 +00004009 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004010 switch (CC) {
4011 case CC_X86StdCall:
4012 case CC_X86ThisCall:
4013 case CC_X86FastCall:
4014 return CCCR_Ignore;
4015 case CC_C:
4016 case CC_X86VectorCall:
4017 case CC_IntelOclBicc:
4018 case CC_X86_64SysV:
4019 return CCCR_OK;
4020 default:
4021 return CCCR_Warning;
4022 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004023 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004024};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004025
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004026// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004027class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004028public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004029 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004030 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004031 LongDoubleWidth = LongDoubleAlign = 64;
4032 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004033 }
Craig Topper3164f332014-03-11 03:39:26 +00004034 void getTargetDefines(const LangOptions &Opts,
4035 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004036 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4037 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004038 Builder.defineMacro("_M_X64", "100");
4039 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004040 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004041};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004042
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004043// x86-64 MinGW target
4044class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4045public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004046 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00004047 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00004048 void getTargetDefines(const LangOptions &Opts,
4049 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004050 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004051 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004052 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004053 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004054
4055 // GCC defines this macro when it is using __gxx_personality_seh0.
4056 if (!Opts.SjLjExceptions)
4057 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004058 }
4059};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004060
Yaron Kerend030d112015-07-22 17:38:19 +00004061// x86-64 Cygwin target
4062class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4063public:
4064 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4065 : X86_64TargetInfo(Triple) {
4066 TLSSupported = false;
4067 WCharType = UnsignedShort;
4068 }
4069 void getTargetDefines(const LangOptions &Opts,
4070 MacroBuilder &Builder) const override {
4071 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4072 Builder.defineMacro("__x86_64__");
4073 Builder.defineMacro("__CYGWIN__");
4074 Builder.defineMacro("__CYGWIN64__");
4075 addCygMingDefines(Opts, Builder);
4076 DefineStd(Builder, "unix", Opts);
4077 if (Opts.CPlusPlus)
4078 Builder.defineMacro("_GNU_SOURCE");
4079
4080 // GCC defines this macro when it is using __gxx_personality_seh0.
4081 if (!Opts.SjLjExceptions)
4082 Builder.defineMacro("__SEH__");
4083 }
4084};
4085
Eli Friedman2857ccb2009-07-01 03:36:11 +00004086class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4087public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004088 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4089 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004090 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004091 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4092 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004093 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004094 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004095 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004096 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004097
4098 bool handleTargetFeatures(std::vector<std::string> &Features,
4099 DiagnosticsEngine &Diags) override {
4100 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4101 Diags))
4102 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004103 // We now know the features we have: we can decide how to align vectors.
4104 MaxVectorAlign =
4105 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004106 return true;
4107 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004108};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004109
Eli Friedman245f2292009-07-05 22:31:18 +00004110class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4111public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004112 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4113 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004114 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004115 Int64Type = SignedLongLong;
4116 }
4117};
Eli Friedman245f2292009-07-05 22:31:18 +00004118
Eli Friedman9fa28852012-08-08 23:57:20 +00004119class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4120public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004121 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4122 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4123 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004124 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004125 }
4126};
Tim Northover9bb857a2013-01-31 12:13:10 +00004127
Eli Friedmanf05b7722008-08-20 07:44:10 +00004128class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004129 // Possible FPU choices.
4130 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004131 VFP2FPU = (1 << 0),
4132 VFP3FPU = (1 << 1),
4133 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004134 NeonFPU = (1 << 3),
4135 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004136 };
4137
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004138 // Possible HWDiv features.
4139 enum HWDivMode {
4140 HWDivThumb = (1 << 0),
4141 HWDivARM = (1 << 1)
4142 };
4143
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004144 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004145 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004146 }
4147
4148 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4149 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004150
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004151 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004152
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004153 StringRef CPUProfile;
4154 StringRef CPUAttr;
4155
Rafael Espindolaeb265472013-08-21 21:59:03 +00004156 enum {
4157 FP_Default,
4158 FP_VFP,
4159 FP_Neon
4160 } FPMath;
4161
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004162 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004163 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004164 unsigned ArchProfile;
4165 unsigned ArchVersion;
4166
Bernard Ogdenda13af32013-10-24 18:32:51 +00004167 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004168
Logan Chien57086ce2012-10-10 06:56:20 +00004169 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004170 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004171
4172 // Initialized via features.
4173 unsigned SoftFloat : 1;
4174 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004175
Bernard Ogden18b57012013-10-29 09:47:51 +00004176 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004177 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004178 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004179 unsigned Unaligned : 1;
4180
4181 enum {
4182 LDREX_B = (1 << 0), /// byte (8-bit)
4183 LDREX_H = (1 << 1), /// half (16-bit)
4184 LDREX_W = (1 << 2), /// word (32-bit)
4185 LDREX_D = (1 << 3), /// double (64-bit)
4186 };
4187
4188 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004189
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004190 // ACLE 6.5.1 Hardware floating point
4191 enum {
4192 HW_FP_HP = (1 << 1), /// half (16-bit)
4193 HW_FP_SP = (1 << 2), /// single (32-bit)
4194 HW_FP_DP = (1 << 3), /// double (64-bit)
4195 };
4196 uint32_t HW_FP;
4197
Chris Lattner5cc15e02010-03-03 19:03:45 +00004198 static const Builtin::Info BuiltinInfo[];
4199
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004200 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004201 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004202
4203 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004204 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004205
Renato Golin9ba39232015-02-27 16:35:48 +00004206 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4207 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4208 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004209 SizeType = UnsignedLong;
4210 else
4211 SizeType = UnsignedInt;
4212
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004213 switch (T.getOS()) {
4214 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004215 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004216 break;
4217 case llvm::Triple::Win32:
4218 WCharType = UnsignedShort;
4219 break;
4220 case llvm::Triple::Linux:
4221 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004222 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4223 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004224 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004225 }
4226
4227 UseBitFieldTypeAlignment = true;
4228
4229 ZeroLengthBitfieldBoundary = 0;
4230
Tim Northover147cd2f2014-10-14 22:12:21 +00004231 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4232 // so set preferred for small types to 32.
4233 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004234 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004235 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4236 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4237 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004238 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004239 DataLayoutString = "e"
4240 "-m:w"
4241 "-p:32:32"
4242 "-i64:64"
4243 "-v128:64:128"
4244 "-a:0:32"
4245 "-n32"
4246 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004247 } else if (T.isOSNaCl()) {
4248 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004249 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004250 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004251 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004252 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4253 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004254 }
4255
4256 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004257 }
4258
4259 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004260 const llvm::Triple &T = getTriple();
4261
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004262 IsAAPCS = false;
4263
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004264 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004265
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004266 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004267 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004268 SizeType = UnsignedInt;
4269 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004270 SizeType = UnsignedLong;
4271
4272 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4273 WCharType = SignedInt;
4274
4275 // Do not respect the alignment of bit-field types when laying out
4276 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4277 UseBitFieldTypeAlignment = false;
4278
4279 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4280 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4281 /// gcc.
4282 ZeroLengthBitfieldBoundary = 32;
4283
Tim Northover147cd2f2014-10-14 22:12:21 +00004284 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004285 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004286 BigEndian
4287 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4288 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4289 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004290 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004291 BigEndian
4292 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4293 : "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 +00004294
4295 // FIXME: Override "preferred align" for double and long long.
4296 }
4297
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004298 void setArchInfo() {
4299 StringRef ArchName = getTriple().getArchName();
4300
Renato Goline84b0002015-10-08 16:43:26 +00004301 ArchISA = llvm::ARM::parseArchISA(ArchName);
4302 CPU = llvm::ARM::getDefaultCPU(ArchName);
4303 unsigned AK = llvm::ARM::parseArch(ArchName);
4304 if (AK != llvm::ARM::AK_INVALID)
4305 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004306 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004307 }
4308
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004309 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004310 StringRef SubArch;
4311
4312 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004313 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004314 SubArch = llvm::ARM::getSubArch(ArchKind);
4315 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4316 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004317
4318 // cache CPU related strings
4319 CPUAttr = getCPUAttr();
4320 CPUProfile = getCPUProfile();
4321 }
4322
4323 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004324 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004325 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004326 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004327 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4328 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004329 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004330 if (ArchProfile == llvm::ARM::PK_M) {
4331 MaxAtomicPromoteWidth = 32;
4332 if (ShouldUseInlineAtomic)
4333 MaxAtomicInlineWidth = 32;
4334 }
4335 else {
4336 MaxAtomicPromoteWidth = 64;
4337 if (ShouldUseInlineAtomic)
4338 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004339 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004340 }
4341
4342 bool isThumb() const {
4343 return (ArchISA == llvm::ARM::IK_THUMB);
4344 }
4345
4346 bool supportsThumb() const {
4347 return CPUAttr.count('T') || ArchVersion >= 6;
4348 }
4349
4350 bool supportsThumb2() const {
4351 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4352 }
4353
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004354 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004355 // For most sub-arches, the build attribute CPU name is enough.
4356 // For Cortex variants, it's slightly different.
4357 switch(ArchKind) {
4358 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004359 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004360 case llvm::ARM::AK_ARMV6M:
4361 case llvm::ARM::AK_ARMV6SM:
4362 case llvm::ARM::AK_ARMV6HL:
4363 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004364 case llvm::ARM::AK_ARMV7S:
4365 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004366 case llvm::ARM::AK_ARMV7:
4367 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004368 case llvm::ARM::AK_ARMV7L:
4369 case llvm::ARM::AK_ARMV7HL:
4370 return "7A";
4371 case llvm::ARM::AK_ARMV7R:
4372 return "7R";
4373 case llvm::ARM::AK_ARMV7M:
4374 return "7M";
4375 case llvm::ARM::AK_ARMV7EM:
4376 return "7EM";
4377 case llvm::ARM::AK_ARMV8A:
4378 return "8A";
4379 case llvm::ARM::AK_ARMV8_1A:
4380 return "8_1A";
4381 }
4382 }
4383
4384 StringRef getCPUProfile() const {
4385 switch(ArchProfile) {
4386 case llvm::ARM::PK_A:
4387 return "A";
4388 case llvm::ARM::PK_R:
4389 return "R";
4390 case llvm::ARM::PK_M:
4391 return "M";
4392 default:
4393 return "";
4394 }
4395 }
4396
Chris Lattner17df24e2008-04-21 18:56:49 +00004397public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004398 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004399 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004400 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004401 BigEndian = IsBigEndian;
4402
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004403 switch (getTriple().getOS()) {
4404 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004405 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004406 break;
4407 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004408 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004409 break;
4410 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004411
Renato Goline84b0002015-10-08 16:43:26 +00004412 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004413 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004414
Chris Lattner1a8f3942010-04-23 16:29:58 +00004415 // {} in inline assembly are neon specifiers, not assembly variant
4416 // specifiers.
4417 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004418
Eric Christopher0e261882014-12-05 01:06:59 +00004419 // FIXME: This duplicates code from the driver that sets the -target-abi
4420 // option - this code is used if -target-abi isn't passed and should
4421 // be unified in some way.
4422 if (Triple.isOSBinFormatMachO()) {
4423 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4424 // the frontend matches that.
4425 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4426 Triple.getOS() == llvm::Triple::UnknownOS ||
4427 StringRef(CPU).startswith("cortex-m")) {
4428 setABI("aapcs");
4429 } else {
4430 setABI("apcs-gnu");
4431 }
4432 } else if (Triple.isOSWindows()) {
4433 // FIXME: this is invalid for WindowsCE
4434 setABI("aapcs");
4435 } else {
4436 // Select the default based on the platform.
4437 switch (Triple.getEnvironment()) {
4438 case llvm::Triple::Android:
4439 case llvm::Triple::GNUEABI:
4440 case llvm::Triple::GNUEABIHF:
4441 setABI("aapcs-linux");
4442 break;
4443 case llvm::Triple::EABIHF:
4444 case llvm::Triple::EABI:
4445 setABI("aapcs");
4446 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004447 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004448 setABI("apcs-gnu");
4449 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004450 default:
4451 if (Triple.getOS() == llvm::Triple::NetBSD)
4452 setABI("apcs-gnu");
4453 else
4454 setABI("aapcs");
4455 break;
4456 }
4457 }
John McCall86353412010-08-21 22:46:04 +00004458
4459 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004460 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004461
Renato Golin15b86152015-07-03 16:41:13 +00004462 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004463 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004464
James Molloya7139222012-03-12 09:14:10 +00004465 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004466 // the alignment of the zero-length bitfield is greater than the member
4467 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004468 // zero length bitfield.
4469 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004470 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004471
Alp Toker4925ba72014-06-07 23:30:42 +00004472 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004473
Craig Topper3164f332014-03-11 03:39:26 +00004474 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004475 ABI = Name;
4476
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004477 // The defaults (above) are for AAPCS, check if we need to change them.
4478 //
4479 // FIXME: We need support for -meabi... we could just mangle it into the
4480 // name.
4481 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004482 setABIAPCS();
4483 return true;
4484 }
4485 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4486 setABIAAPCS();
4487 return true;
4488 }
4489 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004490 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004491
Renato Golinf5c4dec2015-05-27 13:33:00 +00004492 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004493 bool
4494 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4495 StringRef CPU,
4496 const std::vector<std::string> &FeaturesVec) const override {
4497
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004498 std::vector<const char*> TargetFeatures;
4499
4500 // get default FPU features
4501 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4502 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4503
4504 // get default Extension features
4505 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4506 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4507
4508 for (const char *Feature : TargetFeatures)
4509 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004510 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004511
Eric Christopher007b0a02015-08-28 22:32:01 +00004512 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004513 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004514
Craig Topper3164f332014-03-11 03:39:26 +00004515 bool handleTargetFeatures(std::vector<std::string> &Features,
4516 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004517 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004518 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004519 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004520 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004521 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004522 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004523 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004524
Ranjeet Singhac08e532015-06-24 23:39:25 +00004525 // This does not diagnose illegal cases like having both
4526 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4527 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004528 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004529 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004530 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004531 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004532 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004533 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004534 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004535 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004536 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004537 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004538 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004539 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004540 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004541 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004542 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004543 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004544 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004545 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004546 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004547 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004548 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004549 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004550 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004551 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004552 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004553 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004554 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004555 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004556 } else if (Feature == "+t2dsp") {
4557 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004558 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004559 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004560 } else if (Feature == "+strict-align") {
4561 Unaligned = 0;
4562 } else if (Feature == "+fp16") {
4563 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004564 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004565 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004566 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004567
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004568 switch (ArchVersion) {
4569 case 6:
4570 if (ArchProfile == llvm::ARM::PK_M)
4571 LDREX = 0;
4572 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4573 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4574 else
4575 LDREX = LDREX_W;
4576 break;
4577 case 7:
4578 if (ArchProfile == llvm::ARM::PK_M)
4579 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4580 else
4581 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4582 break;
4583 case 8:
4584 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4585 }
4586
Rafael Espindolaeb265472013-08-21 21:59:03 +00004587 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4588 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4589 return false;
4590 }
4591
4592 if (FPMath == FP_Neon)
4593 Features.push_back("+neonfp");
4594 else if (FPMath == FP_VFP)
4595 Features.push_back("-neonfp");
4596
Daniel Dunbar893d4752009-12-19 04:15:38 +00004597 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004598 auto Feature =
4599 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4600 if (Feature != Features.end())
4601 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004602
Rafael Espindolaeb265472013-08-21 21:59:03 +00004603 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004604 }
4605
Craig Topper3164f332014-03-11 03:39:26 +00004606 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004607 return llvm::StringSwitch<bool>(Feature)
4608 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004609 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004610 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004611 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004612 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004613 .Case("hwdiv", HWDiv & HWDivThumb)
4614 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004615 .Default(false);
4616 }
Renato Golin15b86152015-07-03 16:41:13 +00004617
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004618 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004619 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004620 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004621
Renato Golin15b86152015-07-03 16:41:13 +00004622 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004623 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004624 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004625 CPU = Name;
4626 return true;
4627 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004628
Craig Topper3164f332014-03-11 03:39:26 +00004629 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004630
Craig Topper3164f332014-03-11 03:39:26 +00004631 void getTargetDefines(const LangOptions &Opts,
4632 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004633 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004634 Builder.defineMacro("__arm");
4635 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004636
Chris Lattnerecd49032009-03-02 22:27:17 +00004637 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004638 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004639 if (!CPUAttr.empty())
4640 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004641
4642 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004643 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004644 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004645
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004646 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004647 // ACLE 6.5.7 Crypto Extension
4648 if (Crypto)
4649 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4650 // ACLE 6.5.8 CRC32 Extension
4651 if (CRC)
4652 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4653 // ACLE 6.5.10 Numeric Maximum and Minimum
4654 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4655 // ACLE 6.5.9 Directed Rounding
4656 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004657 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004658
4659 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4660 // is not defined for the M-profile.
4661 // NOTE that the deffault profile is assumed to be 'A'
4662 if (CPUProfile.empty() || CPUProfile != "M")
4663 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4664
4665 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4666 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4667 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004668 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004669 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004670 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004671 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4672
4673 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4674 // instruction set such as ARM or Thumb.
4675 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4676
4677 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4678
4679 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004680 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004681 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004682
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004683 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004684 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004685 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004686
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004687 // ACLE 6.4.4 LDREX/STREX
4688 if (LDREX)
4689 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4690
4691 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004692 if (ArchVersion == 5 ||
4693 (ArchVersion == 6 && CPUProfile != "M") ||
4694 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004695 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4696
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004697 // ACLE 6.5.1 Hardware Floating Point
4698 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004699 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004700
Yi Konga44c4d72014-06-27 21:25:42 +00004701 // ACLE predefines.
4702 Builder.defineMacro("__ARM_ACLE", "200");
4703
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004704 // FP16 support (we currently only support IEEE format).
4705 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4706 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4707
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004708 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4709 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4710 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4711
Mike Stump9d54bd72009-04-08 02:07:04 +00004712 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004713
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004714 // FIXME: It's more complicated than this and we don't really support
4715 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004716 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004717 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004718 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004719
David Tweed8f676532012-10-25 13:33:01 +00004720 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004721 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004722 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4723 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004724 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004725 Builder.defineMacro("__ARM_PCS", "1");
4726
David Tweed8f676532012-10-25 13:33:01 +00004727 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004728 Builder.defineMacro("__ARM_PCS_VFP", "1");
4729 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004730
Daniel Dunbar893d4752009-12-19 04:15:38 +00004731 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004732 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004733
4734 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004735 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004736
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004737 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004738 Builder.defineMacro("__THUMBEL__");
4739 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004740 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004741 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004742 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004743
4744 // ACLE 6.4.9 32-bit SIMD instructions
4745 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4746 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4747
4748 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004749 if (((HWDiv & HWDivThumb) && isThumb()) ||
4750 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004751 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004752 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004753 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004754
4755 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004756 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004757
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004758 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004759 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004760 if (FPU & VFP2FPU)
4761 Builder.defineMacro("__ARM_VFPV2__");
4762 if (FPU & VFP3FPU)
4763 Builder.defineMacro("__ARM_VFPV3__");
4764 if (FPU & VFP4FPU)
4765 Builder.defineMacro("__ARM_VFPV4__");
4766 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004767
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004768 // This only gets set when Neon instructions are actually available, unlike
4769 // the VFP define, hence the soft float and arch check. This is subtly
4770 // different from gcc, we follow the intent which was that it should be set
4771 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004772 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004773 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004774 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004775 // current AArch32 NEON implementations do not support double-precision
4776 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004777 Builder.defineMacro("__ARM_NEON_FP",
4778 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004779 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004780
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004781 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4782 Opts.ShortWChar ? "2" : "4");
4783
4784 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4785 Opts.ShortEnums ? "1" : "4");
4786
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004787 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004788 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4789 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4790 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4791 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4792 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004793
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004794 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004795 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004796 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004797 }
4798
4799 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004800 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004801 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4802 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004803 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004804 }
4805
4806 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004807 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004808 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004809
4810 if (Opts.UnsafeFPMath)
4811 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004812 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004813
Craig Topper3164f332014-03-11 03:39:26 +00004814 void getTargetBuiltins(const Builtin::Info *&Records,
4815 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004816 Records = BuiltinInfo;
4817 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004818 }
Craig Topper3164f332014-03-11 03:39:26 +00004819 bool isCLZForZeroUndef() const override { return false; }
4820 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004821 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004822 }
Craig Topper3164f332014-03-11 03:39:26 +00004823 void getGCCRegNames(const char * const *&Names,
4824 unsigned &NumNames) const override;
4825 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4826 unsigned &NumAliases) const override;
4827 bool validateAsmConstraint(const char *&Name,
4828 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004829 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004830 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004831 case 'l': // r0-r7
4832 case 'h': // r8-r15
4833 case 'w': // VFP Floating point register single precision
4834 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004835 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004836 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004837 case 'I':
4838 case 'J':
4839 case 'K':
4840 case 'L':
4841 case 'M':
4842 // FIXME
4843 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004844 case 'Q': // A memory address that is a single base register.
4845 Info.setAllowsMemory();
4846 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004847 case 'U': // a memory reference...
4848 switch (Name[1]) {
4849 case 'q': // ...ARMV4 ldrsb
4850 case 'v': // ...VFP load/store (reg+constant offset)
4851 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004852 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004853 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004854 case 'n': // valid address for Neon doubleword vector load/store
4855 case 'm': // valid address for Neon element and structure load/store
4856 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004857 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004858 Info.setAllowsMemory();
4859 Name++;
4860 return true;
4861 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004862 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004863 return false;
4864 }
Craig Topper3164f332014-03-11 03:39:26 +00004865 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004866 std::string R;
4867 switch (*Constraint) {
4868 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004869 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004870 Constraint++;
4871 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004872 case 'p': // 'p' should be translated to 'r' by default.
4873 R = std::string("r");
4874 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004875 default:
4876 return std::string(1, *Constraint);
4877 }
4878 return R;
4879 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004880 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004881 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004882 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004883 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004884 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004885
Bill Wendling9d1ee112012-10-25 23:28:48 +00004886 // Strip off constraint modifiers.
4887 while (Constraint[0] == '=' ||
4888 Constraint[0] == '+' ||
4889 Constraint[0] == '&')
4890 Constraint = Constraint.substr(1);
4891
4892 switch (Constraint[0]) {
4893 default: break;
4894 case 'r': {
4895 switch (Modifier) {
4896 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004897 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004898 case 'q':
4899 // A register of size 32 cannot fit a vector type.
4900 return false;
4901 }
4902 }
4903 }
4904
4905 return true;
4906 }
Craig Topper3164f332014-03-11 03:39:26 +00004907 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004908 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004909 return "";
4910 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004911
Craig Topper3164f332014-03-11 03:39:26 +00004912 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004913 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4914 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004915
Craig Topper3164f332014-03-11 03:39:26 +00004916 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004917 if (RegNo == 0) return 0;
4918 if (RegNo == 1) return 1;
4919 return -1;
4920 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004921
4922 bool hasSjLjLowering() const override {
4923 return true;
4924 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004925};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004926
Rafael Espindolaeb265472013-08-21 21:59:03 +00004927bool ARMTargetInfo::setFPMath(StringRef Name) {
4928 if (Name == "neon") {
4929 FPMath = FP_Neon;
4930 return true;
4931 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4932 Name == "vfp4") {
4933 FPMath = FP_VFP;
4934 return true;
4935 }
4936 return false;
4937}
4938
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004939const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004940 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004941 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004942 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4943
4944 // Float registers
4945 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4946 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4947 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004948 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004949
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004950 // Double registers
4951 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4952 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004953 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4954 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004955
4956 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004957 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4958 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004959};
4960
4961void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004962 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004963 Names = GCCRegNames;
4964 NumNames = llvm::array_lengthof(GCCRegNames);
4965}
4966
4967const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004968 { { "a1" }, "r0" },
4969 { { "a2" }, "r1" },
4970 { { "a3" }, "r2" },
4971 { { "a4" }, "r3" },
4972 { { "v1" }, "r4" },
4973 { { "v2" }, "r5" },
4974 { { "v3" }, "r6" },
4975 { { "v4" }, "r7" },
4976 { { "v5" }, "r8" },
4977 { { "v6", "rfp" }, "r9" },
4978 { { "sl" }, "r10" },
4979 { { "fp" }, "r11" },
4980 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004981 { { "r13" }, "sp" },
4982 { { "r14" }, "lr" },
4983 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004984 // The S, D and Q registers overlap, but aren't really aliases; we
4985 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004986};
4987
4988void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4989 unsigned &NumAliases) const {
4990 Aliases = GCCRegAliases;
4991 NumAliases = llvm::array_lengthof(GCCRegAliases);
4992}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004993
4994const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004995#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004996 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004997#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4998 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004999#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005000
Craig Topper07d3b622015-08-07 05:14:44 +00005001#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005002 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005003#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005004 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005005#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5006 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005007#include "clang/Basic/BuiltinsARM.def"
5008};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005009
5010class ARMleTargetInfo : public ARMTargetInfo {
5011public:
5012 ARMleTargetInfo(const llvm::Triple &Triple)
5013 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005014 void getTargetDefines(const LangOptions &Opts,
5015 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005016 Builder.defineMacro("__ARMEL__");
5017 ARMTargetInfo::getTargetDefines(Opts, Builder);
5018 }
5019};
5020
5021class ARMbeTargetInfo : public ARMTargetInfo {
5022public:
5023 ARMbeTargetInfo(const llvm::Triple &Triple)
5024 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005025 void getTargetDefines(const LangOptions &Opts,
5026 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005027 Builder.defineMacro("__ARMEB__");
5028 Builder.defineMacro("__ARM_BIG_ENDIAN");
5029 ARMTargetInfo::getTargetDefines(Opts, Builder);
5030 }
5031};
Chris Lattner17df24e2008-04-21 18:56:49 +00005032
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005033class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5034 const llvm::Triple Triple;
5035public:
5036 WindowsARMTargetInfo(const llvm::Triple &Triple)
5037 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
5038 TLSSupported = false;
5039 WCharType = UnsignedShort;
5040 SizeType = UnsignedInt;
5041 UserLabelPrefix = "";
5042 }
5043 void getVisualStudioDefines(const LangOptions &Opts,
5044 MacroBuilder &Builder) const {
5045 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5046
5047 // FIXME: this is invalid for WindowsCE
5048 Builder.defineMacro("_M_ARM_NT", "1");
5049 Builder.defineMacro("_M_ARMT", "_M_ARM");
5050 Builder.defineMacro("_M_THUMB", "_M_ARM");
5051
5052 assert((Triple.getArch() == llvm::Triple::arm ||
5053 Triple.getArch() == llvm::Triple::thumb) &&
5054 "invalid architecture for Windows ARM target info");
5055 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5056 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5057
5058 // TODO map the complete set of values
5059 // 31: VFPv3 40: VFPv4
5060 Builder.defineMacro("_M_ARM_FP", "31");
5061 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005062 BuiltinVaListKind getBuiltinVaListKind() const override {
5063 return TargetInfo::CharPtrBuiltinVaList;
5064 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005065 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5066 switch (CC) {
5067 case CC_X86StdCall:
5068 case CC_X86ThisCall:
5069 case CC_X86FastCall:
5070 case CC_X86VectorCall:
5071 return CCCR_Ignore;
5072 case CC_C:
5073 return CCCR_OK;
5074 default:
5075 return CCCR_Warning;
5076 }
5077 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005078};
5079
5080// Windows ARM + Itanium C++ ABI Target
5081class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5082public:
5083 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5084 : WindowsARMTargetInfo(Triple) {
5085 TheCXXABI.set(TargetCXXABI::GenericARM);
5086 }
5087
5088 void getTargetDefines(const LangOptions &Opts,
5089 MacroBuilder &Builder) const override {
5090 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5091
5092 if (Opts.MSVCCompat)
5093 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5094 }
5095};
5096
5097// Windows ARM, MS (C++) ABI
5098class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5099public:
5100 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5101 : WindowsARMTargetInfo(Triple) {
5102 TheCXXABI.set(TargetCXXABI::Microsoft);
5103 }
5104
5105 void getTargetDefines(const LangOptions &Opts,
5106 MacroBuilder &Builder) const override {
5107 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5108 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5109 }
5110};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005111
Yaron Keren321249c2015-07-15 13:32:23 +00005112// ARM MinGW target
5113class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5114public:
5115 MinGWARMTargetInfo(const llvm::Triple &Triple)
5116 : WindowsARMTargetInfo(Triple) {
5117 TheCXXABI.set(TargetCXXABI::GenericARM);
5118 }
5119
5120 void getTargetDefines(const LangOptions &Opts,
5121 MacroBuilder &Builder) const override {
5122 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5123 DefineStd(Builder, "WIN32", Opts);
5124 DefineStd(Builder, "WINNT", Opts);
5125 Builder.defineMacro("_ARM_");
5126 addMinGWDefines(Opts, Builder);
5127 }
5128};
5129
5130// ARM Cygwin target
5131class CygwinARMTargetInfo : public ARMleTargetInfo {
5132public:
5133 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5134 TLSSupported = false;
5135 WCharType = UnsignedShort;
5136 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005137 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005138 }
5139 void getTargetDefines(const LangOptions &Opts,
5140 MacroBuilder &Builder) const override {
5141 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5142 Builder.defineMacro("_ARM_");
5143 Builder.defineMacro("__CYGWIN__");
5144 Builder.defineMacro("__CYGWIN32__");
5145 DefineStd(Builder, "unix", Opts);
5146 if (Opts.CPlusPlus)
5147 Builder.defineMacro("_GNU_SOURCE");
5148 }
5149};
5150
Mike Stump11289f42009-09-09 15:08:12 +00005151class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005152 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005153protected:
Craig Topper3164f332014-03-11 03:39:26 +00005154 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5155 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005156 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005157 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005158
Torok Edwinb2b37c62009-06-30 17:10:35 +00005159public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005160 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005161 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005162 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005163 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005164 // FIXME: This should be based off of the target features in
5165 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005166 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005167
5168 // Darwin on iOS uses a variant of the ARM C++ ABI.
5169 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005170 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005171};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005172
Tim Northover573cbee2014-05-24 12:52:07 +00005173class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005174 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005175 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5176 static const char *const GCCRegNames[];
5177
James Molloy75f5f9e2014-04-16 15:33:48 +00005178 enum FPUModeEnum {
5179 FPUMode,
5180 NeonMode
5181 };
5182
5183 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005184 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005185 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005186 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005187
Tim Northovera2ee4332014-03-29 15:09:45 +00005188 static const Builtin::Info BuiltinInfo[];
5189
5190 std::string ABI;
5191
5192public:
Tim Northover573cbee2014-05-24 12:52:07 +00005193 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005194 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005195
5196 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5197 WCharType = SignedInt;
5198
5199 // NetBSD apparently prefers consistency across ARM targets to consistency
5200 // across 64-bit targets.
5201 Int64Type = SignedLongLong;
5202 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005203 } else {
5204 WCharType = UnsignedInt;
5205 Int64Type = SignedLong;
5206 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005207 }
5208
Tim Northovera2ee4332014-03-29 15:09:45 +00005209 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005210 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005211 MaxAtomicInlineWidth = 128;
5212 MaxAtomicPromoteWidth = 128;
5213
Tim Northovera6a19f12015-02-06 01:25:07 +00005214 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005215 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5216
Tim Northovera2ee4332014-03-29 15:09:45 +00005217 // {} in inline assembly are neon specifiers, not assembly variant
5218 // specifiers.
5219 NoAsmVariants = true;
5220
Tim Northover7ad87af2015-01-16 18:44:04 +00005221 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5222 // contributes to the alignment of the containing aggregate in the same way
5223 // a plain (non bit-field) member of that type would, without exception for
5224 // zero-sized or anonymous bit-fields."
5225 UseBitFieldTypeAlignment = true;
5226 UseZeroLengthBitfieldAlignment = true;
5227
Tim Northover573cbee2014-05-24 12:52:07 +00005228 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005229 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5230 }
5231
Alp Toker4925ba72014-06-07 23:30:42 +00005232 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005233 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005234 if (Name != "aapcs" && Name != "darwinpcs")
5235 return false;
5236
5237 ABI = Name;
5238 return true;
5239 }
5240
David Blaikie1cbb9712014-11-14 19:09:44 +00005241 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005242 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005243 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005244 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005245 .Case("cyclone", true)
5246 .Default(false);
5247 return CPUKnown;
5248 }
5249
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005250 void getTargetDefines(const LangOptions &Opts,
5251 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005252 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005253 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005254
5255 // Target properties.
5256 Builder.defineMacro("_LP64");
5257 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005258
5259 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5260 Builder.defineMacro("__ARM_ACLE", "200");
5261 Builder.defineMacro("__ARM_ARCH", "8");
5262 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5263
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005264 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005265 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005266 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005267
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005268 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5269 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5270 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5271 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005272 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005273 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5274 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005275
5276 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5277
5278 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005279 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005280
5281 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5282 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005283 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5284 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005285
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005286 if (Opts.UnsafeFPMath)
5287 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005288
5289 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5290
5291 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5292 Opts.ShortEnums ? "1" : "4");
5293
James Molloy75f5f9e2014-04-16 15:33:48 +00005294 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005295 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005296 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005297 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005298 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005299
Bradley Smith418c5932014-05-02 15:17:51 +00005300 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005301 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005302
James Molloy75f5f9e2014-04-16 15:33:48 +00005303 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005304 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5305
5306 if (Unaligned)
5307 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005308
5309 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5310 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005314 }
5315
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005316 void getTargetBuiltins(const Builtin::Info *&Records,
5317 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005318 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005319 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005320 }
5321
David Blaikie1cbb9712014-11-14 19:09:44 +00005322 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005323 return Feature == "aarch64" ||
5324 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005325 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005326 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005327 }
5328
James Molloy5e73df52014-04-16 15:06:20 +00005329 bool handleTargetFeatures(std::vector<std::string> &Features,
5330 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005331 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005332 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005333 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005334 Unaligned = 1;
5335
Eric Christopher610fe112015-08-26 08:21:55 +00005336 for (const auto &Feature : Features) {
5337 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005338 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005339 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005340 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005341 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005342 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005343 if (Feature == "+strict-align")
5344 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005345 }
5346
Eric Christopher964a5f32015-08-05 23:48:05 +00005347 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005348
5349 return true;
5350 }
5351
David Blaikie1cbb9712014-11-14 19:09:44 +00005352 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005353
David Blaikie1cbb9712014-11-14 19:09:44 +00005354 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005355 return TargetInfo::AArch64ABIBuiltinVaList;
5356 }
5357
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005358 void getGCCRegNames(const char *const *&Names,
5359 unsigned &NumNames) const override;
5360 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5361 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005362
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005363 bool validateAsmConstraint(const char *&Name,
5364 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005365 switch (*Name) {
5366 default:
5367 return false;
5368 case 'w': // Floating point and SIMD registers (V0-V31)
5369 Info.setAllowsRegister();
5370 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005371 case 'I': // Constant that can be used with an ADD instruction
5372 case 'J': // Constant that can be used with a SUB instruction
5373 case 'K': // Constant that can be used with a 32-bit logical instruction
5374 case 'L': // Constant that can be used with a 64-bit logical instruction
5375 case 'M': // Constant that can be used as a 32-bit MOV immediate
5376 case 'N': // Constant that can be used as a 64-bit MOV immediate
5377 case 'Y': // Floating point constant zero
5378 case 'Z': // Integer constant zero
5379 return true;
5380 case 'Q': // A memory reference with base register and no offset
5381 Info.setAllowsMemory();
5382 return true;
5383 case 'S': // A symbolic address
5384 Info.setAllowsRegister();
5385 return true;
5386 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005387 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5388 // Utf: A memory address suitable for ldp/stp in TF mode.
5389 // Usa: An absolute symbolic address.
5390 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5391 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005392 case 'z': // Zero register, wzr or xzr
5393 Info.setAllowsRegister();
5394 return true;
5395 case 'x': // Floating point and SIMD registers (V0-V15)
5396 Info.setAllowsRegister();
5397 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005398 }
5399 return false;
5400 }
5401
Akira Hatanaka987f1862014-08-22 06:05:21 +00005402 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005403 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005404 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005405 // Strip off constraint modifiers.
5406 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5407 Constraint = Constraint.substr(1);
5408
5409 switch (Constraint[0]) {
5410 default:
5411 return true;
5412 case 'z':
5413 case 'r': {
5414 switch (Modifier) {
5415 case 'x':
5416 case 'w':
5417 // For now assume that the person knows what they're
5418 // doing with the modifier.
5419 return true;
5420 default:
5421 // By default an 'r' constraint will be in the 'x'
5422 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005423 if (Size == 64)
5424 return true;
5425
5426 SuggestedModifier = "w";
5427 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005428 }
5429 }
5430 }
5431 }
5432
David Blaikie1cbb9712014-11-14 19:09:44 +00005433 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005434
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005435 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005436 if (RegNo == 0)
5437 return 0;
5438 if (RegNo == 1)
5439 return 1;
5440 return -1;
5441 }
5442};
5443
Tim Northover573cbee2014-05-24 12:52:07 +00005444const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005445 // 32-bit Integer registers
5446 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5447 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5448 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5449
5450 // 64-bit Integer registers
5451 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5452 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5453 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5454
5455 // 32-bit floating point regsisters
5456 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5457 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5458 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5459
5460 // 64-bit floating point regsisters
5461 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5462 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5463 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5464
5465 // Vector registers
5466 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5467 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5468 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5469};
5470
Tim Northover573cbee2014-05-24 12:52:07 +00005471void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005472 unsigned &NumNames) const {
5473 Names = GCCRegNames;
5474 NumNames = llvm::array_lengthof(GCCRegNames);
5475}
5476
Tim Northover573cbee2014-05-24 12:52:07 +00005477const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005478 { { "w31" }, "wsp" },
5479 { { "x29" }, "fp" },
5480 { { "x30" }, "lr" },
5481 { { "x31" }, "sp" },
5482 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5483 // don't want to substitute one of these for a different-sized one.
5484};
5485
Tim Northover573cbee2014-05-24 12:52:07 +00005486void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005487 unsigned &NumAliases) const {
5488 Aliases = GCCRegAliases;
5489 NumAliases = llvm::array_lengthof(GCCRegAliases);
5490}
5491
Tim Northover573cbee2014-05-24 12:52:07 +00005492const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005493#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005494 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005495#include "clang/Basic/BuiltinsNEON.def"
5496
5497#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005498 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005499#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005500};
James Molloy5e73df52014-04-16 15:06:20 +00005501
Tim Northover573cbee2014-05-24 12:52:07 +00005502class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005503 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005504 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005505 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005506 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005507 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005508 }
5509
5510public:
Tim Northover573cbee2014-05-24 12:52:07 +00005511 AArch64leTargetInfo(const llvm::Triple &Triple)
5512 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005513 BigEndian = false;
5514 }
5515 void getTargetDefines(const LangOptions &Opts,
5516 MacroBuilder &Builder) const override {
5517 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005518 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005519 }
5520};
5521
Tim Northover573cbee2014-05-24 12:52:07 +00005522class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005523 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005524 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005525 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005526 }
5527
5528public:
Tim Northover573cbee2014-05-24 12:52:07 +00005529 AArch64beTargetInfo(const llvm::Triple &Triple)
5530 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005531 void getTargetDefines(const LangOptions &Opts,
5532 MacroBuilder &Builder) const override {
5533 Builder.defineMacro("__AARCH64EB__");
5534 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5535 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005536 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005537 }
5538};
Tim Northovera2ee4332014-03-29 15:09:45 +00005539
Tim Northover573cbee2014-05-24 12:52:07 +00005540class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005541protected:
5542 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5543 MacroBuilder &Builder) const override {
5544 Builder.defineMacro("__AARCH64_SIMD__");
5545 Builder.defineMacro("__ARM64_ARCH_8__");
5546 Builder.defineMacro("__ARM_NEON__");
5547 Builder.defineMacro("__LITTLE_ENDIAN__");
5548 Builder.defineMacro("__REGISTER_PREFIX__", "");
5549 Builder.defineMacro("__arm64", "1");
5550 Builder.defineMacro("__arm64__", "1");
5551
5552 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5553 }
5554
Tim Northovera2ee4332014-03-29 15:09:45 +00005555public:
Tim Northover573cbee2014-05-24 12:52:07 +00005556 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5557 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005558 Int64Type = SignedLongLong;
5559 WCharType = SignedInt;
5560 UseSignedCharForObjCBool = false;
5561
Tim Northovera6a19f12015-02-06 01:25:07 +00005562 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005563 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5564
5565 TheCXXABI.set(TargetCXXABI::iOS64);
5566 }
5567
David Blaikie1cbb9712014-11-14 19:09:44 +00005568 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005569 return TargetInfo::CharPtrBuiltinVaList;
5570 }
5571};
Tim Northovera2ee4332014-03-29 15:09:45 +00005572
Tony Linthicum76329bf2011-12-12 21:14:55 +00005573// Hexagon abstract base class
5574class HexagonTargetInfo : public TargetInfo {
5575 static const Builtin::Info BuiltinInfo[];
5576 static const char * const GCCRegNames[];
5577 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5578 std::string CPU;
5579public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005580 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005581 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005582 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005583
5584 // {} in inline assembly are packet specifiers, not assembly variant
5585 // specifiers.
5586 NoAsmVariants = true;
5587 }
5588
Craig Topper3164f332014-03-11 03:39:26 +00005589 void getTargetBuiltins(const Builtin::Info *&Records,
5590 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005591 Records = BuiltinInfo;
5592 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5593 }
5594
Craig Topper3164f332014-03-11 03:39:26 +00005595 bool validateAsmConstraint(const char *&Name,
5596 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005597 return true;
5598 }
5599
Craig Topper3164f332014-03-11 03:39:26 +00005600 void getTargetDefines(const LangOptions &Opts,
5601 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005602
Craig Topper3164f332014-03-11 03:39:26 +00005603 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005604 return Feature == "hexagon";
5605 }
Craig Topper3164f332014-03-11 03:39:26 +00005606
5607 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005608 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005609 }
Craig Topper3164f332014-03-11 03:39:26 +00005610 void getGCCRegNames(const char * const *&Names,
5611 unsigned &NumNames) const override;
5612 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5613 unsigned &NumAliases) const override;
5614 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005615 return "";
5616 }
Sebastian Pop86500282012-01-13 20:37:10 +00005617
5618 static const char *getHexagonCPUSuffix(StringRef Name) {
5619 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005620 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005621 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005622 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005623 }
5624
Craig Topper3164f332014-03-11 03:39:26 +00005625 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005626 if (!getHexagonCPUSuffix(Name))
5627 return false;
5628
Tony Linthicum76329bf2011-12-12 21:14:55 +00005629 CPU = Name;
5630 return true;
5631 }
5632};
5633
5634void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5635 MacroBuilder &Builder) const {
5636 Builder.defineMacro("qdsp6");
5637 Builder.defineMacro("__qdsp6", "1");
5638 Builder.defineMacro("__qdsp6__", "1");
5639
5640 Builder.defineMacro("hexagon");
5641 Builder.defineMacro("__hexagon", "1");
5642 Builder.defineMacro("__hexagon__", "1");
5643
5644 if(CPU == "hexagonv1") {
5645 Builder.defineMacro("__HEXAGON_V1__");
5646 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5647 if(Opts.HexagonQdsp6Compat) {
5648 Builder.defineMacro("__QDSP6_V1__");
5649 Builder.defineMacro("__QDSP6_ARCH__", "1");
5650 }
5651 }
5652 else if(CPU == "hexagonv2") {
5653 Builder.defineMacro("__HEXAGON_V2__");
5654 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5655 if(Opts.HexagonQdsp6Compat) {
5656 Builder.defineMacro("__QDSP6_V2__");
5657 Builder.defineMacro("__QDSP6_ARCH__", "2");
5658 }
5659 }
5660 else if(CPU == "hexagonv3") {
5661 Builder.defineMacro("__HEXAGON_V3__");
5662 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5663 if(Opts.HexagonQdsp6Compat) {
5664 Builder.defineMacro("__QDSP6_V3__");
5665 Builder.defineMacro("__QDSP6_ARCH__", "3");
5666 }
5667 }
5668 else if(CPU == "hexagonv4") {
5669 Builder.defineMacro("__HEXAGON_V4__");
5670 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5671 if(Opts.HexagonQdsp6Compat) {
5672 Builder.defineMacro("__QDSP6_V4__");
5673 Builder.defineMacro("__QDSP6_ARCH__", "4");
5674 }
5675 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005676 else if(CPU == "hexagonv5") {
5677 Builder.defineMacro("__HEXAGON_V5__");
5678 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5679 if(Opts.HexagonQdsp6Compat) {
5680 Builder.defineMacro("__QDSP6_V5__");
5681 Builder.defineMacro("__QDSP6_ARCH__", "5");
5682 }
5683 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005684}
5685
5686const char * const HexagonTargetInfo::GCCRegNames[] = {
5687 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5688 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5689 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5690 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5691 "p0", "p1", "p2", "p3",
5692 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5693};
5694
5695void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5696 unsigned &NumNames) const {
5697 Names = GCCRegNames;
5698 NumNames = llvm::array_lengthof(GCCRegNames);
5699}
5700
5701
5702const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5703 { { "sp" }, "r29" },
5704 { { "fp" }, "r30" },
5705 { { "lr" }, "r31" },
5706 };
5707
5708void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5709 unsigned &NumAliases) const {
5710 Aliases = GCCRegAliases;
5711 NumAliases = llvm::array_lengthof(GCCRegAliases);
5712}
5713
5714
5715const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005716#define BUILTIN(ID, TYPE, ATTRS) \
5717 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5718#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5719 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005720#include "clang/Basic/BuiltinsHexagon.def"
5721};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005722
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005723// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5724class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005725 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5726 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005727 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005728public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005729 SparcTargetInfo(const llvm::Triple &Triple)
5730 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005731
Craig Topper3164f332014-03-11 03:39:26 +00005732 bool handleTargetFeatures(std::vector<std::string> &Features,
5733 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005734 // The backend doesn't actually handle soft float yet, but in case someone
5735 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005736 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5737 if (Feature != Features.end()) {
5738 SoftFloat = true;
5739 Features.erase(Feature);
5740 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005741 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005742 }
Craig Topper3164f332014-03-11 03:39:26 +00005743 void getTargetDefines(const LangOptions &Opts,
5744 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005745 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005746 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005747
5748 if (SoftFloat)
5749 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005750 }
Craig Topper3164f332014-03-11 03:39:26 +00005751
5752 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005753 return llvm::StringSwitch<bool>(Feature)
5754 .Case("softfloat", SoftFloat)
5755 .Case("sparc", true)
5756 .Default(false);
5757 }
Craig Topper3164f332014-03-11 03:39:26 +00005758
5759 void getTargetBuiltins(const Builtin::Info *&Records,
5760 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005761 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005762 }
Craig Topper3164f332014-03-11 03:39:26 +00005763 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005764 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005765 }
Craig Topper3164f332014-03-11 03:39:26 +00005766 void getGCCRegNames(const char * const *&Names,
5767 unsigned &NumNames) const override;
5768 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5769 unsigned &NumAliases) const override;
5770 bool validateAsmConstraint(const char *&Name,
5771 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005772 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005773 switch (*Name) {
5774 case 'I': // Signed 13-bit constant
5775 case 'J': // Zero
5776 case 'K': // 32-bit constant with the low 12 bits clear
5777 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5778 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5779 case 'N': // Same as 'K' but zext (required for SIMode)
5780 case 'O': // The constant 4096
5781 return true;
5782 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005783 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005784 }
Craig Topper3164f332014-03-11 03:39:26 +00005785 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005786 // FIXME: Implement!
5787 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005788 }
5789};
5790
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005791const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005792 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5793 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5794 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5795 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5796};
5797
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005798void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5799 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005800 Names = GCCRegNames;
5801 NumNames = llvm::array_lengthof(GCCRegNames);
5802}
5803
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005804const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005805 { { "g0" }, "r0" },
5806 { { "g1" }, "r1" },
5807 { { "g2" }, "r2" },
5808 { { "g3" }, "r3" },
5809 { { "g4" }, "r4" },
5810 { { "g5" }, "r5" },
5811 { { "g6" }, "r6" },
5812 { { "g7" }, "r7" },
5813 { { "o0" }, "r8" },
5814 { { "o1" }, "r9" },
5815 { { "o2" }, "r10" },
5816 { { "o3" }, "r11" },
5817 { { "o4" }, "r12" },
5818 { { "o5" }, "r13" },
5819 { { "o6", "sp" }, "r14" },
5820 { { "o7" }, "r15" },
5821 { { "l0" }, "r16" },
5822 { { "l1" }, "r17" },
5823 { { "l2" }, "r18" },
5824 { { "l3" }, "r19" },
5825 { { "l4" }, "r20" },
5826 { { "l5" }, "r21" },
5827 { { "l6" }, "r22" },
5828 { { "l7" }, "r23" },
5829 { { "i0" }, "r24" },
5830 { { "i1" }, "r25" },
5831 { { "i2" }, "r26" },
5832 { { "i3" }, "r27" },
5833 { { "i4" }, "r28" },
5834 { { "i5" }, "r29" },
5835 { { "i6", "fp" }, "r30" },
5836 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005837};
5838
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005839void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5840 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005841 Aliases = GCCRegAliases;
5842 NumAliases = llvm::array_lengthof(GCCRegAliases);
5843}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005844
5845// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5846class SparcV8TargetInfo : public SparcTargetInfo {
5847public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005848 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005849 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005850 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5851 switch (getTriple().getOS()) {
5852 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005853 SizeType = UnsignedInt;
5854 IntPtrType = SignedInt;
5855 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005856 break;
5857 case llvm::Triple::NetBSD:
5858 case llvm::Triple::OpenBSD:
5859 SizeType = UnsignedLong;
5860 IntPtrType = SignedLong;
5861 PtrDiffType = SignedLong;
5862 break;
Brad Smith56495d52015-08-13 22:00:53 +00005863 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005864 }
5865
Craig Topper3164f332014-03-11 03:39:26 +00005866 void getTargetDefines(const LangOptions &Opts,
5867 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005868 SparcTargetInfo::getTargetDefines(Opts, Builder);
5869 Builder.defineMacro("__sparcv8");
5870 }
5871};
5872
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005873// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5874class SparcV8elTargetInfo : public SparcV8TargetInfo {
5875 public:
5876 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005877 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005878 BigEndian = false;
5879 }
5880};
5881
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005882// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5883class SparcV9TargetInfo : public SparcTargetInfo {
5884public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005885 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005886 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005887 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005888 // This is an LP64 platform.
5889 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005890
5891 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005892 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005893 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005894 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005895 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005896 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005897
5898 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5899 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5900 LongDoubleWidth = 128;
5901 LongDoubleAlign = 128;
5902 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005903 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005904 }
5905
Craig Topper3164f332014-03-11 03:39:26 +00005906 void getTargetDefines(const LangOptions &Opts,
5907 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005908 SparcTargetInfo::getTargetDefines(Opts, Builder);
5909 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005910 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005911 // Solaris doesn't need these variants, but the BSDs do.
5912 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005913 Builder.defineMacro("__sparc64__");
5914 Builder.defineMacro("__sparc_v9__");
5915 Builder.defineMacro("__sparcv9__");
5916 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005917 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005918
Craig Topper3164f332014-03-11 03:39:26 +00005919 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005920 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5921 .Case("v9", true)
5922 .Case("ultrasparc", true)
5923 .Case("ultrasparc3", true)
5924 .Case("niagara", true)
5925 .Case("niagara2", true)
5926 .Case("niagara3", true)
5927 .Case("niagara4", true)
5928 .Default(false);
5929
5930 // No need to store the CPU yet. There aren't any CPU-specific
5931 // macros to define.
5932 return CPUKnown;
5933 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005934};
5935
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005936class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005937 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005938 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005939 std::string CPU;
5940 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005941 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005942
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005943public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005944 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00005945 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
5946 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005947 IntMaxType = SignedLong;
5948 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005949 TLSSupported = true;
5950 IntWidth = IntAlign = 32;
5951 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5952 PointerWidth = PointerAlign = 64;
5953 LongDoubleWidth = 128;
5954 LongDoubleAlign = 64;
5955 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005956 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005957 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005958 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 +00005959 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5960 }
5961 void getTargetDefines(const LangOptions &Opts,
5962 MacroBuilder &Builder) const override {
5963 Builder.defineMacro("__s390__");
5964 Builder.defineMacro("__s390x__");
5965 Builder.defineMacro("__zarch__");
5966 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005967 if (HasTransactionalExecution)
5968 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005969 if (Opts.ZVector)
5970 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005971 }
5972 void getTargetBuiltins(const Builtin::Info *&Records,
5973 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005974 Records = BuiltinInfo;
5975 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005976 }
5977
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005978 void getGCCRegNames(const char *const *&Names,
5979 unsigned &NumNames) const override;
5980 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5981 unsigned &NumAliases) const override {
5982 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005983 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005984 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005985 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005986 bool validateAsmConstraint(const char *&Name,
5987 TargetInfo::ConstraintInfo &info) const override;
5988 const char *getClobbers() const override {
5989 // FIXME: Is this really right?
5990 return "";
5991 }
5992 BuiltinVaListKind getBuiltinVaListKind() const override {
5993 return TargetInfo::SystemZBuiltinVaList;
5994 }
5995 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005996 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005997 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5998 .Case("z10", true)
5999 .Case("z196", true)
6000 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006001 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006002 .Default(false);
6003
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006004 return CPUKnown;
6005 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006006 bool
6007 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6008 StringRef CPU,
6009 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006010 if (CPU == "zEC12")
6011 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006012 if (CPU == "z13") {
6013 Features["transactional-execution"] = true;
6014 Features["vector"] = true;
6015 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006016 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006017 }
6018
6019 bool handleTargetFeatures(std::vector<std::string> &Features,
6020 DiagnosticsEngine &Diags) override {
6021 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006022 for (const auto &Feature : Features) {
6023 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006024 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006025 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006026 HasVector = true;
6027 }
6028 // If we use the vector ABI, vector types are 64-bit aligned.
6029 if (HasVector) {
6030 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006031 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6032 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006033 }
6034 return true;
6035 }
6036
6037 bool hasFeature(StringRef Feature) const override {
6038 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006039 .Case("systemz", true)
6040 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006041 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006042 .Default(false);
6043 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006044
6045 StringRef getABI() const override {
6046 if (HasVector)
6047 return "vector";
6048 return "";
6049 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006050
6051 bool useFloat128ManglingForLongDouble() const override {
6052 return true;
6053 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006054};
6055
6056const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6057#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006058 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006059#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006060};
6061
6062const char *const SystemZTargetInfo::GCCRegNames[] = {
6063 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6064 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6065 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6066 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6067};
6068
6069void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6070 unsigned &NumNames) const {
6071 Names = GCCRegNames;
6072 NumNames = llvm::array_lengthof(GCCRegNames);
6073}
6074
6075bool SystemZTargetInfo::
6076validateAsmConstraint(const char *&Name,
6077 TargetInfo::ConstraintInfo &Info) const {
6078 switch (*Name) {
6079 default:
6080 return false;
6081
6082 case 'a': // Address register
6083 case 'd': // Data register (equivalent to 'r')
6084 case 'f': // Floating-point register
6085 Info.setAllowsRegister();
6086 return true;
6087
6088 case 'I': // Unsigned 8-bit constant
6089 case 'J': // Unsigned 12-bit constant
6090 case 'K': // Signed 16-bit constant
6091 case 'L': // Signed 20-bit displacement (on all targets we support)
6092 case 'M': // 0x7fffffff
6093 return true;
6094
6095 case 'Q': // Memory with base and unsigned 12-bit displacement
6096 case 'R': // Likewise, plus an index
6097 case 'S': // Memory with base and signed 20-bit displacement
6098 case 'T': // Likewise, plus an index
6099 Info.setAllowsMemory();
6100 return true;
6101 }
6102}
Ulrich Weigand47445072013-05-06 16:26:41 +00006103
Eric Christopherc48497a2015-09-18 21:26:24 +00006104class MSP430TargetInfo : public TargetInfo {
6105 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006106
Eric Christopherc48497a2015-09-18 21:26:24 +00006107public:
6108 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6109 BigEndian = false;
6110 TLSSupported = false;
6111 IntWidth = 16;
6112 IntAlign = 16;
6113 LongWidth = 32;
6114 LongLongWidth = 64;
6115 LongAlign = LongLongAlign = 16;
6116 PointerWidth = 16;
6117 PointerAlign = 16;
6118 SuitableAlign = 16;
6119 SizeType = UnsignedInt;
6120 IntMaxType = SignedLongLong;
6121 IntPtrType = SignedInt;
6122 PtrDiffType = SignedInt;
6123 SigAtomicType = SignedLong;
6124 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006125 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006126 void getTargetDefines(const LangOptions &Opts,
6127 MacroBuilder &Builder) const override {
6128 Builder.defineMacro("MSP430");
6129 Builder.defineMacro("__MSP430__");
6130 // FIXME: defines for different 'flavours' of MCU
6131 }
6132 void getTargetBuiltins(const Builtin::Info *&Records,
6133 unsigned &NumRecords) const override {
6134 // FIXME: Implement.
6135 Records = nullptr;
6136 NumRecords = 0;
6137 }
6138 bool hasFeature(StringRef Feature) const override {
6139 return Feature == "msp430";
6140 }
6141 void getGCCRegNames(const char *const *&Names,
6142 unsigned &NumNames) const override;
6143 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6144 unsigned &NumAliases) const override {
6145 // No aliases.
6146 Aliases = nullptr;
6147 NumAliases = 0;
6148 }
6149 bool validateAsmConstraint(const char *&Name,
6150 TargetInfo::ConstraintInfo &info) const override {
6151 // FIXME: implement
6152 switch (*Name) {
6153 case 'K': // the constant 1
6154 case 'L': // constant -1^20 .. 1^19
6155 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006156 return true;
6157 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006158 // No target constraints for now.
6159 return false;
6160 }
6161 const char *getClobbers() const override {
6162 // FIXME: Is this really right?
6163 return "";
6164 }
6165 BuiltinVaListKind getBuiltinVaListKind() const override {
6166 // FIXME: implement
6167 return TargetInfo::CharPtrBuiltinVaList;
6168 }
6169};
6170
6171const char *const MSP430TargetInfo::GCCRegNames[] = {
6172 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6173 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6174
6175void MSP430TargetInfo::getGCCRegNames(const char *const *&Names,
6176 unsigned &NumNames) const {
6177 Names = GCCRegNames;
6178 NumNames = llvm::array_lengthof(GCCRegNames);
6179}
6180
6181// LLVM and Clang cannot be used directly to output native binaries for
6182// target, but is used to compile C code to llvm bitcode with correct
6183// type and alignment information.
6184//
6185// TCE uses the llvm bitcode as input and uses it for generating customized
6186// target processor and program binary. TCE co-design environment is
6187// publicly available in http://tce.cs.tut.fi
6188
6189static const unsigned TCEOpenCLAddrSpaceMap[] = {
6190 3, // opencl_global
6191 4, // opencl_local
6192 5, // opencl_constant
6193 // FIXME: generic has to be added to the target
6194 0, // opencl_generic
6195 0, // cuda_device
6196 0, // cuda_constant
6197 0 // cuda_shared
6198};
6199
6200class TCETargetInfo : public TargetInfo {
6201public:
6202 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6203 TLSSupported = false;
6204 IntWidth = 32;
6205 LongWidth = LongLongWidth = 32;
6206 PointerWidth = 32;
6207 IntAlign = 32;
6208 LongAlign = LongLongAlign = 32;
6209 PointerAlign = 32;
6210 SuitableAlign = 32;
6211 SizeType = UnsignedInt;
6212 IntMaxType = SignedLong;
6213 IntPtrType = SignedInt;
6214 PtrDiffType = SignedInt;
6215 FloatWidth = 32;
6216 FloatAlign = 32;
6217 DoubleWidth = 32;
6218 DoubleAlign = 32;
6219 LongDoubleWidth = 32;
6220 LongDoubleAlign = 32;
6221 FloatFormat = &llvm::APFloat::IEEEsingle;
6222 DoubleFormat = &llvm::APFloat::IEEEsingle;
6223 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6224 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6225 "-f64:32-v64:32-v128:32-a:0:32-n32";
6226 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6227 UseAddrSpaceMapMangling = true;
6228 }
6229
6230 void getTargetDefines(const LangOptions &Opts,
6231 MacroBuilder &Builder) const override {
6232 DefineStd(Builder, "tce", Opts);
6233 Builder.defineMacro("__TCE__");
6234 Builder.defineMacro("__TCE_V1__");
6235 }
6236 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6237
6238 void getTargetBuiltins(const Builtin::Info *&Records,
6239 unsigned &NumRecords) const override {}
6240 const char *getClobbers() const override { return ""; }
6241 BuiltinVaListKind getBuiltinVaListKind() const override {
6242 return TargetInfo::VoidPtrBuiltinVaList;
6243 }
6244 void getGCCRegNames(const char *const *&Names,
6245 unsigned &NumNames) const override {}
6246 bool validateAsmConstraint(const char *&Name,
6247 TargetInfo::ConstraintInfo &info) const override {
6248 return true;
6249 }
6250 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6251 unsigned &NumAliases) const override {}
6252};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006253
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006254class BPFTargetInfo : public TargetInfo {
6255public:
6256 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6257 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6258 SizeType = UnsignedLong;
6259 PtrDiffType = SignedLong;
6260 IntPtrType = SignedLong;
6261 IntMaxType = SignedLong;
6262 Int64Type = SignedLong;
6263 RegParmMax = 5;
6264 if (Triple.getArch() == llvm::Triple::bpfeb) {
6265 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006266 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006267 } else {
6268 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006269 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006270 }
6271 MaxAtomicPromoteWidth = 64;
6272 MaxAtomicInlineWidth = 64;
6273 TLSSupported = false;
6274 }
6275 void getTargetDefines(const LangOptions &Opts,
6276 MacroBuilder &Builder) const override {
6277 DefineStd(Builder, "bpf", Opts);
6278 Builder.defineMacro("__BPF__");
6279 }
6280 bool hasFeature(StringRef Feature) const override {
6281 return Feature == "bpf";
6282 }
6283
6284 void getTargetBuiltins(const Builtin::Info *&Records,
6285 unsigned &NumRecords) const override {}
6286 const char *getClobbers() const override {
6287 return "";
6288 }
6289 BuiltinVaListKind getBuiltinVaListKind() const override {
6290 return TargetInfo::VoidPtrBuiltinVaList;
6291 }
6292 void getGCCRegNames(const char * const *&Names,
6293 unsigned &NumNames) const override {
6294 Names = nullptr;
6295 NumNames = 0;
6296 }
6297 bool validateAsmConstraint(const char *&Name,
6298 TargetInfo::ConstraintInfo &info) const override {
6299 return true;
6300 }
6301 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6302 unsigned &NumAliases) const override {
6303 Aliases = nullptr;
6304 NumAliases = 0;
6305 }
6306};
6307
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006308class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006309 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006310
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006311 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006312 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006313 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006314 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006315 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006316 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006317 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006318 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006319 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006320 enum DspRevEnum {
6321 NoDSP, DSP1, DSP2
6322 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006323 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006324
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006325protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006326 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006327 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006328
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006329public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006330 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6331 const std::string &CPUStr)
6332 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006333 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006334 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6335 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6336 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006337
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006338 bool isNaN2008Default() const {
6339 return CPU == "mips32r6" || CPU == "mips64r6";
6340 }
6341
6342 bool isFP64Default() const {
6343 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6344 }
6345
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006346 bool isNan2008() const override {
6347 return IsNan2008;
6348 }
6349
Alp Toker4925ba72014-06-07 23:30:42 +00006350 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006351 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006352 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6353 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006354 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006355 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006356 .Case("mips1", IsMips32)
6357 .Case("mips2", IsMips32)
6358 .Case("mips3", true)
6359 .Case("mips4", true)
6360 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006361 .Case("mips32", IsMips32)
6362 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006363 .Case("mips32r3", IsMips32)
6364 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006365 .Case("mips32r6", IsMips32)
6366 .Case("mips64", true)
6367 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006368 .Case("mips64r3", true)
6369 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006370 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006371 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006372 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006373 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006374 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006375 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006376 bool
6377 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6378 StringRef CPU,
6379 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006380 if (CPU == "octeon")
6381 Features["mips64r2"] = Features["cnmips"] = true;
6382 else
6383 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006384 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006385 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006386
Craig Topper3164f332014-03-11 03:39:26 +00006387 void getTargetDefines(const LangOptions &Opts,
6388 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006389 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006390 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006391 if (Opts.GNUMode)
6392 Builder.defineMacro("mips");
6393
Simon Atanasyan683535b2012-08-29 19:14:58 +00006394 Builder.defineMacro("__REGISTER_PREFIX__", "");
6395
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006396 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006397 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006398 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006399 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006400 case SoftFloat:
6401 Builder.defineMacro("__mips_soft_float", Twine(1));
6402 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006403 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006404
Simon Atanasyan16071912013-04-14 14:07:30 +00006405 if (IsSingleFloat)
6406 Builder.defineMacro("__mips_single_float", Twine(1));
6407
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006408 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6409 Builder.defineMacro("_MIPS_FPSET",
6410 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6411
Simon Atanasyan72244b62012-07-05 16:06:06 +00006412 if (IsMips16)
6413 Builder.defineMacro("__mips16", Twine(1));
6414
Simon Atanasyan60777612013-04-14 14:07:51 +00006415 if (IsMicromips)
6416 Builder.defineMacro("__mips_micromips", Twine(1));
6417
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006418 if (IsNan2008)
6419 Builder.defineMacro("__mips_nan2008", Twine(1));
6420
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006421 switch (DspRev) {
6422 default:
6423 break;
6424 case DSP1:
6425 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6426 Builder.defineMacro("__mips_dsp", Twine(1));
6427 break;
6428 case DSP2:
6429 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6430 Builder.defineMacro("__mips_dspr2", Twine(1));
6431 Builder.defineMacro("__mips_dsp", Twine(1));
6432 break;
6433 }
6434
Jack Carter44ff1e52013-08-12 17:20:29 +00006435 if (HasMSA)
6436 Builder.defineMacro("__mips_msa", Twine(1));
6437
Simon Atanasyan26f19672012-04-05 19:28:31 +00006438 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6439 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6440 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006441
6442 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6443 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006444 }
6445
Craig Topper3164f332014-03-11 03:39:26 +00006446 void getTargetBuiltins(const Builtin::Info *&Records,
6447 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006448 Records = BuiltinInfo;
6449 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006450 }
Craig Topper3164f332014-03-11 03:39:26 +00006451 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006452 return llvm::StringSwitch<bool>(Feature)
6453 .Case("mips", true)
6454 .Case("fp64", HasFP64)
6455 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006456 }
Craig Topper3164f332014-03-11 03:39:26 +00006457 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006458 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006459 }
Craig Topper3164f332014-03-11 03:39:26 +00006460 void getGCCRegNames(const char * const *&Names,
6461 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006462 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006463 // CPU register names
6464 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006465 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6466 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6467 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006468 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6469 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006470 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6471 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6472 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6473 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006474 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006475 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006476 "$fcc5","$fcc6","$fcc7",
6477 // MSA register names
6478 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6479 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6480 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6481 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6482 // MSA control register names
6483 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6484 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006485 };
6486 Names = GCCRegNames;
6487 NumNames = llvm::array_lengthof(GCCRegNames);
6488 }
Craig Topper3164f332014-03-11 03:39:26 +00006489 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6490 unsigned &NumAliases) const override = 0;
6491 bool validateAsmConstraint(const char *&Name,
6492 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006493 switch (*Name) {
6494 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006495 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006496 case 'r': // CPU registers.
6497 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006498 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006499 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006500 case 'c': // $25 for indirect jumps
6501 case 'l': // lo register
6502 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006503 Info.setAllowsRegister();
6504 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006505 case 'I': // Signed 16-bit constant
6506 case 'J': // Integer 0
6507 case 'K': // Unsigned 16-bit constant
6508 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6509 case 'M': // Constants not loadable via lui, addiu, or ori
6510 case 'N': // Constant -1 to -65535
6511 case 'O': // A signed 15-bit constant
6512 case 'P': // A constant between 1 go 65535
6513 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006514 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006515 Info.setAllowsMemory();
6516 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006517 case 'Z':
6518 if (Name[1] == 'C') { // An address usable by ll, and sc.
6519 Info.setAllowsMemory();
6520 Name++; // Skip over 'Z'.
6521 return true;
6522 }
6523 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006524 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006525 }
6526
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006527 std::string convertConstraint(const char *&Constraint) const override {
6528 std::string R;
6529 switch (*Constraint) {
6530 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6531 if (Constraint[1] == 'C') {
6532 R = std::string("^") + std::string(Constraint, 2);
6533 Constraint++;
6534 return R;
6535 }
6536 break;
6537 }
6538 return TargetInfo::convertConstraint(Constraint);
6539 }
6540
Craig Topper3164f332014-03-11 03:39:26 +00006541 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006542 // In GCC, $1 is not widely used in generated code (it's used only in a few
6543 // specific situations), so there is no real need for users to add it to
6544 // the clobbers list if they want to use it in their inline assembly code.
6545 //
6546 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6547 // code generation, so using it in inline assembly without adding it to the
6548 // clobbers list can cause conflicts between the inline assembly code and
6549 // the surrounding generated code.
6550 //
6551 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6552 // operands, which will conflict with the ".set at" assembler option (which
6553 // we use only for inline assembly, in order to maintain compatibility with
6554 // GCC) and will also conflict with the user's usage of $1.
6555 //
6556 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6557 // register for generated code is to automatically clobber $1 for all inline
6558 // assembly code.
6559 //
6560 // FIXME: We should automatically clobber $1 only for inline assembly code
6561 // which actually uses it. This would allow LLVM to use $1 for inline
6562 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006563 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006564 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006565
Craig Topper3164f332014-03-11 03:39:26 +00006566 bool handleTargetFeatures(std::vector<std::string> &Features,
6567 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006568 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006569 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006570 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006571 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006572 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006573 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006574 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006575
Eric Christopher610fe112015-08-26 08:21:55 +00006576 for (const auto &Feature : Features) {
6577 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006578 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006579 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006580 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006581 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006582 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006583 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006584 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006585 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006586 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006587 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006588 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006589 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006590 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006591 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006592 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006593 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006594 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006595 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006596 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006597 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006598 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006599 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006600
Eric Christopher964a5f32015-08-05 23:48:05 +00006601 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006602
Rafael Espindolaeb265472013-08-21 21:59:03 +00006603 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006604 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006605
Craig Topper3164f332014-03-11 03:39:26 +00006606 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006607 if (RegNo == 0) return 4;
6608 if (RegNo == 1) return 5;
6609 return -1;
6610 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006611
6612 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006613};
6614
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006615const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006616#define BUILTIN(ID, TYPE, ATTRS) \
6617 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6618#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6619 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006620#include "clang/Basic/BuiltinsMips.def"
6621};
6622
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006623class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006624public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006625 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006626 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006627 SizeType = UnsignedInt;
6628 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006629 Int64Type = SignedLongLong;
6630 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006631 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006632 }
Craig Topper3164f332014-03-11 03:39:26 +00006633 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006634 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006635 ABI = Name;
6636 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006637 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006638 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006639 }
Craig Topper3164f332014-03-11 03:39:26 +00006640 void getTargetDefines(const LangOptions &Opts,
6641 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006642 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006643
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006644 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006645 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6646
6647 const std::string& CPUStr = getCPU();
6648 if (CPUStr == "mips32")
6649 Builder.defineMacro("__mips_isa_rev", "1");
6650 else if (CPUStr == "mips32r2")
6651 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006652 else if (CPUStr == "mips32r3")
6653 Builder.defineMacro("__mips_isa_rev", "3");
6654 else if (CPUStr == "mips32r5")
6655 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006656 else if (CPUStr == "mips32r6")
6657 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006658
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006659 if (ABI == "o32") {
6660 Builder.defineMacro("__mips_o32");
6661 Builder.defineMacro("_ABIO32", "1");
6662 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6663 }
6664 else if (ABI == "eabi")
6665 Builder.defineMacro("__mips_eabi");
6666 else
David Blaikie83d382b2011-09-23 05:06:16 +00006667 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006668 }
Craig Topper3164f332014-03-11 03:39:26 +00006669 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6670 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006671 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6672 { { "at" }, "$1" },
6673 { { "v0" }, "$2" },
6674 { { "v1" }, "$3" },
6675 { { "a0" }, "$4" },
6676 { { "a1" }, "$5" },
6677 { { "a2" }, "$6" },
6678 { { "a3" }, "$7" },
6679 { { "t0" }, "$8" },
6680 { { "t1" }, "$9" },
6681 { { "t2" }, "$10" },
6682 { { "t3" }, "$11" },
6683 { { "t4" }, "$12" },
6684 { { "t5" }, "$13" },
6685 { { "t6" }, "$14" },
6686 { { "t7" }, "$15" },
6687 { { "s0" }, "$16" },
6688 { { "s1" }, "$17" },
6689 { { "s2" }, "$18" },
6690 { { "s3" }, "$19" },
6691 { { "s4" }, "$20" },
6692 { { "s5" }, "$21" },
6693 { { "s6" }, "$22" },
6694 { { "s7" }, "$23" },
6695 { { "t8" }, "$24" },
6696 { { "t9" }, "$25" },
6697 { { "k0" }, "$26" },
6698 { { "k1" }, "$27" },
6699 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006700 { { "sp","$sp" }, "$29" },
6701 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006702 { { "ra" }, "$31" }
6703 };
6704 Aliases = GCCRegAliases;
6705 NumAliases = llvm::array_lengthof(GCCRegAliases);
6706 }
6707};
6708
6709class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006710 void setDataLayoutString() override {
6711 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006712 }
6713
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006714public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006715 Mips32EBTargetInfo(const llvm::Triple &Triple)
6716 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006717 }
Craig Topper3164f332014-03-11 03:39:26 +00006718 void getTargetDefines(const LangOptions &Opts,
6719 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006720 DefineStd(Builder, "MIPSEB", Opts);
6721 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006722 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006723 }
6724};
6725
6726class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006727 void setDataLayoutString() override {
6728 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006729 }
6730
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006731public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006732 Mips32ELTargetInfo(const llvm::Triple &Triple)
6733 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006734 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006735 }
Craig Topper3164f332014-03-11 03:39:26 +00006736 void getTargetDefines(const LangOptions &Opts,
6737 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006738 DefineStd(Builder, "MIPSEL", Opts);
6739 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006740 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006741 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006742};
Akira Hatanakabef17452011-09-20 19:21:49 +00006743
6744class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006745public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006746 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006747 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006748 LongDoubleWidth = LongDoubleAlign = 128;
6749 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006750 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6751 LongDoubleWidth = LongDoubleAlign = 64;
6752 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6753 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006754 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006755 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006756 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006757 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006758
6759 void setN64ABITypes() {
6760 LongWidth = LongAlign = 64;
6761 PointerWidth = PointerAlign = 64;
6762 SizeType = UnsignedLong;
6763 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006764 Int64Type = SignedLong;
6765 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006766 }
6767
6768 void setN32ABITypes() {
6769 LongWidth = LongAlign = 32;
6770 PointerWidth = PointerAlign = 32;
6771 SizeType = UnsignedInt;
6772 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006773 Int64Type = SignedLongLong;
6774 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006775 }
6776
Craig Topper3164f332014-03-11 03:39:26 +00006777 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006778 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006779 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006780 ABI = Name;
6781 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006782 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006783 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006784 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006785 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006786 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006787 }
6788 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006789 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006790
Craig Topper3164f332014-03-11 03:39:26 +00006791 void getTargetDefines(const LangOptions &Opts,
6792 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006793 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006794
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006795 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006796 Builder.defineMacro("__mips64");
6797 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006798 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6799
6800 const std::string& CPUStr = getCPU();
6801 if (CPUStr == "mips64")
6802 Builder.defineMacro("__mips_isa_rev", "1");
6803 else if (CPUStr == "mips64r2")
6804 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006805 else if (CPUStr == "mips64r3")
6806 Builder.defineMacro("__mips_isa_rev", "3");
6807 else if (CPUStr == "mips64r5")
6808 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006809 else if (CPUStr == "mips64r6")
6810 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006811
Akira Hatanakabef17452011-09-20 19:21:49 +00006812 if (ABI == "n32") {
6813 Builder.defineMacro("__mips_n32");
6814 Builder.defineMacro("_ABIN32", "2");
6815 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6816 }
6817 else if (ABI == "n64") {
6818 Builder.defineMacro("__mips_n64");
6819 Builder.defineMacro("_ABI64", "3");
6820 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6821 }
6822 else
David Blaikie83d382b2011-09-23 05:06:16 +00006823 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006824 }
Craig Topper3164f332014-03-11 03:39:26 +00006825 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6826 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006827 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6828 { { "at" }, "$1" },
6829 { { "v0" }, "$2" },
6830 { { "v1" }, "$3" },
6831 { { "a0" }, "$4" },
6832 { { "a1" }, "$5" },
6833 { { "a2" }, "$6" },
6834 { { "a3" }, "$7" },
6835 { { "a4" }, "$8" },
6836 { { "a5" }, "$9" },
6837 { { "a6" }, "$10" },
6838 { { "a7" }, "$11" },
6839 { { "t0" }, "$12" },
6840 { { "t1" }, "$13" },
6841 { { "t2" }, "$14" },
6842 { { "t3" }, "$15" },
6843 { { "s0" }, "$16" },
6844 { { "s1" }, "$17" },
6845 { { "s2" }, "$18" },
6846 { { "s3" }, "$19" },
6847 { { "s4" }, "$20" },
6848 { { "s5" }, "$21" },
6849 { { "s6" }, "$22" },
6850 { { "s7" }, "$23" },
6851 { { "t8" }, "$24" },
6852 { { "t9" }, "$25" },
6853 { { "k0" }, "$26" },
6854 { { "k1" }, "$27" },
6855 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006856 { { "sp","$sp" }, "$29" },
6857 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006858 { { "ra" }, "$31" }
6859 };
6860 Aliases = GCCRegAliases;
6861 NumAliases = llvm::array_lengthof(GCCRegAliases);
6862 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006863
6864 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006865};
6866
6867class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006868 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006869 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006870 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 +00006871 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006872 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006873
Akira Hatanakabef17452011-09-20 19:21:49 +00006874 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006875
Akira Hatanakabef17452011-09-20 19:21:49 +00006876public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006878 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006879 void getTargetDefines(const LangOptions &Opts,
6880 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006881 DefineStd(Builder, "MIPSEB", Opts);
6882 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006883 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006884 }
6885};
6886
6887class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006888 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006889 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006890 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 +00006891 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006892 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006893 }
6894public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006895 Mips64ELTargetInfo(const llvm::Triple &Triple)
6896 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006897 // Default ABI is n64.
6898 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006899 }
Craig Topper3164f332014-03-11 03:39:26 +00006900 void getTargetDefines(const LangOptions &Opts,
6901 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006902 DefineStd(Builder, "MIPSEL", Opts);
6903 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006904 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006905 }
6906};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006907
Ivan Krasindd7403e2011-08-24 20:22:22 +00006908class PNaClTargetInfo : public TargetInfo {
6909public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006911 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006912 this->UserLabelPrefix = "";
6913 this->LongAlign = 32;
6914 this->LongWidth = 32;
6915 this->PointerAlign = 32;
6916 this->PointerWidth = 32;
6917 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006918 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006919 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006920 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006921 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006922 this->SizeType = TargetInfo::UnsignedInt;
6923 this->PtrDiffType = TargetInfo::SignedInt;
6924 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006925 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006926 }
6927
Craig Toppere6f17d02014-03-11 04:07:52 +00006928 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006929 Builder.defineMacro("__le32__");
6930 Builder.defineMacro("__pnacl__");
6931 }
Craig Topper3164f332014-03-11 03:39:26 +00006932 void getTargetDefines(const LangOptions &Opts,
6933 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006934 getArchDefines(Opts, Builder);
6935 }
Craig Topper3164f332014-03-11 03:39:26 +00006936 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006937 return Feature == "pnacl";
6938 }
Craig Topper3164f332014-03-11 03:39:26 +00006939 void getTargetBuiltins(const Builtin::Info *&Records,
6940 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006941 }
Craig Topper3164f332014-03-11 03:39:26 +00006942 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006943 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006944 }
Craig Topper3164f332014-03-11 03:39:26 +00006945 void getGCCRegNames(const char * const *&Names,
6946 unsigned &NumNames) const override;
6947 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6948 unsigned &NumAliases) const override;
6949 bool validateAsmConstraint(const char *&Name,
6950 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006951 return false;
6952 }
6953
Craig Topper3164f332014-03-11 03:39:26 +00006954 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006955 return "";
6956 }
6957};
6958
6959void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6960 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006961 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006962 NumNames = 0;
6963}
6964
6965void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6966 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006967 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006968 NumAliases = 0;
6969}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006970
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006971// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6972class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6973public:
6974 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006975 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006976 }
6977
6978 BuiltinVaListKind getBuiltinVaListKind() const override {
6979 return TargetInfo::PNaClABIBuiltinVaList;
6980 }
6981};
6982
JF Bastien643817d2014-09-12 17:52:47 +00006983class Le64TargetInfo : public TargetInfo {
6984 static const Builtin::Info BuiltinInfo[];
6985
6986public:
6987 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6988 BigEndian = false;
6989 NoAsmVariants = true;
6990 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6991 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006992 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006993 }
6994
6995 void getTargetDefines(const LangOptions &Opts,
6996 MacroBuilder &Builder) const override {
6997 DefineStd(Builder, "unix", Opts);
6998 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6999 Builder.defineMacro("__ELF__");
7000 }
7001 void getTargetBuiltins(const Builtin::Info *&Records,
7002 unsigned &NumRecords) const override {
7003 Records = BuiltinInfo;
7004 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
7005 }
7006 BuiltinVaListKind getBuiltinVaListKind() const override {
7007 return TargetInfo::PNaClABIBuiltinVaList;
7008 }
7009 const char *getClobbers() const override { return ""; }
7010 void getGCCRegNames(const char *const *&Names,
7011 unsigned &NumNames) const override {
7012 Names = nullptr;
7013 NumNames = 0;
7014 }
7015 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7016 unsigned &NumAliases) const override {
7017 Aliases = nullptr;
7018 NumAliases = 0;
7019 }
7020 bool validateAsmConstraint(const char *&Name,
7021 TargetInfo::ConstraintInfo &Info) const override {
7022 return false;
7023 }
7024
7025 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007026};
Dan Gohmanc2853072015-09-03 22:51:53 +00007027
7028class WebAssemblyTargetInfo : public TargetInfo {
7029 static const Builtin::Info BuiltinInfo[];
7030
7031 enum SIMDEnum {
7032 NoSIMD,
7033 SIMD128,
7034 } SIMDLevel;
7035
7036public:
7037 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7038 : TargetInfo(T), SIMDLevel(NoSIMD) {
7039 BigEndian = false;
7040 NoAsmVariants = true;
7041 SuitableAlign = 128;
7042 LargeArrayMinWidth = 128;
7043 LargeArrayAlign = 128;
7044 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007045 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00007046 }
7047
7048protected:
7049 void getTargetDefines(const LangOptions &Opts,
7050 MacroBuilder &Builder) const override {
7051 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7052 if (SIMDLevel >= SIMD128)
7053 Builder.defineMacro("__wasm_simd128__");
7054 }
7055
7056private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007057 bool
7058 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7059 StringRef CPU,
7060 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007061 if (CPU == "bleeding-edge")
7062 Features["simd128"] = true;
7063 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7064 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007065 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007066 return llvm::StringSwitch<bool>(Feature)
7067 .Case("simd128", SIMDLevel >= SIMD128)
7068 .Default(false);
7069 }
7070 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007071 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007072 for (const auto &Feature : Features) {
7073 if (Feature == "+simd128") {
7074 SIMDLevel = std::max(SIMDLevel, SIMD128);
7075 continue;
7076 }
7077 if (Feature == "-simd128") {
7078 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7079 continue;
7080 }
7081
7082 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7083 << "-target-feature";
7084 return false;
7085 }
7086 return true;
7087 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007088 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007089 return llvm::StringSwitch<bool>(Name)
7090 .Case("mvp", true)
7091 .Case("bleeding-edge", true)
7092 .Case("generic", true)
7093 .Default(false);
7094 }
7095 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007096 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007097 Records = BuiltinInfo;
7098 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7099 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007100 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007101 // TODO: Implement va_list properly.
7102 return VoidPtrBuiltinVaList;
7103 }
7104 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007105 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007106 Names = nullptr;
7107 NumNames = 0;
7108 }
7109 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007110 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007111 Aliases = nullptr;
7112 NumAliases = 0;
7113 }
7114 bool
7115 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007116 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007117 return false;
7118 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007119 const char *getClobbers() const final { return ""; }
7120 bool isCLZForZeroUndef() const final { return false; }
7121 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007122 IntType getIntTypeByWidth(unsigned BitWidth,
7123 bool IsSigned) const final {
7124 // WebAssembly prefers long long for explicitly 64-bit integers.
7125 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7126 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7127 }
7128 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7129 bool IsSigned) const final {
7130 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7131 return BitWidth == 64
7132 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7133 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7134 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007135};
7136
7137const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7138#define BUILTIN(ID, TYPE, ATTRS) \
7139 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7140#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7141 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7142#include "clang/Basic/BuiltinsWebAssembly.def"
7143};
7144
7145class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7146public:
7147 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7148 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007149 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007150 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7151 }
7152
7153protected:
7154 void getTargetDefines(const LangOptions &Opts,
7155 MacroBuilder &Builder) const override {
7156 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7157 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7158 }
7159};
7160
7161class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7162public:
7163 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7164 : WebAssemblyTargetInfo(T) {
7165 LongAlign = LongWidth = 64;
7166 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007167 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007168 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7169 }
7170
7171protected:
7172 void getTargetDefines(const LangOptions &Opts,
7173 MacroBuilder &Builder) const override {
7174 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7175 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7176 }
7177};
7178
JF Bastien643817d2014-09-12 17:52:47 +00007179const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7180#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007181 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007182#include "clang/Basic/BuiltinsLe64.def"
7183};
7184
Eric Christopherc48497a2015-09-18 21:26:24 +00007185static const unsigned SPIRAddrSpaceMap[] = {
7186 1, // opencl_global
7187 3, // opencl_local
7188 2, // opencl_constant
7189 4, // opencl_generic
7190 0, // cuda_device
7191 0, // cuda_constant
7192 0 // cuda_shared
7193};
7194class SPIRTargetInfo : public TargetInfo {
7195public:
7196 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7197 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7198 "SPIR target must use unknown OS");
7199 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7200 "SPIR target must use unknown environment type");
7201 BigEndian = false;
7202 TLSSupported = false;
7203 LongWidth = LongAlign = 64;
7204 AddrSpaceMap = &SPIRAddrSpaceMap;
7205 UseAddrSpaceMapMangling = true;
7206 // Define available target features
7207 // These must be defined in sorted order!
7208 NoAsmVariants = true;
7209 }
7210 void getTargetDefines(const LangOptions &Opts,
7211 MacroBuilder &Builder) const override {
7212 DefineStd(Builder, "SPIR", Opts);
7213 }
7214 bool hasFeature(StringRef Feature) const override {
7215 return Feature == "spir";
7216 }
Craig Topper3164f332014-03-11 03:39:26 +00007217
Eric Christopherc48497a2015-09-18 21:26:24 +00007218 void getTargetBuiltins(const Builtin::Info *&Records,
7219 unsigned &NumRecords) const override {}
7220 const char *getClobbers() const override { return ""; }
7221 void getGCCRegNames(const char *const *&Names,
7222 unsigned &NumNames) const override {}
7223 bool validateAsmConstraint(const char *&Name,
7224 TargetInfo::ConstraintInfo &info) const override {
7225 return true;
7226 }
7227 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7228 unsigned &NumAliases) const override {}
7229 BuiltinVaListKind getBuiltinVaListKind() const override {
7230 return TargetInfo::VoidPtrBuiltinVaList;
7231 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007232
Eric Christopherc48497a2015-09-18 21:26:24 +00007233 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7234 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7235 : CCCR_Warning;
7236 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007237
Eric Christopherc48497a2015-09-18 21:26:24 +00007238 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7239 return CC_SpirFunction;
7240 }
7241};
Guy Benyeib798fc92012-12-11 21:38:14 +00007242
Eric Christopherc48497a2015-09-18 21:26:24 +00007243class SPIR32TargetInfo : public SPIRTargetInfo {
7244public:
7245 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7246 PointerWidth = PointerAlign = 32;
7247 SizeType = TargetInfo::UnsignedInt;
7248 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7249 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7250 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7251 }
7252 void getTargetDefines(const LangOptions &Opts,
7253 MacroBuilder &Builder) const override {
7254 DefineStd(Builder, "SPIR32", Opts);
7255 }
7256};
Guy Benyeib798fc92012-12-11 21:38:14 +00007257
Eric Christopherc48497a2015-09-18 21:26:24 +00007258class SPIR64TargetInfo : public SPIRTargetInfo {
7259public:
7260 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7261 PointerWidth = PointerAlign = 64;
7262 SizeType = TargetInfo::UnsignedLong;
7263 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7264 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7265 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7266 }
7267 void getTargetDefines(const LangOptions &Opts,
7268 MacroBuilder &Builder) const override {
7269 DefineStd(Builder, "SPIR64", Opts);
7270 }
7271};
Guy Benyeib798fc92012-12-11 21:38:14 +00007272
Robert Lytton0e076492013-08-13 09:43:10 +00007273class XCoreTargetInfo : public TargetInfo {
7274 static const Builtin::Info BuiltinInfo[];
7275public:
7276 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7277 BigEndian = false;
7278 NoAsmVariants = true;
7279 LongLongAlign = 32;
7280 SuitableAlign = 32;
7281 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007282 SizeType = UnsignedInt;
7283 PtrDiffType = SignedInt;
7284 IntPtrType = SignedInt;
7285 WCharType = UnsignedChar;
7286 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007287 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007288 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7289 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007290 }
Craig Topper3164f332014-03-11 03:39:26 +00007291 void getTargetDefines(const LangOptions &Opts,
7292 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007293 Builder.defineMacro("__XS1B__");
7294 }
Craig Topper3164f332014-03-11 03:39:26 +00007295 void getTargetBuiltins(const Builtin::Info *&Records,
7296 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007297 Records = BuiltinInfo;
7298 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7299 }
Craig Topper3164f332014-03-11 03:39:26 +00007300 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007301 return TargetInfo::VoidPtrBuiltinVaList;
7302 }
Craig Topper3164f332014-03-11 03:39:26 +00007303 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007304 return "";
7305 }
Craig Topper3164f332014-03-11 03:39:26 +00007306 void getGCCRegNames(const char * const *&Names,
7307 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007308 static const char * const GCCRegNames[] = {
7309 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7310 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7311 };
7312 Names = GCCRegNames;
7313 NumNames = llvm::array_lengthof(GCCRegNames);
7314 }
Craig Topper3164f332014-03-11 03:39:26 +00007315 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7316 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007317 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007318 NumAliases = 0;
7319 }
Craig Topper3164f332014-03-11 03:39:26 +00007320 bool validateAsmConstraint(const char *&Name,
7321 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007322 return false;
7323 }
Craig Topper3164f332014-03-11 03:39:26 +00007324 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007325 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7326 return (RegNo < 2)? RegNo : -1;
7327 }
Robert Lytton0e076492013-08-13 09:43:10 +00007328};
7329
7330const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007331#define BUILTIN(ID, TYPE, ATTRS) \
7332 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7333#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7334 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007335#include "clang/Basic/BuiltinsXCore.def"
7336};
Robert Lytton0e076492013-08-13 09:43:10 +00007337
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007338// x86_32 Android target
7339class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7340public:
7341 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7342 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7343 SuitableAlign = 32;
7344 LongDoubleWidth = 64;
7345 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7346 }
7347};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007348
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007349// x86_64 Android target
7350class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7351public:
7352 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7353 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7354 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7355 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007356
7357 bool useFloat128ManglingForLongDouble() const override {
7358 return true;
7359 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007360};
7361} // end anonymous namespace
7362
Chris Lattner5ba61f02006-10-14 07:39:34 +00007363//===----------------------------------------------------------------------===//
7364// Driver code
7365//===----------------------------------------------------------------------===//
7366
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007367static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007368 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007369
Daniel Dunbar52322032009-08-18 05:47:58 +00007370 switch (Triple.getArch()) {
7371 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007372 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007373
Tim Northover2a0783d2014-05-30 14:14:07 +00007374 case llvm::Triple::xcore:
7375 return new XCoreTargetInfo(Triple);
7376
7377 case llvm::Triple::hexagon:
7378 return new HexagonTargetInfo(Triple);
7379
7380 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007381 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007382 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007383
7384 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007385 case llvm::Triple::CloudABI:
7386 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007387 case llvm::Triple::FreeBSD:
7388 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007389 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007390 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007391 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007392 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007393 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007394 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007395 }
7396
Christian Pirker9b019ae2014-02-25 13:51:00 +00007397 case llvm::Triple::aarch64_be:
7398 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007399 case llvm::Triple::FreeBSD:
7400 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007401 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007402 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007403 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007404 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007405 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007406 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007407 }
7408
Daniel Dunbar52322032009-08-18 05:47:58 +00007409 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007410 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007411 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007412 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007413
Daniel Dunbar52322032009-08-18 05:47:58 +00007414 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007415 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007416 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007417 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007418 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007419 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007420 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007421 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007422 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007423 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007424 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007425 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007426 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007427 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007428 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007429 case llvm::Triple::Win32:
7430 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007431 case llvm::Triple::Cygnus:
7432 return new CygwinARMTargetInfo(Triple);
7433 case llvm::Triple::GNU:
7434 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007435 case llvm::Triple::Itanium:
7436 return new ItaniumWindowsARMleTargetInfo(Triple);
7437 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007438 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007439 return new MicrosoftARMleTargetInfo(Triple);
7440 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007441 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007442 return new ARMleTargetInfo(Triple);
7443 }
7444
7445 case llvm::Triple::armeb:
7446 case llvm::Triple::thumbeb:
7447 if (Triple.isOSDarwin())
7448 return new DarwinARMTargetInfo(Triple);
7449
7450 switch (os) {
7451 case llvm::Triple::Linux:
7452 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7453 case llvm::Triple::FreeBSD:
7454 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7455 case llvm::Triple::NetBSD:
7456 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7457 case llvm::Triple::OpenBSD:
7458 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7459 case llvm::Triple::Bitrig:
7460 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7461 case llvm::Triple::RTEMS:
7462 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7463 case llvm::Triple::NaCl:
7464 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7465 default:
7466 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007467 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007468
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007469 case llvm::Triple::bpfeb:
7470 case llvm::Triple::bpfel:
7471 return new BPFTargetInfo(Triple);
7472
Daniel Dunbar52322032009-08-18 05:47:58 +00007473 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007474 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007475
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007476 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007477 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007478 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007479 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007480 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007481 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007482 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007483 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007484 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007485 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007486 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007487 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007488 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007489
7490 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007491 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007492 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007493 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007494 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007495 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007496 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007497 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007498 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007499 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007500 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007501 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007502 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007503 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007504 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007505
Akira Hatanakabef17452011-09-20 19:21:49 +00007506 case llvm::Triple::mips64:
7507 switch (os) {
7508 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007509 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007510 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007511 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007512 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007513 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007514 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007515 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007516 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007517 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007518 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007519 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007520 }
7521
7522 case llvm::Triple::mips64el:
7523 switch (os) {
7524 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007525 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007526 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007527 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007528 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007529 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007530 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007531 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007532 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007533 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007534 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007535 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007536 }
7537
Ivan Krasindd7403e2011-08-24 20:22:22 +00007538 case llvm::Triple::le32:
7539 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007540 case llvm::Triple::NaCl:
7541 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7542 default:
7543 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007544 }
7545
JF Bastien643817d2014-09-12 17:52:47 +00007546 case llvm::Triple::le64:
7547 return new Le64TargetInfo(Triple);
7548
Daniel Dunbar52322032009-08-18 05:47:58 +00007549 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007550 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007551 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007552 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007553 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007554 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007555 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007556 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007557 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007558 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007559 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007560 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007561 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007562 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007563 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007564 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007565 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007566
7567 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007568 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007569 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007570 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007571 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007572 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007573 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007574 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007575 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007576 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007577 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007578 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007579 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007580 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007581 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007582
Bill Schmidt778d3872013-07-26 01:36:11 +00007583 case llvm::Triple::ppc64le:
7584 switch (os) {
7585 case llvm::Triple::Linux:
7586 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007587 case llvm::Triple::NetBSD:
7588 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007589 default:
7590 return new PPC64TargetInfo(Triple);
7591 }
7592
Peter Collingbournec947aae2012-05-20 23:28:41 +00007593 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007594 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007595 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007596 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007597
Tom Stellardd8e38a32015-01-06 20:34:47 +00007598 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007599 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007600 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007601
Daniel Dunbar52322032009-08-18 05:47:58 +00007602 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007603 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007604 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007605 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007606 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007607 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007608 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007609 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007610 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007611 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007612 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007613 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007614 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007615 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007616 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007617
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007618 // The 'sparcel' architecture copies all the above cases except for Solaris.
7619 case llvm::Triple::sparcel:
7620 switch (os) {
7621 case llvm::Triple::Linux:
7622 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7623 case llvm::Triple::NetBSD:
7624 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7625 case llvm::Triple::OpenBSD:
7626 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7627 case llvm::Triple::RTEMS:
7628 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7629 default:
7630 return new SparcV8elTargetInfo(Triple);
7631 }
7632
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007633 case llvm::Triple::sparcv9:
7634 switch (os) {
7635 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007636 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007637 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007638 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007639 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007640 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007641 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007642 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007643 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007644 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007645 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007646 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007647 }
7648
Ulrich Weigand47445072013-05-06 16:26:41 +00007649 case llvm::Triple::systemz:
7650 switch (os) {
7651 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007652 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007653 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007654 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007655 }
7656
Eli Friedmana9c3d712009-08-19 20:47:07 +00007657 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007658 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007659
Daniel Dunbar52322032009-08-18 05:47:58 +00007660 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007661 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007662 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007663
Daniel Dunbar52322032009-08-18 05:47:58 +00007664 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007665 case llvm::Triple::CloudABI:
7666 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007667 case llvm::Triple::Linux: {
7668 switch (Triple.getEnvironment()) {
7669 default:
7670 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7671 case llvm::Triple::Android:
7672 return new AndroidX86_32TargetInfo(Triple);
7673 }
7674 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007675 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007676 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007677 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007678 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007679 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007680 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007681 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007682 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007683 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007684 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007685 case llvm::Triple::KFreeBSD:
7686 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007687 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007688 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007689 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007690 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007691 case llvm::Triple::Win32: {
7692 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007693 case llvm::Triple::Cygnus:
7694 return new CygwinX86_32TargetInfo(Triple);
7695 case llvm::Triple::GNU:
7696 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007697 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007698 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007699 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007700 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007701 }
7702 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007703 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007704 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007705 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007706 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007707 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007708 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007709 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007710 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007711 }
7712
7713 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007714 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007715 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007716
Daniel Dunbar52322032009-08-18 05:47:58 +00007717 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007718 case llvm::Triple::CloudABI:
7719 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007720 case llvm::Triple::Linux: {
7721 switch (Triple.getEnvironment()) {
7722 default:
7723 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7724 case llvm::Triple::Android:
7725 return new AndroidX86_64TargetInfo(Triple);
7726 }
7727 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007728 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007729 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007730 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007731 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007732 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007733 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007734 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007735 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007736 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007737 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007738 case llvm::Triple::KFreeBSD:
7739 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007740 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007741 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007742 case llvm::Triple::Win32: {
7743 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007744 case llvm::Triple::Cygnus:
7745 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007746 case llvm::Triple::GNU:
7747 return new MinGWX86_64TargetInfo(Triple);
7748 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007749 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007750 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007751 }
7752 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007753 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007754 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007755 case llvm::Triple::PS4:
7756 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007757 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007758 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007759 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007760
Douglas Katzman78d7c542015-05-12 21:18:10 +00007761 case llvm::Triple::spir: {
7762 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7763 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7764 return nullptr;
7765 return new SPIR32TargetInfo(Triple);
7766 }
7767 case llvm::Triple::spir64: {
7768 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7769 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7770 return nullptr;
7771 return new SPIR64TargetInfo(Triple);
7772 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007773 case llvm::Triple::wasm32:
7774 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7775 return nullptr;
7776 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7777 case llvm::Triple::wasm64:
7778 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7779 return nullptr;
7780 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007781 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007782}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007783
7784/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007785/// options.
Alp Toker80758082014-07-06 05:26:44 +00007786TargetInfo *
7787TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7788 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007789 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007790
7791 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007792 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007793 if (!Target) {
7794 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007795 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007796 }
Alp Toker80758082014-07-06 05:26:44 +00007797 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007798
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007799 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007800 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7801 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007802 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007803 }
7804
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007805 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007806 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7807 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007808 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007809 }
7810
Rafael Espindolaeb265472013-08-21 21:59:03 +00007811 // Set the fp math unit.
7812 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7813 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007814 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007815 }
7816
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007817 // Compute the default target features, we need the target to handle this
7818 // because features may have dependencies on one another.
7819 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007820 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7821 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007822 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007823
7824 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007825 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007826 for (const auto &F : Features)
7827 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7828
Eric Christopher3ff21b32013-10-16 21:26:26 +00007829 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007830 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007831
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007832 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007833}