blob: 16593b9b224bbd75124ebfb196dd0b7f89da7341 [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 Lattner859c37a2009-08-12 06:24:27 +000086} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000087
Chris Lattner30ba6742009-08-10 19:03:04 +000088
Daniel Dunbard86666f2010-01-26 01:44:04 +000089static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000091 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000092 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000093 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000095 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000096 // AddressSanitizer doesn't play well with source fortification, which is on
97 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000098 if (Opts.Sanitize.has(SanitizerKind::Address))
99 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000100
John McCall5d36a8c2011-06-16 00:03:19 +0000101 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000102 // __weak is always defined, for use in blocks and with objc pointers.
103 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000104
John McCall31168b02011-06-15 23:02:42 +0000105 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000106 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000107 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
108 else
109 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000110
John McCall31168b02011-06-15 23:02:42 +0000111 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
112 // allow this in C, since one might have block pointers in structs that
113 // are used in pure C code and in Objective-C ARC.
114 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000115 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000116
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000119 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000121
122 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000123 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124
Daniel Dunbarecf13562011-04-19 21:40:34 +0000125 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000126 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000127 if (Triple.isMacOSX()) {
128 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000131 Triple.getOSVersion(Maj, Min, Rev);
132 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000133 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000134
Sebastian Pop422377c2012-01-20 22:01:23 +0000135 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000136 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000137 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
138 if (PlatformName == "win32") {
139 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
140 return;
141 }
142
Evan Cheng31dd9a62014-01-26 23:12:43 +0000143 // Set the appropriate OS version define.
144 if (Triple.isiOS()) {
145 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
146 char Str[6];
147 Str[0] = '0' + Maj;
148 Str[1] = '0' + (Min / 10);
149 Str[2] = '0' + (Min % 10);
150 Str[3] = '0' + (Rev / 10);
151 Str[4] = '0' + (Rev % 10);
152 Str[5] = '\0';
153 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
154 Str);
155 } else if (Triple.isMacOSX()) {
156 // Note that the Driver allows versions which aren't representable in the
157 // define (because we only get a single digit for the minor and micro
158 // revision numbers). So, we limit them to the maximum representable
159 // version.
160 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000161 char Str[7];
162 if (Maj < 10 || (Maj == 10 && Min < 10)) {
163 Str[0] = '0' + (Maj / 10);
164 Str[1] = '0' + (Maj % 10);
165 Str[2] = '0' + std::min(Min, 9U);
166 Str[3] = '0' + std::min(Rev, 9U);
167 Str[4] = '\0';
168 } else {
169 // Handle versions > 10.9.
170 Str[0] = '0' + (Maj / 10);
171 Str[1] = '0' + (Maj % 10);
172 Str[2] = '0' + (Min / 10);
173 Str[3] = '0' + (Min % 10);
174 Str[4] = '0' + (Rev / 10);
175 Str[5] = '0' + (Rev % 10);
176 Str[6] = '\0';
177 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000178 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000179 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000180
Tim Northover157d9112014-01-16 08:48:16 +0000181 // Tell users about the kernel if there is one.
182 if (Triple.isOSDarwin())
183 Builder.defineMacro("__MACH__");
184
Daniel Dunbarecf13562011-04-19 21:40:34 +0000185 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000186}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000187
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000188namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000189// CloudABI Target
190template <typename Target>
191class CloudABITargetInfo : public OSTargetInfo<Target> {
192protected:
193 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
194 MacroBuilder &Builder) const override {
195 Builder.defineMacro("__CloudABI__");
196 Builder.defineMacro("__ELF__");
197
198 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
199 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
200 Builder.defineMacro("__STDC_UTF_16__");
201 Builder.defineMacro("__STDC_UTF_32__");
202 }
203
204public:
205 CloudABITargetInfo(const llvm::Triple &Triple)
206 : OSTargetInfo<Target>(Triple) {
207 this->UserLabelPrefix = "";
208 }
209};
210
Torok Edwinb2b37c62009-06-30 17:10:35 +0000211template<typename Target>
212class DarwinTargetInfo : public OSTargetInfo<Target> {
213protected:
Craig Topper3164f332014-03-11 03:39:26 +0000214 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
215 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000216 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000217 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218 }
Mike Stump11289f42009-09-09 15:08:12 +0000219
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000221 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
222 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
223 this->MCountName = "\01mcount";
224 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225
Craig Topper3164f332014-03-11 03:39:26 +0000226 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000228 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000230 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000232 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000233 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000234
Craig Topper3164f332014-03-11 03:39:26 +0000235 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000236 // FIXME: We should return 0 when building kexts.
237 return "__TEXT,__StaticInit,regular,pure_instructions";
238 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000239
John McCalleed64c72012-01-29 01:20:30 +0000240 /// Darwin does not support protected visibility. Darwin's "default"
241 /// is very similar to ELF's "protected"; Darwin requires a "weak"
242 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000243 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000244 return false;
245 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246};
247
Chris Lattner30ba6742009-08-10 19:03:04 +0000248
Torok Edwinb2b37c62009-06-30 17:10:35 +0000249// DragonFlyBSD Target
250template<typename Target>
251class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
252protected:
Craig Topper3164f332014-03-11 03:39:26 +0000253 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
254 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000255 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000256 Builder.defineMacro("__DragonFly__");
257 Builder.defineMacro("__DragonFly_cc_version", "100001");
258 Builder.defineMacro("__ELF__");
259 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
260 Builder.defineMacro("__tune_i386__");
261 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000262 }
263public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
265 : OSTargetInfo<Target>(Triple) {
266 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000267
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000268 switch (Triple.getArch()) {
269 default:
270 case llvm::Triple::x86:
271 case llvm::Triple::x86_64:
272 this->MCountName = ".mcount";
273 break;
274 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000275 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000276};
277
278// FreeBSD Target
279template<typename Target>
280class FreeBSDTargetInfo : public OSTargetInfo<Target> {
281protected:
Craig Topper3164f332014-03-11 03:39:26 +0000282 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
283 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284 // FreeBSD defines; list based off of gcc output
285
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000286 unsigned Release = Triple.getOSMajorVersion();
287 if (Release == 0U)
288 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000289
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000290 Builder.defineMacro("__FreeBSD__", Twine(Release));
291 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000292 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
293 DefineStd(Builder, "unix", Opts);
294 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000295
296 // On FreeBSD, wchar_t contains the number of the code point as
297 // used by the character set of the locale. These character sets are
298 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000299 //
300 // FIXME: This is wrong; the macro refers to the numerical values
301 // of wchar_t *literals*, which are not locale-dependent. However,
302 // FreeBSD systems apparently depend on us getting this wrong, and
303 // setting this to 1 is conforming even if all the basic source
304 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000305 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306 }
307public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000308 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
309 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000310
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000311 switch (Triple.getArch()) {
312 default:
313 case llvm::Triple::x86:
314 case llvm::Triple::x86_64:
315 this->MCountName = ".mcount";
316 break;
317 case llvm::Triple::mips:
318 case llvm::Triple::mipsel:
319 case llvm::Triple::ppc:
320 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000321 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000322 this->MCountName = "_mcount";
323 break;
324 case llvm::Triple::arm:
325 this->MCountName = "__mcount";
326 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000327 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000328 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329};
330
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000331// GNU/kFreeBSD Target
332template<typename Target>
333class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
334protected:
Craig Topper3164f332014-03-11 03:39:26 +0000335 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
336 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000337 // GNU/kFreeBSD defines; list based off of gcc output
338
339 DefineStd(Builder, "unix", Opts);
340 Builder.defineMacro("__FreeBSD_kernel__");
341 Builder.defineMacro("__GLIBC__");
342 Builder.defineMacro("__ELF__");
343 if (Opts.POSIXThreads)
344 Builder.defineMacro("_REENTRANT");
345 if (Opts.CPlusPlus)
346 Builder.defineMacro("_GNU_SOURCE");
347 }
348public:
Eric Christopher917e9522014-11-18 22:36:15 +0000349 KFreeBSDTargetInfo(const llvm::Triple &Triple)
350 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000351 this->UserLabelPrefix = "";
352 }
353};
354
Chris Lattner3e2ee142010-07-07 16:01:42 +0000355// Minix Target
356template<typename Target>
357class MinixTargetInfo : public OSTargetInfo<Target> {
358protected:
Craig Topper3164f332014-03-11 03:39:26 +0000359 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
360 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000361 // Minix defines
362
363 Builder.defineMacro("__minix", "3");
364 Builder.defineMacro("_EM_WSIZE", "4");
365 Builder.defineMacro("_EM_PSIZE", "4");
366 Builder.defineMacro("_EM_SSIZE", "2");
367 Builder.defineMacro("_EM_LSIZE", "4");
368 Builder.defineMacro("_EM_FSIZE", "4");
369 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000370 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000371 DefineStd(Builder, "unix", Opts);
372 }
373public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
375 this->UserLabelPrefix = "";
376 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000377};
378
Torok Edwinb2b37c62009-06-30 17:10:35 +0000379// Linux target
380template<typename Target>
381class LinuxTargetInfo : public OSTargetInfo<Target> {
382protected:
Craig Topper3164f332014-03-11 03:39:26 +0000383 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
384 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000385 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000386 DefineStd(Builder, "unix", Opts);
387 DefineStd(Builder, "linux", Opts);
388 Builder.defineMacro("__gnu_linux__");
389 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000390 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000391 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000392 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000393 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000394 this->PlatformName = "android";
395 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
396 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000397 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000398 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000399 if (Opts.CPlusPlus)
400 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000401 }
402public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000403 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000404 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000405 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000406
407 switch (Triple.getArch()) {
408 default:
409 break;
410 case llvm::Triple::ppc:
411 case llvm::Triple::ppc64:
412 case llvm::Triple::ppc64le:
413 this->MCountName = "_mcount";
414 break;
415 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000416 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000417
Craig Topper3164f332014-03-11 03:39:26 +0000418 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000419 return ".text.startup";
420 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000421};
422
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000423// NetBSD Target
424template<typename Target>
425class NetBSDTargetInfo : public OSTargetInfo<Target> {
426protected:
Craig Topper3164f332014-03-11 03:39:26 +0000427 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
428 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000429 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000430 Builder.defineMacro("__NetBSD__");
431 Builder.defineMacro("__unix__");
432 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000433 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000434 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000435
436 switch (Triple.getArch()) {
437 default:
438 break;
439 case llvm::Triple::arm:
440 case llvm::Triple::armeb:
441 case llvm::Triple::thumb:
442 case llvm::Triple::thumbeb:
443 Builder.defineMacro("__ARM_DWARF_EH__");
444 break;
445 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000446 }
447public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000448 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
449 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000450 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000451 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000452};
453
Torok Edwinb2b37c62009-06-30 17:10:35 +0000454// OpenBSD Target
455template<typename Target>
456class OpenBSDTargetInfo : public OSTargetInfo<Target> {
457protected:
Craig Topper3164f332014-03-11 03:39:26 +0000458 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
459 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000460 // OpenBSD defines; list based off of gcc output
461
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000462 Builder.defineMacro("__OpenBSD__");
463 DefineStd(Builder, "unix", Opts);
464 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000465 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000466 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000467 }
468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000469 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
470 this->UserLabelPrefix = "";
471 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000472
Eli Friedman3715d1f2011-12-15 02:15:56 +0000473 switch (Triple.getArch()) {
474 default:
475 case llvm::Triple::x86:
476 case llvm::Triple::x86_64:
477 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000478 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000479 this->MCountName = "__mcount";
480 break;
481 case llvm::Triple::mips64:
482 case llvm::Triple::mips64el:
483 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000484 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000485 this->MCountName = "_mcount";
486 break;
487 }
488 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000489};
490
Eli Friedman9fa28852012-08-08 23:57:20 +0000491// Bitrig Target
492template<typename Target>
493class BitrigTargetInfo : public OSTargetInfo<Target> {
494protected:
Craig Topper3164f332014-03-11 03:39:26 +0000495 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
496 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000497 // Bitrig defines; list based off of gcc output
498
499 Builder.defineMacro("__Bitrig__");
500 DefineStd(Builder, "unix", Opts);
501 Builder.defineMacro("__ELF__");
502 if (Opts.POSIXThreads)
503 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000504
505 switch (Triple.getArch()) {
506 default:
507 break;
508 case llvm::Triple::arm:
509 case llvm::Triple::armeb:
510 case llvm::Triple::thumb:
511 case llvm::Triple::thumbeb:
512 Builder.defineMacro("__ARM_DWARF_EH__");
513 break;
514 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000515 }
516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
518 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000519 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000520 }
521};
522
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000523// PSP Target
524template<typename Target>
525class PSPTargetInfo : public OSTargetInfo<Target> {
526protected:
Craig Topper3164f332014-03-11 03:39:26 +0000527 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
528 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000529 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000530 Builder.defineMacro("PSP");
531 Builder.defineMacro("_PSP");
532 Builder.defineMacro("__psp__");
533 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000534 }
535public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000536 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000537 this->UserLabelPrefix = "";
538 }
539};
540
John Thompsone467e192009-11-19 17:18:50 +0000541// PS3 PPU Target
542template<typename Target>
543class PS3PPUTargetInfo : public OSTargetInfo<Target> {
544protected:
Craig Topper3164f332014-03-11 03:39:26 +0000545 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
546 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000547 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000548 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000549 Builder.defineMacro("__PPU__");
550 Builder.defineMacro("__CELLOS_LV2__");
551 Builder.defineMacro("__ELF__");
552 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000553 Builder.defineMacro("_ARCH_PPC64");
554 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000555 }
556public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000557 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000558 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000559 this->LongWidth = this->LongAlign = 32;
560 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000561 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000562 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000563 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000564 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000565 }
566};
567
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000568template <typename Target>
569class PS4OSTargetInfo : public OSTargetInfo<Target> {
570protected:
571 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
572 MacroBuilder &Builder) const override {
573 Builder.defineMacro("__FreeBSD__", "9");
574 Builder.defineMacro("__FreeBSD_cc_version", "900001");
575 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
576 DefineStd(Builder, "unix", Opts);
577 Builder.defineMacro("__ELF__");
578 Builder.defineMacro("__PS4__");
579 }
580public:
581 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
582 this->WCharType = this->UnsignedShort;
583
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000584 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
585 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000586 this->UserLabelPrefix = "";
587
588 switch (Triple.getArch()) {
589 default:
590 case llvm::Triple::x86_64:
591 this->MCountName = ".mcount";
592 break;
593 }
594 }
595};
596
Torok Edwinb2b37c62009-06-30 17:10:35 +0000597// Solaris target
598template<typename Target>
599class SolarisTargetInfo : public OSTargetInfo<Target> {
600protected:
Craig Topper3164f332014-03-11 03:39:26 +0000601 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
602 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000603 DefineStd(Builder, "sun", Opts);
604 DefineStd(Builder, "unix", Opts);
605 Builder.defineMacro("__ELF__");
606 Builder.defineMacro("__svr4__");
607 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000608 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
609 // newer, but to 500 for everything else. feature_test.h has a check to
610 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000611 // with a new version.
612 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("_XOPEN_SOURCE", "600");
614 else
615 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000616 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000618 Builder.defineMacro("_LARGEFILE_SOURCE");
619 Builder.defineMacro("_LARGEFILE64_SOURCE");
620 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000621 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622 }
623public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000624 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000625 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000626 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000627 // FIXME: WIntType should be SignedLong
628 }
629};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000630
631// Windows target
632template<typename Target>
633class WindowsTargetInfo : public OSTargetInfo<Target> {
634protected:
Craig Topper3164f332014-03-11 03:39:26 +0000635 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
636 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000637 Builder.defineMacro("_WIN32");
638 }
639 void getVisualStudioDefines(const LangOptions &Opts,
640 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000641 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000642 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000643 Builder.defineMacro("_CPPRTTI");
644
Reid Kleckner16514352015-01-30 21:42:55 +0000645 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000646 Builder.defineMacro("_CPPUNWIND");
647 }
648
David Majnemer6a658902015-07-22 22:36:26 +0000649 if (Opts.Bool)
650 Builder.defineMacro("__BOOL_DEFINED");
651
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000652 if (!Opts.CharIsSigned)
653 Builder.defineMacro("_CHAR_UNSIGNED");
654
655 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
656 // but it works for now.
657 if (Opts.POSIXThreads)
658 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000659
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000660 if (Opts.MSCompatibilityVersion) {
661 Builder.defineMacro("_MSC_VER",
662 Twine(Opts.MSCompatibilityVersion / 100000));
663 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000664 // FIXME We cannot encode the revision information into 32-bits
665 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000666
David Majnemerb710a932015-05-11 03:57:49 +0000667 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000668 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000669 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000670
671 if (Opts.MicrosoftExt) {
672 Builder.defineMacro("_MSC_EXTENSIONS");
673
674 if (Opts.CPlusPlus11) {
675 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
676 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
677 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
678 }
679 }
680
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000681 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000682 }
683
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000684public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000685 WindowsTargetInfo(const llvm::Triple &Triple)
686 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000687};
688
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000689template <typename Target>
690class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000691protected:
Craig Topper3164f332014-03-11 03:39:26 +0000692 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
693 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000694 if (Opts.POSIXThreads)
695 Builder.defineMacro("_REENTRANT");
696 if (Opts.CPlusPlus)
697 Builder.defineMacro("_GNU_SOURCE");
698
699 DefineStd(Builder, "unix", Opts);
700 Builder.defineMacro("__ELF__");
701 Builder.defineMacro("__native_client__");
702 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000703
704public:
705 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000706 this->UserLabelPrefix = "";
707 this->LongAlign = 32;
708 this->LongWidth = 32;
709 this->PointerAlign = 32;
710 this->PointerWidth = 32;
711 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000712 this->Int64Type = TargetInfo::SignedLongLong;
713 this->DoubleAlign = 64;
714 this->LongDoubleWidth = 64;
715 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000716 this->LongLongWidth = 64;
717 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000718 this->SizeType = TargetInfo::UnsignedInt;
719 this->PtrDiffType = TargetInfo::SignedInt;
720 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000721 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000722 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000724 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000725 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000726 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000728 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000729 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000730 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000731 } else {
732 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000733 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000734 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000735 }
736};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000737
Dan Gohmanc2853072015-09-03 22:51:53 +0000738namespace {
739// WebAssembly target
740template <typename Target>
741class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
742 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000743 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000744 // A common platform macro.
745 if (Opts.POSIXThreads)
746 Builder.defineMacro("_REENTRANT");
747 // Follow g++ convention and predefine _GNU_SOURCE for C++.
748 if (Opts.CPlusPlus)
749 Builder.defineMacro("_GNU_SOURCE");
750 }
751
752 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000753 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000754 return ".text.__startup";
755 }
756
757public:
758 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
759 : OSTargetInfo<Target>(Triple) {
760 this->MCountName = "__mcount";
761 this->UserLabelPrefix = "";
762 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
763 }
764};
765} // end anonymous namespace
766
Chris Lattner09d98f52008-10-05 21:50:58 +0000767//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000768// Specific target implementations.
769//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000770
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000771// PPC abstract base class
772class PPCTargetInfo : public TargetInfo {
773 static const Builtin::Info BuiltinInfo[];
774 static const char * const GCCRegNames[];
775 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000776 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000777
778 // Target cpu features.
779 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000780 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000781 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000782 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000783 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000784 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000785 bool HasBPERMD;
786 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000787
Ulrich Weigand8afad612014-07-28 13:17:52 +0000788protected:
789 std::string ABI;
790
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000791public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000792 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000793 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000794 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000795 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000796 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000797 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000798 LongDoubleWidth = LongDoubleAlign = 128;
799 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
800 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000801
Hal Finkel6b984f02012-07-03 16:51:04 +0000802 /// \brief Flags for architecture specific defines.
803 typedef enum {
804 ArchDefineNone = 0,
805 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
806 ArchDefinePpcgr = 1 << 1,
807 ArchDefinePpcsq = 1 << 2,
808 ArchDefine440 = 1 << 3,
809 ArchDefine603 = 1 << 4,
810 ArchDefine604 = 1 << 5,
811 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000812 ArchDefinePwr5 = 1 << 7,
813 ArchDefinePwr5x = 1 << 8,
814 ArchDefinePwr6 = 1 << 9,
815 ArchDefinePwr6x = 1 << 10,
816 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000817 ArchDefinePwr8 = 1 << 12,
818 ArchDefineA2 = 1 << 13,
819 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000820 } ArchDefineTypes;
821
Bill Schmidt38378a02013-02-01 20:23:10 +0000822 // Note: GCC recognizes the following additional cpus:
823 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
824 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
825 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000826 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000827 bool CPUKnown = llvm::StringSwitch<bool>(Name)
828 .Case("generic", true)
829 .Case("440", true)
830 .Case("450", true)
831 .Case("601", true)
832 .Case("602", true)
833 .Case("603", true)
834 .Case("603e", true)
835 .Case("603ev", true)
836 .Case("604", true)
837 .Case("604e", true)
838 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000839 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000840 .Case("g3", true)
841 .Case("7400", true)
842 .Case("g4", true)
843 .Case("7450", true)
844 .Case("g4+", true)
845 .Case("750", true)
846 .Case("970", true)
847 .Case("g5", true)
848 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000849 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000850 .Case("e500mc", true)
851 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000852 .Case("power3", true)
853 .Case("pwr3", true)
854 .Case("power4", true)
855 .Case("pwr4", true)
856 .Case("power5", true)
857 .Case("pwr5", true)
858 .Case("power5x", true)
859 .Case("pwr5x", true)
860 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000861 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("power6x", true)
863 .Case("pwr6x", true)
864 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000865 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000866 .Case("power8", true)
867 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000868 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000869 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000870 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000871 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000872 .Case("powerpc64le", true)
873 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000874 .Default(false);
875
876 if (CPUKnown)
877 CPU = Name;
878
879 return CPUKnown;
880 }
881
Ulrich Weigand8afad612014-07-28 13:17:52 +0000882
883 StringRef getABI() const override { return ABI; }
884
Craig Topper3164f332014-03-11 03:39:26 +0000885 void getTargetBuiltins(const Builtin::Info *&Records,
886 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000887 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000888 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000889 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000890
Craig Topper3164f332014-03-11 03:39:26 +0000891 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000892
Craig Topper3164f332014-03-11 03:39:26 +0000893 void getTargetDefines(const LangOptions &Opts,
894 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000895
Eric Christopheref1e2952015-08-28 02:13:58 +0000896 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
897 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +0000898 std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000899
Craig Topper3164f332014-03-11 03:39:26 +0000900 bool handleTargetFeatures(std::vector<std::string> &Features,
901 DiagnosticsEngine &Diags) override;
902 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000903 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
904 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000905
906 void getGCCRegNames(const char * const *&Names,
907 unsigned &NumNames) const override;
908 void getGCCRegAliases(const GCCRegAlias *&Aliases,
909 unsigned &NumAliases) const override;
910 bool validateAsmConstraint(const char *&Name,
911 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000912 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000913 default: return false;
914 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000915 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000916 case 'b': // Base register
917 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000918 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000919 break;
920 // FIXME: The following are added to allow parsing.
921 // I just took a guess at what the actions should be.
922 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000924 case 'v': // Altivec vector register
925 Info.setAllowsRegister();
926 break;
927 case 'w':
928 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 case 'd':// VSX vector register to hold vector double data
930 case 'f':// VSX vector register to hold vector float data
931 case 's':// VSX vector register to hold scalar float data
932 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000933 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000934 break;
935 default:
936 return false;
937 }
938 Info.setAllowsRegister();
939 Name++; // Skip over 'w'.
940 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 case 'h': // `MQ', `CTR', or `LINK' register
942 case 'q': // `MQ' register
943 case 'c': // `CTR' register
944 case 'l': // `LINK' register
945 case 'x': // `CR' register (condition register) number 0
946 case 'y': // `CR' register (condition register)
947 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000948 Info.setAllowsRegister();
949 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000951 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000952 // (use `L' instead for SImode constants)
953 case 'K': // Unsigned 16-bit constant
954 case 'L': // Signed 16-bit constant shifted left 16 bits
955 case 'M': // Constant larger than 31
956 case 'N': // Exact power of 2
957 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000960 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000962 break;
963 case 'm': // Memory operand. Note that on PowerPC targets, m can
964 // include addresses that update the base register. It
965 // is therefore only safe to use `m' in an asm statement
966 // if that asm statement accesses the operand exactly once.
967 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000968 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000970 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000972 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
973 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 // register to be updated.
975 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000976 if (Name[1] != 's')
977 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000978 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000979 // include any automodification of the base register. Unlike
980 // `m', this constraint can be used in asm statements that
981 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000982 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000983 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000984 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000985 break;
986 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000987 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000988 case 'Z': // Memory operand that is an indexed or indirect from a
989 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000991 Info.setAllowsMemory();
992 Info.setAllowsRegister();
993 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // register (`p' is preferable for asm statements)
997 case 'S': // Constant suitable as a 64-bit mask operand
998 case 'T': // Constant suitable as a 32-bit mask operand
999 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001000 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 // instructions
1002 case 'W': // Vector constant that does not require memory
1003 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001004 break;
1005 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001006 }
John Thompson07a61a42010-06-24 22:44:13 +00001007 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001008 }
Craig Topper3164f332014-03-11 03:39:26 +00001009 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001010 std::string R;
1011 switch (*Constraint) {
1012 case 'e':
1013 case 'w':
1014 // Two-character constraint; add "^" hint for later parsing.
1015 R = std::string("^") + std::string(Constraint, 2);
1016 Constraint++;
1017 break;
1018 default:
1019 return TargetInfo::convertConstraint(Constraint);
1020 }
1021 return R;
1022 }
Craig Topper3164f332014-03-11 03:39:26 +00001023 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001024 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 }
Craig Topper3164f332014-03-11 03:39:26 +00001026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001027 if (RegNo == 0) return 3;
1028 if (RegNo == 1) return 4;
1029 return -1;
1030 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001031
1032 bool hasSjLjLowering() const override {
1033 return true;
1034 }
David Majnemer2617ea62015-06-09 18:05:33 +00001035
1036 bool useFloat128ManglingForLongDouble() const override {
1037 return LongDoubleWidth == 128 &&
1038 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1039 getTriple().isOSBinFormatELF();
1040 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001041};
Anders Carlssonf511f642007-11-27 04:11:28 +00001042
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001043const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001044#define BUILTIN(ID, TYPE, ATTRS) \
1045 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1046#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1047 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001048#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001049};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001050
Eric Christopher917e9522014-11-18 22:36:15 +00001051/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001053bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001055 for (const auto &Feature : Features) {
1056 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001059 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001061 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001063 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001064 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001065 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001066 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001067 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001068 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001069 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001070 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001071 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001072 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001073 // TODO: Finish this list and add an assert that we've handled them
1074 // all.
1075 }
Eric Christopher02c33352015-08-25 00:59:11 +00001076
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001077 return true;
1078}
1079
Chris Lattnerecd49032009-03-02 22:27:17 +00001080/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1081/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001082void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001084 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001086 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001088 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001089 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001091 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001092 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001093 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001094 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001095 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001098 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1099 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001100 } else {
1101 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1102 getTriple().getOS() != llvm::Triple::OpenBSD)
1103 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001104 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001105
Ulrich Weigand8afad612014-07-28 13:17:52 +00001106 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001107 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001108 Builder.defineMacro("_CALL_ELF", "1");
1109 if (ABI == "elfv2")
1110 Builder.defineMacro("_CALL_ELF", "2");
1111
Chris Lattnerecd49032009-03-02 22:27:17 +00001112 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1114 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001115
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001117 if (LongDoubleWidth == 128)
1118 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001119
John Thompsone467e192009-11-19 17:18:50 +00001120 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001121 Builder.defineMacro("__VEC__", "10206");
1122 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001123 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001124
1125 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001126 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1127 .Case("440", ArchDefineName)
1128 .Case("450", ArchDefineName | ArchDefine440)
1129 .Case("601", ArchDefineName)
1130 .Case("602", ArchDefineName | ArchDefinePpcgr)
1131 .Case("603", ArchDefineName | ArchDefinePpcgr)
1132 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1133 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1134 .Case("604", ArchDefineName | ArchDefinePpcgr)
1135 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1136 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001137 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001138 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1139 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1140 .Case("750", ArchDefineName | ArchDefinePpcgr)
1141 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001143 .Case("a2", ArchDefineA2)
1144 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001145 .Case("pwr3", ArchDefinePpcgr)
1146 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1147 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1148 | ArchDefinePpcsq)
1149 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1150 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1152 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1154 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1157 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001158 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1160 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1161 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 .Case("power3", ArchDefinePpcgr)
1163 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1165 | ArchDefinePpcsq)
1166 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1167 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1169 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1171 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1174 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001175 | ArchDefinePpcgr | ArchDefinePpcsq)
1176 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1177 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1178 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001179 .Default(ArchDefineNone);
1180
1181 if (defs & ArchDefineName)
1182 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1183 if (defs & ArchDefinePpcgr)
1184 Builder.defineMacro("_ARCH_PPCGR");
1185 if (defs & ArchDefinePpcsq)
1186 Builder.defineMacro("_ARCH_PPCSQ");
1187 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001188 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 if (defs & ArchDefine603)
1190 Builder.defineMacro("_ARCH_603");
1191 if (defs & ArchDefine604)
1192 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001193 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001194 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001195 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 if (defs & ArchDefinePwr5x)
1198 Builder.defineMacro("_ARCH_PWR5X");
1199 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001200 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001201 if (defs & ArchDefinePwr6x)
1202 Builder.defineMacro("_ARCH_PWR6X");
1203 if (defs & ArchDefinePwr7)
1204 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001205 if (defs & ArchDefinePwr8)
1206 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001207 if (defs & ArchDefineA2)
1208 Builder.defineMacro("_ARCH_A2");
1209 if (defs & ArchDefineA2q) {
1210 Builder.defineMacro("_ARCH_A2Q");
1211 Builder.defineMacro("_ARCH_QP");
1212 }
1213
1214 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1215 Builder.defineMacro("__bg__");
1216 Builder.defineMacro("__THW_BLUEGENE__");
1217 Builder.defineMacro("__bgq__");
1218 Builder.defineMacro("__TOS_BGQ__");
1219 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001220
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001221 if (HasVSX)
1222 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001223 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001224 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001225 if (HasP8Crypto)
1226 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001227 if (HasHTM)
1228 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001229 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001230 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001231 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1232 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1233 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1234 if (PointerWidth == 64)
1235 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1236 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001237
Bill Schmidt38378a02013-02-01 20:23:10 +00001238 // FIXME: The following are not yet generated here by Clang, but are
1239 // generated by GCC:
1240 //
1241 // _SOFT_FLOAT_
1242 // __RECIP_PRECISION__
1243 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001244 // __RECIP__
1245 // __RECIPF__
1246 // __RSQRTE__
1247 // __RSQRTEF__
1248 // _SOFT_DOUBLE_
1249 // __NO_LWSYNC__
1250 // __HAVE_BSWAP__
1251 // __LONGDOUBLE128
1252 // __CMODEL_MEDIUM__
1253 // __CMODEL_LARGE__
1254 // _CALL_SYSV
1255 // _CALL_DARWIN
1256 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001257}
1258
Eric Christophera8a14c32015-08-31 18:39:16 +00001259// Handle explicit options being passed to the compiler here: if we've
1260// explicitly turned off vsx and turned on power8-vector or direct-move then
1261// go ahead and error since the customer has expressed a somewhat incompatible
1262// set of options.
1263static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
1264 std::vector<std::string> &FeaturesVec) {
1265
1266 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1267 FeaturesVec.end()) {
1268 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1269 FeaturesVec.end()) {
1270 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1271 << "-mno-vsx";
1272 return false;
1273 }
1274
1275 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1276 FeaturesVec.end()) {
1277 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1278 << "-mno-vsx";
1279 return false;
1280 }
1281 }
1282
1283 return true;
1284}
1285
1286bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
1287 DiagnosticsEngine &Diags, StringRef CPU,
1288 std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001289 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1290 .Case("7400", true)
1291 .Case("g4", true)
1292 .Case("7450", true)
1293 .Case("g4+", true)
1294 .Case("970", true)
1295 .Case("g5", true)
1296 .Case("pwr6", true)
1297 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001298 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001299 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001300 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001301 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001302
1303 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001304 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1305 .Case("ppc64le", true)
1306 .Case("pwr8", true)
1307 .Default(false);
1308 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1309 .Case("ppc64le", true)
1310 .Case("pwr8", true)
1311 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001312 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1313 .Case("ppc64le", true)
1314 .Case("pwr8", true)
1315 .Case("pwr7", true)
1316 .Default(false);
1317 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1318 .Case("ppc64le", true)
1319 .Case("pwr8", true)
1320 .Case("pwr7", true)
1321 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001322 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1323 .Case("ppc64le", true)
1324 .Case("pwr8", true)
1325 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001326 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1327 .Case("ppc64le", true)
1328 .Case("pwr8", true)
1329 .Case("pwr7", true)
1330 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001331
Eric Christophera8a14c32015-08-31 18:39:16 +00001332 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1333 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001334
Eric Christopher007b0a02015-08-28 22:32:01 +00001335 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001336}
1337
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001338bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001339 return llvm::StringSwitch<bool>(Feature)
1340 .Case("powerpc", true)
1341 .Case("vsx", HasVSX)
1342 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001343 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001344 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001345 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001346 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001347 .Case("bpermd", HasBPERMD)
1348 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001349 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001350}
Chris Lattner17df24e2008-04-21 18:56:49 +00001351
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001352void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1353 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001354 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1355 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1356 // incompatible options.
1357 if (Enabled) {
1358 if (Name == "vsx") {
1359 Features[Name] = true;
1360 } else if (Name == "direct-move") {
1361 Features[Name] = Features["vsx"] = true;
1362 } else if (Name == "power8-vector") {
1363 Features[Name] = Features["vsx"] = true;
1364 } else {
1365 Features[Name] = true;
1366 }
1367 } else {
1368 if (Name == "vsx") {
1369 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1370 false;
1371 } else {
1372 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001373 }
1374 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001375}
1376
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001377const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001378 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1379 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1380 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1381 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1382 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1383 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1384 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1385 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001387 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001388 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001389 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1390 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1391 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1392 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001393 "vrsave", "vscr",
1394 "spe_acc", "spefscr",
1395 "sfp"
1396};
Chris Lattner10a5b382007-01-29 05:24:35 +00001397
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001398void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001399 unsigned &NumNames) const {
1400 Names = GCCRegNames;
1401 NumNames = llvm::array_lengthof(GCCRegNames);
1402}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001403
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001404const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1405 // While some of these aliases do map to different registers
1406 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001407 { { "0" }, "r0" },
1408 { { "1"}, "r1" },
1409 { { "2" }, "r2" },
1410 { { "3" }, "r3" },
1411 { { "4" }, "r4" },
1412 { { "5" }, "r5" },
1413 { { "6" }, "r6" },
1414 { { "7" }, "r7" },
1415 { { "8" }, "r8" },
1416 { { "9" }, "r9" },
1417 { { "10" }, "r10" },
1418 { { "11" }, "r11" },
1419 { { "12" }, "r12" },
1420 { { "13" }, "r13" },
1421 { { "14" }, "r14" },
1422 { { "15" }, "r15" },
1423 { { "16" }, "r16" },
1424 { { "17" }, "r17" },
1425 { { "18" }, "r18" },
1426 { { "19" }, "r19" },
1427 { { "20" }, "r20" },
1428 { { "21" }, "r21" },
1429 { { "22" }, "r22" },
1430 { { "23" }, "r23" },
1431 { { "24" }, "r24" },
1432 { { "25" }, "r25" },
1433 { { "26" }, "r26" },
1434 { { "27" }, "r27" },
1435 { { "28" }, "r28" },
1436 { { "29" }, "r29" },
1437 { { "30" }, "r30" },
1438 { { "31" }, "r31" },
1439 { { "fr0" }, "f0" },
1440 { { "fr1" }, "f1" },
1441 { { "fr2" }, "f2" },
1442 { { "fr3" }, "f3" },
1443 { { "fr4" }, "f4" },
1444 { { "fr5" }, "f5" },
1445 { { "fr6" }, "f6" },
1446 { { "fr7" }, "f7" },
1447 { { "fr8" }, "f8" },
1448 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001449 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001450 { { "fr11" }, "f11" },
1451 { { "fr12" }, "f12" },
1452 { { "fr13" }, "f13" },
1453 { { "fr14" }, "f14" },
1454 { { "fr15" }, "f15" },
1455 { { "fr16" }, "f16" },
1456 { { "fr17" }, "f17" },
1457 { { "fr18" }, "f18" },
1458 { { "fr19" }, "f19" },
1459 { { "fr20" }, "f20" },
1460 { { "fr21" }, "f21" },
1461 { { "fr22" }, "f22" },
1462 { { "fr23" }, "f23" },
1463 { { "fr24" }, "f24" },
1464 { { "fr25" }, "f25" },
1465 { { "fr26" }, "f26" },
1466 { { "fr27" }, "f27" },
1467 { { "fr28" }, "f28" },
1468 { { "fr29" }, "f29" },
1469 { { "fr30" }, "f30" },
1470 { { "fr31" }, "f31" },
1471 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001472};
1473
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001474void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001475 unsigned &NumAliases) const {
1476 Aliases = GCCRegAliases;
1477 NumAliases = llvm::array_lengthof(GCCRegAliases);
1478}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001479
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001481public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001482 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001483 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001484
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001485 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001486 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001487 case llvm::Triple::FreeBSD:
1488 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001489 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001490 PtrDiffType = SignedInt;
1491 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001492 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001493 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001494 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001495 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001496
Roman Divacky3ffe7462012-03-13 19:20:17 +00001497 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1498 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001499 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001500 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001501
1502 // PPC32 supports atomics up to 4 bytes.
1503 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001504 }
1505
Craig Topper3164f332014-03-11 03:39:26 +00001506 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001507 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001508 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001509 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001510};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001511
Bill Schmidt778d3872013-07-26 01:36:11 +00001512// Note: ABI differences may eventually require us to have a separate
1513// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001514class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001516 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001517 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001518 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001519 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001520
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001521 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001522 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001523 ABI = "elfv2";
1524 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001525 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001526 ABI = "elfv1";
1527 }
1528
1529 switch (getTriple().getOS()) {
1530 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001531 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001532 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001533 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001534 case llvm::Triple::NetBSD:
1535 IntMaxType = SignedLongLong;
1536 Int64Type = SignedLongLong;
1537 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001538 default:
1539 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001540 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001541
1542 // PPC64 supports atomics up to 8 bytes.
1543 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001544 }
Craig Topper3164f332014-03-11 03:39:26 +00001545 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001546 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001547 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001548 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001549 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001550 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001551 ABI = Name;
1552 return true;
1553 }
1554 return false;
1555 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001556};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557
Roman Divacky965b0b72011-01-06 08:27:10 +00001558class DarwinPPC32TargetInfo :
1559 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001560public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001561 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1562 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001563 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001564 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001565 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001566 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001567 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001568 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001569 }
Craig Topper3164f332014-03-11 03:39:26 +00001570 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001571 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001572 }
1573};
1574
1575class DarwinPPC64TargetInfo :
1576 public DarwinTargetInfo<PPC64TargetInfo> {
1577public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001578 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1579 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001580 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001581 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001582 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001583 }
1584};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001585
Peter Collingbournec947aae2012-05-20 23:28:41 +00001586 static const unsigned NVPTXAddrSpaceMap[] = {
1587 1, // opencl_global
1588 3, // opencl_local
1589 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001590 // FIXME: generic has to be added to the target
1591 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001592 1, // cuda_device
1593 4, // cuda_constant
1594 3, // cuda_shared
1595 };
1596 class NVPTXTargetInfo : public TargetInfo {
1597 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001598 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001599
1600 // The GPU profiles supported by the NVPTX backend
1601 enum GPUKind {
1602 GK_NONE,
1603 GK_SM20,
1604 GK_SM21,
1605 GK_SM30,
1606 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001607 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001608 } GPU;
1609
Peter Collingbournec947aae2012-05-20 23:28:41 +00001610 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001611 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001612 BigEndian = false;
1613 TLSSupported = false;
1614 LongWidth = LongAlign = 64;
1615 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001616 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001617 // Define available target features
1618 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001619 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001620 // Set the default GPU to sm20
1621 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001622 }
Craig Topper3164f332014-03-11 03:39:26 +00001623 void getTargetDefines(const LangOptions &Opts,
1624 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001625 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001626 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001627 if (Opts.CUDAIsDevice) {
1628 // Set __CUDA_ARCH__ for the GPU specified.
1629 std::string CUDAArchCode;
1630 switch (GPU) {
1631 case GK_SM20:
1632 CUDAArchCode = "200";
1633 break;
1634 case GK_SM21:
1635 CUDAArchCode = "210";
1636 break;
1637 case GK_SM30:
1638 CUDAArchCode = "300";
1639 break;
1640 case GK_SM35:
1641 CUDAArchCode = "350";
1642 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001643 case GK_SM37:
1644 CUDAArchCode = "370";
1645 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001646 default:
1647 llvm_unreachable("Unhandled target CPU");
1648 }
1649 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1650 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001651 }
Craig Topper3164f332014-03-11 03:39:26 +00001652 void getTargetBuiltins(const Builtin::Info *&Records,
1653 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001654 Records = BuiltinInfo;
1655 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001656 }
Craig Topper3164f332014-03-11 03:39:26 +00001657 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001658 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001659 }
Craig Topper3164f332014-03-11 03:39:26 +00001660
1661 void getGCCRegNames(const char * const *&Names,
1662 unsigned &NumNames) const override;
1663 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1664 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001665 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001666 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001667 NumAliases = 0;
1668 }
Eric Christopher917e9522014-11-18 22:36:15 +00001669 bool
1670 validateAsmConstraint(const char *&Name,
1671 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001672 switch (*Name) {
1673 default: return false;
1674 case 'c':
1675 case 'h':
1676 case 'r':
1677 case 'l':
1678 case 'f':
1679 case 'd':
1680 Info.setAllowsRegister();
1681 return true;
1682 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001683 }
Craig Topper3164f332014-03-11 03:39:26 +00001684 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001685 // FIXME: Is this really right?
1686 return "";
1687 }
Craig Topper3164f332014-03-11 03:39:26 +00001688 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001689 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001690 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001691 }
Craig Topper3164f332014-03-11 03:39:26 +00001692 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001693 GPU = llvm::StringSwitch<GPUKind>(Name)
1694 .Case("sm_20", GK_SM20)
1695 .Case("sm_21", GK_SM21)
1696 .Case("sm_30", GK_SM30)
1697 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001698 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001699 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001700
Reid Klecknerbbc01782014-12-03 21:53:36 +00001701 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001702 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001703 };
1704
1705 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001706#define BUILTIN(ID, TYPE, ATTRS) \
1707 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1708#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1709 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Justin Holewinski83e96682012-05-24 17:43:12 +00001710#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001711 };
1712
1713 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1714 "r0"
1715 };
1716
1717 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1718 unsigned &NumNames) const {
1719 Names = GCCRegNames;
1720 NumNames = llvm::array_lengthof(GCCRegNames);
1721 }
1722
1723 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1724 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001725 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001726 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001727 SizeType = TargetInfo::UnsignedInt;
1728 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001729 IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00001730 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001731 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001732 };
1733
1734 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1735 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001736 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001737 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001738 SizeType = TargetInfo::UnsignedLong;
1739 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001740 IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00001741 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001742 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001743 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001744
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001745static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001746 1, // opencl_global
1747 3, // opencl_local
1748 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001749 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001750 1, // cuda_device
1751 2, // cuda_constant
1752 3 // cuda_shared
1753};
1754
Tom Stellarda96344b2014-08-21 13:58:40 +00001755// If you edit the description strings, make sure you update
1756// getPointerWidthV().
1757
Eric Christopher964a5f32015-08-05 23:48:05 +00001758static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001759 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1760 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001761
Eric Christopher964a5f32015-08-05 23:48:05 +00001762static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001763 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1764 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001765
Eric Christopher964a5f32015-08-05 23:48:05 +00001766static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001767 "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 +00001768 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1769 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001770
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001771class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001772 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001773 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001774
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001775 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001776 enum GPUKind {
1777 GK_NONE,
1778 GK_R600,
1779 GK_R600_DOUBLE_OPS,
1780 GK_R700,
1781 GK_R700_DOUBLE_OPS,
1782 GK_EVERGREEN,
1783 GK_EVERGREEN_DOUBLE_OPS,
1784 GK_NORTHERN_ISLANDS,
1785 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001786 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001787 GK_SEA_ISLANDS,
1788 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001789 } GPU;
1790
Jan Veselyeebeaea2015-05-04 19:53:36 +00001791 bool hasFP64:1;
1792 bool hasFMAF:1;
1793 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001794
Eli Friedmand13b41e2012-10-12 23:32:00 +00001795public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001796 AMDGPUTargetInfo(const llvm::Triple &Triple)
1797 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001798
1799 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001800 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001801 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001802 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001803 hasFMAF = true;
1804 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001805 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001806 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001807 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001808 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001809 hasFMAF = false;
1810 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001811 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001812 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001813 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001814 }
1815
Tom Stellarda96344b2014-08-21 13:58:40 +00001816 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1817 if (GPU <= GK_CAYMAN)
1818 return 32;
1819
1820 switch(AddrSpace) {
1821 default:
1822 return 64;
1823 case 0:
1824 case 3:
1825 case 5:
1826 return 32;
1827 }
1828 }
1829
Craig Topper3164f332014-03-11 03:39:26 +00001830 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001831 return "";
1832 }
1833
Craig Topper3164f332014-03-11 03:39:26 +00001834 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001835 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001836
Craig Topper3164f332014-03-11 03:39:26 +00001837 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1838 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001839 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001840 NumAliases = 0;
1841 }
1842
Craig Topper3164f332014-03-11 03:39:26 +00001843 bool validateAsmConstraint(const char *&Name,
1844 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001845 return true;
1846 }
1847
Craig Topper3164f332014-03-11 03:39:26 +00001848 void getTargetBuiltins(const Builtin::Info *&Records,
1849 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001850 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001851 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001852 }
1853
Craig Topper3164f332014-03-11 03:39:26 +00001854 void getTargetDefines(const LangOptions &Opts,
1855 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001856 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001857 if (hasFMAF)
1858 Builder.defineMacro("__HAS_FMAF__");
1859 if (hasLDEXPF)
1860 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001861 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001862 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001863 if (Opts.OpenCL) {
1864 if (GPU >= GK_NORTHERN_ISLANDS) {
1865 Builder.defineMacro("cl_khr_byte_addressable_store");
1866 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1867 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1868 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1869 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1870 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001871 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001872 }
1873
Craig Topper3164f332014-03-11 03:39:26 +00001874 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001875 return TargetInfo::CharPtrBuiltinVaList;
1876 }
1877
Craig Topper3164f332014-03-11 03:39:26 +00001878 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001879 GPU = llvm::StringSwitch<GPUKind>(Name)
1880 .Case("r600" , GK_R600)
1881 .Case("rv610", GK_R600)
1882 .Case("rv620", GK_R600)
1883 .Case("rv630", GK_R600)
1884 .Case("rv635", GK_R600)
1885 .Case("rs780", GK_R600)
1886 .Case("rs880", GK_R600)
1887 .Case("rv670", GK_R600_DOUBLE_OPS)
1888 .Case("rv710", GK_R700)
1889 .Case("rv730", GK_R700)
1890 .Case("rv740", GK_R700_DOUBLE_OPS)
1891 .Case("rv770", GK_R700_DOUBLE_OPS)
1892 .Case("palm", GK_EVERGREEN)
1893 .Case("cedar", GK_EVERGREEN)
1894 .Case("sumo", GK_EVERGREEN)
1895 .Case("sumo2", GK_EVERGREEN)
1896 .Case("redwood", GK_EVERGREEN)
1897 .Case("juniper", GK_EVERGREEN)
1898 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1899 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1900 .Case("barts", GK_NORTHERN_ISLANDS)
1901 .Case("turks", GK_NORTHERN_ISLANDS)
1902 .Case("caicos", GK_NORTHERN_ISLANDS)
1903 .Case("cayman", GK_CAYMAN)
1904 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001905 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001906 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1907 .Case("verde", GK_SOUTHERN_ISLANDS)
1908 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001909 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001910 .Case("bonaire", GK_SEA_ISLANDS)
1911 .Case("kabini", GK_SEA_ISLANDS)
1912 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001913 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001914 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001915 .Case("tonga", GK_VOLCANIC_ISLANDS)
1916 .Case("iceland", GK_VOLCANIC_ISLANDS)
1917 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001918 .Default(GK_NONE);
1919
1920 if (GPU == GK_NONE) {
1921 return false;
1922 }
1923
1924 // Set the correct data layout
1925 switch (GPU) {
1926 case GK_NONE:
1927 case GK_R600:
1928 case GK_R700:
1929 case GK_EVERGREEN:
1930 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001931 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001932 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001933 hasFMAF = false;
1934 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935 break;
1936 case GK_R600_DOUBLE_OPS:
1937 case GK_R700_DOUBLE_OPS:
1938 case GK_EVERGREEN_DOUBLE_OPS:
1939 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001940 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001941 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001942 hasFMAF = true;
1943 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944 break;
1945 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001946 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001947 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001948 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001949 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001950 hasFMAF = true;
1951 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001952 break;
1953 }
1954
1955 return true;
1956 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001957};
1958
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001959const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001960#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001961 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001962#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001963};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001964const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001965 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1966 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1967 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1968 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1969 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1970 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1971 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1972 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1973 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1974 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1975 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1976 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1977 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1978 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1979 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1980 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1981 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1982 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1983 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1984 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1985 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1986 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1987 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1988 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1989 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1990 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1991 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1992 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1993 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1994 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1995 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1996 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1997 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1998 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1999 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2000 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2001 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2002 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2003 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2004 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2005 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2006 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2007 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2008 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2009 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2010 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2011 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2012 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2013 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2014 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2015};
2016
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002017void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
2018 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002019 Names = GCCRegNames;
2020 NumNames = llvm::array_lengthof(GCCRegNames);
2021}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002022
Eli Friedman3fd920a2008-08-20 02:34:37 +00002023// Namespace for x86 abstract base class
2024const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002025#define BUILTIN(ID, TYPE, ATTRS) \
2026 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002027#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002028 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002029#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002030 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002031#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002032};
Eli Friedmanb5366062008-05-20 14:21:01 +00002033
Nuno Lopescfca1f02009-12-23 17:49:57 +00002034static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002035 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2036 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002037 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002038 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2039 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2040 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002041 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002042 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2043 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002044};
2045
Eric Christophercdd36352011-06-21 00:05:20 +00002046const TargetInfo::AddlRegName AddlRegNames[] = {
2047 { { "al", "ah", "eax", "rax" }, 0 },
2048 { { "bl", "bh", "ebx", "rbx" }, 3 },
2049 { { "cl", "ch", "ecx", "rcx" }, 2 },
2050 { { "dl", "dh", "edx", "rdx" }, 1 },
2051 { { "esi", "rsi" }, 4 },
2052 { { "edi", "rdi" }, 5 },
2053 { { "esp", "rsp" }, 7 },
2054 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002055 { { "r8d", "r8w", "r8b" }, 38 },
2056 { { "r9d", "r9w", "r9b" }, 39 },
2057 { { "r10d", "r10w", "r10b" }, 40 },
2058 { { "r11d", "r11w", "r11b" }, 41 },
2059 { { "r12d", "r12w", "r12b" }, 42 },
2060 { { "r13d", "r13w", "r13b" }, 43 },
2061 { { "r14d", "r14w", "r14b" }, 44 },
2062 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002063};
2064
2065// X86 target abstract base class; x86-32 and x86-64 are very close, so
2066// most of the implementation can be shared.
2067class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002068 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002069 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00002070 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002071 enum MMX3DNowEnum {
2072 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2073 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002074 enum XOPEnum {
2075 NoXOP,
2076 SSE4A,
2077 FMA4,
2078 XOP
2079 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002080
Eric Christophere1ddaf92010-04-02 23:50:19 +00002081 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002082 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002083 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002084 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002085 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002086 bool HasBMI;
2087 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002088 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002089 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002090 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002091 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002092 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002093 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002094 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002095 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002096 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2097 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002098 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002099 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002100
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002101 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2102 ///
2103 /// Each enumeration represents a particular CPU supported by Clang. These
2104 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2105 enum CPUKind {
2106 CK_Generic,
2107
2108 /// \name i386
2109 /// i386-generation processors.
2110 //@{
2111 CK_i386,
2112 //@}
2113
2114 /// \name i486
2115 /// i486-generation processors.
2116 //@{
2117 CK_i486,
2118 CK_WinChipC6,
2119 CK_WinChip2,
2120 CK_C3,
2121 //@}
2122
2123 /// \name i586
2124 /// i586-generation processors, P5 microarchitecture based.
2125 //@{
2126 CK_i586,
2127 CK_Pentium,
2128 CK_PentiumMMX,
2129 //@}
2130
2131 /// \name i686
2132 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2133 //@{
2134 CK_i686,
2135 CK_PentiumPro,
2136 CK_Pentium2,
2137 CK_Pentium3,
2138 CK_Pentium3M,
2139 CK_PentiumM,
2140 CK_C3_2,
2141
2142 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2143 /// Clang however has some logic to suport this.
2144 // FIXME: Warn, deprecate, and potentially remove this.
2145 CK_Yonah,
2146 //@}
2147
2148 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002149 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002150 //@{
2151 CK_Pentium4,
2152 CK_Pentium4M,
2153 CK_Prescott,
2154 CK_Nocona,
2155 //@}
2156
2157 /// \name Core
2158 /// Core microarchitecture based processors.
2159 //@{
2160 CK_Core2,
2161
2162 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2163 /// codename which GCC no longer accepts as an option to -march, but Clang
2164 /// has some logic for recognizing it.
2165 // FIXME: Warn, deprecate, and potentially remove this.
2166 CK_Penryn,
2167 //@}
2168
2169 /// \name Atom
2170 /// Atom processors
2171 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002172 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002173 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002174 //@}
2175
2176 /// \name Nehalem
2177 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002178 CK_Nehalem,
2179
2180 /// \name Westmere
2181 /// Westmere microarchitecture based processors.
2182 CK_Westmere,
2183
2184 /// \name Sandy Bridge
2185 /// Sandy Bridge microarchitecture based processors.
2186 CK_SandyBridge,
2187
2188 /// \name Ivy Bridge
2189 /// Ivy Bridge microarchitecture based processors.
2190 CK_IvyBridge,
2191
2192 /// \name Haswell
2193 /// Haswell microarchitecture based processors.
2194 CK_Haswell,
2195
2196 /// \name Broadwell
2197 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002198 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002199
2200 /// \name Skylake
2201 /// Skylake microarchitecture based processors.
2202 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002203
Craig Topper449314e2013-08-20 07:09:39 +00002204 /// \name Knights Landing
2205 /// Knights Landing processor.
2206 CK_KNL,
2207
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002208 /// \name K6
2209 /// K6 architecture processors.
2210 //@{
2211 CK_K6,
2212 CK_K6_2,
2213 CK_K6_3,
2214 //@}
2215
2216 /// \name K7
2217 /// K7 architecture processors.
2218 //@{
2219 CK_Athlon,
2220 CK_AthlonThunderbird,
2221 CK_Athlon4,
2222 CK_AthlonXP,
2223 CK_AthlonMP,
2224 //@}
2225
2226 /// \name K8
2227 /// K8 architecture processors.
2228 //@{
2229 CK_Athlon64,
2230 CK_Athlon64SSE3,
2231 CK_AthlonFX,
2232 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002233 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002234 CK_Opteron,
2235 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002236 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002237 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002238
Benjamin Kramer569f2152012-01-10 11:50:18 +00002239 /// \name Bobcat
2240 /// Bobcat architecture processors.
2241 //@{
2242 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002243 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002244 //@}
2245
2246 /// \name Bulldozer
2247 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002248 //@{
2249 CK_BDVER1,
2250 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002251 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002252 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002253 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002254
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002255 /// This specification is deprecated and will be removed in the future.
2256 /// Users should prefer \see CK_K8.
2257 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002258 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002259 CK_x86_64,
2260 //@}
2261
2262 /// \name Geode
2263 /// Geode processors.
2264 //@{
2265 CK_Geode
2266 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002267 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002268
Eric Christopherc50738f2015-08-27 00:05:50 +00002269 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002270 return llvm::StringSwitch<CPUKind>(CPU)
2271 .Case("i386", CK_i386)
2272 .Case("i486", CK_i486)
2273 .Case("winchip-c6", CK_WinChipC6)
2274 .Case("winchip2", CK_WinChip2)
2275 .Case("c3", CK_C3)
2276 .Case("i586", CK_i586)
2277 .Case("pentium", CK_Pentium)
2278 .Case("pentium-mmx", CK_PentiumMMX)
2279 .Case("i686", CK_i686)
2280 .Case("pentiumpro", CK_PentiumPro)
2281 .Case("pentium2", CK_Pentium2)
2282 .Case("pentium3", CK_Pentium3)
2283 .Case("pentium3m", CK_Pentium3M)
2284 .Case("pentium-m", CK_PentiumM)
2285 .Case("c3-2", CK_C3_2)
2286 .Case("yonah", CK_Yonah)
2287 .Case("pentium4", CK_Pentium4)
2288 .Case("pentium4m", CK_Pentium4M)
2289 .Case("prescott", CK_Prescott)
2290 .Case("nocona", CK_Nocona)
2291 .Case("core2", CK_Core2)
2292 .Case("penryn", CK_Penryn)
2293 .Case("bonnell", CK_Bonnell)
2294 .Case("atom", CK_Bonnell) // Legacy name.
2295 .Case("silvermont", CK_Silvermont)
2296 .Case("slm", CK_Silvermont) // Legacy name.
2297 .Case("nehalem", CK_Nehalem)
2298 .Case("corei7", CK_Nehalem) // Legacy name.
2299 .Case("westmere", CK_Westmere)
2300 .Case("sandybridge", CK_SandyBridge)
2301 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2302 .Case("ivybridge", CK_IvyBridge)
2303 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2304 .Case("haswell", CK_Haswell)
2305 .Case("core-avx2", CK_Haswell) // Legacy name.
2306 .Case("broadwell", CK_Broadwell)
2307 .Case("skylake", CK_Skylake)
2308 .Case("skx", CK_Skylake) // Legacy name.
2309 .Case("knl", CK_KNL)
2310 .Case("k6", CK_K6)
2311 .Case("k6-2", CK_K6_2)
2312 .Case("k6-3", CK_K6_3)
2313 .Case("athlon", CK_Athlon)
2314 .Case("athlon-tbird", CK_AthlonThunderbird)
2315 .Case("athlon-4", CK_Athlon4)
2316 .Case("athlon-xp", CK_AthlonXP)
2317 .Case("athlon-mp", CK_AthlonMP)
2318 .Case("athlon64", CK_Athlon64)
2319 .Case("athlon64-sse3", CK_Athlon64SSE3)
2320 .Case("athlon-fx", CK_AthlonFX)
2321 .Case("k8", CK_K8)
2322 .Case("k8-sse3", CK_K8SSE3)
2323 .Case("opteron", CK_Opteron)
2324 .Case("opteron-sse3", CK_OpteronSSE3)
2325 .Case("barcelona", CK_AMDFAM10)
2326 .Case("amdfam10", CK_AMDFAM10)
2327 .Case("btver1", CK_BTVER1)
2328 .Case("btver2", CK_BTVER2)
2329 .Case("bdver1", CK_BDVER1)
2330 .Case("bdver2", CK_BDVER2)
2331 .Case("bdver3", CK_BDVER3)
2332 .Case("bdver4", CK_BDVER4)
2333 .Case("x86-64", CK_x86_64)
2334 .Case("geode", CK_Geode)
2335 .Default(CK_Generic);
2336 }
2337
Rafael Espindolaeb265472013-08-21 21:59:03 +00002338 enum FPMathKind {
2339 FP_Default,
2340 FP_SSE,
2341 FP_387
2342 } FPMath;
2343
Eli Friedman3fd920a2008-08-20 02:34:37 +00002344public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002345 X86TargetInfo(const llvm::Triple &Triple)
2346 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002347 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002348 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2349 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2350 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2351 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2352 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2353 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002354 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002355 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002356 }
Craig Topper3164f332014-03-11 03:39:26 +00002357 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002358 // X87 evaluates with 80 bits "long double" precision.
2359 return SSELevel == NoSSE ? 2 : 0;
2360 }
Craig Topper3164f332014-03-11 03:39:26 +00002361 void getTargetBuiltins(const Builtin::Info *&Records,
2362 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002363 Records = BuiltinInfo;
2364 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002365 }
Craig Topper3164f332014-03-11 03:39:26 +00002366 void getGCCRegNames(const char * const *&Names,
2367 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002368 Names = GCCRegNames;
2369 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002370 }
Craig Topper3164f332014-03-11 03:39:26 +00002371 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2372 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002373 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002374 NumAliases = 0;
2375 }
Craig Topper3164f332014-03-11 03:39:26 +00002376 void getGCCAddlRegNames(const AddlRegName *&Names,
2377 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002378 Names = AddlRegNames;
2379 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002380 }
Eric Christopherd9832702015-06-29 21:00:05 +00002381 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002382 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002383 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002384
Akira Hatanaka974131e2014-09-18 18:17:18 +00002385 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2386
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002387 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2388
Akira Hatanaka974131e2014-09-18 18:17:18 +00002389 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2390
Craig Topper3164f332014-03-11 03:39:26 +00002391 std::string convertConstraint(const char *&Constraint) const override;
2392 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002393 return "~{dirflag},~{fpsr},~{flags}";
2394 }
Craig Topper3164f332014-03-11 03:39:26 +00002395 void getTargetDefines(const LangOptions &Opts,
2396 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002397 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2398 bool Enabled);
2399 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2400 bool Enabled);
2401 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2402 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002403 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2404 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002405 setFeatureEnabledImpl(Features, Name, Enabled);
2406 }
2407 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002408 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002409 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2410 StringRef Name, bool Enabled);
Eric Christopheref1e2952015-08-28 02:13:58 +00002411 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2412 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00002413 std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002414 bool hasFeature(StringRef Feature) const override;
2415 bool handleTargetFeatures(std::vector<std::string> &Features,
2416 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002417 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002418 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2419 return "avx512";
2420 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002421 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002422 else if (getTriple().getArch() == llvm::Triple::x86 &&
2423 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002424 return "no-mmx";
2425 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002426 }
Craig Topper3164f332014-03-11 03:39:26 +00002427 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002428 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002429
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002430 // Perform any per-CPU checks necessary to determine if this CPU is
2431 // acceptable.
2432 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2433 // invalid without explaining *why*.
2434 switch (CPU) {
2435 case CK_Generic:
2436 // No processor selected!
2437 return false;
2438
2439 case CK_i386:
2440 case CK_i486:
2441 case CK_WinChipC6:
2442 case CK_WinChip2:
2443 case CK_C3:
2444 case CK_i586:
2445 case CK_Pentium:
2446 case CK_PentiumMMX:
2447 case CK_i686:
2448 case CK_PentiumPro:
2449 case CK_Pentium2:
2450 case CK_Pentium3:
2451 case CK_Pentium3M:
2452 case CK_PentiumM:
2453 case CK_Yonah:
2454 case CK_C3_2:
2455 case CK_Pentium4:
2456 case CK_Pentium4M:
2457 case CK_Prescott:
2458 case CK_K6:
2459 case CK_K6_2:
2460 case CK_K6_3:
2461 case CK_Athlon:
2462 case CK_AthlonThunderbird:
2463 case CK_Athlon4:
2464 case CK_AthlonXP:
2465 case CK_AthlonMP:
2466 case CK_Geode:
2467 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002468 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002469 return false;
2470
2471 // Fallthrough
2472 case CK_Nocona:
2473 case CK_Core2:
2474 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002475 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002476 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002477 case CK_Nehalem:
2478 case CK_Westmere:
2479 case CK_SandyBridge:
2480 case CK_IvyBridge:
2481 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002482 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002483 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002484 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002485 case CK_Athlon64:
2486 case CK_Athlon64SSE3:
2487 case CK_AthlonFX:
2488 case CK_K8:
2489 case CK_K8SSE3:
2490 case CK_Opteron:
2491 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002492 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002493 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002494 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002495 case CK_BDVER1:
2496 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002497 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002498 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002499 case CK_x86_64:
2500 return true;
2501 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002502 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002503 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002504
Craig Topper3164f332014-03-11 03:39:26 +00002505 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002506
Craig Topper3164f332014-03-11 03:39:26 +00002507 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002508 // We accept all non-ARM calling conventions
2509 return (CC == CC_X86ThisCall ||
2510 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002511 CC == CC_X86StdCall ||
2512 CC == CC_X86VectorCall ||
2513 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002514 CC == CC_X86Pascal ||
2515 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002516 }
2517
Craig Topper3164f332014-03-11 03:39:26 +00002518 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002519 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002520 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002521
2522 bool hasSjLjLowering() const override {
2523 return true;
2524 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002525};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002526
Rafael Espindolaeb265472013-08-21 21:59:03 +00002527bool X86TargetInfo::setFPMath(StringRef Name) {
2528 if (Name == "387") {
2529 FPMath = FP_387;
2530 return true;
2531 }
2532 if (Name == "sse") {
2533 FPMath = FP_SSE;
2534 return true;
2535 }
2536 return false;
2537}
2538
Eric Christopher007b0a02015-08-28 22:32:01 +00002539bool X86TargetInfo::initFeatureMap(
2540 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
2541 std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002542 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002543 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002544 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002545 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002546
Eric Christopher2b4a7252015-08-27 00:05:52 +00002547 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002548 case CK_Generic:
2549 case CK_i386:
2550 case CK_i486:
2551 case CK_i586:
2552 case CK_Pentium:
2553 case CK_i686:
2554 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002555 break;
2556 case CK_PentiumMMX:
2557 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002558 case CK_K6:
2559 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002560 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002561 break;
2562 case CK_Pentium3:
2563 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002564 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002565 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002566 break;
2567 case CK_PentiumM:
2568 case CK_Pentium4:
2569 case CK_Pentium4M:
2570 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002571 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002572 break;
2573 case CK_Yonah:
2574 case CK_Prescott:
2575 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002576 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002577 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002578 break;
2579 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002580 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002581 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002582 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002583 break;
2584 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002585 setFeatureEnabledImpl(Features, "sse4.1", 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 Topperdb4dc082014-11-06 05:52:19 +00002594 // FALLTHROUGH
2595 case CK_Broadwell:
2596 setFeatureEnabledImpl(Features, "rdseed", true);
2597 setFeatureEnabledImpl(Features, "adx", true);
2598 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002599 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002600 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002601 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002602 setFeatureEnabledImpl(Features, "bmi", true);
2603 setFeatureEnabledImpl(Features, "bmi2", true);
2604 setFeatureEnabledImpl(Features, "rtm", true);
2605 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002606 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002607 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002608 setFeatureEnabledImpl(Features, "rdrnd", true);
2609 setFeatureEnabledImpl(Features, "f16c", true);
2610 setFeatureEnabledImpl(Features, "fsgsbase", true);
2611 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002612 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002613 setFeatureEnabledImpl(Features, "avx", true);
2614 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002615 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002616 case CK_Silvermont:
2617 setFeatureEnabledImpl(Features, "aes", true);
2618 setFeatureEnabledImpl(Features, "pclmul", true);
2619 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002620 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002621 setFeatureEnabledImpl(Features, "sse4.2", true);
2622 setFeatureEnabledImpl(Features, "cx16", true);
2623 break;
2624 case CK_KNL:
2625 setFeatureEnabledImpl(Features, "avx512f", true);
2626 setFeatureEnabledImpl(Features, "avx512cd", true);
2627 setFeatureEnabledImpl(Features, "avx512er", true);
2628 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002629 setFeatureEnabledImpl(Features, "rdseed", true);
2630 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002631 setFeatureEnabledImpl(Features, "lzcnt", true);
2632 setFeatureEnabledImpl(Features, "bmi", true);
2633 setFeatureEnabledImpl(Features, "bmi2", true);
2634 setFeatureEnabledImpl(Features, "rtm", true);
2635 setFeatureEnabledImpl(Features, "fma", true);
2636 setFeatureEnabledImpl(Features, "rdrnd", true);
2637 setFeatureEnabledImpl(Features, "f16c", true);
2638 setFeatureEnabledImpl(Features, "fsgsbase", true);
2639 setFeatureEnabledImpl(Features, "aes", true);
2640 setFeatureEnabledImpl(Features, "pclmul", true);
2641 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
2643 case CK_K6_2:
2644 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002645 case CK_WinChip2:
2646 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002647 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002649 case CK_Athlon:
2650 case CK_AthlonThunderbird:
2651 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002652 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002653 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 case CK_Athlon4:
2655 case CK_AthlonXP:
2656 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002657 setFeatureEnabledImpl(Features, "sse", true);
2658 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 break;
2660 case CK_K8:
2661 case CK_Opteron:
2662 case CK_Athlon64:
2663 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002664 setFeatureEnabledImpl(Features, "sse2", true);
2665 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002667 case CK_AMDFAM10:
2668 setFeatureEnabledImpl(Features, "sse4a", true);
2669 setFeatureEnabledImpl(Features, "lzcnt", true);
2670 setFeatureEnabledImpl(Features, "popcnt", true);
2671 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002672 case CK_K8SSE3:
2673 case CK_OpteronSSE3:
2674 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002675 setFeatureEnabledImpl(Features, "sse3", true);
2676 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002677 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002678 case CK_BTVER2:
2679 setFeatureEnabledImpl(Features, "avx", true);
2680 setFeatureEnabledImpl(Features, "aes", true);
2681 setFeatureEnabledImpl(Features, "pclmul", true);
2682 setFeatureEnabledImpl(Features, "bmi", true);
2683 setFeatureEnabledImpl(Features, "f16c", true);
2684 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002685 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002686 setFeatureEnabledImpl(Features, "ssse3", true);
2687 setFeatureEnabledImpl(Features, "sse4a", true);
2688 setFeatureEnabledImpl(Features, "lzcnt", true);
2689 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002690 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002691 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002692 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002693 case CK_BDVER4:
2694 setFeatureEnabledImpl(Features, "avx2", true);
2695 setFeatureEnabledImpl(Features, "bmi2", true);
2696 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002697 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002698 setFeatureEnabledImpl(Features, "fsgsbase", true);
2699 // FALLTHROUGH
2700 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002701 setFeatureEnabledImpl(Features, "bmi", true);
2702 setFeatureEnabledImpl(Features, "fma", true);
2703 setFeatureEnabledImpl(Features, "f16c", true);
2704 setFeatureEnabledImpl(Features, "tbm", true);
2705 // FALLTHROUGH
2706 case CK_BDVER1:
2707 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002708 setFeatureEnabledImpl(Features, "xop", true);
2709 setFeatureEnabledImpl(Features, "lzcnt", true);
2710 setFeatureEnabledImpl(Features, "aes", true);
2711 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002712 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002713 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002714 break;
Eli Friedman33465822011-07-08 23:31:17 +00002715 }
Eric Christopher007b0a02015-08-28 22:32:01 +00002716 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002717}
2718
Rafael Espindolae62e2792013-08-20 13:44:29 +00002719void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002720 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002721 if (Enabled) {
2722 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002723 case AVX512F:
2724 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002725 case AVX2:
2726 Features["avx2"] = true;
2727 case AVX:
2728 Features["avx"] = true;
2729 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002730 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002731 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002732 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002733 case SSSE3:
2734 Features["ssse3"] = true;
2735 case SSE3:
2736 Features["sse3"] = true;
2737 case SSE2:
2738 Features["sse2"] = true;
2739 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002740 Features["sse"] = true;
2741 case NoSSE:
2742 break;
2743 }
2744 return;
2745 }
2746
2747 switch (Level) {
2748 case NoSSE:
2749 case SSE1:
2750 Features["sse"] = false;
2751 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002752 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2753 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002754 case SSE3:
2755 Features["sse3"] = false;
2756 setXOPLevel(Features, NoXOP, false);
2757 case SSSE3:
2758 Features["ssse3"] = false;
2759 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002760 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002761 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002762 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002763 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002764 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002765 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002766 case AVX2:
2767 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002768 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002769 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002770 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2771 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002772 }
2773}
2774
2775void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002776 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002777 if (Enabled) {
2778 switch (Level) {
2779 case AMD3DNowAthlon:
2780 Features["3dnowa"] = true;
2781 case AMD3DNow:
2782 Features["3dnow"] = true;
2783 case MMX:
2784 Features["mmx"] = true;
2785 case NoMMX3DNow:
2786 break;
2787 }
2788 return;
2789 }
2790
2791 switch (Level) {
2792 case NoMMX3DNow:
2793 case MMX:
2794 Features["mmx"] = false;
2795 case AMD3DNow:
2796 Features["3dnow"] = false;
2797 case AMD3DNowAthlon:
2798 Features["3dnowa"] = false;
2799 }
2800}
2801
2802void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002803 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002804 if (Enabled) {
2805 switch (Level) {
2806 case XOP:
2807 Features["xop"] = true;
2808 case FMA4:
2809 Features["fma4"] = true;
2810 setSSELevel(Features, AVX, true);
2811 case SSE4A:
2812 Features["sse4a"] = true;
2813 setSSELevel(Features, SSE3, true);
2814 case NoXOP:
2815 break;
2816 }
2817 return;
2818 }
2819
2820 switch (Level) {
2821 case NoXOP:
2822 case SSE4A:
2823 Features["sse4a"] = false;
2824 case FMA4:
2825 Features["fma4"] = false;
2826 case XOP:
2827 Features["xop"] = false;
2828 }
2829}
2830
Craig Topper86d79ef2013-09-17 04:51:29 +00002831void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2832 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002833 // This is a bit of a hack to deal with the sse4 target feature when used
2834 // as part of the target attribute. We handle sse4 correctly everywhere
2835 // else. See below for more information on how we handle the sse4 options.
2836 if (Name != "sse4")
2837 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002838
Craig Topper29561122013-09-19 01:13:07 +00002839 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002840 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002841 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002843 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002844 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002845 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002846 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002847 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002848 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002849 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002850 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002851 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002852 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002853 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002854 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002855 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002856 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002857 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858 if (Enabled)
2859 setSSELevel(Features, SSE2, Enabled);
2860 } else if (Name == "pclmul") {
2861 if (Enabled)
2862 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002863 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002865 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002866 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002867 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002868 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002869 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2870 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002871 if (Enabled)
2872 setSSELevel(Features, AVX512F, Enabled);
2873 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002874 if (Enabled)
2875 setSSELevel(Features, AVX, Enabled);
2876 } else if (Name == "fma4") {
2877 setXOPLevel(Features, FMA4, Enabled);
2878 } else if (Name == "xop") {
2879 setXOPLevel(Features, XOP, Enabled);
2880 } else if (Name == "sse4a") {
2881 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002882 } else if (Name == "f16c") {
2883 if (Enabled)
2884 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002885 } else if (Name == "sha") {
2886 if (Enabled)
2887 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002888 } else if (Name == "sse4") {
2889 // We can get here via the __target__ attribute since that's not controlled
2890 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2891 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2892 // disabled.
2893 if (Enabled)
2894 setSSELevel(Features, SSE42, Enabled);
2895 else
2896 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002897 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002898}
2899
Eric Christopher3ff21b32013-10-16 21:26:26 +00002900/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002901/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002902bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002903 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002904 for (const auto &Feature : Features) {
2905 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002906 continue;
2907
Eric Christopher610fe112015-08-26 08:21:55 +00002908 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002909 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002910 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002911 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002912 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002913 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002914 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002915 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002916 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002917 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002918 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002919 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002920 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002921 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002922 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002923 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002924 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002925 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002926 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002927 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002928 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002929 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002930 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002931 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002932 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002933 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002934 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002935 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002936 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002937 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002938 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002939 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002940 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002941 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002942 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002943 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002944 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002945 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002946 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002947 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002948 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002949 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002950 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002951 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002952 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002953 HasCX16 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002954 }
2955
Benjamin Kramer27402c62012-03-05 15:10:44 +00002956 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002957 .Case("+avx512f", AVX512F)
2958 .Case("+avx2", AVX2)
2959 .Case("+avx", AVX)
2960 .Case("+sse4.2", SSE42)
2961 .Case("+sse4.1", SSE41)
2962 .Case("+ssse3", SSSE3)
2963 .Case("+sse3", SSE3)
2964 .Case("+sse2", SSE2)
2965 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002966 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002967 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002968
Eli Friedman33465822011-07-08 23:31:17 +00002969 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002970 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002971 .Case("+3dnowa", AMD3DNowAthlon)
2972 .Case("+3dnow", AMD3DNow)
2973 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00002974 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002975 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002976
2977 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002978 .Case("+xop", XOP)
2979 .Case("+fma4", FMA4)
2980 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002981 .Default(NoXOP);
2982 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002983 }
Eli Friedman33465822011-07-08 23:31:17 +00002984
Craig Topper7481d8a2013-09-10 06:55:47 +00002985 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2986 // Can't do this earlier because we need to be able to explicitly enable
2987 // popcnt and still disable sse4.2.
2988 if (!HasPOPCNT && SSELevel >= SSE42 &&
2989 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2990 HasPOPCNT = true;
2991 Features.push_back("+popcnt");
2992 }
2993
Yunzhong Gao61089362013-10-16 19:07:02 +00002994 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2995 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2996 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2997 HasPRFCHW = true;
2998 Features.push_back("+prfchw");
2999 }
3000
Rafael Espindolaeb265472013-08-21 21:59:03 +00003001 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3002 // matches the selected sse level.
3003 if (FPMath == FP_SSE && SSELevel < SSE1) {
3004 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3005 return false;
3006 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3007 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3008 return false;
3009 }
3010
Eli Friedman33465822011-07-08 23:31:17 +00003011 // Don't tell the backend if we're turning off mmx; it will end up disabling
3012 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003013 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3014 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003015 std::vector<std::string>::iterator it;
3016 it = std::find(Features.begin(), Features.end(), "-mmx");
3017 if (it != Features.end())
3018 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003019 else if (SSELevel > NoSSE)
3020 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003021
3022 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003023 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003024 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003025}
Chris Lattnerecd49032009-03-02 22:27:17 +00003026
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003027/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3028/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003029void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003030 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003031 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003032 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003033 Builder.defineMacro("__amd64__");
3034 Builder.defineMacro("__amd64");
3035 Builder.defineMacro("__x86_64");
3036 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003037 if (getTriple().getArchName() == "x86_64h") {
3038 Builder.defineMacro("__x86_64h");
3039 Builder.defineMacro("__x86_64h__");
3040 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003041 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003042 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003043 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003044
Chris Lattnerecd49032009-03-02 22:27:17 +00003045 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003046 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3047 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003048 switch (CPU) {
3049 case CK_Generic:
3050 break;
3051 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003052 // The rest are coming from the i386 define above.
3053 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003054 break;
3055 case CK_i486:
3056 case CK_WinChipC6:
3057 case CK_WinChip2:
3058 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003059 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003060 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003061 case CK_PentiumMMX:
3062 Builder.defineMacro("__pentium_mmx__");
3063 Builder.defineMacro("__tune_pentium_mmx__");
3064 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 case CK_i586:
3066 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003067 defineCPUMacros(Builder, "i586");
3068 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003069 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003070 case CK_Pentium3:
3071 case CK_Pentium3M:
3072 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003073 Builder.defineMacro("__tune_pentium3__");
3074 // Fallthrough
3075 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003076 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003077 Builder.defineMacro("__tune_pentium2__");
3078 // Fallthrough
3079 case CK_PentiumPro:
3080 Builder.defineMacro("__tune_i686__");
3081 Builder.defineMacro("__tune_pentiumpro__");
3082 // Fallthrough
3083 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003084 Builder.defineMacro("__i686");
3085 Builder.defineMacro("__i686__");
3086 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3087 Builder.defineMacro("__pentiumpro");
3088 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003089 break;
3090 case CK_Pentium4:
3091 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003092 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003093 break;
3094 case CK_Yonah:
3095 case CK_Prescott:
3096 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003097 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 break;
3099 case CK_Core2:
3100 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003101 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003102 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003103 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003104 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003105 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003106 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003107 defineCPUMacros(Builder, "slm");
3108 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003109 case CK_Nehalem:
3110 case CK_Westmere:
3111 case CK_SandyBridge:
3112 case CK_IvyBridge:
3113 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003114 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003115 // FIXME: Historically, we defined this legacy name, it would be nice to
3116 // remove it at some point. We've never exposed fine-grained names for
3117 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003118 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003119 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003120 case CK_Skylake:
3121 // FIXME: Historically, we defined this legacy name, it would be nice to
3122 // remove it at some point. This is the only fine-grained CPU macro in the
3123 // main intel CPU line, and it would be better to not have these and force
3124 // people to use ISA macros.
3125 defineCPUMacros(Builder, "skx");
3126 break;
Craig Topper449314e2013-08-20 07:09:39 +00003127 case CK_KNL:
3128 defineCPUMacros(Builder, "knl");
3129 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003130 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003131 Builder.defineMacro("__k6_2__");
3132 Builder.defineMacro("__tune_k6_2__");
3133 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003134 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003135 if (CPU != CK_K6_2) { // In case of fallthrough
3136 // FIXME: GCC may be enabling these in cases where some other k6
3137 // architecture is specified but -m3dnow is explicitly provided. The
3138 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003139 Builder.defineMacro("__k6_3__");
3140 Builder.defineMacro("__tune_k6_3__");
3141 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003142 // Fallthrough
3143 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003144 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003145 break;
3146 case CK_Athlon:
3147 case CK_AthlonThunderbird:
3148 case CK_Athlon4:
3149 case CK_AthlonXP:
3150 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003151 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003152 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003153 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003154 Builder.defineMacro("__tune_athlon_sse__");
3155 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003156 break;
3157 case CK_K8:
3158 case CK_K8SSE3:
3159 case CK_x86_64:
3160 case CK_Opteron:
3161 case CK_OpteronSSE3:
3162 case CK_Athlon64:
3163 case CK_Athlon64SSE3:
3164 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003165 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003166 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003167 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003168 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003169 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003170 case CK_BTVER1:
3171 defineCPUMacros(Builder, "btver1");
3172 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003173 case CK_BTVER2:
3174 defineCPUMacros(Builder, "btver2");
3175 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003176 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003177 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003178 break;
3179 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003180 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003181 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003182 case CK_BDVER3:
3183 defineCPUMacros(Builder, "bdver3");
3184 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003185 case CK_BDVER4:
3186 defineCPUMacros(Builder, "bdver4");
3187 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003188 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003189 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003190 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003191 }
Chris Lattner96e43572009-03-02 22:40:39 +00003192
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003193 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003194 Builder.defineMacro("__REGISTER_PREFIX__", "");
3195
Chris Lattner6df41af2009-04-19 17:32:33 +00003196 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3197 // functions in glibc header files that use FP Stack inline asm which the
3198 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003199 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003200
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003201 if (HasAES)
3202 Builder.defineMacro("__AES__");
3203
Craig Topper3f122a72012-05-31 05:18:48 +00003204 if (HasPCLMUL)
3205 Builder.defineMacro("__PCLMUL__");
3206
Craig Topper22967d42011-12-25 05:06:45 +00003207 if (HasLZCNT)
3208 Builder.defineMacro("__LZCNT__");
3209
Benjamin Kramer1e250392012-07-07 09:39:18 +00003210 if (HasRDRND)
3211 Builder.defineMacro("__RDRND__");
3212
Craig Topper8c7f2512014-11-03 06:51:41 +00003213 if (HasFSGSBASE)
3214 Builder.defineMacro("__FSGSBASE__");
3215
Craig Topper22967d42011-12-25 05:06:45 +00003216 if (HasBMI)
3217 Builder.defineMacro("__BMI__");
3218
3219 if (HasBMI2)
3220 Builder.defineMacro("__BMI2__");
3221
Craig Topper1de83482011-12-29 16:10:46 +00003222 if (HasPOPCNT)
3223 Builder.defineMacro("__POPCNT__");
3224
Michael Liao625a8752012-11-10 05:17:46 +00003225 if (HasRTM)
3226 Builder.defineMacro("__RTM__");
3227
Michael Liao74f4eaf2013-03-26 17:52:08 +00003228 if (HasPRFCHW)
3229 Builder.defineMacro("__PRFCHW__");
3230
Michael Liaoffaae352013-03-29 05:17:55 +00003231 if (HasRDSEED)
3232 Builder.defineMacro("__RDSEED__");
3233
Robert Khasanov50e6f582014-09-19 09:53:48 +00003234 if (HasADX)
3235 Builder.defineMacro("__ADX__");
3236
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003237 if (HasTBM)
3238 Builder.defineMacro("__TBM__");
3239
Rafael Espindolae62e2792013-08-20 13:44:29 +00003240 switch (XOPLevel) {
3241 case XOP:
3242 Builder.defineMacro("__XOP__");
3243 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003244 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003245 case SSE4A:
3246 Builder.defineMacro("__SSE4A__");
3247 case NoXOP:
3248 break;
3249 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003250
Craig Topperbba778b2012-06-03 21:46:30 +00003251 if (HasFMA)
3252 Builder.defineMacro("__FMA__");
3253
Manman Rena45358c2012-10-11 00:59:55 +00003254 if (HasF16C)
3255 Builder.defineMacro("__F16C__");
3256
Craig Topper679b53a2013-08-21 05:29:10 +00003257 if (HasAVX512CD)
3258 Builder.defineMacro("__AVX512CD__");
3259 if (HasAVX512ER)
3260 Builder.defineMacro("__AVX512ER__");
3261 if (HasAVX512PF)
3262 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003263 if (HasAVX512DQ)
3264 Builder.defineMacro("__AVX512DQ__");
3265 if (HasAVX512BW)
3266 Builder.defineMacro("__AVX512BW__");
3267 if (HasAVX512VL)
3268 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003269
Ben Langmuir58078d02013-09-19 13:22:04 +00003270 if (HasSHA)
3271 Builder.defineMacro("__SHA__");
3272
Nick Lewycky50e8f482013-10-05 20:14:27 +00003273 if (HasCX16)
3274 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3275
Chris Lattner96e43572009-03-02 22:40:39 +00003276 // Each case falls through to the previous one here.
3277 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003278 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003279 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003280 case AVX2:
3281 Builder.defineMacro("__AVX2__");
3282 case AVX:
3283 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003284 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003285 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003286 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003287 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003288 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003289 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003290 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003291 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003292 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003293 Builder.defineMacro("__SSE2__");
3294 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003295 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003296 Builder.defineMacro("__SSE__");
3297 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003298 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003299 break;
3300 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003301
Derek Schuffc7dd7222012-10-11 15:52:22 +00003302 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003303 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003304 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003305 case AVX2:
3306 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003307 case SSE42:
3308 case SSE41:
3309 case SSSE3:
3310 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003311 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003312 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003313 break;
3314 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003315 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003316 break;
3317 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003318 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003319 }
3320 }
3321
Anders Carlssone437c682010-01-27 03:47:49 +00003322 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003323 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003324 case AMD3DNowAthlon:
3325 Builder.defineMacro("__3dNOW_A__");
3326 case AMD3DNow:
3327 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003328 case MMX:
3329 Builder.defineMacro("__MMX__");
3330 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003331 break;
3332 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003333
3334 if (CPU >= CK_i486) {
3335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3336 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3337 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3338 }
3339 if (CPU >= CK_i586)
3340 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003341}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003342
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003343bool X86TargetInfo::hasFeature(StringRef Feature) const {
3344 return llvm::StringSwitch<bool>(Feature)
3345 .Case("aes", HasAES)
3346 .Case("avx", SSELevel >= AVX)
3347 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003348 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003349 .Case("avx512cd", HasAVX512CD)
3350 .Case("avx512er", HasAVX512ER)
3351 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003352 .Case("avx512dq", HasAVX512DQ)
3353 .Case("avx512bw", HasAVX512BW)
3354 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003355 .Case("bmi", HasBMI)
3356 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003357 .Case("cx16", HasCX16)
3358 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003359 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003360 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003361 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003362 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003363 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3364 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3365 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003366 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003367 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003368 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003369 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003370 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003371 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003372 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003373 .Case("sse", SSELevel >= SSE1)
3374 .Case("sse2", SSELevel >= SSE2)
3375 .Case("sse3", SSELevel >= SSE3)
3376 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003377 .Case("sse4.1", SSELevel >= SSE41)
3378 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003379 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003380 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003381 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003382 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3383 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003384 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003385 .Default(false);
3386}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003387
Eric Christopherd9832702015-06-29 21:00:05 +00003388// We can't use a generic validation scheme for the features accepted here
3389// versus subtarget features accepted in the target attribute because the
3390// bitfield structure that's initialized in the runtime only supports the
3391// below currently rather than the full range of subtarget features. (See
3392// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3393bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3394 return llvm::StringSwitch<bool>(FeatureStr)
3395 .Case("cmov", true)
3396 .Case("mmx", true)
3397 .Case("popcnt", true)
3398 .Case("sse", true)
3399 .Case("sse2", true)
3400 .Case("sse3", true)
3401 .Case("sse4.1", true)
3402 .Case("sse4.2", true)
3403 .Case("avx", true)
3404 .Case("avx2", true)
3405 .Case("sse4a", true)
3406 .Case("fma4", true)
3407 .Case("xop", true)
3408 .Case("fma", true)
3409 .Case("avx512f", true)
3410 .Case("bmi", true)
3411 .Case("bmi2", true)
3412 .Default(false);
3413}
3414
Eli Friedman3fd920a2008-08-20 02:34:37 +00003415bool
Anders Carlsson58436352009-02-28 17:11:49 +00003416X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003417 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003418 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003419 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003420 // Constant constraints.
3421 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3422 // instructions.
3423 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3424 // x86_64 instructions.
3425 case 's':
3426 Info.setRequiresImmediate();
3427 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003428 case 'I':
3429 Info.setRequiresImmediate(0, 31);
3430 return true;
3431 case 'J':
3432 Info.setRequiresImmediate(0, 63);
3433 return true;
3434 case 'K':
3435 Info.setRequiresImmediate(-128, 127);
3436 return true;
3437 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003438 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003439 return true;
3440 case 'M':
3441 Info.setRequiresImmediate(0, 3);
3442 return true;
3443 case 'N':
3444 Info.setRequiresImmediate(0, 255);
3445 return true;
3446 case 'O':
3447 Info.setRequiresImmediate(0, 127);
3448 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003449 // Register constraints.
3450 case 'Y': // 'Y' is the first character for several 2-character constraints.
3451 // Shift the pointer to the second character of the constraint.
3452 Name++;
3453 switch (*Name) {
3454 default:
3455 return false;
3456 case '0': // First SSE register.
3457 case 't': // Any SSE register, when SSE2 is enabled.
3458 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3459 case 'm': // Any MMX register, when inter-unit moves enabled.
3460 Info.setAllowsRegister();
3461 return true;
3462 }
3463 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003464 // Constraint 'f' cannot be used for output operands.
3465 if (Info.ConstraintStr[0] == '=')
3466 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003467 Info.setAllowsRegister();
3468 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003469 case 'a': // eax.
3470 case 'b': // ebx.
3471 case 'c': // ecx.
3472 case 'd': // edx.
3473 case 'S': // esi.
3474 case 'D': // edi.
3475 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003476 case 't': // Top of floating point stack.
3477 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003478 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003479 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003480 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003481 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003482 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3483 case 'l': // "Index" registers: any general register that can be used as an
3484 // index in a base+index memory access.
3485 Info.setAllowsRegister();
3486 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003487 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003488 case 'C': // SSE floating point constant.
3489 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003490 return true;
3491 }
3492}
3493
Akira Hatanaka974131e2014-09-18 18:17:18 +00003494bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3495 unsigned Size) const {
3496 // Strip off constraint modifiers.
3497 while (Constraint[0] == '=' ||
3498 Constraint[0] == '+' ||
3499 Constraint[0] == '&')
3500 Constraint = Constraint.substr(1);
3501
3502 return validateOperandSize(Constraint, Size);
3503}
3504
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003505bool X86TargetInfo::validateInputSize(StringRef Constraint,
3506 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003507 return validateOperandSize(Constraint, Size);
3508}
3509
3510bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3511 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003512 switch (Constraint[0]) {
3513 default: break;
3514 case 'y':
3515 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003516 case 'f':
3517 case 't':
3518 case 'u':
3519 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003520 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003521 if (SSELevel >= AVX512F)
3522 // 512-bit zmm registers can be used if target supports AVX512F.
3523 return Size <= 512U;
3524 else if (SSELevel >= AVX)
3525 // 256-bit ymm registers can be used if target supports AVX.
3526 return Size <= 256U;
3527 return Size <= 128U;
3528 case 'Y':
3529 // 'Y' is the first character for several 2-character constraints.
3530 switch (Constraint[1]) {
3531 default: break;
3532 case 'm':
3533 // 'Ym' is synonymous with 'y'.
3534 return Size <= 64;
3535 case 'i':
3536 case 't':
3537 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3538 if (SSELevel >= AVX512F)
3539 return Size <= 512U;
3540 else if (SSELevel >= AVX)
3541 return Size <= 256U;
3542 return SSELevel >= SSE2 && Size <= 128U;
3543 }
3544
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003545 }
3546
3547 return true;
3548}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003549
Eli Friedman3fd920a2008-08-20 02:34:37 +00003550std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003551X86TargetInfo::convertConstraint(const char *&Constraint) const {
3552 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003553 case 'a': return std::string("{ax}");
3554 case 'b': return std::string("{bx}");
3555 case 'c': return std::string("{cx}");
3556 case 'd': return std::string("{dx}");
3557 case 'S': return std::string("{si}");
3558 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003559 case 'p': // address
3560 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003561 case 't': // top of floating point stack.
3562 return std::string("{st}");
3563 case 'u': // second from top of floating point stack.
3564 return std::string("{st(1)}"); // second from top of floating point stack.
3565 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003566 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003567 }
3568}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003569
Eli Friedman3fd920a2008-08-20 02:34:37 +00003570// X86-32 generic target
3571class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003572public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003573 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003574 DoubleAlign = LongLongAlign = 32;
3575 LongDoubleWidth = 96;
3576 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003577 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003578 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003579 SizeType = UnsignedInt;
3580 PtrDiffType = SignedInt;
3581 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003582 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003583
3584 // Use fpret for all types.
3585 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3586 (1 << TargetInfo::Double) |
3587 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003588
3589 // x86-32 has atomics up to 8 bytes
3590 // FIXME: Check that we actually have cmpxchg8b before setting
3591 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3592 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003593 }
Craig Topper3164f332014-03-11 03:39:26 +00003594 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003595 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003596 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003597
Craig Topper3164f332014-03-11 03:39:26 +00003598 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003599 if (RegNo == 0) return 0;
3600 if (RegNo == 1) return 2;
3601 return -1;
3602 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003603 bool validateOperandSize(StringRef Constraint,
3604 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003605 switch (Constraint[0]) {
3606 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003607 case 'R':
3608 case 'q':
3609 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003610 case 'a':
3611 case 'b':
3612 case 'c':
3613 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003614 case 'S':
3615 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003616 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003617 case 'A':
3618 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003619 }
3620
Akira Hatanaka974131e2014-09-18 18:17:18 +00003621 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003622 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003623};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003624
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003625class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3626public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003627 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3628 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003629
Craig Topper3164f332014-03-11 03:39:26 +00003630 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003631 unsigned Major, Minor, Micro;
3632 getTriple().getOSVersion(Major, Minor, Micro);
3633 // New NetBSD uses the default rounding mode.
3634 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3635 return X86_32TargetInfo::getFloatEvalMethod();
3636 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003637 return 1;
3638 }
3639};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003640
Eli Friedmane3aa4542009-07-05 18:47:56 +00003641class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3642public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003643 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3644 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003645 SizeType = UnsignedLong;
3646 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003647 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003648 }
3649};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003650
Eli Friedman9fa28852012-08-08 23:57:20 +00003651class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3652public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003653 BitrigI386TargetInfo(const llvm::Triple &Triple)
3654 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003655 SizeType = UnsignedLong;
3656 IntPtrType = SignedLong;
3657 PtrDiffType = SignedLong;
3658 }
3659};
Eli Friedman9fa28852012-08-08 23:57:20 +00003660
Torok Edwinb2b37c62009-06-30 17:10:35 +00003661class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003662public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003663 DarwinI386TargetInfo(const llvm::Triple &Triple)
3664 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003665 LongDoubleWidth = 128;
3666 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003667 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003668 SizeType = UnsignedLong;
3669 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003670 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003671 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003672 }
3673
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003674 bool handleTargetFeatures(std::vector<std::string> &Features,
3675 DiagnosticsEngine &Diags) override {
3676 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3677 Diags))
3678 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003679 // We now know the features we have: we can decide how to align vectors.
3680 MaxVectorAlign =
3681 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003682 return true;
3683 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003684};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003685
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003686// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003687class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003688public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003689 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3690 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003691 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003692 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003693 bool IsWinCOFF =
3694 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003695 DataLayoutString = IsWinCOFF
3696 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3697 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003698 }
Craig Topper3164f332014-03-11 03:39:26 +00003699 void getTargetDefines(const LangOptions &Opts,
3700 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003701 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3702 }
3703};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003704
3705// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003706class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003707public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003708 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003709 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003710 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003711 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3712 }
Craig Topper3164f332014-03-11 03:39:26 +00003713 void getTargetDefines(const LangOptions &Opts,
3714 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003715 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3716 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3717 // The value of the following reflects processor type.
3718 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3719 // We lost the original triple, so we use the default.
3720 Builder.defineMacro("_M_IX86", "600");
3721 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003722};
3723} // end anonymous namespace
3724
David Majnemerae1ed0e2015-05-28 04:36:18 +00003725static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3726 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003727 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3728 // macro anyway for pre-processor compatibility.
3729 if (Opts.MicrosoftExt)
3730 Builder.defineMacro("__declspec", "__declspec");
3731 else
3732 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3733
3734 if (!Opts.MicrosoftExt) {
3735 // Provide macros for all the calling convention keywords. Provide both
3736 // single and double underscore prefixed variants. These are available on
3737 // x64 as well as x86, even though they have no effect.
3738 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3739 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003740 std::string GCCSpelling = "__attribute__((__";
3741 GCCSpelling += CC;
3742 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003743 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3744 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3745 }
3746 }
3747}
3748
David Majnemerae1ed0e2015-05-28 04:36:18 +00003749static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3750 Builder.defineMacro("__MSVCRT__");
3751 Builder.defineMacro("__MINGW32__");
3752 addCygMingDefines(Opts, Builder);
3753}
3754
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003755namespace {
3756// x86-32 MinGW target
3757class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3758public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003759 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003760 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003761 void getTargetDefines(const LangOptions &Opts,
3762 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003763 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003764 DefineStd(Builder, "WIN32", Opts);
3765 DefineStd(Builder, "WINNT", Opts);
3766 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003767 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003768 }
3769};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003770
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003771// x86-32 Cygwin target
3772class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3773public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003774 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3775 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003776 TLSSupported = false;
3777 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003778 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003779 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 +00003780 }
Craig Topper3164f332014-03-11 03:39:26 +00003781 void getTargetDefines(const LangOptions &Opts,
3782 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003783 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003784 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003785 Builder.defineMacro("__CYGWIN__");
3786 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003787 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003788 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003789 if (Opts.CPlusPlus)
3790 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003791 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003792};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003793
Chris Lattnerb986aba2010-04-11 19:29:39 +00003794// x86-32 Haiku target
3795class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3796public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003797 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003798 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003799 IntPtrType = SignedLong;
3800 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003801 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003802 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003803 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003804 }
Craig Topper3164f332014-03-11 03:39:26 +00003805 void getTargetDefines(const LangOptions &Opts,
3806 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003807 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3808 Builder.defineMacro("__INTEL__");
3809 Builder.defineMacro("__HAIKU__");
3810 }
3811};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003812
Douglas Gregor9fabd852011-07-01 22:41:14 +00003813// RTEMS Target
3814template<typename Target>
3815class RTEMSTargetInfo : public OSTargetInfo<Target> {
3816protected:
Craig Topper3164f332014-03-11 03:39:26 +00003817 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3818 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003819 // RTEMS defines; list based off of gcc output
3820
Douglas Gregor9fabd852011-07-01 22:41:14 +00003821 Builder.defineMacro("__rtems__");
3822 Builder.defineMacro("__ELF__");
3823 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003824
Douglas Gregor9fabd852011-07-01 22:41:14 +00003825public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003826 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3827 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003828
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003829 switch (Triple.getArch()) {
3830 default:
3831 case llvm::Triple::x86:
3832 // this->MCountName = ".mcount";
3833 break;
3834 case llvm::Triple::mips:
3835 case llvm::Triple::mipsel:
3836 case llvm::Triple::ppc:
3837 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003838 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003839 // this->MCountName = "_mcount";
3840 break;
3841 case llvm::Triple::arm:
3842 // this->MCountName = "__mcount";
3843 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003844 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003845 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003846};
3847
Douglas Gregor9fabd852011-07-01 22:41:14 +00003848// x86-32 RTEMS target
3849class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3850public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003851 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003852 SizeType = UnsignedLong;
3853 IntPtrType = SignedLong;
3854 PtrDiffType = SignedLong;
3855 this->UserLabelPrefix = "";
3856 }
Craig Topper3164f332014-03-11 03:39:26 +00003857 void getTargetDefines(const LangOptions &Opts,
3858 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003859 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3860 Builder.defineMacro("__INTEL__");
3861 Builder.defineMacro("__rtems__");
3862 }
3863};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003864
Eli Friedman3fd920a2008-08-20 02:34:37 +00003865// x86-64 generic target
3866class X86_64TargetInfo : public X86TargetInfo {
3867public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003868 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003869 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003870 bool IsWinCOFF =
3871 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003872 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003873 LongDoubleWidth = 128;
3874 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003875 LargeArrayMinWidth = 128;
3876 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003877 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003878 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3879 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3880 IntPtrType = IsX32 ? SignedInt : SignedLong;
3881 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003882 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003883 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003884
Eric Christopher917e9522014-11-18 22:36:15 +00003885 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003886 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3887 : IsWinCOFF
3888 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3889 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003890
3891 // Use fpret only for long double.
3892 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003893
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003894 // Use fp2ret for _Complex long double.
3895 ComplexLongDoubleUsesFP2Ret = true;
3896
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003897 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003898 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003899 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003900 }
Craig Topper3164f332014-03-11 03:39:26 +00003901 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003902 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003903 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003904
Craig Topper3164f332014-03-11 03:39:26 +00003905 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003906 if (RegNo == 0) return 0;
3907 if (RegNo == 1) return 1;
3908 return -1;
3909 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003910
Craig Topper3164f332014-03-11 03:39:26 +00003911 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003912 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003913 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003914 CC == CC_IntelOclBicc ||
3915 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003916 }
3917
Craig Topper3164f332014-03-11 03:39:26 +00003918 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003919 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003920 }
3921
Pavel Chupinfd223e12014-08-04 12:39:43 +00003922 // for x32 we need it here explicitly
3923 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003924};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003925
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003926// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003927class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003928public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003929 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3930 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003931 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003932 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003933 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003934 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003935 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003936 SizeType = UnsignedLongLong;
3937 PtrDiffType = SignedLongLong;
3938 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003939 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003940 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003941
Craig Topper3164f332014-03-11 03:39:26 +00003942 void getTargetDefines(const LangOptions &Opts,
3943 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003944 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003945 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003946 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003947
Craig Topper3164f332014-03-11 03:39:26 +00003948 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003949 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003950 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003951
Craig Topper3164f332014-03-11 03:39:26 +00003952 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003953 switch (CC) {
3954 case CC_X86StdCall:
3955 case CC_X86ThisCall:
3956 case CC_X86FastCall:
3957 return CCCR_Ignore;
3958 case CC_C:
3959 case CC_X86VectorCall:
3960 case CC_IntelOclBicc:
3961 case CC_X86_64SysV:
3962 return CCCR_OK;
3963 default:
3964 return CCCR_Warning;
3965 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003966 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003967};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003968
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003969// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003970class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003971public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003972 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003973 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003974 LongDoubleWidth = LongDoubleAlign = 64;
3975 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003976 }
Craig Topper3164f332014-03-11 03:39:26 +00003977 void getTargetDefines(const LangOptions &Opts,
3978 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003979 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3980 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00003981 Builder.defineMacro("_M_X64", "100");
3982 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003983 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003984};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003985
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003986// x86-64 MinGW target
3987class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3988public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003989 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00003990 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003991 void getTargetDefines(const LangOptions &Opts,
3992 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003993 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003994 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003995 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003996 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003997
3998 // GCC defines this macro when it is using __gxx_personality_seh0.
3999 if (!Opts.SjLjExceptions)
4000 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004001 }
4002};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004003
Yaron Kerend030d112015-07-22 17:38:19 +00004004// x86-64 Cygwin target
4005class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4006public:
4007 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4008 : X86_64TargetInfo(Triple) {
4009 TLSSupported = false;
4010 WCharType = UnsignedShort;
4011 }
4012 void getTargetDefines(const LangOptions &Opts,
4013 MacroBuilder &Builder) const override {
4014 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4015 Builder.defineMacro("__x86_64__");
4016 Builder.defineMacro("__CYGWIN__");
4017 Builder.defineMacro("__CYGWIN64__");
4018 addCygMingDefines(Opts, Builder);
4019 DefineStd(Builder, "unix", Opts);
4020 if (Opts.CPlusPlus)
4021 Builder.defineMacro("_GNU_SOURCE");
4022
4023 // GCC defines this macro when it is using __gxx_personality_seh0.
4024 if (!Opts.SjLjExceptions)
4025 Builder.defineMacro("__SEH__");
4026 }
4027};
4028
Eli Friedman2857ccb2009-07-01 03:36:11 +00004029class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4030public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004031 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4032 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004033 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004034 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4035 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004036 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004037 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004038 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004039 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004040
4041 bool handleTargetFeatures(std::vector<std::string> &Features,
4042 DiagnosticsEngine &Diags) override {
4043 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4044 Diags))
4045 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004046 // We now know the features we have: we can decide how to align vectors.
4047 MaxVectorAlign =
4048 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004049 return true;
4050 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004051};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004052
Eli Friedman245f2292009-07-05 22:31:18 +00004053class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4054public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004055 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4056 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004057 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004058 Int64Type = SignedLongLong;
4059 }
4060};
Eli Friedman245f2292009-07-05 22:31:18 +00004061
Eli Friedman9fa28852012-08-08 23:57:20 +00004062class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4063public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004064 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4065 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4066 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004067 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004068 }
4069};
Tim Northover9bb857a2013-01-31 12:13:10 +00004070
Eli Friedmanf05b7722008-08-20 07:44:10 +00004071class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004072 // Possible FPU choices.
4073 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004074 VFP2FPU = (1 << 0),
4075 VFP3FPU = (1 << 1),
4076 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004077 NeonFPU = (1 << 3),
4078 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004079 };
4080
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004081 // Possible HWDiv features.
4082 enum HWDivMode {
4083 HWDivThumb = (1 << 0),
4084 HWDivARM = (1 << 1)
4085 };
4086
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004087 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004088 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004089 }
4090
4091 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4092 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004093
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004094 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004095
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004096 StringRef DefaultCPU;
4097 StringRef CPUProfile;
4098 StringRef CPUAttr;
4099
Rafael Espindolaeb265472013-08-21 21:59:03 +00004100 enum {
4101 FP_Default,
4102 FP_VFP,
4103 FP_Neon
4104 } FPMath;
4105
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004106 unsigned ArchISA;
4107 unsigned ArchKind;
4108 unsigned ArchProfile;
4109 unsigned ArchVersion;
4110
Bernard Ogdenda13af32013-10-24 18:32:51 +00004111 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004112
Logan Chien57086ce2012-10-10 06:56:20 +00004113 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004114 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004115
4116 // Initialized via features.
4117 unsigned SoftFloat : 1;
4118 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004119
Bernard Ogden18b57012013-10-29 09:47:51 +00004120 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004121 unsigned Crypto : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004122 unsigned Unaligned : 1;
4123
4124 enum {
4125 LDREX_B = (1 << 0), /// byte (8-bit)
4126 LDREX_H = (1 << 1), /// half (16-bit)
4127 LDREX_W = (1 << 2), /// word (32-bit)
4128 LDREX_D = (1 << 3), /// double (64-bit)
4129 };
4130
4131 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004132
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004133 // ACLE 6.5.1 Hardware floating point
4134 enum {
4135 HW_FP_HP = (1 << 1), /// half (16-bit)
4136 HW_FP_SP = (1 << 2), /// single (32-bit)
4137 HW_FP_DP = (1 << 3), /// double (64-bit)
4138 };
4139 uint32_t HW_FP;
4140
Chris Lattner5cc15e02010-03-03 19:03:45 +00004141 static const Builtin::Info BuiltinInfo[];
4142
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004143 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004144 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004145
4146 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004147 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004148
Renato Golin9ba39232015-02-27 16:35:48 +00004149 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4150 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4151 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004152 SizeType = UnsignedLong;
4153 else
4154 SizeType = UnsignedInt;
4155
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004156 switch (T.getOS()) {
4157 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004158 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004159 break;
4160 case llvm::Triple::Win32:
4161 WCharType = UnsignedShort;
4162 break;
4163 case llvm::Triple::Linux:
4164 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004165 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4166 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004167 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004168 }
4169
4170 UseBitFieldTypeAlignment = true;
4171
4172 ZeroLengthBitfieldBoundary = 0;
4173
Tim Northover147cd2f2014-10-14 22:12:21 +00004174 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4175 // so set preferred for small types to 32.
4176 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004177 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004178 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4179 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4180 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004181 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004182 DataLayoutString = "e"
4183 "-m:w"
4184 "-p:32:32"
4185 "-i64:64"
4186 "-v128:64:128"
4187 "-a:0:32"
4188 "-n32"
4189 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004190 } else if (T.isOSNaCl()) {
4191 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004192 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004193 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004194 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004195 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4196 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004197 }
4198
4199 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004200 }
4201
4202 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004203 const llvm::Triple &T = getTriple();
4204
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004205 IsAAPCS = false;
4206
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004207 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004208
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004209 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004210 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004211 SizeType = UnsignedInt;
4212 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004213 SizeType = UnsignedLong;
4214
4215 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4216 WCharType = SignedInt;
4217
4218 // Do not respect the alignment of bit-field types when laying out
4219 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4220 UseBitFieldTypeAlignment = false;
4221
4222 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4223 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4224 /// gcc.
4225 ZeroLengthBitfieldBoundary = 32;
4226
Tim Northover147cd2f2014-10-14 22:12:21 +00004227 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004228 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004229 BigEndian
4230 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4231 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4232 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004233 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004234 BigEndian
4235 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4236 : "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 +00004237
4238 // FIXME: Override "preferred align" for double and long long.
4239 }
4240
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004241 void setArchInfo() {
4242 StringRef ArchName = getTriple().getArchName();
4243
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004244 ArchISA = llvm::ARM::parseArchISA(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004245 DefaultCPU = getDefaultCPU(ArchName);
4246
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004247 unsigned ArchKind = llvm::ARM::parseArch(ArchName);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004248 if (ArchKind == llvm::ARM::AK_INVALID)
4249 // set arch of the CPU, either provided explicitly or hardcoded default
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004250 ArchKind = llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004251 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004252 }
4253
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004254 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004255 StringRef SubArch;
4256
4257 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004258 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004259 SubArch = llvm::ARM::getSubArch(ArchKind);
4260 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4261 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004262
4263 // cache CPU related strings
4264 CPUAttr = getCPUAttr();
4265 CPUProfile = getCPUProfile();
4266 }
4267
4268 void setAtomic() {
4269 // when triple does not specify a sub arch,
4270 // then we are not using inline atomics
4271 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4272 false :
4273 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4274 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4275 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4276 if (ArchProfile == llvm::ARM::PK_M) {
4277 MaxAtomicPromoteWidth = 32;
4278 if (ShouldUseInlineAtomic)
4279 MaxAtomicInlineWidth = 32;
4280 }
4281 else {
4282 MaxAtomicPromoteWidth = 64;
4283 if (ShouldUseInlineAtomic)
4284 MaxAtomicInlineWidth = 64;
4285 }
4286 }
4287
4288 bool isThumb() const {
4289 return (ArchISA == llvm::ARM::IK_THUMB);
4290 }
4291
4292 bool supportsThumb() const {
4293 return CPUAttr.count('T') || ArchVersion >= 6;
4294 }
4295
4296 bool supportsThumb2() const {
4297 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4298 }
4299
4300 StringRef getDefaultCPU(StringRef ArchName) const {
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004301 return llvm::ARM::getDefaultCPU(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004302 }
4303
4304 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004305 // For most sub-arches, the build attribute CPU name is enough.
4306 // For Cortex variants, it's slightly different.
4307 switch(ArchKind) {
4308 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004309 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004310 case llvm::ARM::AK_ARMV6M:
4311 case llvm::ARM::AK_ARMV6SM:
4312 case llvm::ARM::AK_ARMV6HL:
4313 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004314 case llvm::ARM::AK_ARMV7S:
4315 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004316 case llvm::ARM::AK_ARMV7:
4317 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004318 case llvm::ARM::AK_ARMV7L:
4319 case llvm::ARM::AK_ARMV7HL:
4320 return "7A";
4321 case llvm::ARM::AK_ARMV7R:
4322 return "7R";
4323 case llvm::ARM::AK_ARMV7M:
4324 return "7M";
4325 case llvm::ARM::AK_ARMV7EM:
4326 return "7EM";
4327 case llvm::ARM::AK_ARMV8A:
4328 return "8A";
4329 case llvm::ARM::AK_ARMV8_1A:
4330 return "8_1A";
4331 }
4332 }
4333
4334 StringRef getCPUProfile() const {
4335 switch(ArchProfile) {
4336 case llvm::ARM::PK_A:
4337 return "A";
4338 case llvm::ARM::PK_R:
4339 return "R";
4340 case llvm::ARM::PK_M:
4341 return "M";
4342 default:
4343 return "";
4344 }
4345 }
4346
Chris Lattner17df24e2008-04-21 18:56:49 +00004347public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004348 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004349 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004350 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004351 BigEndian = IsBigEndian;
4352
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004353 switch (getTriple().getOS()) {
4354 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004355 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004356 break;
4357 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004358 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004359 break;
4360 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004361
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004362 // cache arch related info
4363 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004364
Chris Lattner1a8f3942010-04-23 16:29:58 +00004365 // {} in inline assembly are neon specifiers, not assembly variant
4366 // specifiers.
4367 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004368
Eric Christopher0e261882014-12-05 01:06:59 +00004369 // FIXME: This duplicates code from the driver that sets the -target-abi
4370 // option - this code is used if -target-abi isn't passed and should
4371 // be unified in some way.
4372 if (Triple.isOSBinFormatMachO()) {
4373 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4374 // the frontend matches that.
4375 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4376 Triple.getOS() == llvm::Triple::UnknownOS ||
4377 StringRef(CPU).startswith("cortex-m")) {
4378 setABI("aapcs");
4379 } else {
4380 setABI("apcs-gnu");
4381 }
4382 } else if (Triple.isOSWindows()) {
4383 // FIXME: this is invalid for WindowsCE
4384 setABI("aapcs");
4385 } else {
4386 // Select the default based on the platform.
4387 switch (Triple.getEnvironment()) {
4388 case llvm::Triple::Android:
4389 case llvm::Triple::GNUEABI:
4390 case llvm::Triple::GNUEABIHF:
4391 setABI("aapcs-linux");
4392 break;
4393 case llvm::Triple::EABIHF:
4394 case llvm::Triple::EABI:
4395 setABI("aapcs");
4396 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004397 case llvm::Triple::GNU:
4398 setABI("apcs-gnu");
4399 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004400 default:
4401 if (Triple.getOS() == llvm::Triple::NetBSD)
4402 setABI("apcs-gnu");
4403 else
4404 setABI("aapcs");
4405 break;
4406 }
4407 }
John McCall86353412010-08-21 22:46:04 +00004408
4409 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004410 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004411
Renato Golin15b86152015-07-03 16:41:13 +00004412 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004413 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004414
James Molloya7139222012-03-12 09:14:10 +00004415 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004416 // the alignment of the zero-length bitfield is greater than the member
4417 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004418 // zero length bitfield.
4419 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004420 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004421
Alp Toker4925ba72014-06-07 23:30:42 +00004422 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004423
Craig Topper3164f332014-03-11 03:39:26 +00004424 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004425 ABI = Name;
4426
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004427 // The defaults (above) are for AAPCS, check if we need to change them.
4428 //
4429 // FIXME: We need support for -meabi... we could just mangle it into the
4430 // name.
4431 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004432 setABIAPCS();
4433 return true;
4434 }
4435 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4436 setABIAAPCS();
4437 return true;
4438 }
4439 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004440 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004441
Renato Golinf5c4dec2015-05-27 13:33:00 +00004442 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopheref1e2952015-08-28 02:13:58 +00004443 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4444 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00004445 std::vector<std::string> &FeaturesVec) const override {
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004446
4447 std::vector<const char*> TargetFeatures;
4448
4449 // get default FPU features
4450 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4451 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4452
4453 // get default Extension features
4454 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4455 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4456
4457 for (const char *Feature : TargetFeatures)
4458 if (Feature[0] == '+')
4459 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004460
4461 if (ArchVersion < 6 ||
4462 (ArchVersion == 6 && ArchProfile == llvm::ARM::PK_M))
4463 Features["strict-align"] = true;
4464
Eric Christopher007b0a02015-08-28 22:32:01 +00004465 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004466 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004467
Craig Topper3164f332014-03-11 03:39:26 +00004468 bool handleTargetFeatures(std::vector<std::string> &Features,
4469 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004470 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004471 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004472 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004473 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004474 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004475 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004476
Ranjeet Singhac08e532015-06-24 23:39:25 +00004477 // This does not diagnose illegal cases like having both
4478 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4479 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004480 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004481 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004482 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004483 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004484 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004485 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004486 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004487 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004488 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004489 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004490 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004491 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004492 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004493 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004494 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004495 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004496 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004497 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004498 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004499 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004500 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004501 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004502 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004503 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004504 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004505 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004506 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004507 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004508 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004509 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004510 } else if (Feature == "+strict-align") {
4511 Unaligned = 0;
4512 } else if (Feature == "+fp16") {
4513 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004514 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004515 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004516 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004517
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004518 switch (ArchVersion) {
4519 case 6:
4520 if (ArchProfile == llvm::ARM::PK_M)
4521 LDREX = 0;
4522 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4523 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4524 else
4525 LDREX = LDREX_W;
4526 break;
4527 case 7:
4528 if (ArchProfile == llvm::ARM::PK_M)
4529 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4530 else
4531 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4532 break;
4533 case 8:
4534 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4535 }
4536
Rafael Espindolaeb265472013-08-21 21:59:03 +00004537 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4538 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4539 return false;
4540 }
4541
4542 if (FPMath == FP_Neon)
4543 Features.push_back("+neonfp");
4544 else if (FPMath == FP_VFP)
4545 Features.push_back("-neonfp");
4546
Daniel Dunbar893d4752009-12-19 04:15:38 +00004547 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004548 auto Feature =
4549 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4550 if (Feature != Features.end())
4551 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004552
Rafael Espindolaeb265472013-08-21 21:59:03 +00004553 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004554 }
4555
Craig Topper3164f332014-03-11 03:39:26 +00004556 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004557 return llvm::StringSwitch<bool>(Feature)
4558 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004559 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004560 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004561 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004562 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004563 .Case("hwdiv", HWDiv & HWDivThumb)
4564 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004565 .Default(false);
4566 }
Renato Golin15b86152015-07-03 16:41:13 +00004567
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004568 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004569 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004570 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004571
Renato Golin15b86152015-07-03 16:41:13 +00004572 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004573 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004574 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004575 CPU = Name;
4576 return true;
4577 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004578
Craig Topper3164f332014-03-11 03:39:26 +00004579 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004580
Craig Topper3164f332014-03-11 03:39:26 +00004581 void getTargetDefines(const LangOptions &Opts,
4582 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004583 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004584 Builder.defineMacro("__arm");
4585 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004586
Chris Lattnerecd49032009-03-02 22:27:17 +00004587 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004588 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004589 if (!CPUAttr.empty())
4590 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004591
4592 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004593 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004594 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004595
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004596 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004597 // ACLE 6.5.7 Crypto Extension
4598 if (Crypto)
4599 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4600 // ACLE 6.5.8 CRC32 Extension
4601 if (CRC)
4602 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4603 // ACLE 6.5.10 Numeric Maximum and Minimum
4604 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4605 // ACLE 6.5.9 Directed Rounding
4606 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004607 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004608
4609 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4610 // is not defined for the M-profile.
4611 // NOTE that the deffault profile is assumed to be 'A'
4612 if (CPUProfile.empty() || CPUProfile != "M")
4613 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4614
4615 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4616 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4617 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004618 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004619 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004620 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004621 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4622
4623 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4624 // instruction set such as ARM or Thumb.
4625 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4626
4627 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4628
4629 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004630 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004631 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004632
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004633 // ACLE 6.4.3 Unaligned access supported in hardware
4634 if (Unaligned)
4635 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
4636
4637 // ACLE 6.4.4 LDREX/STREX
4638 if (LDREX)
4639 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4640
4641 // ACLE 6.4.5 CLZ
4642 if (ArchVersion == 5 ||
4643 (ArchVersion == 6 && CPUProfile != "M") ||
4644 ArchVersion > 6)
4645 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4646
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004647 // ACLE 6.5.1 Hardware Floating Point
4648 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004649 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004650
Yi Konga44c4d72014-06-27 21:25:42 +00004651 // ACLE predefines.
4652 Builder.defineMacro("__ARM_ACLE", "200");
4653
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004654 // FP16 support (we currently only support IEEE format).
4655 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4656 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4657
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004658 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4659 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4660 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4661
Mike Stump9d54bd72009-04-08 02:07:04 +00004662 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004663
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004664 // FIXME: It's more complicated than this and we don't really support
4665 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004666 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004667 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004668 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004669
David Tweed8f676532012-10-25 13:33:01 +00004670 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004671 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004672 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4673 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004674 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004675 Builder.defineMacro("__ARM_PCS", "1");
4676
David Tweed8f676532012-10-25 13:33:01 +00004677 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004678 Builder.defineMacro("__ARM_PCS_VFP", "1");
4679 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004680
Daniel Dunbar893d4752009-12-19 04:15:38 +00004681 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004682 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004683
4684 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004685 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004686
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004687 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004688 Builder.defineMacro("__THUMBEL__");
4689 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004690 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004691 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004692 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004693
4694 // ACLE 6.4.9 32-bit SIMD instructions
4695 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4696 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4697
4698 // ACLE 6.4.10 Hardware Integer Divide
4699 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb())) {
4700 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004701 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004702 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004703
4704 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004705 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004706
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004707 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004708 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004709 if (FPU & VFP2FPU)
4710 Builder.defineMacro("__ARM_VFPV2__");
4711 if (FPU & VFP3FPU)
4712 Builder.defineMacro("__ARM_VFPV3__");
4713 if (FPU & VFP4FPU)
4714 Builder.defineMacro("__ARM_VFPV4__");
4715 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004716
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004717 // This only gets set when Neon instructions are actually available, unlike
4718 // the VFP define, hence the soft float and arch check. This is subtly
4719 // different from gcc, we follow the intent which was that it should be set
4720 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004721 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004722 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004723 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004724 // current AArch32 NEON implementations do not support double-precision
4725 // floating-point even when it is present in VFP.
4726 Builder.defineMacro("__ARM_NEON_FP", "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004727 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004728
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004729 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4730 Opts.ShortWChar ? "2" : "4");
4731
4732 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4733 Opts.ShortEnums ? "1" : "4");
4734
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004735 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4737 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4738 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4739 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4740 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004741
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004742 // ACLE 6.4.7 DSP instructions
4743 bool hasDSP = false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004744 bool is5EOrAbove = (ArchVersion >= 6 ||
4745 (ArchVersion == 5 && CPUAttr.count('E')));
4746 // FIXME: We are not getting all 32-bit ARM architectures
4747 bool is32Bit = (!isThumb() || supportsThumb2());
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004748 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUAttr == "7EM")) {
4749 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
4750 hasDSP = true;
4751 }
4752
4753 // ACLE 6.4.8 Saturation instructions
4754 bool hasSAT = false;
4755 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4756 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
4757 hasSAT = true;
4758 }
4759
4760 // ACLE 6.4.6 Q (saturation) flag
4761 if (hasDSP || hasSAT)
4762 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004763 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004764
Craig Topper3164f332014-03-11 03:39:26 +00004765 void getTargetBuiltins(const Builtin::Info *&Records,
4766 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004767 Records = BuiltinInfo;
4768 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004769 }
Craig Topper3164f332014-03-11 03:39:26 +00004770 bool isCLZForZeroUndef() const override { return false; }
4771 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004772 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004773 }
Craig Topper3164f332014-03-11 03:39:26 +00004774 void getGCCRegNames(const char * const *&Names,
4775 unsigned &NumNames) const override;
4776 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4777 unsigned &NumAliases) const override;
4778 bool validateAsmConstraint(const char *&Name,
4779 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004780 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004781 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004782 case 'l': // r0-r7
4783 case 'h': // r8-r15
4784 case 'w': // VFP Floating point register single precision
4785 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004786 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004787 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004788 case 'I':
4789 case 'J':
4790 case 'K':
4791 case 'L':
4792 case 'M':
4793 // FIXME
4794 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004795 case 'Q': // A memory address that is a single base register.
4796 Info.setAllowsMemory();
4797 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004798 case 'U': // a memory reference...
4799 switch (Name[1]) {
4800 case 'q': // ...ARMV4 ldrsb
4801 case 'v': // ...VFP load/store (reg+constant offset)
4802 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004803 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004804 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004805 case 'n': // valid address for Neon doubleword vector load/store
4806 case 'm': // valid address for Neon element and structure load/store
4807 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004808 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004809 Info.setAllowsMemory();
4810 Name++;
4811 return true;
4812 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004813 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004814 return false;
4815 }
Craig Topper3164f332014-03-11 03:39:26 +00004816 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004817 std::string R;
4818 switch (*Constraint) {
4819 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004820 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004821 Constraint++;
4822 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004823 case 'p': // 'p' should be translated to 'r' by default.
4824 R = std::string("r");
4825 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004826 default:
4827 return std::string(1, *Constraint);
4828 }
4829 return R;
4830 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004831 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004832 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004833 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004834 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004835 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004836
Bill Wendling9d1ee112012-10-25 23:28:48 +00004837 // Strip off constraint modifiers.
4838 while (Constraint[0] == '=' ||
4839 Constraint[0] == '+' ||
4840 Constraint[0] == '&')
4841 Constraint = Constraint.substr(1);
4842
4843 switch (Constraint[0]) {
4844 default: break;
4845 case 'r': {
4846 switch (Modifier) {
4847 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004848 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004849 case 'q':
4850 // A register of size 32 cannot fit a vector type.
4851 return false;
4852 }
4853 }
4854 }
4855
4856 return true;
4857 }
Craig Topper3164f332014-03-11 03:39:26 +00004858 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004859 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004860 return "";
4861 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004862
Craig Topper3164f332014-03-11 03:39:26 +00004863 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004864 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4865 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004866
Craig Topper3164f332014-03-11 03:39:26 +00004867 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004868 if (RegNo == 0) return 0;
4869 if (RegNo == 1) return 1;
4870 return -1;
4871 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004872
4873 bool hasSjLjLowering() const override {
4874 return true;
4875 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004876};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004877
Rafael Espindolaeb265472013-08-21 21:59:03 +00004878bool ARMTargetInfo::setFPMath(StringRef Name) {
4879 if (Name == "neon") {
4880 FPMath = FP_Neon;
4881 return true;
4882 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4883 Name == "vfp4") {
4884 FPMath = FP_VFP;
4885 return true;
4886 }
4887 return false;
4888}
4889
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004890const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004891 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004892 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004893 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4894
4895 // Float registers
4896 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4897 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4898 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004899 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004900
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004901 // Double registers
4902 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4903 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004904 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4905 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004906
4907 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004908 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4909 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004910};
4911
4912void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004913 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004914 Names = GCCRegNames;
4915 NumNames = llvm::array_lengthof(GCCRegNames);
4916}
4917
4918const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004919 { { "a1" }, "r0" },
4920 { { "a2" }, "r1" },
4921 { { "a3" }, "r2" },
4922 { { "a4" }, "r3" },
4923 { { "v1" }, "r4" },
4924 { { "v2" }, "r5" },
4925 { { "v3" }, "r6" },
4926 { { "v4" }, "r7" },
4927 { { "v5" }, "r8" },
4928 { { "v6", "rfp" }, "r9" },
4929 { { "sl" }, "r10" },
4930 { { "fp" }, "r11" },
4931 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004932 { { "r13" }, "sp" },
4933 { { "r14" }, "lr" },
4934 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004935 // The S, D and Q registers overlap, but aren't really aliases; we
4936 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004937};
4938
4939void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4940 unsigned &NumAliases) const {
4941 Aliases = GCCRegAliases;
4942 NumAliases = llvm::array_lengthof(GCCRegAliases);
4943}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004944
4945const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004946#define BUILTIN(ID, TYPE, ATTRS) \
4947 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
4948#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4949 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004950#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004951
Craig Topper07d3b622015-08-07 05:14:44 +00004952#define BUILTIN(ID, TYPE, ATTRS) \
4953 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
4954#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
4955 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr},
4956#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4957 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004958#include "clang/Basic/BuiltinsARM.def"
4959};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004960
4961class ARMleTargetInfo : public ARMTargetInfo {
4962public:
4963 ARMleTargetInfo(const llvm::Triple &Triple)
4964 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004965 void getTargetDefines(const LangOptions &Opts,
4966 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004967 Builder.defineMacro("__ARMEL__");
4968 ARMTargetInfo::getTargetDefines(Opts, Builder);
4969 }
4970};
4971
4972class ARMbeTargetInfo : public ARMTargetInfo {
4973public:
4974 ARMbeTargetInfo(const llvm::Triple &Triple)
4975 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004976 void getTargetDefines(const LangOptions &Opts,
4977 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004978 Builder.defineMacro("__ARMEB__");
4979 Builder.defineMacro("__ARM_BIG_ENDIAN");
4980 ARMTargetInfo::getTargetDefines(Opts, Builder);
4981 }
4982};
Chris Lattner17df24e2008-04-21 18:56:49 +00004983
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004984class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4985 const llvm::Triple Triple;
4986public:
4987 WindowsARMTargetInfo(const llvm::Triple &Triple)
4988 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4989 TLSSupported = false;
4990 WCharType = UnsignedShort;
4991 SizeType = UnsignedInt;
4992 UserLabelPrefix = "";
4993 }
4994 void getVisualStudioDefines(const LangOptions &Opts,
4995 MacroBuilder &Builder) const {
4996 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4997
4998 // FIXME: this is invalid for WindowsCE
4999 Builder.defineMacro("_M_ARM_NT", "1");
5000 Builder.defineMacro("_M_ARMT", "_M_ARM");
5001 Builder.defineMacro("_M_THUMB", "_M_ARM");
5002
5003 assert((Triple.getArch() == llvm::Triple::arm ||
5004 Triple.getArch() == llvm::Triple::thumb) &&
5005 "invalid architecture for Windows ARM target info");
5006 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5007 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5008
5009 // TODO map the complete set of values
5010 // 31: VFPv3 40: VFPv4
5011 Builder.defineMacro("_M_ARM_FP", "31");
5012 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005013 BuiltinVaListKind getBuiltinVaListKind() const override {
5014 return TargetInfo::CharPtrBuiltinVaList;
5015 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005016 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5017 switch (CC) {
5018 case CC_X86StdCall:
5019 case CC_X86ThisCall:
5020 case CC_X86FastCall:
5021 case CC_X86VectorCall:
5022 return CCCR_Ignore;
5023 case CC_C:
5024 return CCCR_OK;
5025 default:
5026 return CCCR_Warning;
5027 }
5028 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005029};
5030
5031// Windows ARM + Itanium C++ ABI Target
5032class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5033public:
5034 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5035 : WindowsARMTargetInfo(Triple) {
5036 TheCXXABI.set(TargetCXXABI::GenericARM);
5037 }
5038
5039 void getTargetDefines(const LangOptions &Opts,
5040 MacroBuilder &Builder) const override {
5041 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5042
5043 if (Opts.MSVCCompat)
5044 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5045 }
5046};
5047
5048// Windows ARM, MS (C++) ABI
5049class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5050public:
5051 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5052 : WindowsARMTargetInfo(Triple) {
5053 TheCXXABI.set(TargetCXXABI::Microsoft);
5054 }
5055
5056 void getTargetDefines(const LangOptions &Opts,
5057 MacroBuilder &Builder) const override {
5058 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5059 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5060 }
5061};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005062
Yaron Keren321249c2015-07-15 13:32:23 +00005063// ARM MinGW target
5064class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5065public:
5066 MinGWARMTargetInfo(const llvm::Triple &Triple)
5067 : WindowsARMTargetInfo(Triple) {
5068 TheCXXABI.set(TargetCXXABI::GenericARM);
5069 }
5070
5071 void getTargetDefines(const LangOptions &Opts,
5072 MacroBuilder &Builder) const override {
5073 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5074 DefineStd(Builder, "WIN32", Opts);
5075 DefineStd(Builder, "WINNT", Opts);
5076 Builder.defineMacro("_ARM_");
5077 addMinGWDefines(Opts, Builder);
5078 }
5079};
5080
5081// ARM Cygwin target
5082class CygwinARMTargetInfo : public ARMleTargetInfo {
5083public:
5084 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5085 TLSSupported = false;
5086 WCharType = UnsignedShort;
5087 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005088 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005089 }
5090 void getTargetDefines(const LangOptions &Opts,
5091 MacroBuilder &Builder) const override {
5092 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5093 Builder.defineMacro("_ARM_");
5094 Builder.defineMacro("__CYGWIN__");
5095 Builder.defineMacro("__CYGWIN32__");
5096 DefineStd(Builder, "unix", Opts);
5097 if (Opts.CPlusPlus)
5098 Builder.defineMacro("_GNU_SOURCE");
5099 }
5100};
5101
Mike Stump11289f42009-09-09 15:08:12 +00005102class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005103 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005104protected:
Craig Topper3164f332014-03-11 03:39:26 +00005105 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5106 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005107 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005108 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005109
Torok Edwinb2b37c62009-06-30 17:10:35 +00005110public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005111 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005112 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005113 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005114 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005115 // FIXME: This should be based off of the target features in
5116 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005117 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005118
5119 // Darwin on iOS uses a variant of the ARM C++ ABI.
5120 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005121 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005122};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005123
Tim Northover573cbee2014-05-24 12:52:07 +00005124class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005125 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005126 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5127 static const char *const GCCRegNames[];
5128
James Molloy75f5f9e2014-04-16 15:33:48 +00005129 enum FPUModeEnum {
5130 FPUMode,
5131 NeonMode
5132 };
5133
5134 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005135 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005136 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005137 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005138
Tim Northovera2ee4332014-03-29 15:09:45 +00005139 static const Builtin::Info BuiltinInfo[];
5140
5141 std::string ABI;
5142
5143public:
Tim Northover573cbee2014-05-24 12:52:07 +00005144 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005145 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005146
5147 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5148 WCharType = SignedInt;
5149
5150 // NetBSD apparently prefers consistency across ARM targets to consistency
5151 // across 64-bit targets.
5152 Int64Type = SignedLongLong;
5153 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005154 } else {
5155 WCharType = UnsignedInt;
5156 Int64Type = SignedLong;
5157 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005158 }
5159
Tim Northovera2ee4332014-03-29 15:09:45 +00005160 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005161 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005162 MaxAtomicInlineWidth = 128;
5163 MaxAtomicPromoteWidth = 128;
5164
Tim Northovera6a19f12015-02-06 01:25:07 +00005165 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005166 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5167
Tim Northovera2ee4332014-03-29 15:09:45 +00005168 // {} in inline assembly are neon specifiers, not assembly variant
5169 // specifiers.
5170 NoAsmVariants = true;
5171
Tim Northover7ad87af2015-01-16 18:44:04 +00005172 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5173 // contributes to the alignment of the containing aggregate in the same way
5174 // a plain (non bit-field) member of that type would, without exception for
5175 // zero-sized or anonymous bit-fields."
5176 UseBitFieldTypeAlignment = true;
5177 UseZeroLengthBitfieldAlignment = true;
5178
Tim Northover573cbee2014-05-24 12:52:07 +00005179 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005180 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5181 }
5182
Alp Toker4925ba72014-06-07 23:30:42 +00005183 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005184 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005185 if (Name != "aapcs" && Name != "darwinpcs")
5186 return false;
5187
5188 ABI = Name;
5189 return true;
5190 }
5191
David Blaikie1cbb9712014-11-14 19:09:44 +00005192 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005193 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005194 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005195 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005196 .Case("cyclone", true)
5197 .Default(false);
5198 return CPUKnown;
5199 }
5200
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005201 void getTargetDefines(const LangOptions &Opts,
5202 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005203 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005204 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005205
5206 // Target properties.
5207 Builder.defineMacro("_LP64");
5208 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005209
5210 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5211 Builder.defineMacro("__ARM_ACLE", "200");
5212 Builder.defineMacro("__ARM_ARCH", "8");
5213 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5214
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005215 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005216 Builder.defineMacro("__ARM_PCS_AAPCS64");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005217 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005218
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005219 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5220 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5221 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5222 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005223 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005224 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5225 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005226
5227 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5228
5229 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005230 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005231
5232 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5233 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005234 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5235 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005236
5237 if (Opts.FastMath || Opts.FiniteMathOnly)
5238 Builder.defineMacro("__ARM_FP_FAST");
5239
Richard Smithab506ad2014-10-20 23:26:58 +00005240 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005241 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5242
5243 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5244
5245 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5246 Opts.ShortEnums ? "1" : "4");
5247
James Molloy75f5f9e2014-04-16 15:33:48 +00005248 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005249 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005250 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005251 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005252 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005253
Bradley Smith418c5932014-05-02 15:17:51 +00005254 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005255 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005256
James Molloy75f5f9e2014-04-16 15:33:48 +00005257 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005258 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5259
5260 if (Unaligned)
5261 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005262
5263 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5264 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5265 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5266 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5267 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005268 }
5269
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005270 void getTargetBuiltins(const Builtin::Info *&Records,
5271 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005272 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005273 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005274 }
5275
David Blaikie1cbb9712014-11-14 19:09:44 +00005276 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005277 return Feature == "aarch64" ||
5278 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005279 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005280 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005281 }
5282
James Molloy5e73df52014-04-16 15:06:20 +00005283 bool handleTargetFeatures(std::vector<std::string> &Features,
5284 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005285 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005286 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005287 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005288 Unaligned = 1;
5289
Eric Christopher610fe112015-08-26 08:21:55 +00005290 for (const auto &Feature : Features) {
5291 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005292 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005293 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005294 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005295 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005296 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005297 if (Feature == "+strict-align")
5298 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005299 }
5300
Eric Christopher964a5f32015-08-05 23:48:05 +00005301 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005302
5303 return true;
5304 }
5305
David Blaikie1cbb9712014-11-14 19:09:44 +00005306 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005307
David Blaikie1cbb9712014-11-14 19:09:44 +00005308 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005309 return TargetInfo::AArch64ABIBuiltinVaList;
5310 }
5311
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005312 void getGCCRegNames(const char *const *&Names,
5313 unsigned &NumNames) const override;
5314 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5315 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005316
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005317 bool validateAsmConstraint(const char *&Name,
5318 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005319 switch (*Name) {
5320 default:
5321 return false;
5322 case 'w': // Floating point and SIMD registers (V0-V31)
5323 Info.setAllowsRegister();
5324 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005325 case 'I': // Constant that can be used with an ADD instruction
5326 case 'J': // Constant that can be used with a SUB instruction
5327 case 'K': // Constant that can be used with a 32-bit logical instruction
5328 case 'L': // Constant that can be used with a 64-bit logical instruction
5329 case 'M': // Constant that can be used as a 32-bit MOV immediate
5330 case 'N': // Constant that can be used as a 64-bit MOV immediate
5331 case 'Y': // Floating point constant zero
5332 case 'Z': // Integer constant zero
5333 return true;
5334 case 'Q': // A memory reference with base register and no offset
5335 Info.setAllowsMemory();
5336 return true;
5337 case 'S': // A symbolic address
5338 Info.setAllowsRegister();
5339 return true;
5340 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005341 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5342 // Utf: A memory address suitable for ldp/stp in TF mode.
5343 // Usa: An absolute symbolic address.
5344 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5345 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005346 case 'z': // Zero register, wzr or xzr
5347 Info.setAllowsRegister();
5348 return true;
5349 case 'x': // Floating point and SIMD registers (V0-V15)
5350 Info.setAllowsRegister();
5351 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005352 }
5353 return false;
5354 }
5355
Akira Hatanaka987f1862014-08-22 06:05:21 +00005356 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005357 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005358 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005359 // Strip off constraint modifiers.
5360 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5361 Constraint = Constraint.substr(1);
5362
5363 switch (Constraint[0]) {
5364 default:
5365 return true;
5366 case 'z':
5367 case 'r': {
5368 switch (Modifier) {
5369 case 'x':
5370 case 'w':
5371 // For now assume that the person knows what they're
5372 // doing with the modifier.
5373 return true;
5374 default:
5375 // By default an 'r' constraint will be in the 'x'
5376 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005377 if (Size == 64)
5378 return true;
5379
5380 SuggestedModifier = "w";
5381 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005382 }
5383 }
5384 }
5385 }
5386
David Blaikie1cbb9712014-11-14 19:09:44 +00005387 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005388
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005389 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005390 if (RegNo == 0)
5391 return 0;
5392 if (RegNo == 1)
5393 return 1;
5394 return -1;
5395 }
5396};
5397
Tim Northover573cbee2014-05-24 12:52:07 +00005398const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005399 // 32-bit Integer registers
5400 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5401 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5402 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5403
5404 // 64-bit Integer registers
5405 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5406 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5407 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5408
5409 // 32-bit floating point regsisters
5410 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5411 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5412 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5413
5414 // 64-bit floating point regsisters
5415 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5416 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5417 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5418
5419 // Vector registers
5420 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5421 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5422 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5423};
5424
Tim Northover573cbee2014-05-24 12:52:07 +00005425void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005426 unsigned &NumNames) const {
5427 Names = GCCRegNames;
5428 NumNames = llvm::array_lengthof(GCCRegNames);
5429}
5430
Tim Northover573cbee2014-05-24 12:52:07 +00005431const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005432 { { "w31" }, "wsp" },
5433 { { "x29" }, "fp" },
5434 { { "x30" }, "lr" },
5435 { { "x31" }, "sp" },
5436 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5437 // don't want to substitute one of these for a different-sized one.
5438};
5439
Tim Northover573cbee2014-05-24 12:52:07 +00005440void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005441 unsigned &NumAliases) const {
5442 Aliases = GCCRegAliases;
5443 NumAliases = llvm::array_lengthof(GCCRegAliases);
5444}
5445
Tim Northover573cbee2014-05-24 12:52:07 +00005446const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005447#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005448 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005449#include "clang/Basic/BuiltinsNEON.def"
5450
5451#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005452 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005453#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005454};
James Molloy5e73df52014-04-16 15:06:20 +00005455
Tim Northover573cbee2014-05-24 12:52:07 +00005456class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005457 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005458 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005459 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005460 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005461 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005462 }
5463
5464public:
Tim Northover573cbee2014-05-24 12:52:07 +00005465 AArch64leTargetInfo(const llvm::Triple &Triple)
5466 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005467 BigEndian = false;
5468 }
5469 void getTargetDefines(const LangOptions &Opts,
5470 MacroBuilder &Builder) const override {
5471 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005472 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005473 }
5474};
5475
Tim Northover573cbee2014-05-24 12:52:07 +00005476class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005477 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005478 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005479 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005480 }
5481
5482public:
Tim Northover573cbee2014-05-24 12:52:07 +00005483 AArch64beTargetInfo(const llvm::Triple &Triple)
5484 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005485 void getTargetDefines(const LangOptions &Opts,
5486 MacroBuilder &Builder) const override {
5487 Builder.defineMacro("__AARCH64EB__");
5488 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5489 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005490 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005491 }
5492};
Tim Northovera2ee4332014-03-29 15:09:45 +00005493
Tim Northover573cbee2014-05-24 12:52:07 +00005494class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005495protected:
5496 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5497 MacroBuilder &Builder) const override {
5498 Builder.defineMacro("__AARCH64_SIMD__");
5499 Builder.defineMacro("__ARM64_ARCH_8__");
5500 Builder.defineMacro("__ARM_NEON__");
5501 Builder.defineMacro("__LITTLE_ENDIAN__");
5502 Builder.defineMacro("__REGISTER_PREFIX__", "");
5503 Builder.defineMacro("__arm64", "1");
5504 Builder.defineMacro("__arm64__", "1");
5505
5506 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5507 }
5508
Tim Northovera2ee4332014-03-29 15:09:45 +00005509public:
Tim Northover573cbee2014-05-24 12:52:07 +00005510 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5511 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005512 Int64Type = SignedLongLong;
5513 WCharType = SignedInt;
5514 UseSignedCharForObjCBool = false;
5515
Tim Northovera6a19f12015-02-06 01:25:07 +00005516 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005517 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5518
5519 TheCXXABI.set(TargetCXXABI::iOS64);
5520 }
5521
David Blaikie1cbb9712014-11-14 19:09:44 +00005522 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005523 return TargetInfo::CharPtrBuiltinVaList;
5524 }
5525};
Tim Northovera2ee4332014-03-29 15:09:45 +00005526
Tony Linthicum76329bf2011-12-12 21:14:55 +00005527// Hexagon abstract base class
5528class HexagonTargetInfo : public TargetInfo {
5529 static const Builtin::Info BuiltinInfo[];
5530 static const char * const GCCRegNames[];
5531 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5532 std::string CPU;
5533public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005534 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005535 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005536 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005537
5538 // {} in inline assembly are packet specifiers, not assembly variant
5539 // specifiers.
5540 NoAsmVariants = true;
5541 }
5542
Craig Topper3164f332014-03-11 03:39:26 +00005543 void getTargetBuiltins(const Builtin::Info *&Records,
5544 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005545 Records = BuiltinInfo;
5546 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5547 }
5548
Craig Topper3164f332014-03-11 03:39:26 +00005549 bool validateAsmConstraint(const char *&Name,
5550 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005551 return true;
5552 }
5553
Craig Topper3164f332014-03-11 03:39:26 +00005554 void getTargetDefines(const LangOptions &Opts,
5555 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005556
Craig Topper3164f332014-03-11 03:39:26 +00005557 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005558 return Feature == "hexagon";
5559 }
Craig Topper3164f332014-03-11 03:39:26 +00005560
5561 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005562 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005563 }
Craig Topper3164f332014-03-11 03:39:26 +00005564 void getGCCRegNames(const char * const *&Names,
5565 unsigned &NumNames) const override;
5566 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5567 unsigned &NumAliases) const override;
5568 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005569 return "";
5570 }
Sebastian Pop86500282012-01-13 20:37:10 +00005571
5572 static const char *getHexagonCPUSuffix(StringRef Name) {
5573 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005574 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005575 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005576 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005577 }
5578
Craig Topper3164f332014-03-11 03:39:26 +00005579 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005580 if (!getHexagonCPUSuffix(Name))
5581 return false;
5582
Tony Linthicum76329bf2011-12-12 21:14:55 +00005583 CPU = Name;
5584 return true;
5585 }
5586};
5587
5588void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5589 MacroBuilder &Builder) const {
5590 Builder.defineMacro("qdsp6");
5591 Builder.defineMacro("__qdsp6", "1");
5592 Builder.defineMacro("__qdsp6__", "1");
5593
5594 Builder.defineMacro("hexagon");
5595 Builder.defineMacro("__hexagon", "1");
5596 Builder.defineMacro("__hexagon__", "1");
5597
5598 if(CPU == "hexagonv1") {
5599 Builder.defineMacro("__HEXAGON_V1__");
5600 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5601 if(Opts.HexagonQdsp6Compat) {
5602 Builder.defineMacro("__QDSP6_V1__");
5603 Builder.defineMacro("__QDSP6_ARCH__", "1");
5604 }
5605 }
5606 else if(CPU == "hexagonv2") {
5607 Builder.defineMacro("__HEXAGON_V2__");
5608 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5609 if(Opts.HexagonQdsp6Compat) {
5610 Builder.defineMacro("__QDSP6_V2__");
5611 Builder.defineMacro("__QDSP6_ARCH__", "2");
5612 }
5613 }
5614 else if(CPU == "hexagonv3") {
5615 Builder.defineMacro("__HEXAGON_V3__");
5616 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5617 if(Opts.HexagonQdsp6Compat) {
5618 Builder.defineMacro("__QDSP6_V3__");
5619 Builder.defineMacro("__QDSP6_ARCH__", "3");
5620 }
5621 }
5622 else if(CPU == "hexagonv4") {
5623 Builder.defineMacro("__HEXAGON_V4__");
5624 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5625 if(Opts.HexagonQdsp6Compat) {
5626 Builder.defineMacro("__QDSP6_V4__");
5627 Builder.defineMacro("__QDSP6_ARCH__", "4");
5628 }
5629 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005630 else if(CPU == "hexagonv5") {
5631 Builder.defineMacro("__HEXAGON_V5__");
5632 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5633 if(Opts.HexagonQdsp6Compat) {
5634 Builder.defineMacro("__QDSP6_V5__");
5635 Builder.defineMacro("__QDSP6_ARCH__", "5");
5636 }
5637 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005638}
5639
5640const char * const HexagonTargetInfo::GCCRegNames[] = {
5641 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5642 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5643 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5644 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5645 "p0", "p1", "p2", "p3",
5646 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5647};
5648
5649void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5650 unsigned &NumNames) const {
5651 Names = GCCRegNames;
5652 NumNames = llvm::array_lengthof(GCCRegNames);
5653}
5654
5655
5656const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5657 { { "sp" }, "r29" },
5658 { { "fp" }, "r30" },
5659 { { "lr" }, "r31" },
5660 };
5661
5662void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5663 unsigned &NumAliases) const {
5664 Aliases = GCCRegAliases;
5665 NumAliases = llvm::array_lengthof(GCCRegAliases);
5666}
5667
5668
5669const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005670#define BUILTIN(ID, TYPE, ATTRS) \
5671 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5672#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5673 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005674#include "clang/Basic/BuiltinsHexagon.def"
5675};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005676
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005677// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5678class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005679 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5680 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005681 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005682public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005683 SparcTargetInfo(const llvm::Triple &Triple)
5684 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005685
Craig Topper3164f332014-03-11 03:39:26 +00005686 bool handleTargetFeatures(std::vector<std::string> &Features,
5687 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005688 // The backend doesn't actually handle soft float yet, but in case someone
5689 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005690 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5691 if (Feature != Features.end()) {
5692 SoftFloat = true;
5693 Features.erase(Feature);
5694 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005695 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005696 }
Craig Topper3164f332014-03-11 03:39:26 +00005697 void getTargetDefines(const LangOptions &Opts,
5698 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005699 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005700 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005701
5702 if (SoftFloat)
5703 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005704 }
Craig Topper3164f332014-03-11 03:39:26 +00005705
5706 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005707 return llvm::StringSwitch<bool>(Feature)
5708 .Case("softfloat", SoftFloat)
5709 .Case("sparc", true)
5710 .Default(false);
5711 }
Craig Topper3164f332014-03-11 03:39:26 +00005712
5713 void getTargetBuiltins(const Builtin::Info *&Records,
5714 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005715 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005716 }
Craig Topper3164f332014-03-11 03:39:26 +00005717 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005718 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005719 }
Craig Topper3164f332014-03-11 03:39:26 +00005720 void getGCCRegNames(const char * const *&Names,
5721 unsigned &NumNames) const override;
5722 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5723 unsigned &NumAliases) const override;
5724 bool validateAsmConstraint(const char *&Name,
5725 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005726 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005727 switch (*Name) {
5728 case 'I': // Signed 13-bit constant
5729 case 'J': // Zero
5730 case 'K': // 32-bit constant with the low 12 bits clear
5731 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5732 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5733 case 'N': // Same as 'K' but zext (required for SIMode)
5734 case 'O': // The constant 4096
5735 return true;
5736 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005737 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005738 }
Craig Topper3164f332014-03-11 03:39:26 +00005739 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005740 // FIXME: Implement!
5741 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005742 }
5743};
5744
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005745const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005746 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5747 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5748 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5749 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5750};
5751
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005752void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5753 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005754 Names = GCCRegNames;
5755 NumNames = llvm::array_lengthof(GCCRegNames);
5756}
5757
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005758const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005759 { { "g0" }, "r0" },
5760 { { "g1" }, "r1" },
5761 { { "g2" }, "r2" },
5762 { { "g3" }, "r3" },
5763 { { "g4" }, "r4" },
5764 { { "g5" }, "r5" },
5765 { { "g6" }, "r6" },
5766 { { "g7" }, "r7" },
5767 { { "o0" }, "r8" },
5768 { { "o1" }, "r9" },
5769 { { "o2" }, "r10" },
5770 { { "o3" }, "r11" },
5771 { { "o4" }, "r12" },
5772 { { "o5" }, "r13" },
5773 { { "o6", "sp" }, "r14" },
5774 { { "o7" }, "r15" },
5775 { { "l0" }, "r16" },
5776 { { "l1" }, "r17" },
5777 { { "l2" }, "r18" },
5778 { { "l3" }, "r19" },
5779 { { "l4" }, "r20" },
5780 { { "l5" }, "r21" },
5781 { { "l6" }, "r22" },
5782 { { "l7" }, "r23" },
5783 { { "i0" }, "r24" },
5784 { { "i1" }, "r25" },
5785 { { "i2" }, "r26" },
5786 { { "i3" }, "r27" },
5787 { { "i4" }, "r28" },
5788 { { "i5" }, "r29" },
5789 { { "i6", "fp" }, "r30" },
5790 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005791};
5792
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005793void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5794 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005795 Aliases = GCCRegAliases;
5796 NumAliases = llvm::array_lengthof(GCCRegAliases);
5797}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005798
5799// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5800class SparcV8TargetInfo : public SparcTargetInfo {
5801public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005802 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005803 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005804 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5805 switch (getTriple().getOS()) {
5806 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005807 SizeType = UnsignedInt;
5808 IntPtrType = SignedInt;
5809 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005810 break;
5811 case llvm::Triple::NetBSD:
5812 case llvm::Triple::OpenBSD:
5813 SizeType = UnsignedLong;
5814 IntPtrType = SignedLong;
5815 PtrDiffType = SignedLong;
5816 break;
Brad Smith56495d52015-08-13 22:00:53 +00005817 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005818 }
5819
Craig Topper3164f332014-03-11 03:39:26 +00005820 void getTargetDefines(const LangOptions &Opts,
5821 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005822 SparcTargetInfo::getTargetDefines(Opts, Builder);
5823 Builder.defineMacro("__sparcv8");
5824 }
5825};
5826
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005827// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5828class SparcV8elTargetInfo : public SparcV8TargetInfo {
5829 public:
5830 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005831 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005832 BigEndian = false;
5833 }
5834};
5835
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005836// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5837class SparcV9TargetInfo : public SparcTargetInfo {
5838public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005839 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005840 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005841 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005842 // This is an LP64 platform.
5843 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005844
5845 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005846 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005847 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005848 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005849 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005850 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005851
5852 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5853 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5854 LongDoubleWidth = 128;
5855 LongDoubleAlign = 128;
5856 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005857 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005858 }
5859
Craig Topper3164f332014-03-11 03:39:26 +00005860 void getTargetDefines(const LangOptions &Opts,
5861 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005862 SparcTargetInfo::getTargetDefines(Opts, Builder);
5863 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005864 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005865 // Solaris doesn't need these variants, but the BSDs do.
5866 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005867 Builder.defineMacro("__sparc64__");
5868 Builder.defineMacro("__sparc_v9__");
5869 Builder.defineMacro("__sparcv9__");
5870 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005871 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005872
Craig Topper3164f332014-03-11 03:39:26 +00005873 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005874 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5875 .Case("v9", true)
5876 .Case("ultrasparc", true)
5877 .Case("ultrasparc3", true)
5878 .Case("niagara", true)
5879 .Case("niagara2", true)
5880 .Case("niagara3", true)
5881 .Case("niagara4", true)
5882 .Default(false);
5883
5884 // No need to store the CPU yet. There aren't any CPU-specific
5885 // macros to define.
5886 return CPUKnown;
5887 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005888};
5889
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005890class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005891 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005892 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005893 std::string CPU;
5894 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005895 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005896
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005897public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005898 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005899 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005900 IntMaxType = SignedLong;
5901 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005902 TLSSupported = true;
5903 IntWidth = IntAlign = 32;
5904 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5905 PointerWidth = PointerAlign = 64;
5906 LongDoubleWidth = 128;
5907 LongDoubleAlign = 64;
5908 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005909 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005910 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005911 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 +00005912 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5913 }
5914 void getTargetDefines(const LangOptions &Opts,
5915 MacroBuilder &Builder) const override {
5916 Builder.defineMacro("__s390__");
5917 Builder.defineMacro("__s390x__");
5918 Builder.defineMacro("__zarch__");
5919 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005920 if (HasTransactionalExecution)
5921 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005922 if (Opts.ZVector)
5923 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005924 }
5925 void getTargetBuiltins(const Builtin::Info *&Records,
5926 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005927 Records = BuiltinInfo;
5928 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005929 }
5930
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005931 void getGCCRegNames(const char *const *&Names,
5932 unsigned &NumNames) const override;
5933 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5934 unsigned &NumAliases) const override {
5935 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005936 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005937 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005938 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005939 bool validateAsmConstraint(const char *&Name,
5940 TargetInfo::ConstraintInfo &info) const override;
5941 const char *getClobbers() const override {
5942 // FIXME: Is this really right?
5943 return "";
5944 }
5945 BuiltinVaListKind getBuiltinVaListKind() const override {
5946 return TargetInfo::SystemZBuiltinVaList;
5947 }
5948 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005949 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005950 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5951 .Case("z10", true)
5952 .Case("z196", true)
5953 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005954 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005955 .Default(false);
5956
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005957 return CPUKnown;
5958 }
Eric Christopheref1e2952015-08-28 02:13:58 +00005959 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00005960 StringRef CPU,
5961 std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005962 if (CPU == "zEC12")
5963 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005964 if (CPU == "z13") {
5965 Features["transactional-execution"] = true;
5966 Features["vector"] = true;
5967 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005968 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005969 }
5970
5971 bool handleTargetFeatures(std::vector<std::string> &Features,
5972 DiagnosticsEngine &Diags) override {
5973 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005974 for (const auto &Feature : Features) {
5975 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005976 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005977 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005978 HasVector = true;
5979 }
5980 // If we use the vector ABI, vector types are 64-bit aligned.
5981 if (HasVector) {
5982 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005983 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5984 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005985 }
5986 return true;
5987 }
5988
5989 bool hasFeature(StringRef Feature) const override {
5990 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005991 .Case("systemz", true)
5992 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005993 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005994 .Default(false);
5995 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005996
5997 StringRef getABI() const override {
5998 if (HasVector)
5999 return "vector";
6000 return "";
6001 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006002
6003 bool useFloat128ManglingForLongDouble() const override {
6004 return true;
6005 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006006};
6007
6008const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6009#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006010 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006011#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006012};
6013
6014const char *const SystemZTargetInfo::GCCRegNames[] = {
6015 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6016 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6017 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6018 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6019};
6020
6021void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6022 unsigned &NumNames) const {
6023 Names = GCCRegNames;
6024 NumNames = llvm::array_lengthof(GCCRegNames);
6025}
6026
6027bool SystemZTargetInfo::
6028validateAsmConstraint(const char *&Name,
6029 TargetInfo::ConstraintInfo &Info) const {
6030 switch (*Name) {
6031 default:
6032 return false;
6033
6034 case 'a': // Address register
6035 case 'd': // Data register (equivalent to 'r')
6036 case 'f': // Floating-point register
6037 Info.setAllowsRegister();
6038 return true;
6039
6040 case 'I': // Unsigned 8-bit constant
6041 case 'J': // Unsigned 12-bit constant
6042 case 'K': // Signed 16-bit constant
6043 case 'L': // Signed 20-bit displacement (on all targets we support)
6044 case 'M': // 0x7fffffff
6045 return true;
6046
6047 case 'Q': // Memory with base and unsigned 12-bit displacement
6048 case 'R': // Likewise, plus an index
6049 case 'S': // Memory with base and signed 20-bit displacement
6050 case 'T': // Likewise, plus an index
6051 Info.setAllowsMemory();
6052 return true;
6053 }
6054}
Ulrich Weigand47445072013-05-06 16:26:41 +00006055
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006056 class MSP430TargetInfo : public TargetInfo {
6057 static const char * const GCCRegNames[];
6058 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006059 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006060 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006061 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00006062 IntWidth = 16; IntAlign = 16;
6063 LongWidth = 32; LongLongWidth = 64;
6064 LongAlign = LongLongAlign = 16;
6065 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006066 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006067 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00006068 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00006069 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006070 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00006071 SigAtomicType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00006072 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00006073 }
6074 void getTargetDefines(const LangOptions &Opts,
6075 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006076 Builder.defineMacro("MSP430");
6077 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006078 // FIXME: defines for different 'flavours' of MCU
6079 }
Craig Topper3164f332014-03-11 03:39:26 +00006080 void getTargetBuiltins(const Builtin::Info *&Records,
6081 unsigned &NumRecords) const override {
6082 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00006083 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006084 NumRecords = 0;
6085 }
Craig Topper3164f332014-03-11 03:39:26 +00006086 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006087 return Feature == "msp430";
6088 }
Craig Topper3164f332014-03-11 03:39:26 +00006089 void getGCCRegNames(const char * const *&Names,
6090 unsigned &NumNames) const override;
6091 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6092 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006093 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00006094 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006095 NumAliases = 0;
6096 }
Eric Christopher917e9522014-11-18 22:36:15 +00006097 bool
6098 validateAsmConstraint(const char *&Name,
6099 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006100 // FIXME: implement
6101 switch (*Name) {
6102 case 'K': // the constant 1
6103 case 'L': // constant -1^20 .. 1^19
6104 case 'M': // constant 1-4:
6105 return true;
6106 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00006107 // No target constraints for now.
6108 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006109 }
Craig Topper3164f332014-03-11 03:39:26 +00006110 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006111 // FIXME: Is this really right?
6112 return "";
6113 }
Craig Topper3164f332014-03-11 03:39:26 +00006114 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006115 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00006116 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006117 }
6118 };
6119
6120 const char * const MSP430TargetInfo::GCCRegNames[] = {
6121 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6122 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
6123 };
6124
6125 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
6126 unsigned &NumNames) const {
6127 Names = GCCRegNames;
6128 NumNames = llvm::array_lengthof(GCCRegNames);
6129 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00006130
Mike Stump11289f42009-09-09 15:08:12 +00006131 // LLVM and Clang cannot be used directly to output native binaries for
6132 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00006133 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00006134 //
6135 // TCE uses the llvm bitcode as input and uses it for generating customized
6136 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00006137 // publicly available in http://tce.cs.tut.fi
6138
Eli Friedman1f191002011-10-07 19:51:42 +00006139 static const unsigned TCEOpenCLAddrSpaceMap[] = {
6140 3, // opencl_global
6141 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006142 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006143 // FIXME: generic has to be added to the target
6144 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006145 0, // cuda_device
6146 0, // cuda_constant
6147 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00006148 };
6149
Eli Friedmana9c3d712009-08-19 20:47:07 +00006150 class TCETargetInfo : public TargetInfo{
6151 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006152 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00006153 TLSSupported = false;
6154 IntWidth = 32;
6155 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006156 PointerWidth = 32;
6157 IntAlign = 32;
6158 LongAlign = LongLongAlign = 32;
6159 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006160 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006161 SizeType = UnsignedInt;
6162 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006163 IntPtrType = SignedInt;
6164 PtrDiffType = SignedInt;
6165 FloatWidth = 32;
6166 FloatAlign = 32;
6167 DoubleWidth = 32;
6168 DoubleAlign = 32;
6169 LongDoubleWidth = 32;
6170 LongDoubleAlign = 32;
6171 FloatFormat = &llvm::APFloat::IEEEsingle;
6172 DoubleFormat = &llvm::APFloat::IEEEsingle;
6173 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Eric Christopher964a5f32015-08-05 23:48:05 +00006174 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6175 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00006176 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006177 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006178 }
6179
Craig Topper3164f332014-03-11 03:39:26 +00006180 void getTargetDefines(const LangOptions &Opts,
6181 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006182 DefineStd(Builder, "tce", Opts);
6183 Builder.defineMacro("__TCE__");
6184 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00006185 }
Craig Topper3164f332014-03-11 03:39:26 +00006186 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006187 return Feature == "tce";
6188 }
Craig Topper3164f332014-03-11 03:39:26 +00006189
6190 void getTargetBuiltins(const Builtin::Info *&Records,
6191 unsigned &NumRecords) const override {}
6192 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00006193 return "";
6194 }
Craig Topper3164f332014-03-11 03:39:26 +00006195 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006196 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006197 }
Craig Topper3164f332014-03-11 03:39:26 +00006198 void getGCCRegNames(const char * const *&Names,
6199 unsigned &NumNames) const override {}
6200 bool validateAsmConstraint(const char *&Name,
6201 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00006202 return true;
6203 }
Craig Topper3164f332014-03-11 03:39:26 +00006204 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6205 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00006206 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00006207
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006208class BPFTargetInfo : public TargetInfo {
6209public:
6210 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6211 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6212 SizeType = UnsignedLong;
6213 PtrDiffType = SignedLong;
6214 IntPtrType = SignedLong;
6215 IntMaxType = SignedLong;
6216 Int64Type = SignedLong;
6217 RegParmMax = 5;
6218 if (Triple.getArch() == llvm::Triple::bpfeb) {
6219 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006220 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006221 } else {
6222 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006223 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006224 }
6225 MaxAtomicPromoteWidth = 64;
6226 MaxAtomicInlineWidth = 64;
6227 TLSSupported = false;
6228 }
6229 void getTargetDefines(const LangOptions &Opts,
6230 MacroBuilder &Builder) const override {
6231 DefineStd(Builder, "bpf", Opts);
6232 Builder.defineMacro("__BPF__");
6233 }
6234 bool hasFeature(StringRef Feature) const override {
6235 return Feature == "bpf";
6236 }
6237
6238 void getTargetBuiltins(const Builtin::Info *&Records,
6239 unsigned &NumRecords) const override {}
6240 const char *getClobbers() const override {
6241 return "";
6242 }
6243 BuiltinVaListKind getBuiltinVaListKind() const override {
6244 return TargetInfo::VoidPtrBuiltinVaList;
6245 }
6246 void getGCCRegNames(const char * const *&Names,
6247 unsigned &NumNames) const override {
6248 Names = nullptr;
6249 NumNames = 0;
6250 }
6251 bool validateAsmConstraint(const char *&Name,
6252 TargetInfo::ConstraintInfo &info) const override {
6253 return true;
6254 }
6255 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6256 unsigned &NumAliases) const override {
6257 Aliases = nullptr;
6258 NumAliases = 0;
6259 }
6260};
6261
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006262class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006263 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006264
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006265 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006266 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006267 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006268 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006269 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006270 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006271 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006272 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006273 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006274 enum DspRevEnum {
6275 NoDSP, DSP1, DSP2
6276 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006277 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006278
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006279protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006280 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006281 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006282
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006283public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006284 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6285 const std::string &CPUStr)
6286 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006287 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006288 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6289 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6290 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006291
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006292 bool isNaN2008Default() const {
6293 return CPU == "mips32r6" || CPU == "mips64r6";
6294 }
6295
6296 bool isFP64Default() const {
6297 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6298 }
6299
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006300 bool isNan2008() const override {
6301 return IsNan2008;
6302 }
6303
Alp Toker4925ba72014-06-07 23:30:42 +00006304 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006305 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006306 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6307 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006308 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006309 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006310 .Case("mips1", IsMips32)
6311 .Case("mips2", IsMips32)
6312 .Case("mips3", true)
6313 .Case("mips4", true)
6314 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006315 .Case("mips32", IsMips32)
6316 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006317 .Case("mips32r3", IsMips32)
6318 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006319 .Case("mips32r6", IsMips32)
6320 .Case("mips64", true)
6321 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006322 .Case("mips64r3", true)
6323 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006324 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006325 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006326 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006327 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006328 const std::string& getCPU() const { return CPU; }
Eric Christopheref1e2952015-08-28 02:13:58 +00006329 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00006330 StringRef CPU,
6331 std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006332 if (CPU == "octeon")
6333 Features["mips64r2"] = Features["cnmips"] = true;
6334 else
6335 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006336 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006337 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006338
Craig Topper3164f332014-03-11 03:39:26 +00006339 void getTargetDefines(const LangOptions &Opts,
6340 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006341 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006342 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006343 if (Opts.GNUMode)
6344 Builder.defineMacro("mips");
6345
Simon Atanasyan683535b2012-08-29 19:14:58 +00006346 Builder.defineMacro("__REGISTER_PREFIX__", "");
6347
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006348 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006349 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006350 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006351 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006352 case SoftFloat:
6353 Builder.defineMacro("__mips_soft_float", Twine(1));
6354 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006355 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006356
Simon Atanasyan16071912013-04-14 14:07:30 +00006357 if (IsSingleFloat)
6358 Builder.defineMacro("__mips_single_float", Twine(1));
6359
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006360 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6361 Builder.defineMacro("_MIPS_FPSET",
6362 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6363
Simon Atanasyan72244b62012-07-05 16:06:06 +00006364 if (IsMips16)
6365 Builder.defineMacro("__mips16", Twine(1));
6366
Simon Atanasyan60777612013-04-14 14:07:51 +00006367 if (IsMicromips)
6368 Builder.defineMacro("__mips_micromips", Twine(1));
6369
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006370 if (IsNan2008)
6371 Builder.defineMacro("__mips_nan2008", Twine(1));
6372
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006373 switch (DspRev) {
6374 default:
6375 break;
6376 case DSP1:
6377 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6378 Builder.defineMacro("__mips_dsp", Twine(1));
6379 break;
6380 case DSP2:
6381 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6382 Builder.defineMacro("__mips_dspr2", Twine(1));
6383 Builder.defineMacro("__mips_dsp", Twine(1));
6384 break;
6385 }
6386
Jack Carter44ff1e52013-08-12 17:20:29 +00006387 if (HasMSA)
6388 Builder.defineMacro("__mips_msa", Twine(1));
6389
Simon Atanasyan26f19672012-04-05 19:28:31 +00006390 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6391 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6392 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006393
6394 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6395 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006396 }
6397
Craig Topper3164f332014-03-11 03:39:26 +00006398 void getTargetBuiltins(const Builtin::Info *&Records,
6399 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006400 Records = BuiltinInfo;
6401 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006402 }
Craig Topper3164f332014-03-11 03:39:26 +00006403 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006404 return llvm::StringSwitch<bool>(Feature)
6405 .Case("mips", true)
6406 .Case("fp64", HasFP64)
6407 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006408 }
Craig Topper3164f332014-03-11 03:39:26 +00006409 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006410 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006411 }
Craig Topper3164f332014-03-11 03:39:26 +00006412 void getGCCRegNames(const char * const *&Names,
6413 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006414 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006415 // CPU register names
6416 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006417 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6418 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6419 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006420 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6421 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006422 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6423 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6424 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6425 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006426 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006427 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006428 "$fcc5","$fcc6","$fcc7",
6429 // MSA register names
6430 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6431 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6432 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6433 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6434 // MSA control register names
6435 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6436 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006437 };
6438 Names = GCCRegNames;
6439 NumNames = llvm::array_lengthof(GCCRegNames);
6440 }
Craig Topper3164f332014-03-11 03:39:26 +00006441 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6442 unsigned &NumAliases) const override = 0;
6443 bool validateAsmConstraint(const char *&Name,
6444 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006445 switch (*Name) {
6446 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006447 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006448 case 'r': // CPU registers.
6449 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006450 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006451 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006452 case 'c': // $25 for indirect jumps
6453 case 'l': // lo register
6454 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006455 Info.setAllowsRegister();
6456 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006457 case 'I': // Signed 16-bit constant
6458 case 'J': // Integer 0
6459 case 'K': // Unsigned 16-bit constant
6460 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6461 case 'M': // Constants not loadable via lui, addiu, or ori
6462 case 'N': // Constant -1 to -65535
6463 case 'O': // A signed 15-bit constant
6464 case 'P': // A constant between 1 go 65535
6465 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006466 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006467 Info.setAllowsMemory();
6468 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006469 case 'Z':
6470 if (Name[1] == 'C') { // An address usable by ll, and sc.
6471 Info.setAllowsMemory();
6472 Name++; // Skip over 'Z'.
6473 return true;
6474 }
6475 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006476 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006477 }
6478
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006479 std::string convertConstraint(const char *&Constraint) const override {
6480 std::string R;
6481 switch (*Constraint) {
6482 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6483 if (Constraint[1] == 'C') {
6484 R = std::string("^") + std::string(Constraint, 2);
6485 Constraint++;
6486 return R;
6487 }
6488 break;
6489 }
6490 return TargetInfo::convertConstraint(Constraint);
6491 }
6492
Craig Topper3164f332014-03-11 03:39:26 +00006493 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006494 // In GCC, $1 is not widely used in generated code (it's used only in a few
6495 // specific situations), so there is no real need for users to add it to
6496 // the clobbers list if they want to use it in their inline assembly code.
6497 //
6498 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6499 // code generation, so using it in inline assembly without adding it to the
6500 // clobbers list can cause conflicts between the inline assembly code and
6501 // the surrounding generated code.
6502 //
6503 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6504 // operands, which will conflict with the ".set at" assembler option (which
6505 // we use only for inline assembly, in order to maintain compatibility with
6506 // GCC) and will also conflict with the user's usage of $1.
6507 //
6508 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6509 // register for generated code is to automatically clobber $1 for all inline
6510 // assembly code.
6511 //
6512 // FIXME: We should automatically clobber $1 only for inline assembly code
6513 // which actually uses it. This would allow LLVM to use $1 for inline
6514 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006515 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006516 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006517
Craig Topper3164f332014-03-11 03:39:26 +00006518 bool handleTargetFeatures(std::vector<std::string> &Features,
6519 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006520 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006521 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006522 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006523 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006524 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006525 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006526 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006527
Eric Christopher610fe112015-08-26 08:21:55 +00006528 for (const auto &Feature : Features) {
6529 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006530 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006531 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006532 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006533 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006534 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006535 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006536 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006537 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006538 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006539 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006540 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006541 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006542 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006543 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006544 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006545 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006546 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006547 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006548 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006549 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006550 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006551 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006552
Eric Christopher964a5f32015-08-05 23:48:05 +00006553 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006554
Rafael Espindolaeb265472013-08-21 21:59:03 +00006555 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006556 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006557
Craig Topper3164f332014-03-11 03:39:26 +00006558 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006559 if (RegNo == 0) return 4;
6560 if (RegNo == 1) return 5;
6561 return -1;
6562 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006563
6564 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006565};
6566
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006567const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006568#define BUILTIN(ID, TYPE, ATTRS) \
6569 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6570#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6571 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006572#include "clang/Basic/BuiltinsMips.def"
6573};
6574
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006575class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006576public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006577 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006578 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006579 SizeType = UnsignedInt;
6580 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006581 Int64Type = SignedLongLong;
6582 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006583 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006584 }
Craig Topper3164f332014-03-11 03:39:26 +00006585 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006586 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006587 ABI = Name;
6588 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006589 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006590 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006591 }
Craig Topper3164f332014-03-11 03:39:26 +00006592 void getTargetDefines(const LangOptions &Opts,
6593 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006594 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006595
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006596 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006597 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6598
6599 const std::string& CPUStr = getCPU();
6600 if (CPUStr == "mips32")
6601 Builder.defineMacro("__mips_isa_rev", "1");
6602 else if (CPUStr == "mips32r2")
6603 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006604 else if (CPUStr == "mips32r3")
6605 Builder.defineMacro("__mips_isa_rev", "3");
6606 else if (CPUStr == "mips32r5")
6607 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006608 else if (CPUStr == "mips32r6")
6609 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006610
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006611 if (ABI == "o32") {
6612 Builder.defineMacro("__mips_o32");
6613 Builder.defineMacro("_ABIO32", "1");
6614 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6615 }
6616 else if (ABI == "eabi")
6617 Builder.defineMacro("__mips_eabi");
6618 else
David Blaikie83d382b2011-09-23 05:06:16 +00006619 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006620 }
Craig Topper3164f332014-03-11 03:39:26 +00006621 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6622 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006623 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6624 { { "at" }, "$1" },
6625 { { "v0" }, "$2" },
6626 { { "v1" }, "$3" },
6627 { { "a0" }, "$4" },
6628 { { "a1" }, "$5" },
6629 { { "a2" }, "$6" },
6630 { { "a3" }, "$7" },
6631 { { "t0" }, "$8" },
6632 { { "t1" }, "$9" },
6633 { { "t2" }, "$10" },
6634 { { "t3" }, "$11" },
6635 { { "t4" }, "$12" },
6636 { { "t5" }, "$13" },
6637 { { "t6" }, "$14" },
6638 { { "t7" }, "$15" },
6639 { { "s0" }, "$16" },
6640 { { "s1" }, "$17" },
6641 { { "s2" }, "$18" },
6642 { { "s3" }, "$19" },
6643 { { "s4" }, "$20" },
6644 { { "s5" }, "$21" },
6645 { { "s6" }, "$22" },
6646 { { "s7" }, "$23" },
6647 { { "t8" }, "$24" },
6648 { { "t9" }, "$25" },
6649 { { "k0" }, "$26" },
6650 { { "k1" }, "$27" },
6651 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006652 { { "sp","$sp" }, "$29" },
6653 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006654 { { "ra" }, "$31" }
6655 };
6656 Aliases = GCCRegAliases;
6657 NumAliases = llvm::array_lengthof(GCCRegAliases);
6658 }
6659};
6660
6661class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006662 void setDataLayoutString() override {
6663 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006664 }
6665
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006666public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006667 Mips32EBTargetInfo(const llvm::Triple &Triple)
6668 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006669 }
Craig Topper3164f332014-03-11 03:39:26 +00006670 void getTargetDefines(const LangOptions &Opts,
6671 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006672 DefineStd(Builder, "MIPSEB", Opts);
6673 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006674 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006675 }
6676};
6677
6678class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006679 void setDataLayoutString() override {
6680 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006681 }
6682
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006684 Mips32ELTargetInfo(const llvm::Triple &Triple)
6685 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006686 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006687 }
Craig Topper3164f332014-03-11 03:39:26 +00006688 void getTargetDefines(const LangOptions &Opts,
6689 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006690 DefineStd(Builder, "MIPSEL", Opts);
6691 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006692 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006693 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006694};
Akira Hatanakabef17452011-09-20 19:21:49 +00006695
6696class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006697public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006698 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006699 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006700 LongDoubleWidth = LongDoubleAlign = 128;
6701 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006702 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6703 LongDoubleWidth = LongDoubleAlign = 64;
6704 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6705 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006706 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006707 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006708 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006709 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006710
6711 void setN64ABITypes() {
6712 LongWidth = LongAlign = 64;
6713 PointerWidth = PointerAlign = 64;
6714 SizeType = UnsignedLong;
6715 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006716 Int64Type = SignedLong;
6717 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006718 }
6719
6720 void setN32ABITypes() {
6721 LongWidth = LongAlign = 32;
6722 PointerWidth = PointerAlign = 32;
6723 SizeType = UnsignedInt;
6724 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006725 Int64Type = SignedLongLong;
6726 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006727 }
6728
Craig Topper3164f332014-03-11 03:39:26 +00006729 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006730 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006731 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006732 ABI = Name;
6733 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006734 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006735 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006736 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006737 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006738 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006739 }
6740 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006741 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006742
Craig Topper3164f332014-03-11 03:39:26 +00006743 void getTargetDefines(const LangOptions &Opts,
6744 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006745 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006746
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006747 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006748 Builder.defineMacro("__mips64");
6749 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006750 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6751
6752 const std::string& CPUStr = getCPU();
6753 if (CPUStr == "mips64")
6754 Builder.defineMacro("__mips_isa_rev", "1");
6755 else if (CPUStr == "mips64r2")
6756 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006757 else if (CPUStr == "mips64r3")
6758 Builder.defineMacro("__mips_isa_rev", "3");
6759 else if (CPUStr == "mips64r5")
6760 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006761 else if (CPUStr == "mips64r6")
6762 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006763
Akira Hatanakabef17452011-09-20 19:21:49 +00006764 if (ABI == "n32") {
6765 Builder.defineMacro("__mips_n32");
6766 Builder.defineMacro("_ABIN32", "2");
6767 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6768 }
6769 else if (ABI == "n64") {
6770 Builder.defineMacro("__mips_n64");
6771 Builder.defineMacro("_ABI64", "3");
6772 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6773 }
6774 else
David Blaikie83d382b2011-09-23 05:06:16 +00006775 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006776 }
Craig Topper3164f332014-03-11 03:39:26 +00006777 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6778 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006779 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6780 { { "at" }, "$1" },
6781 { { "v0" }, "$2" },
6782 { { "v1" }, "$3" },
6783 { { "a0" }, "$4" },
6784 { { "a1" }, "$5" },
6785 { { "a2" }, "$6" },
6786 { { "a3" }, "$7" },
6787 { { "a4" }, "$8" },
6788 { { "a5" }, "$9" },
6789 { { "a6" }, "$10" },
6790 { { "a7" }, "$11" },
6791 { { "t0" }, "$12" },
6792 { { "t1" }, "$13" },
6793 { { "t2" }, "$14" },
6794 { { "t3" }, "$15" },
6795 { { "s0" }, "$16" },
6796 { { "s1" }, "$17" },
6797 { { "s2" }, "$18" },
6798 { { "s3" }, "$19" },
6799 { { "s4" }, "$20" },
6800 { { "s5" }, "$21" },
6801 { { "s6" }, "$22" },
6802 { { "s7" }, "$23" },
6803 { { "t8" }, "$24" },
6804 { { "t9" }, "$25" },
6805 { { "k0" }, "$26" },
6806 { { "k1" }, "$27" },
6807 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006808 { { "sp","$sp" }, "$29" },
6809 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006810 { { "ra" }, "$31" }
6811 };
6812 Aliases = GCCRegAliases;
6813 NumAliases = llvm::array_lengthof(GCCRegAliases);
6814 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006815
6816 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006817};
6818
6819class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006820 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006821 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006822 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 +00006823 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006824 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006825
Akira Hatanakabef17452011-09-20 19:21:49 +00006826 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006827
Akira Hatanakabef17452011-09-20 19:21:49 +00006828public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006829 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006830 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006831 void getTargetDefines(const LangOptions &Opts,
6832 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006833 DefineStd(Builder, "MIPSEB", Opts);
6834 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006835 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006836 }
6837};
6838
6839class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006840 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006841 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006842 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 +00006843 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006844 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006845 }
6846public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006847 Mips64ELTargetInfo(const llvm::Triple &Triple)
6848 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006849 // Default ABI is n64.
6850 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006851 }
Craig Topper3164f332014-03-11 03:39:26 +00006852 void getTargetDefines(const LangOptions &Opts,
6853 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006854 DefineStd(Builder, "MIPSEL", Opts);
6855 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006856 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006857 }
6858};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006859
Ivan Krasindd7403e2011-08-24 20:22:22 +00006860class PNaClTargetInfo : public TargetInfo {
6861public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006862 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006863 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006864 this->UserLabelPrefix = "";
6865 this->LongAlign = 32;
6866 this->LongWidth = 32;
6867 this->PointerAlign = 32;
6868 this->PointerWidth = 32;
6869 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006870 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006871 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006872 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006873 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006874 this->SizeType = TargetInfo::UnsignedInt;
6875 this->PtrDiffType = TargetInfo::SignedInt;
6876 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006877 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006878 }
6879
Craig Toppere6f17d02014-03-11 04:07:52 +00006880 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006881 Builder.defineMacro("__le32__");
6882 Builder.defineMacro("__pnacl__");
6883 }
Craig Topper3164f332014-03-11 03:39:26 +00006884 void getTargetDefines(const LangOptions &Opts,
6885 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006886 getArchDefines(Opts, Builder);
6887 }
Craig Topper3164f332014-03-11 03:39:26 +00006888 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006889 return Feature == "pnacl";
6890 }
Craig Topper3164f332014-03-11 03:39:26 +00006891 void getTargetBuiltins(const Builtin::Info *&Records,
6892 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006893 }
Craig Topper3164f332014-03-11 03:39:26 +00006894 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006895 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006896 }
Craig Topper3164f332014-03-11 03:39:26 +00006897 void getGCCRegNames(const char * const *&Names,
6898 unsigned &NumNames) const override;
6899 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6900 unsigned &NumAliases) const override;
6901 bool validateAsmConstraint(const char *&Name,
6902 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006903 return false;
6904 }
6905
Craig Topper3164f332014-03-11 03:39:26 +00006906 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006907 return "";
6908 }
6909};
6910
6911void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6912 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006913 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006914 NumNames = 0;
6915}
6916
6917void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6918 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006919 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006920 NumAliases = 0;
6921}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006922
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006923// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6924class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6925public:
6926 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006927 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006928 }
6929
6930 BuiltinVaListKind getBuiltinVaListKind() const override {
6931 return TargetInfo::PNaClABIBuiltinVaList;
6932 }
6933};
6934
JF Bastien643817d2014-09-12 17:52:47 +00006935class Le64TargetInfo : public TargetInfo {
6936 static const Builtin::Info BuiltinInfo[];
6937
6938public:
6939 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6940 BigEndian = false;
6941 NoAsmVariants = true;
6942 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6943 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006944 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006945 }
6946
6947 void getTargetDefines(const LangOptions &Opts,
6948 MacroBuilder &Builder) const override {
6949 DefineStd(Builder, "unix", Opts);
6950 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6951 Builder.defineMacro("__ELF__");
6952 }
6953 void getTargetBuiltins(const Builtin::Info *&Records,
6954 unsigned &NumRecords) const override {
6955 Records = BuiltinInfo;
6956 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6957 }
6958 BuiltinVaListKind getBuiltinVaListKind() const override {
6959 return TargetInfo::PNaClABIBuiltinVaList;
6960 }
6961 const char *getClobbers() const override { return ""; }
6962 void getGCCRegNames(const char *const *&Names,
6963 unsigned &NumNames) const override {
6964 Names = nullptr;
6965 NumNames = 0;
6966 }
6967 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6968 unsigned &NumAliases) const override {
6969 Aliases = nullptr;
6970 NumAliases = 0;
6971 }
6972 bool validateAsmConstraint(const char *&Name,
6973 TargetInfo::ConstraintInfo &Info) const override {
6974 return false;
6975 }
6976
6977 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006978};
Dan Gohmanc2853072015-09-03 22:51:53 +00006979
6980class WebAssemblyTargetInfo : public TargetInfo {
6981 static const Builtin::Info BuiltinInfo[];
6982
6983 enum SIMDEnum {
6984 NoSIMD,
6985 SIMD128,
6986 } SIMDLevel;
6987
6988public:
6989 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6990 : TargetInfo(T), SIMDLevel(NoSIMD) {
6991 BigEndian = false;
6992 NoAsmVariants = true;
6993 SuitableAlign = 128;
6994 LargeArrayMinWidth = 128;
6995 LargeArrayAlign = 128;
6996 SimdDefaultAlign = 128;
6997 }
6998
6999protected:
7000 void getTargetDefines(const LangOptions &Opts,
7001 MacroBuilder &Builder) const override {
7002 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7003 if (SIMDLevel >= SIMD128)
7004 Builder.defineMacro("__wasm_simd128__");
7005 }
7006
7007private:
7008 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7009 StringRef CPU,
7010 std::vector<std::string> &FeaturesVec) const override {
7011 if (CPU == "bleeding-edge")
7012 Features["simd128"] = true;
7013 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7014 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007015 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007016 return llvm::StringSwitch<bool>(Feature)
7017 .Case("simd128", SIMDLevel >= SIMD128)
7018 .Default(false);
7019 }
7020 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007021 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007022 for (const auto &Feature : Features) {
7023 if (Feature == "+simd128") {
7024 SIMDLevel = std::max(SIMDLevel, SIMD128);
7025 continue;
7026 }
7027 if (Feature == "-simd128") {
7028 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7029 continue;
7030 }
7031
7032 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7033 << "-target-feature";
7034 return false;
7035 }
7036 return true;
7037 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007038 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007039 return llvm::StringSwitch<bool>(Name)
7040 .Case("mvp", true)
7041 .Case("bleeding-edge", true)
7042 .Case("generic", true)
7043 .Default(false);
7044 }
7045 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007046 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007047 Records = BuiltinInfo;
7048 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7049 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007050 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007051 // TODO: Implement va_list properly.
7052 return VoidPtrBuiltinVaList;
7053 }
7054 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007055 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007056 Names = nullptr;
7057 NumNames = 0;
7058 }
7059 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007060 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007061 Aliases = nullptr;
7062 NumAliases = 0;
7063 }
7064 bool
7065 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007066 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007067 return false;
7068 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007069 const char *getClobbers() const final { return ""; }
7070 bool isCLZForZeroUndef() const final { return false; }
7071 bool hasInt128Type() const final { return true; }
Dan Gohmanc2853072015-09-03 22:51:53 +00007072};
7073
7074const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7075#define BUILTIN(ID, TYPE, ATTRS) \
7076 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7077#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7078 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7079#include "clang/Basic/BuiltinsWebAssembly.def"
7080};
7081
7082class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7083public:
7084 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7085 : WebAssemblyTargetInfo(T) {
7086 // TODO: Set this to the correct value once the spec issues are resolved.
7087 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
7088 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7089 }
7090
7091protected:
7092 void getTargetDefines(const LangOptions &Opts,
7093 MacroBuilder &Builder) const override {
7094 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7095 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7096 }
7097};
7098
7099class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7100public:
7101 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7102 : WebAssemblyTargetInfo(T) {
7103 LongAlign = LongWidth = 64;
7104 PointerAlign = PointerWidth = 64;
7105 // TODO: Set this to the correct value once the spec issues are resolved.
7106 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
7107 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7108 }
7109
7110protected:
7111 void getTargetDefines(const LangOptions &Opts,
7112 MacroBuilder &Builder) const override {
7113 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7114 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7115 }
7116};
7117
JF Bastien643817d2014-09-12 17:52:47 +00007118} // end anonymous namespace.
7119
7120const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7121#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007122 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007123#include "clang/Basic/BuiltinsLe64.def"
7124};
7125
7126namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00007127 static const unsigned SPIRAddrSpaceMap[] = {
7128 1, // opencl_global
7129 3, // opencl_local
7130 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00007131 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00007132 0, // cuda_device
7133 0, // cuda_constant
7134 0 // cuda_shared
7135 };
7136 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00007137 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007138 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00007139 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7140 "SPIR target must use unknown OS");
7141 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7142 "SPIR target must use unknown environment type");
7143 BigEndian = false;
7144 TLSSupported = false;
7145 LongWidth = LongAlign = 64;
7146 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00007147 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00007148 // Define available target features
7149 // These must be defined in sorted order!
7150 NoAsmVariants = true;
7151 }
Craig Topper3164f332014-03-11 03:39:26 +00007152 void getTargetDefines(const LangOptions &Opts,
7153 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007154 DefineStd(Builder, "SPIR", Opts);
7155 }
Craig Topper3164f332014-03-11 03:39:26 +00007156 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007157 return Feature == "spir";
7158 }
Craig Topper3164f332014-03-11 03:39:26 +00007159
7160 void getTargetBuiltins(const Builtin::Info *&Records,
7161 unsigned &NumRecords) const override {}
7162 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007163 return "";
7164 }
Craig Topper3164f332014-03-11 03:39:26 +00007165 void getGCCRegNames(const char * const *&Names,
7166 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00007167 bool
7168 validateAsmConstraint(const char *&Name,
7169 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007170 return true;
7171 }
Craig Topper3164f332014-03-11 03:39:26 +00007172 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7173 unsigned &NumAliases) const override {}
7174 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007175 return TargetInfo::VoidPtrBuiltinVaList;
7176 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007177
7178 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7179 return (CC == CC_SpirFunction ||
7180 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
7181 }
7182
7183 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7184 return CC_SpirFunction;
7185 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007186 };
7187
7188
7189 class SPIR32TargetInfo : public SPIRTargetInfo {
7190 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007191 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00007192 PointerWidth = PointerAlign = 32;
7193 SizeType = TargetInfo::UnsignedInt;
7194 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00007195 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7196 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00007197 }
Craig Topper3164f332014-03-11 03:39:26 +00007198 void getTargetDefines(const LangOptions &Opts,
7199 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00007200 DefineStd(Builder, "SPIR32", Opts);
7201 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007202 };
7203
7204 class SPIR64TargetInfo : public SPIRTargetInfo {
7205 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007206 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00007207 PointerWidth = PointerAlign = 64;
7208 SizeType = TargetInfo::UnsignedLong;
7209 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00007210 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7211 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00007212 }
Craig Topper3164f332014-03-11 03:39:26 +00007213 void getTargetDefines(const LangOptions &Opts,
7214 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00007215 DefineStd(Builder, "SPIR64", Opts);
7216 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007217 };
Guy Benyeib798fc92012-12-11 21:38:14 +00007218
Robert Lytton0e076492013-08-13 09:43:10 +00007219class XCoreTargetInfo : public TargetInfo {
7220 static const Builtin::Info BuiltinInfo[];
7221public:
7222 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7223 BigEndian = false;
7224 NoAsmVariants = true;
7225 LongLongAlign = 32;
7226 SuitableAlign = 32;
7227 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007228 SizeType = UnsignedInt;
7229 PtrDiffType = SignedInt;
7230 IntPtrType = SignedInt;
7231 WCharType = UnsignedChar;
7232 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007233 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007234 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7235 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007236 }
Craig Topper3164f332014-03-11 03:39:26 +00007237 void getTargetDefines(const LangOptions &Opts,
7238 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007239 Builder.defineMacro("__XS1B__");
7240 }
Craig Topper3164f332014-03-11 03:39:26 +00007241 void getTargetBuiltins(const Builtin::Info *&Records,
7242 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007243 Records = BuiltinInfo;
7244 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7245 }
Craig Topper3164f332014-03-11 03:39:26 +00007246 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007247 return TargetInfo::VoidPtrBuiltinVaList;
7248 }
Craig Topper3164f332014-03-11 03:39:26 +00007249 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007250 return "";
7251 }
Craig Topper3164f332014-03-11 03:39:26 +00007252 void getGCCRegNames(const char * const *&Names,
7253 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007254 static const char * const GCCRegNames[] = {
7255 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7256 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7257 };
7258 Names = GCCRegNames;
7259 NumNames = llvm::array_lengthof(GCCRegNames);
7260 }
Craig Topper3164f332014-03-11 03:39:26 +00007261 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7262 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007263 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007264 NumAliases = 0;
7265 }
Craig Topper3164f332014-03-11 03:39:26 +00007266 bool validateAsmConstraint(const char *&Name,
7267 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007268 return false;
7269 }
Craig Topper3164f332014-03-11 03:39:26 +00007270 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007271 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7272 return (RegNo < 2)? RegNo : -1;
7273 }
Robert Lytton0e076492013-08-13 09:43:10 +00007274};
7275
7276const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007277#define BUILTIN(ID, TYPE, ATTRS) \
7278 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7279#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7280 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007281#include "clang/Basic/BuiltinsXCore.def"
7282};
7283} // end anonymous namespace.
7284
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007285namespace {
7286// x86_32 Android target
7287class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7288public:
7289 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7290 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7291 SuitableAlign = 32;
7292 LongDoubleWidth = 64;
7293 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7294 }
7295};
7296} // end anonymous namespace
7297
7298namespace {
7299// x86_64 Android target
7300class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7301public:
7302 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7303 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7304 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7305 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007306
7307 bool useFloat128ManglingForLongDouble() const override {
7308 return true;
7309 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007310};
7311} // end anonymous namespace
7312
Ivan Krasindd7403e2011-08-24 20:22:22 +00007313
Chris Lattner5ba61f02006-10-14 07:39:34 +00007314//===----------------------------------------------------------------------===//
7315// Driver code
7316//===----------------------------------------------------------------------===//
7317
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007318static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007319 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007320
Daniel Dunbar52322032009-08-18 05:47:58 +00007321 switch (Triple.getArch()) {
7322 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007323 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007324
Tim Northover2a0783d2014-05-30 14:14:07 +00007325 case llvm::Triple::xcore:
7326 return new XCoreTargetInfo(Triple);
7327
7328 case llvm::Triple::hexagon:
7329 return new HexagonTargetInfo(Triple);
7330
7331 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007332 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007333 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007334
7335 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007336 case llvm::Triple::FreeBSD:
7337 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007338 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007339 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007340 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007341 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007342 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007343 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007344 }
7345
Christian Pirker9b019ae2014-02-25 13:51:00 +00007346 case llvm::Triple::aarch64_be:
7347 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007348 case llvm::Triple::FreeBSD:
7349 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007350 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007351 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007352 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007353 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007354 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007355 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007356 }
7357
Daniel Dunbar52322032009-08-18 05:47:58 +00007358 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007359 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007360 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007361 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007362
Daniel Dunbar52322032009-08-18 05:47:58 +00007363 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007364 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007365 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007366 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007367 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007368 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007369 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007370 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007371 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007372 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007373 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007374 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007375 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007376 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007377 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007378 case llvm::Triple::Win32:
7379 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007380 case llvm::Triple::Cygnus:
7381 return new CygwinARMTargetInfo(Triple);
7382 case llvm::Triple::GNU:
7383 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007384 case llvm::Triple::Itanium:
7385 return new ItaniumWindowsARMleTargetInfo(Triple);
7386 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007387 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007388 return new MicrosoftARMleTargetInfo(Triple);
7389 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007390 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007391 return new ARMleTargetInfo(Triple);
7392 }
7393
7394 case llvm::Triple::armeb:
7395 case llvm::Triple::thumbeb:
7396 if (Triple.isOSDarwin())
7397 return new DarwinARMTargetInfo(Triple);
7398
7399 switch (os) {
7400 case llvm::Triple::Linux:
7401 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7402 case llvm::Triple::FreeBSD:
7403 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7404 case llvm::Triple::NetBSD:
7405 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7406 case llvm::Triple::OpenBSD:
7407 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7408 case llvm::Triple::Bitrig:
7409 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7410 case llvm::Triple::RTEMS:
7411 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7412 case llvm::Triple::NaCl:
7413 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7414 default:
7415 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007416 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007417
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007418 case llvm::Triple::bpfeb:
7419 case llvm::Triple::bpfel:
7420 return new BPFTargetInfo(Triple);
7421
Daniel Dunbar52322032009-08-18 05:47:58 +00007422 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007423 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007424
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007425 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007426 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007427 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007428 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007429 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007430 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007431 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007432 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007433 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007434 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007435 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007436 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007437 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007438
7439 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007440 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007441 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007442 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007443 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007444 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007445 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007446 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007447 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007448 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007449 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007450 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007451 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007452 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007453 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007454
Akira Hatanakabef17452011-09-20 19:21:49 +00007455 case llvm::Triple::mips64:
7456 switch (os) {
7457 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007458 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007459 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007460 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007461 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007462 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007463 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007464 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007465 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007466 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007467 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007468 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007469 }
7470
7471 case llvm::Triple::mips64el:
7472 switch (os) {
7473 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007474 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007475 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007476 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007477 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007478 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007479 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007480 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007481 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007482 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007483 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007484 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007485 }
7486
Ivan Krasindd7403e2011-08-24 20:22:22 +00007487 case llvm::Triple::le32:
7488 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007489 case llvm::Triple::NaCl:
7490 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7491 default:
7492 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007493 }
7494
JF Bastien643817d2014-09-12 17:52:47 +00007495 case llvm::Triple::le64:
7496 return new Le64TargetInfo(Triple);
7497
Daniel Dunbar52322032009-08-18 05:47:58 +00007498 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007499 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007500 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007501 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007502 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007503 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007504 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007505 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007506 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007507 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007508 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007509 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007510 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007511 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007512 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007513 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007514 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007515
7516 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007517 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007518 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007519 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007520 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007521 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007522 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007523 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007524 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007525 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007526 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007527 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007528 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007529 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007530 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007531
Bill Schmidt778d3872013-07-26 01:36:11 +00007532 case llvm::Triple::ppc64le:
7533 switch (os) {
7534 case llvm::Triple::Linux:
7535 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007536 case llvm::Triple::NetBSD:
7537 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007538 default:
7539 return new PPC64TargetInfo(Triple);
7540 }
7541
Peter Collingbournec947aae2012-05-20 23:28:41 +00007542 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007543 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007544 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007545 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007546
Tom Stellardd8e38a32015-01-06 20:34:47 +00007547 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007548 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007549 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007550
Daniel Dunbar52322032009-08-18 05:47:58 +00007551 case llvm::Triple::sparc:
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<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007555 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007556 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007557 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007558 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007559 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007560 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007561 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007562 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007563 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007564 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007565 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007566
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007567 // The 'sparcel' architecture copies all the above cases except for Solaris.
7568 case llvm::Triple::sparcel:
7569 switch (os) {
7570 case llvm::Triple::Linux:
7571 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7572 case llvm::Triple::NetBSD:
7573 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7574 case llvm::Triple::OpenBSD:
7575 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7576 case llvm::Triple::RTEMS:
7577 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7578 default:
7579 return new SparcV8elTargetInfo(Triple);
7580 }
7581
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007582 case llvm::Triple::sparcv9:
7583 switch (os) {
7584 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007585 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007586 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007587 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007588 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007589 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007590 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007591 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007592 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007593 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007594 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007595 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007596 }
7597
Ulrich Weigand47445072013-05-06 16:26:41 +00007598 case llvm::Triple::systemz:
7599 switch (os) {
7600 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007601 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007602 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007603 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007604 }
7605
Eli Friedmana9c3d712009-08-19 20:47:07 +00007606 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007607 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007608
Daniel Dunbar52322032009-08-18 05:47:58 +00007609 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007610 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007611 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007612
Daniel Dunbar52322032009-08-18 05:47:58 +00007613 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007614 case llvm::Triple::CloudABI:
7615 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007616 case llvm::Triple::Linux: {
7617 switch (Triple.getEnvironment()) {
7618 default:
7619 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7620 case llvm::Triple::Android:
7621 return new AndroidX86_32TargetInfo(Triple);
7622 }
7623 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007624 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007625 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007626 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007627 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007628 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007629 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007630 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007631 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007632 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007633 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007634 case llvm::Triple::KFreeBSD:
7635 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007636 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007637 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007638 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007639 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007640 case llvm::Triple::Win32: {
7641 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007642 case llvm::Triple::Cygnus:
7643 return new CygwinX86_32TargetInfo(Triple);
7644 case llvm::Triple::GNU:
7645 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007646 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007647 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007648 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007649 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007650 }
7651 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007652 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007653 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007654 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007655 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007656 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007657 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007658 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007659 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007660 }
7661
7662 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007663 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007664 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007665
Daniel Dunbar52322032009-08-18 05:47:58 +00007666 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007667 case llvm::Triple::CloudABI:
7668 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007669 case llvm::Triple::Linux: {
7670 switch (Triple.getEnvironment()) {
7671 default:
7672 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7673 case llvm::Triple::Android:
7674 return new AndroidX86_64TargetInfo(Triple);
7675 }
7676 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007677 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007678 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007679 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007680 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007681 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007682 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007683 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007684 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007685 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007686 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007687 case llvm::Triple::KFreeBSD:
7688 return new KFreeBSDTargetInfo<X86_64TargetInfo>(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_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007691 case llvm::Triple::Win32: {
7692 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007693 case llvm::Triple::Cygnus:
7694 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007695 case llvm::Triple::GNU:
7696 return new MinGWX86_64TargetInfo(Triple);
7697 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007698 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007699 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007700 }
7701 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007702 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007703 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007704 case llvm::Triple::PS4:
7705 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007706 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007707 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007708 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007709
Douglas Katzman78d7c542015-05-12 21:18:10 +00007710 case llvm::Triple::spir: {
7711 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7712 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7713 return nullptr;
7714 return new SPIR32TargetInfo(Triple);
7715 }
7716 case llvm::Triple::spir64: {
7717 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7718 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7719 return nullptr;
7720 return new SPIR64TargetInfo(Triple);
7721 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007722 case llvm::Triple::wasm32:
7723 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7724 return nullptr;
7725 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7726 case llvm::Triple::wasm64:
7727 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7728 return nullptr;
7729 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007730 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007731}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007732
7733/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007734/// options.
Alp Toker80758082014-07-06 05:26:44 +00007735TargetInfo *
7736TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7737 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007738 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007739
7740 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007741 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007742 if (!Target) {
7743 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007744 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007745 }
Alp Toker80758082014-07-06 05:26:44 +00007746 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007747
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007748 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007749 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7750 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007751 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007752 }
7753
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007754 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007755 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7756 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007757 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007758 }
7759
Rafael Espindolaeb265472013-08-21 21:59:03 +00007760 // Set the fp math unit.
7761 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7762 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007763 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007764 }
7765
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007766 // Compute the default target features, we need the target to handle this
7767 // because features may have dependencies on one another.
7768 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007769 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7770 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007771 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007772
7773 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007774 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007775 for (const auto &F : Features)
7776 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7777
Eric Christopher3ff21b32013-10-16 21:26:26 +00007778 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007779 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007780
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007781 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007782}