blob: 6d6a5d77e8b4d10c16c259356963c01b1224f8b2 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
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"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000186namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000187// CloudABI Target
188template <typename Target>
189class CloudABITargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 Builder.defineMacro("__CloudABI__");
194 Builder.defineMacro("__ELF__");
195
196 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
197 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
198 Builder.defineMacro("__STDC_UTF_16__");
199 Builder.defineMacro("__STDC_UTF_32__");
200 }
201
202public:
203 CloudABITargetInfo(const llvm::Triple &Triple)
204 : OSTargetInfo<Target>(Triple) {
205 this->UserLabelPrefix = "";
206 }
207};
208
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209template<typename Target>
210class DarwinTargetInfo : public OSTargetInfo<Target> {
211protected:
Craig Topper3164f332014-03-11 03:39:26 +0000212 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
213 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000214 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000215 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216 }
Mike Stump11289f42009-09-09 15:08:12 +0000217
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000219 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
220 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
221 this->MCountName = "\01mcount";
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223
Craig Topper3164f332014-03-11 03:39:26 +0000224 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000226 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000230 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000232
Craig Topper3164f332014-03-11 03:39:26 +0000233 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000234 // FIXME: We should return 0 when building kexts.
235 return "__TEXT,__StaticInit,regular,pure_instructions";
236 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000237
John McCalleed64c72012-01-29 01:20:30 +0000238 /// Darwin does not support protected visibility. Darwin's "default"
239 /// is very similar to ELF's "protected"; Darwin requires a "weak"
240 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000241 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000242 return false;
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244};
245
Chris Lattner30ba6742009-08-10 19:03:04 +0000246
Torok Edwinb2b37c62009-06-30 17:10:35 +0000247// DragonFlyBSD Target
248template<typename Target>
249class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
250protected:
Craig Topper3164f332014-03-11 03:39:26 +0000251 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
252 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000254 Builder.defineMacro("__DragonFly__");
255 Builder.defineMacro("__DragonFly_cc_version", "100001");
256 Builder.defineMacro("__ELF__");
257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 Builder.defineMacro("__tune_i386__");
259 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 }
261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000262 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
263 : OSTargetInfo<Target>(Triple) {
264 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000265
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000273 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274};
275
276// FreeBSD Target
277template<typename Target>
278class FreeBSDTargetInfo : public OSTargetInfo<Target> {
279protected:
Craig Topper3164f332014-03-11 03:39:26 +0000280 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282 // FreeBSD defines; list based off of gcc output
283
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000284 unsigned Release = Triple.getOSMajorVersion();
285 if (Release == 0U)
286 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000288 Builder.defineMacro("__FreeBSD__", Twine(Release));
289 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
291 DefineStd(Builder, "unix", Opts);
292 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000293
294 // On FreeBSD, wchar_t contains the number of the code point as
295 // used by the character set of the locale. These character sets are
296 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000297 //
298 // FIXME: This is wrong; the macro refers to the numerical values
299 // of wchar_t *literals*, which are not locale-dependent. However,
300 // FreeBSD systems apparently depend on us getting this wrong, and
301 // setting this to 1 is conforming even if all the basic source
302 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000303 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304 }
305public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000306 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
307 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000308
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000309 switch (Triple.getArch()) {
310 default:
311 case llvm::Triple::x86:
312 case llvm::Triple::x86_64:
313 this->MCountName = ".mcount";
314 break;
315 case llvm::Triple::mips:
316 case llvm::Triple::mipsel:
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000319 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000320 this->MCountName = "_mcount";
321 break;
322 case llvm::Triple::arm:
323 this->MCountName = "__mcount";
324 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000325 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327};
328
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000329// GNU/kFreeBSD Target
330template<typename Target>
331class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Craig Topper3164f332014-03-11 03:39:26 +0000333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000335 // GNU/kFreeBSD defines; list based off of gcc output
336
337 DefineStd(Builder, "unix", Opts);
338 Builder.defineMacro("__FreeBSD_kernel__");
339 Builder.defineMacro("__GLIBC__");
340 Builder.defineMacro("__ELF__");
341 if (Opts.POSIXThreads)
342 Builder.defineMacro("_REENTRANT");
343 if (Opts.CPlusPlus)
344 Builder.defineMacro("_GNU_SOURCE");
345 }
346public:
Eric Christopher917e9522014-11-18 22:36:15 +0000347 KFreeBSDTargetInfo(const llvm::Triple &Triple)
348 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000349 this->UserLabelPrefix = "";
350 }
351};
352
Chris Lattner3e2ee142010-07-07 16:01:42 +0000353// Minix Target
354template<typename Target>
355class MinixTargetInfo : public OSTargetInfo<Target> {
356protected:
Craig Topper3164f332014-03-11 03:39:26 +0000357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359 // Minix defines
360
361 Builder.defineMacro("__minix", "3");
362 Builder.defineMacro("_EM_WSIZE", "4");
363 Builder.defineMacro("_EM_PSIZE", "4");
364 Builder.defineMacro("_EM_SSIZE", "2");
365 Builder.defineMacro("_EM_LSIZE", "4");
366 Builder.defineMacro("_EM_FSIZE", "4");
367 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000368 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000369 DefineStd(Builder, "unix", Opts);
370 }
371public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000372 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
373 this->UserLabelPrefix = "";
374 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375};
376
Torok Edwinb2b37c62009-06-30 17:10:35 +0000377// Linux target
378template<typename Target>
379class LinuxTargetInfo : public OSTargetInfo<Target> {
380protected:
Craig Topper3164f332014-03-11 03:39:26 +0000381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
382 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000383 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000384 DefineStd(Builder, "unix", Opts);
385 DefineStd(Builder, "linux", Opts);
386 Builder.defineMacro("__gnu_linux__");
387 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000388 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000389 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000390 unsigned Maj, Min, Rev;
391 Triple.getOSVersion(Maj, Min, Rev);
392 this->PlatformName = "android";
393 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
394 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000399 }
400public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000401 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000402 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000403 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000404
405 switch (Triple.getArch()) {
406 default:
407 break;
408 case llvm::Triple::ppc:
409 case llvm::Triple::ppc64:
410 case llvm::Triple::ppc64le:
411 this->MCountName = "_mcount";
412 break;
413 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000414 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000415
Craig Topper3164f332014-03-11 03:39:26 +0000416 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000417 return ".text.startup";
418 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419};
420
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000421// NetBSD Target
422template<typename Target>
423class NetBSDTargetInfo : public OSTargetInfo<Target> {
424protected:
Craig Topper3164f332014-03-11 03:39:26 +0000425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000427 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000428 Builder.defineMacro("__NetBSD__");
429 Builder.defineMacro("__unix__");
430 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000431 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000432 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000433
434 switch (Triple.getArch()) {
435 default:
436 break;
437 case llvm::Triple::arm:
438 case llvm::Triple::armeb:
439 case llvm::Triple::thumb:
440 case llvm::Triple::thumbeb:
441 Builder.defineMacro("__ARM_DWARF_EH__");
442 break;
443 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000444 }
445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000446 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
448 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// OpenBSD Target
452template<typename Target>
453class OpenBSDTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // OpenBSD defines; list based off of gcc output
458
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 Builder.defineMacro("__OpenBSD__");
460 DefineStd(Builder, "unix", Opts);
461 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000462 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000463 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000464 }
465public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000466 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
467 this->UserLabelPrefix = "";
468 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469
Eli Friedman3715d1f2011-12-15 02:15:56 +0000470 switch (Triple.getArch()) {
471 default:
472 case llvm::Triple::x86:
473 case llvm::Triple::x86_64:
474 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000475 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000476 this->MCountName = "__mcount";
477 break;
478 case llvm::Triple::mips64:
479 case llvm::Triple::mips64el:
480 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000481 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000482 this->MCountName = "_mcount";
483 break;
484 }
485 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000486};
487
Eli Friedman9fa28852012-08-08 23:57:20 +0000488// Bitrig Target
489template<typename Target>
490class BitrigTargetInfo : public OSTargetInfo<Target> {
491protected:
Craig Topper3164f332014-03-11 03:39:26 +0000492 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
493 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000494 // Bitrig defines; list based off of gcc output
495
496 Builder.defineMacro("__Bitrig__");
497 DefineStd(Builder, "unix", Opts);
498 Builder.defineMacro("__ELF__");
499 if (Opts.POSIXThreads)
500 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000512 }
513public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000514 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
515 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000516 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000517 }
518};
519
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000520// PSP Target
521template<typename Target>
522class PSPTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000526 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000527 Builder.defineMacro("PSP");
528 Builder.defineMacro("_PSP");
529 Builder.defineMacro("__psp__");
530 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000531 }
532public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000533 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000534 this->UserLabelPrefix = "";
535 }
536};
537
John Thompsone467e192009-11-19 17:18:50 +0000538// PS3 PPU Target
539template<typename Target>
540class PS3PPUTargetInfo : public OSTargetInfo<Target> {
541protected:
Craig Topper3164f332014-03-11 03:39:26 +0000542 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
543 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000544 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000545 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000546 Builder.defineMacro("__PPU__");
547 Builder.defineMacro("__CELLOS_LV2__");
548 Builder.defineMacro("__ELF__");
549 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000550 Builder.defineMacro("_ARCH_PPC64");
551 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000552 }
553public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000554 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000555 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000556 this->LongWidth = this->LongAlign = 32;
557 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000559 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000560 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000561 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000562 }
563};
564
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000565template <typename Target>
566class PS4OSTargetInfo : public OSTargetInfo<Target> {
567protected:
568 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
569 MacroBuilder &Builder) const override {
570 Builder.defineMacro("__FreeBSD__", "9");
571 Builder.defineMacro("__FreeBSD_cc_version", "900001");
572 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
573 DefineStd(Builder, "unix", Opts);
574 Builder.defineMacro("__ELF__");
575 Builder.defineMacro("__PS4__");
576 }
577public:
578 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
579 this->WCharType = this->UnsignedShort;
580
581 this->UserLabelPrefix = "";
582
583 switch (Triple.getArch()) {
584 default:
585 case llvm::Triple::x86_64:
586 this->MCountName = ".mcount";
587 break;
588 }
589 }
590};
591
Torok Edwinb2b37c62009-06-30 17:10:35 +0000592// Solaris target
593template<typename Target>
594class SolarisTargetInfo : public OSTargetInfo<Target> {
595protected:
Craig Topper3164f332014-03-11 03:39:26 +0000596 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
597 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000598 DefineStd(Builder, "sun", Opts);
599 DefineStd(Builder, "unix", Opts);
600 Builder.defineMacro("__ELF__");
601 Builder.defineMacro("__svr4__");
602 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000603 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
604 // newer, but to 500 for everything else. feature_test.h has a check to
605 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000606 // with a new version.
607 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000608 Builder.defineMacro("_XOPEN_SOURCE", "600");
609 else
610 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000611 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000612 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000613 Builder.defineMacro("_LARGEFILE_SOURCE");
614 Builder.defineMacro("_LARGEFILE64_SOURCE");
615 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000616 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000617 }
618public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000619 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000620 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000621 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622 // FIXME: WIntType should be SignedLong
623 }
624};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000625
626// Windows target
627template<typename Target>
628class WindowsTargetInfo : public OSTargetInfo<Target> {
629protected:
Craig Topper3164f332014-03-11 03:39:26 +0000630 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
631 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000632 Builder.defineMacro("_WIN32");
633 }
634 void getVisualStudioDefines(const LangOptions &Opts,
635 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000637 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000638 Builder.defineMacro("_CPPRTTI");
639
Reid Kleckner16514352015-01-30 21:42:55 +0000640 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000641 Builder.defineMacro("_CPPUNWIND");
642 }
643
644 if (!Opts.CharIsSigned)
645 Builder.defineMacro("_CHAR_UNSIGNED");
646
647 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
648 // but it works for now.
649 if (Opts.POSIXThreads)
650 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000651
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000652 if (Opts.MSCompatibilityVersion) {
653 Builder.defineMacro("_MSC_VER",
654 Twine(Opts.MSCompatibilityVersion / 100000));
655 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000656 // FIXME We cannot encode the revision information into 32-bits
657 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000658
659 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(19))
660 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000661 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000662
663 if (Opts.MicrosoftExt) {
664 Builder.defineMacro("_MSC_EXTENSIONS");
665
666 if (Opts.CPlusPlus11) {
667 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
668 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
669 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
670 }
671 }
672
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000673 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000674 }
675
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000676public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000677 WindowsTargetInfo(const llvm::Triple &Triple)
678 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000679};
680
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000681template <typename Target>
682class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000683protected:
Craig Topper3164f332014-03-11 03:39:26 +0000684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000686 if (Opts.POSIXThreads)
687 Builder.defineMacro("_REENTRANT");
688 if (Opts.CPlusPlus)
689 Builder.defineMacro("_GNU_SOURCE");
690
691 DefineStd(Builder, "unix", Opts);
692 Builder.defineMacro("__ELF__");
693 Builder.defineMacro("__native_client__");
694 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000695
696public:
697 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000698 this->UserLabelPrefix = "";
699 this->LongAlign = 32;
700 this->LongWidth = 32;
701 this->PointerAlign = 32;
702 this->PointerWidth = 32;
703 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000704 this->Int64Type = TargetInfo::SignedLongLong;
705 this->DoubleAlign = 64;
706 this->LongDoubleWidth = 64;
707 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000708 this->LongLongWidth = 64;
709 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000710 this->SizeType = TargetInfo::UnsignedInt;
711 this->PtrDiffType = TargetInfo::SignedInt;
712 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000713 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000715 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000716 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000717 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000718 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000720 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::mipsel) {
722 // Handled on mips' setDescriptionString.
723 } else {
724 assert(Triple.getArch() == llvm::Triple::le32);
725 this->DescriptionString = "e-p:32:32-i64:64";
726 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000727 }
728};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000729
Chris Lattner09d98f52008-10-05 21:50:58 +0000730//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000731// Specific target implementations.
732//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000733
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000734// PPC abstract base class
735class PPCTargetInfo : public TargetInfo {
736 static const Builtin::Info BuiltinInfo[];
737 static const char * const GCCRegNames[];
738 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000739 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000740
741 // Target cpu features.
742 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000743 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000744 bool HasP8Crypto;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000745 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000746 bool HasHTM;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000747
Ulrich Weigand8afad612014-07-28 13:17:52 +0000748protected:
749 std::string ABI;
750
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000751public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000752 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000753 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Kit Barton8246f282015-03-25 19:41:41 +0000754 HasP8Crypto(false), HasQPX(false), HasHTM(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000755 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000756 LongDoubleWidth = LongDoubleAlign = 128;
757 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
758 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000759
Hal Finkel6b984f02012-07-03 16:51:04 +0000760 /// \brief Flags for architecture specific defines.
761 typedef enum {
762 ArchDefineNone = 0,
763 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
764 ArchDefinePpcgr = 1 << 1,
765 ArchDefinePpcsq = 1 << 2,
766 ArchDefine440 = 1 << 3,
767 ArchDefine603 = 1 << 4,
768 ArchDefine604 = 1 << 5,
769 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000770 ArchDefinePwr5 = 1 << 7,
771 ArchDefinePwr5x = 1 << 8,
772 ArchDefinePwr6 = 1 << 9,
773 ArchDefinePwr6x = 1 << 10,
774 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000775 ArchDefinePwr8 = 1 << 12,
776 ArchDefineA2 = 1 << 13,
777 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000778 } ArchDefineTypes;
779
Bill Schmidt38378a02013-02-01 20:23:10 +0000780 // Note: GCC recognizes the following additional cpus:
781 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
782 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
783 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000784 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000785 bool CPUKnown = llvm::StringSwitch<bool>(Name)
786 .Case("generic", true)
787 .Case("440", true)
788 .Case("450", true)
789 .Case("601", true)
790 .Case("602", true)
791 .Case("603", true)
792 .Case("603e", true)
793 .Case("603ev", true)
794 .Case("604", true)
795 .Case("604e", true)
796 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000797 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000798 .Case("g3", true)
799 .Case("7400", true)
800 .Case("g4", true)
801 .Case("7450", true)
802 .Case("g4+", true)
803 .Case("750", true)
804 .Case("970", true)
805 .Case("g5", true)
806 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000807 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000808 .Case("e500mc", true)
809 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000810 .Case("power3", true)
811 .Case("pwr3", true)
812 .Case("power4", true)
813 .Case("pwr4", true)
814 .Case("power5", true)
815 .Case("pwr5", true)
816 .Case("power5x", true)
817 .Case("pwr5x", true)
818 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000819 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000820 .Case("power6x", true)
821 .Case("pwr6x", true)
822 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000823 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000824 .Case("power8", true)
825 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000826 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000827 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000828 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000829 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000830 .Case("powerpc64le", true)
831 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000832 .Default(false);
833
834 if (CPUKnown)
835 CPU = Name;
836
837 return CPUKnown;
838 }
839
Ulrich Weigand8afad612014-07-28 13:17:52 +0000840
841 StringRef getABI() const override { return ABI; }
842
Craig Topper3164f332014-03-11 03:39:26 +0000843 void getTargetBuiltins(const Builtin::Info *&Records,
844 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000845 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000846 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000847 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000848
Craig Topper3164f332014-03-11 03:39:26 +0000849 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000850
Craig Topper3164f332014-03-11 03:39:26 +0000851 void getTargetDefines(const LangOptions &Opts,
852 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000853
Craig Topper3164f332014-03-11 03:39:26 +0000854 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000855
Craig Topper3164f332014-03-11 03:39:26 +0000856 bool handleTargetFeatures(std::vector<std::string> &Features,
857 DiagnosticsEngine &Diags) override;
858 bool hasFeature(StringRef Feature) const override;
859
860 void getGCCRegNames(const char * const *&Names,
861 unsigned &NumNames) const override;
862 void getGCCRegAliases(const GCCRegAlias *&Aliases,
863 unsigned &NumAliases) const override;
864 bool validateAsmConstraint(const char *&Name,
865 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000866 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000867 default: return false;
868 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000869 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000870 case 'b': // Base register
871 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000872 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000873 break;
874 // FIXME: The following are added to allow parsing.
875 // I just took a guess at what the actions should be.
876 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000877 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000878 case 'v': // Altivec vector register
879 Info.setAllowsRegister();
880 break;
881 case 'w':
882 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000883 case 'd':// VSX vector register to hold vector double data
884 case 'f':// VSX vector register to hold vector float data
885 case 's':// VSX vector register to hold scalar float data
886 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000887 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000888 break;
889 default:
890 return false;
891 }
892 Info.setAllowsRegister();
893 Name++; // Skip over 'w'.
894 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000895 case 'h': // `MQ', `CTR', or `LINK' register
896 case 'q': // `MQ' register
897 case 'c': // `CTR' register
898 case 'l': // `LINK' register
899 case 'x': // `CR' register (condition register) number 0
900 case 'y': // `CR' register (condition register)
901 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000902 Info.setAllowsRegister();
903 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000904 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000905 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000906 // (use `L' instead for SImode constants)
907 case 'K': // Unsigned 16-bit constant
908 case 'L': // Signed 16-bit constant shifted left 16 bits
909 case 'M': // Constant larger than 31
910 case 'N': // Exact power of 2
911 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000912 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000913 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000914 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000915 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000916 break;
917 case 'm': // Memory operand. Note that on PowerPC targets, m can
918 // include addresses that update the base register. It
919 // is therefore only safe to use `m' in an asm statement
920 // if that asm statement accesses the operand exactly once.
921 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000922 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000924 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000925 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000926 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
927 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000928 // register to be updated.
929 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000930 if (Name[1] != 's')
931 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000932 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000933 // include any automodification of the base register. Unlike
934 // `m', this constraint can be used in asm statements that
935 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000936 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000937 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000938 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000939 break;
940 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000942 case 'Z': // Memory operand that is an indexed or indirect from a
943 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000944 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000945 Info.setAllowsMemory();
946 Info.setAllowsRegister();
947 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000948 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000949 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 // register (`p' is preferable for asm statements)
951 case 'S': // Constant suitable as a 64-bit mask operand
952 case 'T': // Constant suitable as a 32-bit mask operand
953 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000954 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // instructions
956 case 'W': // Vector constant that does not require memory
957 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000958 break;
959 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000960 }
John Thompson07a61a42010-06-24 22:44:13 +0000961 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000962 }
Craig Topper3164f332014-03-11 03:39:26 +0000963 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000964 std::string R;
965 switch (*Constraint) {
966 case 'e':
967 case 'w':
968 // Two-character constraint; add "^" hint for later parsing.
969 R = std::string("^") + std::string(Constraint, 2);
970 Constraint++;
971 break;
972 default:
973 return TargetInfo::convertConstraint(Constraint);
974 }
975 return R;
976 }
Craig Topper3164f332014-03-11 03:39:26 +0000977 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000978 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000979 }
Craig Topper3164f332014-03-11 03:39:26 +0000980 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000981 if (RegNo == 0) return 3;
982 if (RegNo == 1) return 4;
983 return -1;
984 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000985
986 bool hasSjLjLowering() const override {
987 return true;
988 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000989};
Anders Carlssonf511f642007-11-27 04:11:28 +0000990
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000991const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000992#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000993#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000994 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000995#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000996};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000997
Eric Christopher917e9522014-11-18 22:36:15 +0000998/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000999/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001000bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001001 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001002 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1003 // Ignore disabled features.
1004 if (Features[i][0] == '-')
1005 continue;
1006
1007 StringRef Feature = StringRef(Features[i]).substr(1);
1008
1009 if (Feature == "vsx") {
1010 HasVSX = true;
1011 continue;
1012 }
1013
Bill Schmidt59eb7672014-10-10 15:09:43 +00001014 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001015 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001016 continue;
1017 }
1018
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001019 if (Feature == "crypto") {
1020 HasP8Crypto = true;
1021 continue;
1022 }
1023
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001024 if (Feature == "qpx") {
1025 HasQPX = true;
1026 continue;
1027 }
1028
Kit Barton8246f282015-03-25 19:41:41 +00001029 if (Feature == "htm") {
1030 HasHTM = true;
1031 continue;
1032 }
1033
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001034 // TODO: Finish this list and add an assert that we've handled them
1035 // all.
1036 }
1037
1038 return true;
1039}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001040
Chris Lattnerecd49032009-03-02 22:27:17 +00001041/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1042/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001043void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001044 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001045 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001046 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001047 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001048 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001049 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001050 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001051 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001052 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001053 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001054 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001055 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001056 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001057
Chris Lattnerecd49032009-03-02 22:27:17 +00001058 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001059 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1060 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001061 } else {
1062 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1063 getTriple().getOS() != llvm::Triple::OpenBSD)
1064 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001065 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001066
Ulrich Weigand8afad612014-07-28 13:17:52 +00001067 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001068 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001069 Builder.defineMacro("_CALL_ELF", "1");
1070 if (ABI == "elfv2")
1071 Builder.defineMacro("_CALL_ELF", "2");
1072
Chris Lattnerecd49032009-03-02 22:27:17 +00001073 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001074 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1075 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001076
Chris Lattnerecd49032009-03-02 22:27:17 +00001077 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001078 if (LongDoubleWidth == 128)
1079 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080
John Thompsone467e192009-11-19 17:18:50 +00001081 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001082 Builder.defineMacro("__VEC__", "10206");
1083 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001084 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001085
1086 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001087 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1088 .Case("440", ArchDefineName)
1089 .Case("450", ArchDefineName | ArchDefine440)
1090 .Case("601", ArchDefineName)
1091 .Case("602", ArchDefineName | ArchDefinePpcgr)
1092 .Case("603", ArchDefineName | ArchDefinePpcgr)
1093 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1094 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1095 .Case("604", ArchDefineName | ArchDefinePpcgr)
1096 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1097 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001098 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001099 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1100 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1101 .Case("750", ArchDefineName | ArchDefinePpcgr)
1102 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1103 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001104 .Case("a2", ArchDefineA2)
1105 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001106 .Case("pwr3", ArchDefinePpcgr)
1107 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1108 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1109 | ArchDefinePpcsq)
1110 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1111 | ArchDefinePpcgr | ArchDefinePpcsq)
1112 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1113 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1114 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1115 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1116 | ArchDefinePpcsq)
1117 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1118 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001119 | ArchDefinePpcgr | ArchDefinePpcsq)
1120 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1121 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1122 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001123 .Case("power3", ArchDefinePpcgr)
1124 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1125 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1126 | ArchDefinePpcsq)
1127 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1128 | ArchDefinePpcgr | ArchDefinePpcsq)
1129 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1130 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1131 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1132 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1133 | ArchDefinePpcsq)
1134 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1135 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001136 | ArchDefinePpcgr | ArchDefinePpcsq)
1137 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1138 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1139 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001140 .Default(ArchDefineNone);
1141
1142 if (defs & ArchDefineName)
1143 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1144 if (defs & ArchDefinePpcgr)
1145 Builder.defineMacro("_ARCH_PPCGR");
1146 if (defs & ArchDefinePpcsq)
1147 Builder.defineMacro("_ARCH_PPCSQ");
1148 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001149 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001150 if (defs & ArchDefine603)
1151 Builder.defineMacro("_ARCH_603");
1152 if (defs & ArchDefine604)
1153 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001154 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001155 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001156 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001157 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001158 if (defs & ArchDefinePwr5x)
1159 Builder.defineMacro("_ARCH_PWR5X");
1160 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001161 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 if (defs & ArchDefinePwr6x)
1163 Builder.defineMacro("_ARCH_PWR6X");
1164 if (defs & ArchDefinePwr7)
1165 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001166 if (defs & ArchDefinePwr8)
1167 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001168 if (defs & ArchDefineA2)
1169 Builder.defineMacro("_ARCH_A2");
1170 if (defs & ArchDefineA2q) {
1171 Builder.defineMacro("_ARCH_A2Q");
1172 Builder.defineMacro("_ARCH_QP");
1173 }
1174
1175 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1176 Builder.defineMacro("__bg__");
1177 Builder.defineMacro("__THW_BLUEGENE__");
1178 Builder.defineMacro("__bgq__");
1179 Builder.defineMacro("__TOS_BGQ__");
1180 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001181
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001182 if (HasVSX)
1183 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001184 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001185 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001186 if (HasP8Crypto)
1187 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001188 if (HasHTM)
1189 Builder.defineMacro("__HTM__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001190
Bill Schmidt38378a02013-02-01 20:23:10 +00001191 // FIXME: The following are not yet generated here by Clang, but are
1192 // generated by GCC:
1193 //
1194 // _SOFT_FLOAT_
1195 // __RECIP_PRECISION__
1196 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 // __RECIP__
1198 // __RECIPF__
1199 // __RSQRTE__
1200 // __RSQRTEF__
1201 // _SOFT_DOUBLE_
1202 // __NO_LWSYNC__
1203 // __HAVE_BSWAP__
1204 // __LONGDOUBLE128
1205 // __CMODEL_MEDIUM__
1206 // __CMODEL_LARGE__
1207 // _CALL_SYSV
1208 // _CALL_DARWIN
1209 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001210}
1211
1212void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1213 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1214 .Case("7400", true)
1215 .Case("g4", true)
1216 .Case("7450", true)
1217 .Case("g4+", true)
1218 .Case("970", true)
1219 .Case("g5", true)
1220 .Case("pwr6", true)
1221 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001222 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001223 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001224 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001225 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001226
1227 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001228 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1229 .Case("ppc64le", true)
1230 .Case("pwr8", true)
1231 .Default(false);
1232 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1233 .Case("ppc64le", true)
1234 .Case("pwr8", true)
1235 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001236}
1237
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001238bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001239 return llvm::StringSwitch<bool>(Feature)
1240 .Case("powerpc", true)
1241 .Case("vsx", HasVSX)
1242 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001243 .Case("crypto", HasP8Crypto)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001244 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001245 .Case("htm", HasHTM)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001246 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001247}
Chris Lattner17df24e2008-04-21 18:56:49 +00001248
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001249const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001250 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1251 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1252 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1253 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1254 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1255 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1256 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1257 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001258 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001259 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001260 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001261 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1262 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1263 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1264 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001265 "vrsave", "vscr",
1266 "spe_acc", "spefscr",
1267 "sfp"
1268};
Chris Lattner10a5b382007-01-29 05:24:35 +00001269
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001270void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001271 unsigned &NumNames) const {
1272 Names = GCCRegNames;
1273 NumNames = llvm::array_lengthof(GCCRegNames);
1274}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001275
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001276const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1277 // While some of these aliases do map to different registers
1278 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001279 { { "0" }, "r0" },
1280 { { "1"}, "r1" },
1281 { { "2" }, "r2" },
1282 { { "3" }, "r3" },
1283 { { "4" }, "r4" },
1284 { { "5" }, "r5" },
1285 { { "6" }, "r6" },
1286 { { "7" }, "r7" },
1287 { { "8" }, "r8" },
1288 { { "9" }, "r9" },
1289 { { "10" }, "r10" },
1290 { { "11" }, "r11" },
1291 { { "12" }, "r12" },
1292 { { "13" }, "r13" },
1293 { { "14" }, "r14" },
1294 { { "15" }, "r15" },
1295 { { "16" }, "r16" },
1296 { { "17" }, "r17" },
1297 { { "18" }, "r18" },
1298 { { "19" }, "r19" },
1299 { { "20" }, "r20" },
1300 { { "21" }, "r21" },
1301 { { "22" }, "r22" },
1302 { { "23" }, "r23" },
1303 { { "24" }, "r24" },
1304 { { "25" }, "r25" },
1305 { { "26" }, "r26" },
1306 { { "27" }, "r27" },
1307 { { "28" }, "r28" },
1308 { { "29" }, "r29" },
1309 { { "30" }, "r30" },
1310 { { "31" }, "r31" },
1311 { { "fr0" }, "f0" },
1312 { { "fr1" }, "f1" },
1313 { { "fr2" }, "f2" },
1314 { { "fr3" }, "f3" },
1315 { { "fr4" }, "f4" },
1316 { { "fr5" }, "f5" },
1317 { { "fr6" }, "f6" },
1318 { { "fr7" }, "f7" },
1319 { { "fr8" }, "f8" },
1320 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001321 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001322 { { "fr11" }, "f11" },
1323 { { "fr12" }, "f12" },
1324 { { "fr13" }, "f13" },
1325 { { "fr14" }, "f14" },
1326 { { "fr15" }, "f15" },
1327 { { "fr16" }, "f16" },
1328 { { "fr17" }, "f17" },
1329 { { "fr18" }, "f18" },
1330 { { "fr19" }, "f19" },
1331 { { "fr20" }, "f20" },
1332 { { "fr21" }, "f21" },
1333 { { "fr22" }, "f22" },
1334 { { "fr23" }, "f23" },
1335 { { "fr24" }, "f24" },
1336 { { "fr25" }, "f25" },
1337 { { "fr26" }, "f26" },
1338 { { "fr27" }, "f27" },
1339 { { "fr28" }, "f28" },
1340 { { "fr29" }, "f29" },
1341 { { "fr30" }, "f30" },
1342 { { "fr31" }, "f31" },
1343 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001344};
1345
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001346void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001347 unsigned &NumAliases) const {
1348 Aliases = GCCRegAliases;
1349 NumAliases = llvm::array_lengthof(GCCRegAliases);
1350}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001351
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001352class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001353public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001354 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001355 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001356
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001357 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001358 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001359 case llvm::Triple::FreeBSD:
1360 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001361 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001362 PtrDiffType = SignedInt;
1363 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001364 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001365 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001366 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001367 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001368
Roman Divacky3ffe7462012-03-13 19:20:17 +00001369 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1370 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001371 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001372 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001373
1374 // PPC32 supports atomics up to 4 bytes.
1375 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001376 }
1377
Craig Topper3164f332014-03-11 03:39:26 +00001378 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001379 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001380 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001381 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001382};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001383
Bill Schmidt778d3872013-07-26 01:36:11 +00001384// Note: ABI differences may eventually require us to have a separate
1385// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001387public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001388 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001389 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001390 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001391 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001392
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001393 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1394 DescriptionString = "e-m:e-i64:64-n32:64";
1395 ABI = "elfv2";
1396 } else {
1397 DescriptionString = "E-m:e-i64:64-n32:64";
1398 ABI = "elfv1";
1399 }
1400
1401 switch (getTriple().getOS()) {
1402 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001403 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001404 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001405 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001406 case llvm::Triple::NetBSD:
1407 IntMaxType = SignedLongLong;
1408 Int64Type = SignedLongLong;
1409 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001410 default:
1411 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001412 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001413
1414 // PPC64 supports atomics up to 8 bytes.
1415 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001416 }
Craig Topper3164f332014-03-11 03:39:26 +00001417 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001418 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001419 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001420 // PPC64 Linux-specifc ABI options.
1421 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001422 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001423 ABI = Name;
1424 return true;
1425 }
1426 return false;
1427 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001428};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001429
Roman Divacky965b0b72011-01-06 08:27:10 +00001430class DarwinPPC32TargetInfo :
1431 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001432public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001433 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1434 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001435 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001436 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001437 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001438 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001439 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001440 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001441 }
Craig Topper3164f332014-03-11 03:39:26 +00001442 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001443 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001444 }
1445};
1446
1447class DarwinPPC64TargetInfo :
1448 public DarwinTargetInfo<PPC64TargetInfo> {
1449public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001450 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1451 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001452 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001453 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001454 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001455 }
1456};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001457
Peter Collingbournec947aae2012-05-20 23:28:41 +00001458 static const unsigned NVPTXAddrSpaceMap[] = {
1459 1, // opencl_global
1460 3, // opencl_local
1461 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001462 // FIXME: generic has to be added to the target
1463 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001464 1, // cuda_device
1465 4, // cuda_constant
1466 3, // cuda_shared
1467 };
1468 class NVPTXTargetInfo : public TargetInfo {
1469 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001470 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001471
1472 // The GPU profiles supported by the NVPTX backend
1473 enum GPUKind {
1474 GK_NONE,
1475 GK_SM20,
1476 GK_SM21,
1477 GK_SM30,
1478 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001479 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001480 } GPU;
1481
Peter Collingbournec947aae2012-05-20 23:28:41 +00001482 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001483 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001484 BigEndian = false;
1485 TLSSupported = false;
1486 LongWidth = LongAlign = 64;
1487 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001488 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001489 // Define available target features
1490 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001491 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001492 // Set the default GPU to sm20
1493 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001494 }
Craig Topper3164f332014-03-11 03:39:26 +00001495 void getTargetDefines(const LangOptions &Opts,
1496 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001497 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001498 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001499 if (Opts.CUDAIsDevice) {
1500 // Set __CUDA_ARCH__ for the GPU specified.
1501 std::string CUDAArchCode;
1502 switch (GPU) {
1503 case GK_SM20:
1504 CUDAArchCode = "200";
1505 break;
1506 case GK_SM21:
1507 CUDAArchCode = "210";
1508 break;
1509 case GK_SM30:
1510 CUDAArchCode = "300";
1511 break;
1512 case GK_SM35:
1513 CUDAArchCode = "350";
1514 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001515 case GK_SM37:
1516 CUDAArchCode = "370";
1517 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001518 default:
1519 llvm_unreachable("Unhandled target CPU");
1520 }
1521 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1522 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001523 }
Craig Topper3164f332014-03-11 03:39:26 +00001524 void getTargetBuiltins(const Builtin::Info *&Records,
1525 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001526 Records = BuiltinInfo;
1527 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001528 }
Craig Topper3164f332014-03-11 03:39:26 +00001529 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001530 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001531 }
Craig Topper3164f332014-03-11 03:39:26 +00001532
1533 void getGCCRegNames(const char * const *&Names,
1534 unsigned &NumNames) const override;
1535 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1536 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001537 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001538 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001539 NumAliases = 0;
1540 }
Eric Christopher917e9522014-11-18 22:36:15 +00001541 bool
1542 validateAsmConstraint(const char *&Name,
1543 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001544 switch (*Name) {
1545 default: return false;
1546 case 'c':
1547 case 'h':
1548 case 'r':
1549 case 'l':
1550 case 'f':
1551 case 'd':
1552 Info.setAllowsRegister();
1553 return true;
1554 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001555 }
Craig Topper3164f332014-03-11 03:39:26 +00001556 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001557 // FIXME: Is this really right?
1558 return "";
1559 }
Craig Topper3164f332014-03-11 03:39:26 +00001560 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001561 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001562 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001563 }
Craig Topper3164f332014-03-11 03:39:26 +00001564 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001565 GPU = llvm::StringSwitch<GPUKind>(Name)
1566 .Case("sm_20", GK_SM20)
1567 .Case("sm_21", GK_SM21)
1568 .Case("sm_30", GK_SM30)
1569 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001570 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001571 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001572
Reid Klecknerbbc01782014-12-03 21:53:36 +00001573 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001574 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001575 };
1576
1577 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1578#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1579#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1580 ALL_LANGUAGES },
1581#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001582 };
1583
1584 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1585 "r0"
1586 };
1587
1588 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1589 unsigned &NumNames) const {
1590 Names = GCCRegNames;
1591 NumNames = llvm::array_lengthof(GCCRegNames);
1592 }
1593
1594 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1595 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001596 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001597 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001598 SizeType = TargetInfo::UnsignedInt;
1599 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001600 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001601 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001602 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001603 };
1604
1605 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1606 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001607 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001608 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001609 SizeType = TargetInfo::UnsignedLong;
1610 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001611 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001612 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001613 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001614 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001615
1616static const unsigned R600AddrSpaceMap[] = {
1617 1, // opencl_global
1618 3, // opencl_local
1619 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001620 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001621 1, // cuda_device
1622 2, // cuda_constant
1623 3 // cuda_shared
1624};
1625
Tom Stellarda96344b2014-08-21 13:58:40 +00001626// If you edit the description strings, make sure you update
1627// getPointerWidthV().
1628
Tom Stellardc74b1e02013-03-04 17:40:53 +00001629static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001630 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1631 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001632
1633static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001634 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1635 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001636
1637static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001638 "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 +00001639 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1640 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001641
Eli Friedmand13b41e2012-10-12 23:32:00 +00001642class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001643 static const Builtin::Info BuiltinInfo[];
1644
Tom Stellardc74b1e02013-03-04 17:40:53 +00001645 /// \brief The GPU profiles supported by the R600 target.
1646 enum GPUKind {
1647 GK_NONE,
1648 GK_R600,
1649 GK_R600_DOUBLE_OPS,
1650 GK_R700,
1651 GK_R700_DOUBLE_OPS,
1652 GK_EVERGREEN,
1653 GK_EVERGREEN_DOUBLE_OPS,
1654 GK_NORTHERN_ISLANDS,
1655 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001656 GK_SOUTHERN_ISLANDS,
1657 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001658 } GPU;
1659
Eli Friedmand13b41e2012-10-12 23:32:00 +00001660public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001661 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001662 : TargetInfo(Triple) {
1663
1664 if (Triple.getArch() == llvm::Triple::amdgcn) {
1665 DescriptionString = DescriptionStringSI;
1666 GPU = GK_SOUTHERN_ISLANDS;
1667 } else {
1668 DescriptionString = DescriptionStringR600;
1669 GPU = GK_R600;
1670 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001671 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001672 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001673 }
1674
Tom Stellarda96344b2014-08-21 13:58:40 +00001675 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1676 if (GPU <= GK_CAYMAN)
1677 return 32;
1678
1679 switch(AddrSpace) {
1680 default:
1681 return 64;
1682 case 0:
1683 case 3:
1684 case 5:
1685 return 32;
1686 }
1687 }
1688
Craig Topper3164f332014-03-11 03:39:26 +00001689 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001690 return "";
1691 }
1692
Craig Topper3164f332014-03-11 03:39:26 +00001693 void getGCCRegNames(const char * const *&Names,
1694 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001695 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001696 numNames = 0;
1697 }
1698
Craig Topper3164f332014-03-11 03:39:26 +00001699 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1700 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001701 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001702 NumAliases = 0;
1703 }
1704
Craig Topper3164f332014-03-11 03:39:26 +00001705 bool validateAsmConstraint(const char *&Name,
1706 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001707 return true;
1708 }
1709
Craig Topper3164f332014-03-11 03:39:26 +00001710 void getTargetBuiltins(const Builtin::Info *&Records,
1711 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001712 Records = BuiltinInfo;
1713 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001714 }
1715
Craig Topper3164f332014-03-11 03:39:26 +00001716 void getTargetDefines(const LangOptions &Opts,
1717 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001718 Builder.defineMacro("__R600__");
Tom Stellardfded50f2015-02-27 15:10:19 +00001719 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1720 Builder.defineMacro("cl_khr_fp64");
Eli Friedmand13b41e2012-10-12 23:32:00 +00001721 }
1722
Craig Topper3164f332014-03-11 03:39:26 +00001723 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001724 return TargetInfo::CharPtrBuiltinVaList;
1725 }
1726
Craig Topper3164f332014-03-11 03:39:26 +00001727 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001728 GPU = llvm::StringSwitch<GPUKind>(Name)
1729 .Case("r600" , GK_R600)
1730 .Case("rv610", GK_R600)
1731 .Case("rv620", GK_R600)
1732 .Case("rv630", GK_R600)
1733 .Case("rv635", GK_R600)
1734 .Case("rs780", GK_R600)
1735 .Case("rs880", GK_R600)
1736 .Case("rv670", GK_R600_DOUBLE_OPS)
1737 .Case("rv710", GK_R700)
1738 .Case("rv730", GK_R700)
1739 .Case("rv740", GK_R700_DOUBLE_OPS)
1740 .Case("rv770", GK_R700_DOUBLE_OPS)
1741 .Case("palm", GK_EVERGREEN)
1742 .Case("cedar", GK_EVERGREEN)
1743 .Case("sumo", GK_EVERGREEN)
1744 .Case("sumo2", GK_EVERGREEN)
1745 .Case("redwood", GK_EVERGREEN)
1746 .Case("juniper", GK_EVERGREEN)
1747 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1748 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1749 .Case("barts", GK_NORTHERN_ISLANDS)
1750 .Case("turks", GK_NORTHERN_ISLANDS)
1751 .Case("caicos", GK_NORTHERN_ISLANDS)
1752 .Case("cayman", GK_CAYMAN)
1753 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001754 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001755 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1756 .Case("verde", GK_SOUTHERN_ISLANDS)
1757 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001758 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001759 .Case("bonaire", GK_SEA_ISLANDS)
1760 .Case("kabini", GK_SEA_ISLANDS)
1761 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001762 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001763 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001764 .Default(GK_NONE);
1765
1766 if (GPU == GK_NONE) {
1767 return false;
1768 }
1769
1770 // Set the correct data layout
1771 switch (GPU) {
1772 case GK_NONE:
1773 case GK_R600:
1774 case GK_R700:
1775 case GK_EVERGREEN:
1776 case GK_NORTHERN_ISLANDS:
1777 DescriptionString = DescriptionStringR600;
1778 break;
1779 case GK_R600_DOUBLE_OPS:
1780 case GK_R700_DOUBLE_OPS:
1781 case GK_EVERGREEN_DOUBLE_OPS:
1782 case GK_CAYMAN:
1783 DescriptionString = DescriptionStringR600DoubleOps;
1784 break;
1785 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001786 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001787 DescriptionString = DescriptionStringSI;
1788 break;
1789 }
1790
1791 return true;
1792 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001793};
1794
Matt Arsenault56f008d2014-06-24 20:45:01 +00001795const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1796#define BUILTIN(ID, TYPE, ATTRS) \
1797 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1798#include "clang/Basic/BuiltinsR600.def"
1799};
1800
Eli Friedman3fd920a2008-08-20 02:34:37 +00001801// Namespace for x86 abstract base class
1802const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001803#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001804#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001805 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001806#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001807};
Eli Friedmanb5366062008-05-20 14:21:01 +00001808
Nuno Lopescfca1f02009-12-23 17:49:57 +00001809static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001810 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1811 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001812 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001813 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1814 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1815 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001816 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001817 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1818 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001819};
1820
Eric Christophercdd36352011-06-21 00:05:20 +00001821const TargetInfo::AddlRegName AddlRegNames[] = {
1822 { { "al", "ah", "eax", "rax" }, 0 },
1823 { { "bl", "bh", "ebx", "rbx" }, 3 },
1824 { { "cl", "ch", "ecx", "rcx" }, 2 },
1825 { { "dl", "dh", "edx", "rdx" }, 1 },
1826 { { "esi", "rsi" }, 4 },
1827 { { "edi", "rdi" }, 5 },
1828 { { "esp", "rsp" }, 7 },
1829 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001830};
1831
1832// X86 target abstract base class; x86-32 and x86-64 are very close, so
1833// most of the implementation can be shared.
1834class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001835 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001836 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001837 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001838 enum MMX3DNowEnum {
1839 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1840 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001841 enum XOPEnum {
1842 NoXOP,
1843 SSE4A,
1844 FMA4,
1845 XOP
1846 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001847
Eric Christophere1ddaf92010-04-02 23:50:19 +00001848 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001849 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001850 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001851 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001852 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001853 bool HasBMI;
1854 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001855 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001856 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001857 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001858 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001859 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001860 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001861 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001862 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001863 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1864 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001865 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001866 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001867
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001868 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1869 ///
1870 /// Each enumeration represents a particular CPU supported by Clang. These
1871 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1872 enum CPUKind {
1873 CK_Generic,
1874
1875 /// \name i386
1876 /// i386-generation processors.
1877 //@{
1878 CK_i386,
1879 //@}
1880
1881 /// \name i486
1882 /// i486-generation processors.
1883 //@{
1884 CK_i486,
1885 CK_WinChipC6,
1886 CK_WinChip2,
1887 CK_C3,
1888 //@}
1889
1890 /// \name i586
1891 /// i586-generation processors, P5 microarchitecture based.
1892 //@{
1893 CK_i586,
1894 CK_Pentium,
1895 CK_PentiumMMX,
1896 //@}
1897
1898 /// \name i686
1899 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1900 //@{
1901 CK_i686,
1902 CK_PentiumPro,
1903 CK_Pentium2,
1904 CK_Pentium3,
1905 CK_Pentium3M,
1906 CK_PentiumM,
1907 CK_C3_2,
1908
1909 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1910 /// Clang however has some logic to suport this.
1911 // FIXME: Warn, deprecate, and potentially remove this.
1912 CK_Yonah,
1913 //@}
1914
1915 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001916 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001917 //@{
1918 CK_Pentium4,
1919 CK_Pentium4M,
1920 CK_Prescott,
1921 CK_Nocona,
1922 //@}
1923
1924 /// \name Core
1925 /// Core microarchitecture based processors.
1926 //@{
1927 CK_Core2,
1928
1929 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1930 /// codename which GCC no longer accepts as an option to -march, but Clang
1931 /// has some logic for recognizing it.
1932 // FIXME: Warn, deprecate, and potentially remove this.
1933 CK_Penryn,
1934 //@}
1935
1936 /// \name Atom
1937 /// Atom processors
1938 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001939 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001940 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001941 //@}
1942
1943 /// \name Nehalem
1944 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001945 CK_Nehalem,
1946
1947 /// \name Westmere
1948 /// Westmere microarchitecture based processors.
1949 CK_Westmere,
1950
1951 /// \name Sandy Bridge
1952 /// Sandy Bridge microarchitecture based processors.
1953 CK_SandyBridge,
1954
1955 /// \name Ivy Bridge
1956 /// Ivy Bridge microarchitecture based processors.
1957 CK_IvyBridge,
1958
1959 /// \name Haswell
1960 /// Haswell microarchitecture based processors.
1961 CK_Haswell,
1962
1963 /// \name Broadwell
1964 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001965 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001966
1967 /// \name Skylake
1968 /// Skylake microarchitecture based processors.
1969 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001970
Craig Topper449314e2013-08-20 07:09:39 +00001971 /// \name Knights Landing
1972 /// Knights Landing processor.
1973 CK_KNL,
1974
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001975 /// \name K6
1976 /// K6 architecture processors.
1977 //@{
1978 CK_K6,
1979 CK_K6_2,
1980 CK_K6_3,
1981 //@}
1982
1983 /// \name K7
1984 /// K7 architecture processors.
1985 //@{
1986 CK_Athlon,
1987 CK_AthlonThunderbird,
1988 CK_Athlon4,
1989 CK_AthlonXP,
1990 CK_AthlonMP,
1991 //@}
1992
1993 /// \name K8
1994 /// K8 architecture processors.
1995 //@{
1996 CK_Athlon64,
1997 CK_Athlon64SSE3,
1998 CK_AthlonFX,
1999 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002000 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002001 CK_Opteron,
2002 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002003 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002004 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002005
Benjamin Kramer569f2152012-01-10 11:50:18 +00002006 /// \name Bobcat
2007 /// Bobcat architecture processors.
2008 //@{
2009 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002010 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002011 //@}
2012
2013 /// \name Bulldozer
2014 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002015 //@{
2016 CK_BDVER1,
2017 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002018 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002019 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002020 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002021
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002022 /// This specification is deprecated and will be removed in the future.
2023 /// Users should prefer \see CK_K8.
2024 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002025 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002026 CK_x86_64,
2027 //@}
2028
2029 /// \name Geode
2030 /// Geode processors.
2031 //@{
2032 CK_Geode
2033 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002034 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002035
Rafael Espindolaeb265472013-08-21 21:59:03 +00002036 enum FPMathKind {
2037 FP_Default,
2038 FP_SSE,
2039 FP_387
2040 } FPMath;
2041
Eli Friedman3fd920a2008-08-20 02:34:37 +00002042public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002043 X86TargetInfo(const llvm::Triple &Triple)
2044 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002045 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002046 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2047 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2048 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2049 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2050 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2051 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002052 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002053 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002054 }
Craig Topper3164f332014-03-11 03:39:26 +00002055 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002056 // X87 evaluates with 80 bits "long double" precision.
2057 return SSELevel == NoSSE ? 2 : 0;
2058 }
Craig Topper3164f332014-03-11 03:39:26 +00002059 void getTargetBuiltins(const Builtin::Info *&Records,
2060 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002061 Records = BuiltinInfo;
2062 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002063 }
Craig Topper3164f332014-03-11 03:39:26 +00002064 void getGCCRegNames(const char * const *&Names,
2065 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002066 Names = GCCRegNames;
2067 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002068 }
Craig Topper3164f332014-03-11 03:39:26 +00002069 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2070 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002071 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002072 NumAliases = 0;
2073 }
Craig Topper3164f332014-03-11 03:39:26 +00002074 void getGCCAddlRegNames(const AddlRegName *&Names,
2075 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002076 Names = AddlRegNames;
2077 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002078 }
Craig Topper3164f332014-03-11 03:39:26 +00002079 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002080 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002081
Akira Hatanaka974131e2014-09-18 18:17:18 +00002082 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2083
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002084 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2085
Akira Hatanaka974131e2014-09-18 18:17:18 +00002086 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2087
Craig Topper3164f332014-03-11 03:39:26 +00002088 std::string convertConstraint(const char *&Constraint) const override;
2089 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002090 return "~{dirflag},~{fpsr},~{flags}";
2091 }
Craig Topper3164f332014-03-11 03:39:26 +00002092 void getTargetDefines(const LangOptions &Opts,
2093 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002094 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2095 bool Enabled);
2096 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2097 bool Enabled);
2098 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2099 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002100 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2101 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002102 setFeatureEnabledImpl(Features, Name, Enabled);
2103 }
2104 // This exists purely to cut down on the number of virtual calls in
2105 // getDefaultFeatures which calls this repeatedly.
2106 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2107 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002108 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2109 bool hasFeature(StringRef Feature) const override;
2110 bool handleTargetFeatures(std::vector<std::string> &Features,
2111 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002112 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002113 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002114 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002115 else if (getTriple().getArch() == llvm::Triple::x86 &&
2116 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002117 return "no-mmx";
2118 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002119 }
Craig Topper3164f332014-03-11 03:39:26 +00002120 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002121 CPU = llvm::StringSwitch<CPUKind>(Name)
2122 .Case("i386", CK_i386)
2123 .Case("i486", CK_i486)
2124 .Case("winchip-c6", CK_WinChipC6)
2125 .Case("winchip2", CK_WinChip2)
2126 .Case("c3", CK_C3)
2127 .Case("i586", CK_i586)
2128 .Case("pentium", CK_Pentium)
2129 .Case("pentium-mmx", CK_PentiumMMX)
2130 .Case("i686", CK_i686)
2131 .Case("pentiumpro", CK_PentiumPro)
2132 .Case("pentium2", CK_Pentium2)
2133 .Case("pentium3", CK_Pentium3)
2134 .Case("pentium3m", CK_Pentium3M)
2135 .Case("pentium-m", CK_PentiumM)
2136 .Case("c3-2", CK_C3_2)
2137 .Case("yonah", CK_Yonah)
2138 .Case("pentium4", CK_Pentium4)
2139 .Case("pentium4m", CK_Pentium4M)
2140 .Case("prescott", CK_Prescott)
2141 .Case("nocona", CK_Nocona)
2142 .Case("core2", CK_Core2)
2143 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002144 .Case("bonnell", CK_Bonnell)
2145 .Case("atom", CK_Bonnell) // Legacy name.
2146 .Case("silvermont", CK_Silvermont)
2147 .Case("slm", CK_Silvermont) // Legacy name.
2148 .Case("nehalem", CK_Nehalem)
2149 .Case("corei7", CK_Nehalem) // Legacy name.
2150 .Case("westmere", CK_Westmere)
2151 .Case("sandybridge", CK_SandyBridge)
2152 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2153 .Case("ivybridge", CK_IvyBridge)
2154 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2155 .Case("haswell", CK_Haswell)
2156 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002157 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002158 .Case("skylake", CK_Skylake)
2159 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002160 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002161 .Case("k6", CK_K6)
2162 .Case("k6-2", CK_K6_2)
2163 .Case("k6-3", CK_K6_3)
2164 .Case("athlon", CK_Athlon)
2165 .Case("athlon-tbird", CK_AthlonThunderbird)
2166 .Case("athlon-4", CK_Athlon4)
2167 .Case("athlon-xp", CK_AthlonXP)
2168 .Case("athlon-mp", CK_AthlonMP)
2169 .Case("athlon64", CK_Athlon64)
2170 .Case("athlon64-sse3", CK_Athlon64SSE3)
2171 .Case("athlon-fx", CK_AthlonFX)
2172 .Case("k8", CK_K8)
2173 .Case("k8-sse3", CK_K8SSE3)
2174 .Case("opteron", CK_Opteron)
2175 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002176 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002177 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002178 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002179 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002180 .Case("bdver1", CK_BDVER1)
2181 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002182 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002183 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002184 .Case("x86-64", CK_x86_64)
2185 .Case("geode", CK_Geode)
2186 .Default(CK_Generic);
2187
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002188 // Perform any per-CPU checks necessary to determine if this CPU is
2189 // acceptable.
2190 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2191 // invalid without explaining *why*.
2192 switch (CPU) {
2193 case CK_Generic:
2194 // No processor selected!
2195 return false;
2196
2197 case CK_i386:
2198 case CK_i486:
2199 case CK_WinChipC6:
2200 case CK_WinChip2:
2201 case CK_C3:
2202 case CK_i586:
2203 case CK_Pentium:
2204 case CK_PentiumMMX:
2205 case CK_i686:
2206 case CK_PentiumPro:
2207 case CK_Pentium2:
2208 case CK_Pentium3:
2209 case CK_Pentium3M:
2210 case CK_PentiumM:
2211 case CK_Yonah:
2212 case CK_C3_2:
2213 case CK_Pentium4:
2214 case CK_Pentium4M:
2215 case CK_Prescott:
2216 case CK_K6:
2217 case CK_K6_2:
2218 case CK_K6_3:
2219 case CK_Athlon:
2220 case CK_AthlonThunderbird:
2221 case CK_Athlon4:
2222 case CK_AthlonXP:
2223 case CK_AthlonMP:
2224 case CK_Geode:
2225 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002226 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002227 return false;
2228
2229 // Fallthrough
2230 case CK_Nocona:
2231 case CK_Core2:
2232 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002233 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002234 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002235 case CK_Nehalem:
2236 case CK_Westmere:
2237 case CK_SandyBridge:
2238 case CK_IvyBridge:
2239 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002240 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002241 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002242 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002243 case CK_Athlon64:
2244 case CK_Athlon64SSE3:
2245 case CK_AthlonFX:
2246 case CK_K8:
2247 case CK_K8SSE3:
2248 case CK_Opteron:
2249 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002250 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002251 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002252 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002253 case CK_BDVER1:
2254 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002255 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002256 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002257 case CK_x86_64:
2258 return true;
2259 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002260 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002261 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002262
Craig Topper3164f332014-03-11 03:39:26 +00002263 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002264
Craig Topper3164f332014-03-11 03:39:26 +00002265 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002266 // We accept all non-ARM calling conventions
2267 return (CC == CC_X86ThisCall ||
2268 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002269 CC == CC_X86StdCall ||
2270 CC == CC_X86VectorCall ||
2271 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002272 CC == CC_X86Pascal ||
2273 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002274 }
2275
Craig Topper3164f332014-03-11 03:39:26 +00002276 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002277 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002278 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002279
2280 bool hasSjLjLowering() const override {
2281 return true;
2282 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002283};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002284
Rafael Espindolaeb265472013-08-21 21:59:03 +00002285bool X86TargetInfo::setFPMath(StringRef Name) {
2286 if (Name == "387") {
2287 FPMath = FP_387;
2288 return true;
2289 }
2290 if (Name == "sse") {
2291 FPMath = FP_SSE;
2292 return true;
2293 }
2294 return false;
2295}
2296
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002297void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002298 // FIXME: This *really* should not be here.
2299
2300 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002301 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002302 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002303
Chandler Carruth212334f2011-09-28 08:55:37 +00002304 switch (CPU) {
2305 case CK_Generic:
2306 case CK_i386:
2307 case CK_i486:
2308 case CK_i586:
2309 case CK_Pentium:
2310 case CK_i686:
2311 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002312 break;
2313 case CK_PentiumMMX:
2314 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002315 case CK_K6:
2316 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002317 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002318 break;
2319 case CK_Pentium3:
2320 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002321 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002322 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002323 break;
2324 case CK_PentiumM:
2325 case CK_Pentium4:
2326 case CK_Pentium4M:
2327 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002328 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002329 break;
2330 case CK_Yonah:
2331 case CK_Prescott:
2332 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002333 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002334 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002335 break;
2336 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002337 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002338 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002339 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002340 break;
2341 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002342 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002343 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002344 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002345 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002346 setFeatureEnabledImpl(Features, "avx512f", true);
2347 setFeatureEnabledImpl(Features, "avx512cd", true);
2348 setFeatureEnabledImpl(Features, "avx512dq", true);
2349 setFeatureEnabledImpl(Features, "avx512bw", true);
2350 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002351 // FALLTHROUGH
2352 case CK_Broadwell:
2353 setFeatureEnabledImpl(Features, "rdseed", true);
2354 setFeatureEnabledImpl(Features, "adx", true);
2355 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002356 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002357 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002358 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002359 setFeatureEnabledImpl(Features, "bmi", true);
2360 setFeatureEnabledImpl(Features, "bmi2", true);
2361 setFeatureEnabledImpl(Features, "rtm", true);
2362 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002363 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002364 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002365 setFeatureEnabledImpl(Features, "rdrnd", true);
2366 setFeatureEnabledImpl(Features, "f16c", true);
2367 setFeatureEnabledImpl(Features, "fsgsbase", true);
2368 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002369 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002370 setFeatureEnabledImpl(Features, "avx", true);
2371 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002372 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002373 case CK_Silvermont:
2374 setFeatureEnabledImpl(Features, "aes", true);
2375 setFeatureEnabledImpl(Features, "pclmul", true);
2376 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002377 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002378 setFeatureEnabledImpl(Features, "sse4.2", true);
2379 setFeatureEnabledImpl(Features, "cx16", true);
2380 break;
2381 case CK_KNL:
2382 setFeatureEnabledImpl(Features, "avx512f", true);
2383 setFeatureEnabledImpl(Features, "avx512cd", true);
2384 setFeatureEnabledImpl(Features, "avx512er", true);
2385 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002386 setFeatureEnabledImpl(Features, "rdseed", true);
2387 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002388 setFeatureEnabledImpl(Features, "lzcnt", true);
2389 setFeatureEnabledImpl(Features, "bmi", true);
2390 setFeatureEnabledImpl(Features, "bmi2", true);
2391 setFeatureEnabledImpl(Features, "rtm", true);
2392 setFeatureEnabledImpl(Features, "fma", true);
2393 setFeatureEnabledImpl(Features, "rdrnd", true);
2394 setFeatureEnabledImpl(Features, "f16c", true);
2395 setFeatureEnabledImpl(Features, "fsgsbase", true);
2396 setFeatureEnabledImpl(Features, "aes", true);
2397 setFeatureEnabledImpl(Features, "pclmul", true);
2398 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002399 break;
2400 case CK_K6_2:
2401 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002402 case CK_WinChip2:
2403 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002404 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002405 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002406 case CK_Athlon:
2407 case CK_AthlonThunderbird:
2408 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002409 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002410 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002411 case CK_Athlon4:
2412 case CK_AthlonXP:
2413 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002414 setFeatureEnabledImpl(Features, "sse", true);
2415 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002416 break;
2417 case CK_K8:
2418 case CK_Opteron:
2419 case CK_Athlon64:
2420 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002421 setFeatureEnabledImpl(Features, "sse2", true);
2422 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002423 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002424 case CK_AMDFAM10:
2425 setFeatureEnabledImpl(Features, "sse4a", true);
2426 setFeatureEnabledImpl(Features, "lzcnt", true);
2427 setFeatureEnabledImpl(Features, "popcnt", true);
2428 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002429 case CK_K8SSE3:
2430 case CK_OpteronSSE3:
2431 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002432 setFeatureEnabledImpl(Features, "sse3", true);
2433 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002434 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002435 case CK_BTVER2:
2436 setFeatureEnabledImpl(Features, "avx", true);
2437 setFeatureEnabledImpl(Features, "aes", true);
2438 setFeatureEnabledImpl(Features, "pclmul", true);
2439 setFeatureEnabledImpl(Features, "bmi", true);
2440 setFeatureEnabledImpl(Features, "f16c", true);
2441 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002442 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002443 setFeatureEnabledImpl(Features, "ssse3", true);
2444 setFeatureEnabledImpl(Features, "sse4a", true);
2445 setFeatureEnabledImpl(Features, "lzcnt", true);
2446 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002447 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002448 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002449 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002450 case CK_BDVER4:
2451 setFeatureEnabledImpl(Features, "avx2", true);
2452 setFeatureEnabledImpl(Features, "bmi2", true);
2453 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002454 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002455 setFeatureEnabledImpl(Features, "fsgsbase", true);
2456 // FALLTHROUGH
2457 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002458 setFeatureEnabledImpl(Features, "bmi", true);
2459 setFeatureEnabledImpl(Features, "fma", true);
2460 setFeatureEnabledImpl(Features, "f16c", true);
2461 setFeatureEnabledImpl(Features, "tbm", true);
2462 // FALLTHROUGH
2463 case CK_BDVER1:
2464 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002465 setFeatureEnabledImpl(Features, "xop", true);
2466 setFeatureEnabledImpl(Features, "lzcnt", true);
2467 setFeatureEnabledImpl(Features, "aes", true);
2468 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002469 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002470 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002471 break;
Eli Friedman33465822011-07-08 23:31:17 +00002472 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002473}
2474
Rafael Espindolae62e2792013-08-20 13:44:29 +00002475void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002476 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002477 if (Enabled) {
2478 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002479 case AVX512F:
2480 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002481 case AVX2:
2482 Features["avx2"] = true;
2483 case AVX:
2484 Features["avx"] = true;
2485 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002486 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002487 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002488 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002489 case SSSE3:
2490 Features["ssse3"] = true;
2491 case SSE3:
2492 Features["sse3"] = true;
2493 case SSE2:
2494 Features["sse2"] = true;
2495 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002496 Features["sse"] = true;
2497 case NoSSE:
2498 break;
2499 }
2500 return;
2501 }
2502
2503 switch (Level) {
2504 case NoSSE:
2505 case SSE1:
2506 Features["sse"] = false;
2507 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002508 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2509 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002510 case SSE3:
2511 Features["sse3"] = false;
2512 setXOPLevel(Features, NoXOP, false);
2513 case SSSE3:
2514 Features["ssse3"] = false;
2515 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002516 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002517 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002518 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002519 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002520 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002521 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002522 case AVX2:
2523 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002524 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002525 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002526 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2527 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002528 }
2529}
2530
2531void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002532 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002533 if (Enabled) {
2534 switch (Level) {
2535 case AMD3DNowAthlon:
2536 Features["3dnowa"] = true;
2537 case AMD3DNow:
2538 Features["3dnow"] = true;
2539 case MMX:
2540 Features["mmx"] = true;
2541 case NoMMX3DNow:
2542 break;
2543 }
2544 return;
2545 }
2546
2547 switch (Level) {
2548 case NoMMX3DNow:
2549 case MMX:
2550 Features["mmx"] = false;
2551 case AMD3DNow:
2552 Features["3dnow"] = false;
2553 case AMD3DNowAthlon:
2554 Features["3dnowa"] = false;
2555 }
2556}
2557
2558void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002559 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002560 if (Enabled) {
2561 switch (Level) {
2562 case XOP:
2563 Features["xop"] = true;
2564 case FMA4:
2565 Features["fma4"] = true;
2566 setSSELevel(Features, AVX, true);
2567 case SSE4A:
2568 Features["sse4a"] = true;
2569 setSSELevel(Features, SSE3, true);
2570 case NoXOP:
2571 break;
2572 }
2573 return;
2574 }
2575
2576 switch (Level) {
2577 case NoXOP:
2578 case SSE4A:
2579 Features["sse4a"] = false;
2580 case FMA4:
2581 Features["fma4"] = false;
2582 case XOP:
2583 Features["xop"] = false;
2584 }
2585}
2586
Craig Topper86d79ef2013-09-17 04:51:29 +00002587void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2588 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002589 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002590
Craig Topper29561122013-09-19 01:13:07 +00002591 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002592 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002593 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002594 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002595 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002596 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002597 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002598 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002599 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002600 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002601 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002602 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002603 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002604 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002605 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002606 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002607 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002608 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002609 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002610 if (Enabled)
2611 setSSELevel(Features, SSE2, Enabled);
2612 } else if (Name == "pclmul") {
2613 if (Enabled)
2614 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002615 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002616 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002617 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002618 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002619 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002620 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002621 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2622 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002623 if (Enabled)
2624 setSSELevel(Features, AVX512F, Enabled);
2625 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002626 if (Enabled)
2627 setSSELevel(Features, AVX, Enabled);
2628 } else if (Name == "fma4") {
2629 setXOPLevel(Features, FMA4, Enabled);
2630 } else if (Name == "xop") {
2631 setXOPLevel(Features, XOP, Enabled);
2632 } else if (Name == "sse4a") {
2633 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002634 } else if (Name == "f16c") {
2635 if (Enabled)
2636 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002637 } else if (Name == "sha") {
2638 if (Enabled)
2639 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002640 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002641}
2642
Eric Christopher3ff21b32013-10-16 21:26:26 +00002643/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002644/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002645bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002646 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002647 // Remember the maximum enabled sselevel.
2648 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2649 // Ignore disabled features.
2650 if (Features[i][0] == '-')
2651 continue;
2652
Benjamin Kramer27402c62012-03-05 15:10:44 +00002653 StringRef Feature = StringRef(Features[i]).substr(1);
2654
2655 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002656 HasAES = true;
2657 continue;
2658 }
2659
Craig Topper3f122a72012-05-31 05:18:48 +00002660 if (Feature == "pclmul") {
2661 HasPCLMUL = true;
2662 continue;
2663 }
2664
Benjamin Kramer27402c62012-03-05 15:10:44 +00002665 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002666 HasLZCNT = true;
2667 continue;
2668 }
2669
Rafael Espindola89049822013-08-23 20:21:37 +00002670 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002671 HasRDRND = true;
2672 continue;
2673 }
2674
Craig Topper8c7f2512014-11-03 06:51:41 +00002675 if (Feature == "fsgsbase") {
2676 HasFSGSBASE = true;
2677 continue;
2678 }
2679
Benjamin Kramer27402c62012-03-05 15:10:44 +00002680 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002681 HasBMI = true;
2682 continue;
2683 }
2684
Benjamin Kramer27402c62012-03-05 15:10:44 +00002685 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002686 HasBMI2 = true;
2687 continue;
2688 }
2689
Benjamin Kramer27402c62012-03-05 15:10:44 +00002690 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002691 HasPOPCNT = true;
2692 continue;
2693 }
2694
Michael Liao625a8752012-11-10 05:17:46 +00002695 if (Feature == "rtm") {
2696 HasRTM = true;
2697 continue;
2698 }
2699
Michael Liao74f4eaf2013-03-26 17:52:08 +00002700 if (Feature == "prfchw") {
2701 HasPRFCHW = true;
2702 continue;
2703 }
2704
Michael Liaoffaae352013-03-29 05:17:55 +00002705 if (Feature == "rdseed") {
2706 HasRDSEED = true;
2707 continue;
2708 }
2709
Robert Khasanov50e6f582014-09-19 09:53:48 +00002710 if (Feature == "adx") {
2711 HasADX = true;
2712 continue;
2713 }
2714
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002715 if (Feature == "tbm") {
2716 HasTBM = true;
2717 continue;
2718 }
2719
Craig Topperbba778b2012-06-03 21:46:30 +00002720 if (Feature == "fma") {
2721 HasFMA = true;
2722 continue;
2723 }
2724
Manman Rena45358c2012-10-11 00:59:55 +00002725 if (Feature == "f16c") {
2726 HasF16C = true;
2727 continue;
2728 }
2729
Craig Topper679b53a2013-08-21 05:29:10 +00002730 if (Feature == "avx512cd") {
2731 HasAVX512CD = true;
2732 continue;
2733 }
2734
2735 if (Feature == "avx512er") {
2736 HasAVX512ER = true;
2737 continue;
2738 }
2739
2740 if (Feature == "avx512pf") {
2741 HasAVX512PF = true;
2742 continue;
2743 }
2744
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002745 if (Feature == "avx512dq") {
2746 HasAVX512DQ = true;
2747 continue;
2748 }
2749
2750 if (Feature == "avx512bw") {
2751 HasAVX512BW = true;
2752 continue;
2753 }
2754
2755 if (Feature == "avx512vl") {
2756 HasAVX512VL = true;
2757 continue;
2758 }
2759
Ben Langmuir58078d02013-09-19 13:22:04 +00002760 if (Feature == "sha") {
2761 HasSHA = true;
2762 continue;
2763 }
2764
Nick Lewycky50e8f482013-10-05 20:14:27 +00002765 if (Feature == "cx16") {
2766 HasCX16 = true;
2767 continue;
2768 }
2769
Daniel Dunbar979586e2009-11-11 09:38:56 +00002770 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002771 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002772 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002773 .Case("avx2", AVX2)
2774 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002775 .Case("sse4.2", SSE42)
2776 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002777 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002778 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002779 .Case("sse2", SSE2)
2780 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002781 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002782 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002783
Eli Friedman33465822011-07-08 23:31:17 +00002784 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002785 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002786 .Case("3dnowa", AMD3DNowAthlon)
2787 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002788 .Case("mmx", MMX)
2789 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002790 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002791
2792 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2793 .Case("xop", XOP)
2794 .Case("fma4", FMA4)
2795 .Case("sse4a", SSE4A)
2796 .Default(NoXOP);
2797 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002798 }
Eli Friedman33465822011-07-08 23:31:17 +00002799
Craig Topper7481d8a2013-09-10 06:55:47 +00002800 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2801 // Can't do this earlier because we need to be able to explicitly enable
2802 // popcnt and still disable sse4.2.
2803 if (!HasPOPCNT && SSELevel >= SSE42 &&
2804 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2805 HasPOPCNT = true;
2806 Features.push_back("+popcnt");
2807 }
2808
Yunzhong Gao61089362013-10-16 19:07:02 +00002809 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2810 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2811 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2812 HasPRFCHW = true;
2813 Features.push_back("+prfchw");
2814 }
2815
Rafael Espindolaeb265472013-08-21 21:59:03 +00002816 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2817 // matches the selected sse level.
2818 if (FPMath == FP_SSE && SSELevel < SSE1) {
2819 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2820 return false;
2821 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2822 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2823 return false;
2824 }
2825
Eli Friedman33465822011-07-08 23:31:17 +00002826 // Don't tell the backend if we're turning off mmx; it will end up disabling
2827 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002828 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2829 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002830 std::vector<std::string>::iterator it;
2831 it = std::find(Features.begin(), Features.end(), "-mmx");
2832 if (it != Features.end())
2833 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002834 else if (SSELevel > NoSSE)
2835 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002836 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002837}
Chris Lattnerecd49032009-03-02 22:27:17 +00002838
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002839/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2840/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002841void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002842 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002843 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002844 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002845 Builder.defineMacro("__amd64__");
2846 Builder.defineMacro("__amd64");
2847 Builder.defineMacro("__x86_64");
2848 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002849 if (getTriple().getArchName() == "x86_64h") {
2850 Builder.defineMacro("__x86_64h");
2851 Builder.defineMacro("__x86_64h__");
2852 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002853 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002854 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002855 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002856
Chris Lattnerecd49032009-03-02 22:27:17 +00002857 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002858 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2859 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002860 switch (CPU) {
2861 case CK_Generic:
2862 break;
2863 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002864 // The rest are coming from the i386 define above.
2865 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002866 break;
2867 case CK_i486:
2868 case CK_WinChipC6:
2869 case CK_WinChip2:
2870 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002871 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002872 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002873 case CK_PentiumMMX:
2874 Builder.defineMacro("__pentium_mmx__");
2875 Builder.defineMacro("__tune_pentium_mmx__");
2876 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002877 case CK_i586:
2878 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002879 defineCPUMacros(Builder, "i586");
2880 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002881 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002882 case CK_Pentium3:
2883 case CK_Pentium3M:
2884 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002885 Builder.defineMacro("__tune_pentium3__");
2886 // Fallthrough
2887 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002888 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002889 Builder.defineMacro("__tune_pentium2__");
2890 // Fallthrough
2891 case CK_PentiumPro:
2892 Builder.defineMacro("__tune_i686__");
2893 Builder.defineMacro("__tune_pentiumpro__");
2894 // Fallthrough
2895 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002896 Builder.defineMacro("__i686");
2897 Builder.defineMacro("__i686__");
2898 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2899 Builder.defineMacro("__pentiumpro");
2900 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002901 break;
2902 case CK_Pentium4:
2903 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002904 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002905 break;
2906 case CK_Yonah:
2907 case CK_Prescott:
2908 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002909 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002910 break;
2911 case CK_Core2:
2912 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002913 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002914 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002915 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002916 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002917 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002918 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002919 defineCPUMacros(Builder, "slm");
2920 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002921 case CK_Nehalem:
2922 case CK_Westmere:
2923 case CK_SandyBridge:
2924 case CK_IvyBridge:
2925 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002926 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002927 // FIXME: Historically, we defined this legacy name, it would be nice to
2928 // remove it at some point. We've never exposed fine-grained names for
2929 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002930 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002931 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002932 case CK_Skylake:
2933 // FIXME: Historically, we defined this legacy name, it would be nice to
2934 // remove it at some point. This is the only fine-grained CPU macro in the
2935 // main intel CPU line, and it would be better to not have these and force
2936 // people to use ISA macros.
2937 defineCPUMacros(Builder, "skx");
2938 break;
Craig Topper449314e2013-08-20 07:09:39 +00002939 case CK_KNL:
2940 defineCPUMacros(Builder, "knl");
2941 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002942 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002943 Builder.defineMacro("__k6_2__");
2944 Builder.defineMacro("__tune_k6_2__");
2945 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002946 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002947 if (CPU != CK_K6_2) { // In case of fallthrough
2948 // FIXME: GCC may be enabling these in cases where some other k6
2949 // architecture is specified but -m3dnow is explicitly provided. The
2950 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002951 Builder.defineMacro("__k6_3__");
2952 Builder.defineMacro("__tune_k6_3__");
2953 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002954 // Fallthrough
2955 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002956 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002957 break;
2958 case CK_Athlon:
2959 case CK_AthlonThunderbird:
2960 case CK_Athlon4:
2961 case CK_AthlonXP:
2962 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002963 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002964 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002965 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002966 Builder.defineMacro("__tune_athlon_sse__");
2967 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002968 break;
2969 case CK_K8:
2970 case CK_K8SSE3:
2971 case CK_x86_64:
2972 case CK_Opteron:
2973 case CK_OpteronSSE3:
2974 case CK_Athlon64:
2975 case CK_Athlon64SSE3:
2976 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002977 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002978 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002979 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002980 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002981 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002982 case CK_BTVER1:
2983 defineCPUMacros(Builder, "btver1");
2984 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002985 case CK_BTVER2:
2986 defineCPUMacros(Builder, "btver2");
2987 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002988 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002989 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002990 break;
2991 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002992 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002993 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002994 case CK_BDVER3:
2995 defineCPUMacros(Builder, "bdver3");
2996 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002997 case CK_BDVER4:
2998 defineCPUMacros(Builder, "bdver4");
2999 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003000 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003001 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003002 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003003 }
Chris Lattner96e43572009-03-02 22:40:39 +00003004
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003005 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003006 Builder.defineMacro("__REGISTER_PREFIX__", "");
3007
Chris Lattner6df41af2009-04-19 17:32:33 +00003008 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3009 // functions in glibc header files that use FP Stack inline asm which the
3010 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003011 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003012
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003013 if (HasAES)
3014 Builder.defineMacro("__AES__");
3015
Craig Topper3f122a72012-05-31 05:18:48 +00003016 if (HasPCLMUL)
3017 Builder.defineMacro("__PCLMUL__");
3018
Craig Topper22967d42011-12-25 05:06:45 +00003019 if (HasLZCNT)
3020 Builder.defineMacro("__LZCNT__");
3021
Benjamin Kramer1e250392012-07-07 09:39:18 +00003022 if (HasRDRND)
3023 Builder.defineMacro("__RDRND__");
3024
Craig Topper8c7f2512014-11-03 06:51:41 +00003025 if (HasFSGSBASE)
3026 Builder.defineMacro("__FSGSBASE__");
3027
Craig Topper22967d42011-12-25 05:06:45 +00003028 if (HasBMI)
3029 Builder.defineMacro("__BMI__");
3030
3031 if (HasBMI2)
3032 Builder.defineMacro("__BMI2__");
3033
Craig Topper1de83482011-12-29 16:10:46 +00003034 if (HasPOPCNT)
3035 Builder.defineMacro("__POPCNT__");
3036
Michael Liao625a8752012-11-10 05:17:46 +00003037 if (HasRTM)
3038 Builder.defineMacro("__RTM__");
3039
Michael Liao74f4eaf2013-03-26 17:52:08 +00003040 if (HasPRFCHW)
3041 Builder.defineMacro("__PRFCHW__");
3042
Michael Liaoffaae352013-03-29 05:17:55 +00003043 if (HasRDSEED)
3044 Builder.defineMacro("__RDSEED__");
3045
Robert Khasanov50e6f582014-09-19 09:53:48 +00003046 if (HasADX)
3047 Builder.defineMacro("__ADX__");
3048
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003049 if (HasTBM)
3050 Builder.defineMacro("__TBM__");
3051
Rafael Espindolae62e2792013-08-20 13:44:29 +00003052 switch (XOPLevel) {
3053 case XOP:
3054 Builder.defineMacro("__XOP__");
3055 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003056 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003057 case SSE4A:
3058 Builder.defineMacro("__SSE4A__");
3059 case NoXOP:
3060 break;
3061 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003062
Craig Topperbba778b2012-06-03 21:46:30 +00003063 if (HasFMA)
3064 Builder.defineMacro("__FMA__");
3065
Manman Rena45358c2012-10-11 00:59:55 +00003066 if (HasF16C)
3067 Builder.defineMacro("__F16C__");
3068
Craig Topper679b53a2013-08-21 05:29:10 +00003069 if (HasAVX512CD)
3070 Builder.defineMacro("__AVX512CD__");
3071 if (HasAVX512ER)
3072 Builder.defineMacro("__AVX512ER__");
3073 if (HasAVX512PF)
3074 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003075 if (HasAVX512DQ)
3076 Builder.defineMacro("__AVX512DQ__");
3077 if (HasAVX512BW)
3078 Builder.defineMacro("__AVX512BW__");
3079 if (HasAVX512VL)
3080 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003081
Ben Langmuir58078d02013-09-19 13:22:04 +00003082 if (HasSHA)
3083 Builder.defineMacro("__SHA__");
3084
Nick Lewycky50e8f482013-10-05 20:14:27 +00003085 if (HasCX16)
3086 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3087
Chris Lattner96e43572009-03-02 22:40:39 +00003088 // Each case falls through to the previous one here.
3089 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003090 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003091 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003092 case AVX2:
3093 Builder.defineMacro("__AVX2__");
3094 case AVX:
3095 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003096 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003097 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003098 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003099 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003100 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003101 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003102 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003103 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003104 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003105 Builder.defineMacro("__SSE2__");
3106 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003107 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003108 Builder.defineMacro("__SSE__");
3109 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003110 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003111 break;
3112 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003113
Derek Schuffc7dd7222012-10-11 15:52:22 +00003114 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003115 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003116 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003117 case AVX2:
3118 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003119 case SSE42:
3120 case SSE41:
3121 case SSSE3:
3122 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003123 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003124 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003125 break;
3126 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003127 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003128 break;
3129 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003130 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003131 }
3132 }
3133
Anders Carlssone437c682010-01-27 03:47:49 +00003134 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003135 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003136 case AMD3DNowAthlon:
3137 Builder.defineMacro("__3dNOW_A__");
3138 case AMD3DNow:
3139 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003140 case MMX:
3141 Builder.defineMacro("__MMX__");
3142 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003143 break;
3144 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003145
3146 if (CPU >= CK_i486) {
3147 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3148 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3149 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3150 }
3151 if (CPU >= CK_i586)
3152 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003153}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003154
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003155bool X86TargetInfo::hasFeature(StringRef Feature) const {
3156 return llvm::StringSwitch<bool>(Feature)
3157 .Case("aes", HasAES)
3158 .Case("avx", SSELevel >= AVX)
3159 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003160 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003161 .Case("avx512cd", HasAVX512CD)
3162 .Case("avx512er", HasAVX512ER)
3163 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003164 .Case("avx512dq", HasAVX512DQ)
3165 .Case("avx512bw", HasAVX512BW)
3166 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003167 .Case("bmi", HasBMI)
3168 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003169 .Case("cx16", HasCX16)
3170 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003171 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003172 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003173 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003174 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003175 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3176 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3177 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003178 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003179 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003180 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003181 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003182 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003183 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003184 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003185 .Case("sse", SSELevel >= SSE1)
3186 .Case("sse2", SSELevel >= SSE2)
3187 .Case("sse3", SSELevel >= SSE3)
3188 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003189 .Case("sse4.1", SSELevel >= SSE41)
3190 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003191 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003192 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003193 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003194 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3195 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003196 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003197 .Default(false);
3198}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003199
Eli Friedman3fd920a2008-08-20 02:34:37 +00003200bool
Anders Carlsson58436352009-02-28 17:11:49 +00003201X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003202 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003203 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003204 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003205 case 'I':
3206 Info.setRequiresImmediate(0, 31);
3207 return true;
3208 case 'J':
3209 Info.setRequiresImmediate(0, 63);
3210 return true;
3211 case 'K':
3212 Info.setRequiresImmediate(-128, 127);
3213 return true;
3214 case 'L':
3215 // FIXME: properly analyze this constraint:
3216 // must be one of 0xff, 0xffff, or 0xffffffff
3217 return true;
3218 case 'M':
3219 Info.setRequiresImmediate(0, 3);
3220 return true;
3221 case 'N':
3222 Info.setRequiresImmediate(0, 255);
3223 return true;
3224 case 'O':
3225 Info.setRequiresImmediate(0, 127);
3226 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003227 case 'Y': // first letter of a pair:
3228 switch (*(Name+1)) {
3229 default: return false;
3230 case '0': // First SSE register.
3231 case 't': // Any SSE register, when SSE2 is enabled.
3232 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3233 case 'm': // any MMX register, when inter-unit moves enabled.
3234 break; // falls through to setAllowsRegister.
3235 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003236 case 'f': // any x87 floating point stack register.
3237 // Constraint 'f' cannot be used for output operands.
3238 if (Info.ConstraintStr[0] == '=')
3239 return false;
3240
3241 Info.setAllowsRegister();
3242 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003243 case 'a': // eax.
3244 case 'b': // ebx.
3245 case 'c': // ecx.
3246 case 'd': // edx.
3247 case 'S': // esi.
3248 case 'D': // edi.
3249 case 'A': // edx:eax.
3250 case 't': // top of floating point stack.
3251 case 'u': // second from top of floating point stack.
3252 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003253 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003254 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003255 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003256 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3257 case 'l': // "Index" registers: any general register that can be used as an
3258 // index in a base+index memory access.
3259 Info.setAllowsRegister();
3260 return true;
3261 case 'C': // SSE floating point constant.
3262 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003263 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003264 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003265 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003266 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003267 return true;
3268 }
3269}
3270
Akira Hatanaka974131e2014-09-18 18:17:18 +00003271bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3272 unsigned Size) const {
3273 // Strip off constraint modifiers.
3274 while (Constraint[0] == '=' ||
3275 Constraint[0] == '+' ||
3276 Constraint[0] == '&')
3277 Constraint = Constraint.substr(1);
3278
3279 return validateOperandSize(Constraint, Size);
3280}
3281
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003282bool X86TargetInfo::validateInputSize(StringRef Constraint,
3283 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003284 return validateOperandSize(Constraint, Size);
3285}
3286
3287bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3288 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003289 switch (Constraint[0]) {
3290 default: break;
3291 case 'y':
3292 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003293 case 'f':
3294 case 't':
3295 case 'u':
3296 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003297 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003298 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003299 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003300 }
3301
3302 return true;
3303}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003304
Eli Friedman3fd920a2008-08-20 02:34:37 +00003305std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003306X86TargetInfo::convertConstraint(const char *&Constraint) const {
3307 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003308 case 'a': return std::string("{ax}");
3309 case 'b': return std::string("{bx}");
3310 case 'c': return std::string("{cx}");
3311 case 'd': return std::string("{dx}");
3312 case 'S': return std::string("{si}");
3313 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003314 case 'p': // address
3315 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003316 case 't': // top of floating point stack.
3317 return std::string("{st}");
3318 case 'u': // second from top of floating point stack.
3319 return std::string("{st(1)}"); // second from top of floating point stack.
3320 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003321 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003322 }
3323}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003324
Eli Friedman3fd920a2008-08-20 02:34:37 +00003325// X86-32 generic target
3326class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003327public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003328 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003329 DoubleAlign = LongLongAlign = 32;
3330 LongDoubleWidth = 96;
3331 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003332 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003333 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003334 SizeType = UnsignedInt;
3335 PtrDiffType = SignedInt;
3336 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003337 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003338
3339 // Use fpret for all types.
3340 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3341 (1 << TargetInfo::Double) |
3342 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003343
3344 // x86-32 has atomics up to 8 bytes
3345 // FIXME: Check that we actually have cmpxchg8b before setting
3346 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3347 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003348 }
Craig Topper3164f332014-03-11 03:39:26 +00003349 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003350 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003351 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003352
Craig Topper3164f332014-03-11 03:39:26 +00003353 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003354 if (RegNo == 0) return 0;
3355 if (RegNo == 1) return 2;
3356 return -1;
3357 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003358 bool validateOperandSize(StringRef Constraint,
3359 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003360 switch (Constraint[0]) {
3361 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003362 case 'R':
3363 case 'q':
3364 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003365 case 'a':
3366 case 'b':
3367 case 'c':
3368 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003369 case 'S':
3370 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003371 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003372 case 'A':
3373 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003374 }
3375
Akira Hatanaka974131e2014-09-18 18:17:18 +00003376 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003377 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003378};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003379
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003380class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003382 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3383 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003384
Craig Topper3164f332014-03-11 03:39:26 +00003385 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003386 unsigned Major, Minor, Micro;
3387 getTriple().getOSVersion(Major, Minor, Micro);
3388 // New NetBSD uses the default rounding mode.
3389 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3390 return X86_32TargetInfo::getFloatEvalMethod();
3391 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003392 return 1;
3393 }
3394};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003395
Eli Friedmane3aa4542009-07-05 18:47:56 +00003396class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3397public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003398 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3399 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003400 SizeType = UnsignedLong;
3401 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003402 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003403 }
3404};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003405
Eli Friedman9fa28852012-08-08 23:57:20 +00003406class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3407public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003408 BitrigI386TargetInfo(const llvm::Triple &Triple)
3409 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003410 SizeType = UnsignedLong;
3411 IntPtrType = SignedLong;
3412 PtrDiffType = SignedLong;
3413 }
3414};
Eli Friedman9fa28852012-08-08 23:57:20 +00003415
Torok Edwinb2b37c62009-06-30 17:10:35 +00003416class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003417public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003418 DarwinI386TargetInfo(const llvm::Triple &Triple)
3419 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003420 LongDoubleWidth = 128;
3421 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003422 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003423 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003424 SizeType = UnsignedLong;
3425 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003426 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003427 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003428 }
3429
Eli Friedman3fd920a2008-08-20 02:34:37 +00003430};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003431
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003432// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003433class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003434public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003435 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3436 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003437 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003438 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003439 bool IsWinCOFF =
3440 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
3441 DescriptionString = IsWinCOFF ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32"
3442 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003443 }
Craig Topper3164f332014-03-11 03:39:26 +00003444 void getTargetDefines(const LangOptions &Opts,
3445 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003446 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3447 }
3448};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003449
3450// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003451class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003452public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003453 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003454 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003455 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003456 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3457 }
Craig Topper3164f332014-03-11 03:39:26 +00003458 void getTargetDefines(const LangOptions &Opts,
3459 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003460 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3461 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3462 // The value of the following reflects processor type.
3463 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3464 // We lost the original triple, so we use the default.
3465 Builder.defineMacro("_M_IX86", "600");
3466 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003467};
3468} // end anonymous namespace
3469
Reid Kleckner47606832014-04-21 20:58:00 +00003470static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3471 Builder.defineMacro("__MSVCRT__");
3472 Builder.defineMacro("__MINGW32__");
3473
3474 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3475 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3476 // macro anyway for pre-processor compatibility.
3477 if (Opts.MicrosoftExt)
3478 Builder.defineMacro("__declspec", "__declspec");
3479 else
3480 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3481
3482 if (!Opts.MicrosoftExt) {
3483 // Provide macros for all the calling convention keywords. Provide both
3484 // single and double underscore prefixed variants. These are available on
3485 // x64 as well as x86, even though they have no effect.
3486 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3487 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003488 std::string GCCSpelling = "__attribute__((__";
3489 GCCSpelling += CC;
3490 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003491 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3492 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3493 }
3494 }
3495}
3496
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003497namespace {
3498// x86-32 MinGW target
3499class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3500public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003501 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3502 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003503 void getTargetDefines(const LangOptions &Opts,
3504 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003505 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003506 DefineStd(Builder, "WIN32", Opts);
3507 DefineStd(Builder, "WINNT", Opts);
3508 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003509 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003510 }
3511};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003512
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003513// x86-32 Cygwin target
3514class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003516 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3517 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003518 TLSSupported = false;
3519 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003520 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003521 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003522 }
Craig Topper3164f332014-03-11 03:39:26 +00003523 void getTargetDefines(const LangOptions &Opts,
3524 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003525 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003526 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003527 Builder.defineMacro("__CYGWIN__");
3528 Builder.defineMacro("__CYGWIN32__");
3529 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003530 if (Opts.CPlusPlus)
3531 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003532 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003533};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003534
Chris Lattnerb986aba2010-04-11 19:29:39 +00003535// x86-32 Haiku target
3536class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3537public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003538 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003539 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003540 IntPtrType = SignedLong;
3541 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003542 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003543 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003544 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003545 }
Craig Topper3164f332014-03-11 03:39:26 +00003546 void getTargetDefines(const LangOptions &Opts,
3547 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003548 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3549 Builder.defineMacro("__INTEL__");
3550 Builder.defineMacro("__HAIKU__");
3551 }
3552};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003553
Douglas Gregor9fabd852011-07-01 22:41:14 +00003554// RTEMS Target
3555template<typename Target>
3556class RTEMSTargetInfo : public OSTargetInfo<Target> {
3557protected:
Craig Topper3164f332014-03-11 03:39:26 +00003558 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3559 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003560 // RTEMS defines; list based off of gcc output
3561
Douglas Gregor9fabd852011-07-01 22:41:14 +00003562 Builder.defineMacro("__rtems__");
3563 Builder.defineMacro("__ELF__");
3564 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003565
Douglas Gregor9fabd852011-07-01 22:41:14 +00003566public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003567 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3568 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003569
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003570 switch (Triple.getArch()) {
3571 default:
3572 case llvm::Triple::x86:
3573 // this->MCountName = ".mcount";
3574 break;
3575 case llvm::Triple::mips:
3576 case llvm::Triple::mipsel:
3577 case llvm::Triple::ppc:
3578 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003579 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003580 // this->MCountName = "_mcount";
3581 break;
3582 case llvm::Triple::arm:
3583 // this->MCountName = "__mcount";
3584 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003585 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003586 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003587};
3588
Douglas Gregor9fabd852011-07-01 22:41:14 +00003589// x86-32 RTEMS target
3590class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3591public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003592 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003593 SizeType = UnsignedLong;
3594 IntPtrType = SignedLong;
3595 PtrDiffType = SignedLong;
3596 this->UserLabelPrefix = "";
3597 }
Craig Topper3164f332014-03-11 03:39:26 +00003598 void getTargetDefines(const LangOptions &Opts,
3599 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003600 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3601 Builder.defineMacro("__INTEL__");
3602 Builder.defineMacro("__rtems__");
3603 }
3604};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003605
Eli Friedman3fd920a2008-08-20 02:34:37 +00003606// x86-64 generic target
3607class X86_64TargetInfo : public X86TargetInfo {
3608public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003609 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003610 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003611 bool IsWinCOFF =
3612 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003613 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003614 LongDoubleWidth = 128;
3615 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003616 LargeArrayMinWidth = 128;
3617 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003618 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003619 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3620 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3621 IntPtrType = IsX32 ? SignedInt : SignedLong;
3622 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003623 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003624 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003625
Eric Christopher917e9522014-11-18 22:36:15 +00003626 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003627 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3628 : IsWinCOFF
3629 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3630 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003631
3632 // Use fpret only for long double.
3633 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003634
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003635 // Use fp2ret for _Complex long double.
3636 ComplexLongDoubleUsesFP2Ret = true;
3637
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003638 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003639 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003640 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003641 }
Craig Topper3164f332014-03-11 03:39:26 +00003642 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003643 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003644 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003645
Craig Topper3164f332014-03-11 03:39:26 +00003646 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003647 if (RegNo == 0) return 0;
3648 if (RegNo == 1) return 1;
3649 return -1;
3650 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003651
Craig Topper3164f332014-03-11 03:39:26 +00003652 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003653 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003654 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003655 CC == CC_IntelOclBicc ||
3656 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003657 }
3658
Craig Topper3164f332014-03-11 03:39:26 +00003659 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003660 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003661 }
3662
Pavel Chupinfd223e12014-08-04 12:39:43 +00003663 // for x32 we need it here explicitly
3664 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003665};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003666
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003667// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003668class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003669public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003670 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3671 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003672 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003673 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003674 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003675 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003676 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003677 SizeType = UnsignedLongLong;
3678 PtrDiffType = SignedLongLong;
3679 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003680 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003681 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003682
Craig Topper3164f332014-03-11 03:39:26 +00003683 void getTargetDefines(const LangOptions &Opts,
3684 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003685 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003686 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003687 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003688
Craig Topper3164f332014-03-11 03:39:26 +00003689 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003690 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003691 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003692
Craig Topper3164f332014-03-11 03:39:26 +00003693 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003694 switch (CC) {
3695 case CC_X86StdCall:
3696 case CC_X86ThisCall:
3697 case CC_X86FastCall:
3698 return CCCR_Ignore;
3699 case CC_C:
3700 case CC_X86VectorCall:
3701 case CC_IntelOclBicc:
3702 case CC_X86_64SysV:
3703 return CCCR_OK;
3704 default:
3705 return CCCR_Warning;
3706 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003707 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003708};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003709
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003710// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003711class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003712public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003713 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003714 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003715 LongDoubleWidth = LongDoubleAlign = 64;
3716 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003717 }
Craig Topper3164f332014-03-11 03:39:26 +00003718 void getTargetDefines(const LangOptions &Opts,
3719 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003720 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3721 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003722 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003723 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003724 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003725};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003726
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003727// x86-64 MinGW target
3728class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3729public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003730 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3731 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003732 void getTargetDefines(const LangOptions &Opts,
3733 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003734 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003735 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003736 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003737 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003738
3739 // GCC defines this macro when it is using __gxx_personality_seh0.
3740 if (!Opts.SjLjExceptions)
3741 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003742 }
3743};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003744
Eli Friedman2857ccb2009-07-01 03:36:11 +00003745class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3746public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003747 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3748 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003749 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003750 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003751 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3752 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003753 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003754 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003755 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003756 }
3757};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003758
Eli Friedman245f2292009-07-05 22:31:18 +00003759class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3760public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003761 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3762 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003763 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003764 Int64Type = SignedLongLong;
3765 }
3766};
Eli Friedman245f2292009-07-05 22:31:18 +00003767
Eli Friedman9fa28852012-08-08 23:57:20 +00003768class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3769public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003770 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3771 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3772 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003773 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003774 }
3775};
Tim Northover9bb857a2013-01-31 12:13:10 +00003776
Eli Friedmanf05b7722008-08-20 07:44:10 +00003777class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003778 // Possible FPU choices.
3779 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003780 VFP2FPU = (1 << 0),
3781 VFP3FPU = (1 << 1),
3782 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003783 NeonFPU = (1 << 3),
3784 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003785 };
3786
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003787 // Possible HWDiv features.
3788 enum HWDivMode {
3789 HWDivThumb = (1 << 0),
3790 HWDivARM = (1 << 1)
3791 };
3792
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003793 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003794 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003795 }
3796
3797 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3798 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003799
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003800 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003801
Rafael Espindolaeb265472013-08-21 21:59:03 +00003802 enum {
3803 FP_Default,
3804 FP_VFP,
3805 FP_Neon
3806 } FPMath;
3807
Bernard Ogdenda13af32013-10-24 18:32:51 +00003808 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003809
Logan Chien57086ce2012-10-10 06:56:20 +00003810 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003811 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003812 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003813
3814 // Initialized via features.
3815 unsigned SoftFloat : 1;
3816 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003817
Bernard Ogden18b57012013-10-29 09:47:51 +00003818 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003819 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003820
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003821 // ACLE 6.5.1 Hardware floating point
3822 enum {
3823 HW_FP_HP = (1 << 1), /// half (16-bit)
3824 HW_FP_SP = (1 << 2), /// single (32-bit)
3825 HW_FP_DP = (1 << 3), /// double (64-bit)
3826 };
3827 uint32_t HW_FP;
3828
Chris Lattner5cc15e02010-03-03 19:03:45 +00003829 static const Builtin::Info BuiltinInfo[];
3830
Rafael Espindola101d5b92013-05-13 20:09:47 +00003831 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003832 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003833 if (T.getArch() == llvm::Triple::arm ||
3834 T.getArch() == llvm::Triple::armeb) {
3835 StringRef VersionStr;
3836 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003837 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003838 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003839 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003840 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003841 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003842 unsigned Version;
3843 if (VersionStr.getAsInteger(10, Version))
3844 return false;
3845 return Version >= 6;
3846 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003847 assert(T.getArch() == llvm::Triple::thumb ||
3848 T.getArch() == llvm::Triple::thumbeb);
3849 StringRef VersionStr;
3850 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003851 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003852 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003853 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003854 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003855 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003856 unsigned Version;
3857 if (VersionStr.getAsInteger(10, Version))
3858 return false;
3859 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003860 }
3861
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003862 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003863 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003864
3865 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003866 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003867
Renato Golin9ba39232015-02-27 16:35:48 +00003868 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3869 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3870 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003871 SizeType = UnsignedLong;
3872 else
3873 SizeType = UnsignedInt;
3874
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003875 switch (T.getOS()) {
3876 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003877 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003878 break;
3879 case llvm::Triple::Win32:
3880 WCharType = UnsignedShort;
3881 break;
3882 case llvm::Triple::Linux:
3883 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003884 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3885 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003886 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003887 }
3888
3889 UseBitFieldTypeAlignment = true;
3890
3891 ZeroLengthBitfieldBoundary = 0;
3892
Tim Northover147cd2f2014-10-14 22:12:21 +00003893 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3894 // so set preferred for small types to 32.
3895 if (T.isOSBinFormatMachO()) {
3896 DescriptionString =
3897 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3898 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3899 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00003900 assert(!BigEndian && "Windows on ARM does not support big endian");
3901 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00003902 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00003903 "-p:32:32"
3904 "-i64:64"
3905 "-v128:64:128"
3906 "-a:0:32"
3907 "-n32"
3908 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003909 } else if (T.isOSNaCl()) {
3910 assert(!BigEndian && "NaCl on ARM does not support big endian");
3911 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003912 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003913 DescriptionString =
3914 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3915 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003916 }
3917
3918 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003919 }
3920
3921 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003922 const llvm::Triple &T = getTriple();
3923
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003924 IsAAPCS = false;
3925
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003926 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003927
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003928 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003929 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003930 SizeType = UnsignedInt;
3931 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003932 SizeType = UnsignedLong;
3933
3934 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3935 WCharType = SignedInt;
3936
3937 // Do not respect the alignment of bit-field types when laying out
3938 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3939 UseBitFieldTypeAlignment = false;
3940
3941 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3942 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3943 /// gcc.
3944 ZeroLengthBitfieldBoundary = 32;
3945
Tim Northover147cd2f2014-10-14 22:12:21 +00003946 if (T.isOSBinFormatMachO())
3947 DescriptionString =
3948 BigEndian
3949 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3950 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3951 else
3952 DescriptionString =
3953 BigEndian
3954 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3955 : "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 +00003956
3957 // FIXME: Override "preferred align" for double and long long.
3958 }
3959
Chris Lattner17df24e2008-04-21 18:56:49 +00003960public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003961 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003962 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003963 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003964 BigEndian = IsBigEndian;
3965
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003966 switch (getTriple().getOS()) {
3967 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003968 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003969 break;
3970 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003971 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003972 break;
3973 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003974
Chris Lattner1a8f3942010-04-23 16:29:58 +00003975 // {} in inline assembly are neon specifiers, not assembly variant
3976 // specifiers.
3977 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003978
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003979 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003980 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003981
Eric Christopher0e261882014-12-05 01:06:59 +00003982 // FIXME: This duplicates code from the driver that sets the -target-abi
3983 // option - this code is used if -target-abi isn't passed and should
3984 // be unified in some way.
3985 if (Triple.isOSBinFormatMachO()) {
3986 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3987 // the frontend matches that.
3988 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3989 Triple.getOS() == llvm::Triple::UnknownOS ||
3990 StringRef(CPU).startswith("cortex-m")) {
3991 setABI("aapcs");
3992 } else {
3993 setABI("apcs-gnu");
3994 }
3995 } else if (Triple.isOSWindows()) {
3996 // FIXME: this is invalid for WindowsCE
3997 setABI("aapcs");
3998 } else {
3999 // Select the default based on the platform.
4000 switch (Triple.getEnvironment()) {
4001 case llvm::Triple::Android:
4002 case llvm::Triple::GNUEABI:
4003 case llvm::Triple::GNUEABIHF:
4004 setABI("aapcs-linux");
4005 break;
4006 case llvm::Triple::EABIHF:
4007 case llvm::Triple::EABI:
4008 setABI("aapcs");
4009 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004010 case llvm::Triple::GNU:
4011 setABI("apcs-gnu");
4012 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004013 default:
4014 if (Triple.getOS() == llvm::Triple::NetBSD)
4015 setABI("apcs-gnu");
4016 else
4017 setABI("aapcs");
4018 break;
4019 }
4020 }
John McCall86353412010-08-21 22:46:04 +00004021
4022 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004023 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004024
4025 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004026 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004027 if (shouldUseInlineAtomic(getTriple()))
4028 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004029
4030 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004031 // the alignment of the zero-length bitfield is greater than the member
4032 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004033 // zero length bitfield.
4034 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004035 }
Alp Toker4925ba72014-06-07 23:30:42 +00004036 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004037 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004038 ABI = Name;
4039
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004040 // The defaults (above) are for AAPCS, check if we need to change them.
4041 //
4042 // FIXME: We need support for -meabi... we could just mangle it into the
4043 // name.
4044 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004045 setABIAPCS();
4046 return true;
4047 }
4048 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4049 setABIAAPCS();
4050 return true;
4051 }
4052 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004053 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004054
Craig Topper3164f332014-03-11 03:39:26 +00004055 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004056 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004057 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4058 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004059 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004060 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004061 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004062 }
4063 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004064 Features["vfp4"] = true;
4065 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004066 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4067 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004068 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004069 Features["vfp4"] = true;
4070 Features["neon"] = true;
4071 Features["hwdiv"] = true;
4072 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004073 } else if (CPU == "cyclone") {
4074 Features["v8fp"] = true;
4075 Features["neon"] = true;
4076 Features["hwdiv"] = true;
4077 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004078 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004079 Features["fp-armv8"] = true;
4080 Features["neon"] = true;
4081 Features["hwdiv"] = true;
4082 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004083 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004084 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004085 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004086 // Enable the hwdiv extension for all v8a AArch32 cores by
4087 // default.
4088 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004089 ArchName == "armebv8a" || ArchName == "armebv8" ||
4090 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4091 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004092 Features["hwdiv"] = true;
4093 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004094 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004095 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004096 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004097 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004098 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004099
Craig Topper3164f332014-03-11 03:39:26 +00004100 bool handleTargetFeatures(std::vector<std::string> &Features,
4101 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004102 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004103 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004104 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004105 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004106 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004107
4108 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004109 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004110 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004111 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004112 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004113 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004114 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004115 HW_FP = HW_FP_SP | HW_FP_DP;
4116 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004117 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004118 HW_FP = HW_FP_SP | HW_FP_DP;
4119 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004120 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004121 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4122 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004123 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004124 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4125 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004126 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004127 HW_FP = HW_FP_SP | HW_FP_DP;
4128 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004129 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004130 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004131 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004132 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004133 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004134 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004135 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004136 } else if (Feature == "+fp-only-sp") {
4137 HW_FP &= ~HW_FP_DP;
4138 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004139 }
4140
Rafael Espindolaeb265472013-08-21 21:59:03 +00004141 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4142 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4143 return false;
4144 }
4145
4146 if (FPMath == FP_Neon)
4147 Features.push_back("+neonfp");
4148 else if (FPMath == FP_VFP)
4149 Features.push_back("-neonfp");
4150
Daniel Dunbar893d4752009-12-19 04:15:38 +00004151 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004152 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4153 for (const auto &FEFeature : FrontEndFeatures) {
4154 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4155 if (Feature != Features.end())
4156 Features.erase(Feature);
4157 }
4158
Rafael Espindolaeb265472013-08-21 21:59:03 +00004159 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004160 }
4161
Craig Topper3164f332014-03-11 03:39:26 +00004162 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004163 return llvm::StringSwitch<bool>(Feature)
4164 .Case("arm", true)
4165 .Case("softfloat", SoftFloat)
4166 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004167 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004168 .Case("hwdiv", HWDiv & HWDivThumb)
4169 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004170 .Default(false);
4171 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004172 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004173 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004174 return llvm::StringSwitch<const char *>(Name)
4175 .Cases("arm8", "arm810", "4")
4176 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4177 "4")
4178 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4179 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4180 .Case("ep9312", "4T")
4181 .Cases("arm10tdmi", "arm1020t", "5T")
4182 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4183 .Case("arm926ej-s", "5TEJ")
4184 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4185 .Cases("xscale", "iwmmxt", "5TE")
4186 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004187 .Case("arm1136jf-s", "6")
4188 .Cases("mpcorenovfp", "mpcore", "6K")
4189 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004190 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4191 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4192 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4193 "7A")
Javed Absar879d18b82015-04-09 14:12:10 +00004194 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004195 .Case("swift", "7S")
4196 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004197 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004198 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004199 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004200 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004201 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004202 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004203 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004204 return llvm::StringSwitch<const char *>(Name)
4205 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4206 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4207 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004208 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004209 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4210 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
Javed Absar879d18b82015-04-09 14:12:10 +00004211 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004212 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004213 }
Craig Topper3164f332014-03-11 03:39:26 +00004214 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004215 if (!getCPUDefineSuffix(Name))
4216 return false;
4217
Tim Northovere8c37212014-07-09 09:24:43 +00004218 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4219 StringRef Profile = getCPUProfile(Name);
4220 if (Profile == "M" && MaxAtomicInlineWidth) {
4221 MaxAtomicPromoteWidth = 32;
4222 MaxAtomicInlineWidth = 32;
4223 }
4224
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004225 CPU = Name;
4226 return true;
4227 }
Craig Topper3164f332014-03-11 03:39:26 +00004228 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004229 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4230 unsigned CPUArchVer) const {
4231 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4232 (CPUArch.find('M') != StringRef::npos);
4233 }
4234 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4235 unsigned CPUArchVer) const {
4236 // We check both CPUArchVer and ArchName because when only triple is
4237 // specified, the default CPU is arm1136j-s.
4238 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4239 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4240 }
Craig Topper3164f332014-03-11 03:39:26 +00004241 void getTargetDefines(const LangOptions &Opts,
4242 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004243 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004244 Builder.defineMacro("__arm");
4245 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004246
Chris Lattnerecd49032009-03-02 22:27:17 +00004247 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004248 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004249
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004250 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004251 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004252 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004253 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004254 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004255
4256 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004257 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004258 StringRef ArchName = getTriple().getArchName();
4259
4260 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4261 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004262 if (CPUArch[0] >= '8') {
4263 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4264 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004265 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004266
4267 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4268 // is not defined for the M-profile.
4269 // NOTE that the deffault profile is assumed to be 'A'
4270 if (CPUProfile.empty() || CPUProfile != "M")
4271 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4272
4273 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4274 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4275 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4276 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4277 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4278 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4279 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4280
4281 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4282 // instruction set such as ARM or Thumb.
4283 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4284
4285 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4286
4287 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004288 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004289 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004290
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004291 // ACLE 6.5.1 Hardware Floating Point
4292 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004293 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004294
Yi Konga44c4d72014-06-27 21:25:42 +00004295 // ACLE predefines.
4296 Builder.defineMacro("__ARM_ACLE", "200");
4297
Mike Stump9d54bd72009-04-08 02:07:04 +00004298 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004299
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004300 // FIXME: It's more complicated than this and we don't really support
4301 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004302 // Windows on ARM does not "support" interworking
4303 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004304 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004305
David Tweed8f676532012-10-25 13:33:01 +00004306 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004307 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004308 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4309 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004310 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004311 Builder.defineMacro("__ARM_PCS", "1");
4312
David Tweed8f676532012-10-25 13:33:01 +00004313 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004314 Builder.defineMacro("__ARM_PCS_VFP", "1");
4315 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004316
Daniel Dunbar893d4752009-12-19 04:15:38 +00004317 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004318 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004319
4320 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004321 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004322
4323 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004324 Builder.defineMacro("__THUMBEL__");
4325 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004326 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004327 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004328 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004329 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4330 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004331
4332 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004333 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004334
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004335 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004336 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004337 if (FPU & VFP2FPU)
4338 Builder.defineMacro("__ARM_VFPV2__");
4339 if (FPU & VFP3FPU)
4340 Builder.defineMacro("__ARM_VFPV3__");
4341 if (FPU & VFP4FPU)
4342 Builder.defineMacro("__ARM_VFPV4__");
4343 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004344
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004345 // This only gets set when Neon instructions are actually available, unlike
4346 // the VFP define, hence the soft float and arch check. This is subtly
4347 // different from gcc, we follow the intent which was that it should be set
4348 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004349 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4350 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004351 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004352 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004353
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004354 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4355 Opts.ShortWChar ? "2" : "4");
4356
4357 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4358 Opts.ShortEnums ? "1" : "4");
4359
Bernard Ogden18b57012013-10-29 09:47:51 +00004360 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004361 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004362
Tim Northover02e38602014-02-03 17:28:04 +00004363 if (Crypto)
4364 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4365
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004366 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004367 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4368 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4369 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4370 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4371 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004372
4373 bool is5EOrAbove = (CPUArchVer >= 6 ||
4374 (CPUArchVer == 5 &&
4375 CPUArch.find('E') != StringRef::npos));
4376 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4377 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4378 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004379 }
Craig Topper3164f332014-03-11 03:39:26 +00004380 void getTargetBuiltins(const Builtin::Info *&Records,
4381 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004382 Records = BuiltinInfo;
4383 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004384 }
Craig Topper3164f332014-03-11 03:39:26 +00004385 bool isCLZForZeroUndef() const override { return false; }
4386 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004387 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004388 }
Craig Topper3164f332014-03-11 03:39:26 +00004389 void getGCCRegNames(const char * const *&Names,
4390 unsigned &NumNames) const override;
4391 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4392 unsigned &NumAliases) const override;
4393 bool validateAsmConstraint(const char *&Name,
4394 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004395 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004396 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004397 case 'l': // r0-r7
4398 case 'h': // r8-r15
4399 case 'w': // VFP Floating point register single precision
4400 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004401 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004402 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004403 case 'I':
4404 case 'J':
4405 case 'K':
4406 case 'L':
4407 case 'M':
4408 // FIXME
4409 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004410 case 'Q': // A memory address that is a single base register.
4411 Info.setAllowsMemory();
4412 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004413 case 'U': // a memory reference...
4414 switch (Name[1]) {
4415 case 'q': // ...ARMV4 ldrsb
4416 case 'v': // ...VFP load/store (reg+constant offset)
4417 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004418 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004419 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004420 case 'n': // valid address for Neon doubleword vector load/store
4421 case 'm': // valid address for Neon element and structure load/store
4422 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004423 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004424 Info.setAllowsMemory();
4425 Name++;
4426 return true;
4427 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004428 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004429 return false;
4430 }
Craig Topper3164f332014-03-11 03:39:26 +00004431 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004432 std::string R;
4433 switch (*Constraint) {
4434 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004435 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004436 Constraint++;
4437 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004438 case 'p': // 'p' should be translated to 'r' by default.
4439 R = std::string("r");
4440 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004441 default:
4442 return std::string(1, *Constraint);
4443 }
4444 return R;
4445 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004446 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004447 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004448 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004449 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004450 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004451
Bill Wendling9d1ee112012-10-25 23:28:48 +00004452 // Strip off constraint modifiers.
4453 while (Constraint[0] == '=' ||
4454 Constraint[0] == '+' ||
4455 Constraint[0] == '&')
4456 Constraint = Constraint.substr(1);
4457
4458 switch (Constraint[0]) {
4459 default: break;
4460 case 'r': {
4461 switch (Modifier) {
4462 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004463 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004464 case 'q':
4465 // A register of size 32 cannot fit a vector type.
4466 return false;
4467 }
4468 }
4469 }
4470
4471 return true;
4472 }
Craig Topper3164f332014-03-11 03:39:26 +00004473 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004474 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004475 return "";
4476 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004477
Craig Topper3164f332014-03-11 03:39:26 +00004478 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004479 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4480 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004481
Craig Topper3164f332014-03-11 03:39:26 +00004482 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004483 if (RegNo == 0) return 0;
4484 if (RegNo == 1) return 1;
4485 return -1;
4486 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004487};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004488
Rafael Espindolaeb265472013-08-21 21:59:03 +00004489bool ARMTargetInfo::setFPMath(StringRef Name) {
4490 if (Name == "neon") {
4491 FPMath = FP_Neon;
4492 return true;
4493 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4494 Name == "vfp4") {
4495 FPMath = FP_VFP;
4496 return true;
4497 }
4498 return false;
4499}
4500
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004501const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004502 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004503 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004504 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4505
4506 // Float registers
4507 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4508 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4509 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004510 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004511
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004512 // Double registers
4513 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4514 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004515 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4516 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004517
4518 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004519 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4520 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004521};
4522
4523void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004524 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004525 Names = GCCRegNames;
4526 NumNames = llvm::array_lengthof(GCCRegNames);
4527}
4528
4529const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004530 { { "a1" }, "r0" },
4531 { { "a2" }, "r1" },
4532 { { "a3" }, "r2" },
4533 { { "a4" }, "r3" },
4534 { { "v1" }, "r4" },
4535 { { "v2" }, "r5" },
4536 { { "v3" }, "r6" },
4537 { { "v4" }, "r7" },
4538 { { "v5" }, "r8" },
4539 { { "v6", "rfp" }, "r9" },
4540 { { "sl" }, "r10" },
4541 { { "fp" }, "r11" },
4542 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004543 { { "r13" }, "sp" },
4544 { { "r14" }, "lr" },
4545 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004546 // The S, D and Q registers overlap, but aren't really aliases; we
4547 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004548};
4549
4550void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4551 unsigned &NumAliases) const {
4552 Aliases = GCCRegAliases;
4553 NumAliases = llvm::array_lengthof(GCCRegAliases);
4554}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004555
4556const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004557#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004558#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004559 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004560#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004561
4562#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004563#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004564#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4565 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004566#include "clang/Basic/BuiltinsARM.def"
4567};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004568
4569class ARMleTargetInfo : public ARMTargetInfo {
4570public:
4571 ARMleTargetInfo(const llvm::Triple &Triple)
4572 : ARMTargetInfo(Triple, false) { }
4573 virtual void getTargetDefines(const LangOptions &Opts,
4574 MacroBuilder &Builder) const {
4575 Builder.defineMacro("__ARMEL__");
4576 ARMTargetInfo::getTargetDefines(Opts, Builder);
4577 }
4578};
4579
4580class ARMbeTargetInfo : public ARMTargetInfo {
4581public:
4582 ARMbeTargetInfo(const llvm::Triple &Triple)
4583 : ARMTargetInfo(Triple, true) { }
4584 virtual void getTargetDefines(const LangOptions &Opts,
4585 MacroBuilder &Builder) const {
4586 Builder.defineMacro("__ARMEB__");
4587 Builder.defineMacro("__ARM_BIG_ENDIAN");
4588 ARMTargetInfo::getTargetDefines(Opts, Builder);
4589 }
4590};
Chris Lattner17df24e2008-04-21 18:56:49 +00004591
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004592class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4593 const llvm::Triple Triple;
4594public:
4595 WindowsARMTargetInfo(const llvm::Triple &Triple)
4596 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4597 TLSSupported = false;
4598 WCharType = UnsignedShort;
4599 SizeType = UnsignedInt;
4600 UserLabelPrefix = "";
4601 }
4602 void getVisualStudioDefines(const LangOptions &Opts,
4603 MacroBuilder &Builder) const {
4604 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4605
4606 // FIXME: this is invalid for WindowsCE
4607 Builder.defineMacro("_M_ARM_NT", "1");
4608 Builder.defineMacro("_M_ARMT", "_M_ARM");
4609 Builder.defineMacro("_M_THUMB", "_M_ARM");
4610
4611 assert((Triple.getArch() == llvm::Triple::arm ||
4612 Triple.getArch() == llvm::Triple::thumb) &&
4613 "invalid architecture for Windows ARM target info");
4614 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4615 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4616
4617 // TODO map the complete set of values
4618 // 31: VFPv3 40: VFPv4
4619 Builder.defineMacro("_M_ARM_FP", "31");
4620 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004621 BuiltinVaListKind getBuiltinVaListKind() const override {
4622 return TargetInfo::CharPtrBuiltinVaList;
4623 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004624};
4625
4626// Windows ARM + Itanium C++ ABI Target
4627class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4628public:
4629 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4630 : WindowsARMTargetInfo(Triple) {
4631 TheCXXABI.set(TargetCXXABI::GenericARM);
4632 }
4633
4634 void getTargetDefines(const LangOptions &Opts,
4635 MacroBuilder &Builder) const override {
4636 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4637
4638 if (Opts.MSVCCompat)
4639 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4640 }
4641};
4642
4643// Windows ARM, MS (C++) ABI
4644class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4645public:
4646 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4647 : WindowsARMTargetInfo(Triple) {
4648 TheCXXABI.set(TargetCXXABI::Microsoft);
4649 }
4650
4651 void getTargetDefines(const LangOptions &Opts,
4652 MacroBuilder &Builder) const override {
4653 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4654 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4655 }
4656};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004657
Mike Stump11289f42009-09-09 15:08:12 +00004658class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004659 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004660protected:
Craig Topper3164f332014-03-11 03:39:26 +00004661 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4662 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004663 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004664 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004665
Torok Edwinb2b37c62009-06-30 17:10:35 +00004666public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004667 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004668 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004669 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004670 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004671 // FIXME: This should be based off of the target features in
4672 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004673 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004674
4675 // Darwin on iOS uses a variant of the ARM C++ ABI.
4676 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004677 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004678};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004679
Tim Northover573cbee2014-05-24 12:52:07 +00004680class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004681 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004682 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4683 static const char *const GCCRegNames[];
4684
James Molloy75f5f9e2014-04-16 15:33:48 +00004685 enum FPUModeEnum {
4686 FPUMode,
4687 NeonMode
4688 };
4689
4690 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004691 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004692 unsigned Crypto;
4693
Tim Northovera2ee4332014-03-29 15:09:45 +00004694 static const Builtin::Info BuiltinInfo[];
4695
4696 std::string ABI;
4697
4698public:
Tim Northover573cbee2014-05-24 12:52:07 +00004699 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004700 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004701
4702 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4703 WCharType = SignedInt;
4704
4705 // NetBSD apparently prefers consistency across ARM targets to consistency
4706 // across 64-bit targets.
4707 Int64Type = SignedLongLong;
4708 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004709 } else {
4710 WCharType = UnsignedInt;
4711 Int64Type = SignedLong;
4712 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004713 }
4714
Tim Northovera2ee4332014-03-29 15:09:45 +00004715 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004716 MaxVectorAlign = 128;
4717 RegParmMax = 8;
4718 MaxAtomicInlineWidth = 128;
4719 MaxAtomicPromoteWidth = 128;
4720
Tim Northovera6a19f12015-02-06 01:25:07 +00004721 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004722 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4723
Tim Northovera2ee4332014-03-29 15:09:45 +00004724 // {} in inline assembly are neon specifiers, not assembly variant
4725 // specifiers.
4726 NoAsmVariants = true;
4727
Tim Northover7ad87af2015-01-16 18:44:04 +00004728 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4729 // contributes to the alignment of the containing aggregate in the same way
4730 // a plain (non bit-field) member of that type would, without exception for
4731 // zero-sized or anonymous bit-fields."
4732 UseBitFieldTypeAlignment = true;
4733 UseZeroLengthBitfieldAlignment = true;
4734
Tim Northover573cbee2014-05-24 12:52:07 +00004735 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004736 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4737 }
4738
Alp Toker4925ba72014-06-07 23:30:42 +00004739 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004740 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004741 if (Name != "aapcs" && Name != "darwinpcs")
4742 return false;
4743
4744 ABI = Name;
4745 return true;
4746 }
4747
David Blaikie1cbb9712014-11-14 19:09:44 +00004748 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004749 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004750 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004751 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004752 .Case("cyclone", true)
4753 .Default(false);
4754 return CPUKnown;
4755 }
4756
4757 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004758 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004759 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004760 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004761
4762 // Target properties.
4763 Builder.defineMacro("_LP64");
4764 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004765
4766 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4767 Builder.defineMacro("__ARM_ACLE", "200");
4768 Builder.defineMacro("__ARM_ARCH", "8");
4769 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4770
4771 Builder.defineMacro("__ARM_64BIT_STATE");
4772 Builder.defineMacro("__ARM_PCS_AAPCS64");
4773 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4774
4775 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4776 Builder.defineMacro("__ARM_FEATURE_CLZ");
4777 Builder.defineMacro("__ARM_FEATURE_FMA");
4778 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004779 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4780 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4781 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4782 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004783
4784 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4785
4786 // 0xe implies support for half, single and double precision operations.
4787 Builder.defineMacro("__ARM_FP", "0xe");
4788
4789 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4790 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4791 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4792
4793 if (Opts.FastMath || Opts.FiniteMathOnly)
4794 Builder.defineMacro("__ARM_FP_FAST");
4795
Richard Smithab506ad2014-10-20 23:26:58 +00004796 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004797 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4798
4799 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4800
4801 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4802 Opts.ShortEnums ? "1" : "4");
4803
James Molloy75f5f9e2014-04-16 15:33:48 +00004804 if (FPU == NeonMode) {
4805 Builder.defineMacro("__ARM_NEON");
4806 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004807 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004808 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004809
Bradley Smith418c5932014-05-02 15:17:51 +00004810 if (CRC)
4811 Builder.defineMacro("__ARM_FEATURE_CRC32");
4812
James Molloy75f5f9e2014-04-16 15:33:48 +00004813 if (Crypto)
4814 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004815 }
4816
4817 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004818 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004819 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004820 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004821 }
4822
David Blaikie1cbb9712014-11-14 19:09:44 +00004823 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004824 return Feature == "aarch64" ||
4825 Feature == "arm64" ||
4826 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004827 }
4828
James Molloy5e73df52014-04-16 15:06:20 +00004829 bool handleTargetFeatures(std::vector<std::string> &Features,
4830 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004831 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004832 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004833 Crypto = 0;
4834 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4835 if (Features[i] == "+neon")
4836 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004837 if (Features[i] == "+crc")
4838 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004839 if (Features[i] == "+crypto")
4840 Crypto = 1;
4841 }
4842
James Molloy5e73df52014-04-16 15:06:20 +00004843 setDescriptionString();
4844
4845 return true;
4846 }
4847
David Blaikie1cbb9712014-11-14 19:09:44 +00004848 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004849
David Blaikie1cbb9712014-11-14 19:09:44 +00004850 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004851 return TargetInfo::AArch64ABIBuiltinVaList;
4852 }
4853
4854 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004855 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004856 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004857 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004858
Eric Christopher917e9522014-11-18 22:36:15 +00004859 virtual bool
4860 validateAsmConstraint(const char *&Name,
4861 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004862 switch (*Name) {
4863 default:
4864 return false;
4865 case 'w': // Floating point and SIMD registers (V0-V31)
4866 Info.setAllowsRegister();
4867 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004868 case 'I': // Constant that can be used with an ADD instruction
4869 case 'J': // Constant that can be used with a SUB instruction
4870 case 'K': // Constant that can be used with a 32-bit logical instruction
4871 case 'L': // Constant that can be used with a 64-bit logical instruction
4872 case 'M': // Constant that can be used as a 32-bit MOV immediate
4873 case 'N': // Constant that can be used as a 64-bit MOV immediate
4874 case 'Y': // Floating point constant zero
4875 case 'Z': // Integer constant zero
4876 return true;
4877 case 'Q': // A memory reference with base register and no offset
4878 Info.setAllowsMemory();
4879 return true;
4880 case 'S': // A symbolic address
4881 Info.setAllowsRegister();
4882 return true;
4883 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004884 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4885 // Utf: A memory address suitable for ldp/stp in TF mode.
4886 // Usa: An absolute symbolic address.
4887 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4888 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004889 case 'z': // Zero register, wzr or xzr
4890 Info.setAllowsRegister();
4891 return true;
4892 case 'x': // Floating point and SIMD registers (V0-V15)
4893 Info.setAllowsRegister();
4894 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004895 }
4896 return false;
4897 }
4898
Akira Hatanaka987f1862014-08-22 06:05:21 +00004899 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004900 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004901 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004902 // Strip off constraint modifiers.
4903 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4904 Constraint = Constraint.substr(1);
4905
4906 switch (Constraint[0]) {
4907 default:
4908 return true;
4909 case 'z':
4910 case 'r': {
4911 switch (Modifier) {
4912 case 'x':
4913 case 'w':
4914 // For now assume that the person knows what they're
4915 // doing with the modifier.
4916 return true;
4917 default:
4918 // By default an 'r' constraint will be in the 'x'
4919 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004920 if (Size == 64)
4921 return true;
4922
4923 SuggestedModifier = "w";
4924 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004925 }
4926 }
4927 }
4928 }
4929
David Blaikie1cbb9712014-11-14 19:09:44 +00004930 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004931
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004932 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004933 if (RegNo == 0)
4934 return 0;
4935 if (RegNo == 1)
4936 return 1;
4937 return -1;
4938 }
4939};
4940
Tim Northover573cbee2014-05-24 12:52:07 +00004941const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004942 // 32-bit Integer registers
4943 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4944 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4945 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4946
4947 // 64-bit Integer registers
4948 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4949 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4950 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4951
4952 // 32-bit floating point regsisters
4953 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4954 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4955 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4956
4957 // 64-bit floating point regsisters
4958 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4959 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4960 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4961
4962 // Vector registers
4963 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4964 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4965 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4966};
4967
Tim Northover573cbee2014-05-24 12:52:07 +00004968void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004969 unsigned &NumNames) const {
4970 Names = GCCRegNames;
4971 NumNames = llvm::array_lengthof(GCCRegNames);
4972}
4973
Tim Northover573cbee2014-05-24 12:52:07 +00004974const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004975 { { "w31" }, "wsp" },
4976 { { "x29" }, "fp" },
4977 { { "x30" }, "lr" },
4978 { { "x31" }, "sp" },
4979 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4980 // don't want to substitute one of these for a different-sized one.
4981};
4982
Tim Northover573cbee2014-05-24 12:52:07 +00004983void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004984 unsigned &NumAliases) const {
4985 Aliases = GCCRegAliases;
4986 NumAliases = llvm::array_lengthof(GCCRegAliases);
4987}
4988
Tim Northover573cbee2014-05-24 12:52:07 +00004989const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004990#define BUILTIN(ID, TYPE, ATTRS) \
4991 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4992#include "clang/Basic/BuiltinsNEON.def"
4993
4994#define BUILTIN(ID, TYPE, ATTRS) \
4995 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004996#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004997};
James Molloy5e73df52014-04-16 15:06:20 +00004998
Tim Northover573cbee2014-05-24 12:52:07 +00004999class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005000 void setDescriptionString() override {
5001 if (getTriple().isOSBinFormatMachO())
5002 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5003 else
5004 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5005 }
5006
5007public:
Tim Northover573cbee2014-05-24 12:52:07 +00005008 AArch64leTargetInfo(const llvm::Triple &Triple)
5009 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005010 BigEndian = false;
5011 }
5012 void getTargetDefines(const LangOptions &Opts,
5013 MacroBuilder &Builder) const override {
5014 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005015 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005016 }
5017};
5018
Tim Northover573cbee2014-05-24 12:52:07 +00005019class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005020 void setDescriptionString() override {
5021 assert(!getTriple().isOSBinFormatMachO());
5022 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5023 }
5024
5025public:
Tim Northover573cbee2014-05-24 12:52:07 +00005026 AArch64beTargetInfo(const llvm::Triple &Triple)
5027 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005028 void getTargetDefines(const LangOptions &Opts,
5029 MacroBuilder &Builder) const override {
5030 Builder.defineMacro("__AARCH64EB__");
5031 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5032 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005033 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005034 }
5035};
Tim Northovera2ee4332014-03-29 15:09:45 +00005036
Tim Northover573cbee2014-05-24 12:52:07 +00005037class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005038protected:
5039 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5040 MacroBuilder &Builder) const override {
5041 Builder.defineMacro("__AARCH64_SIMD__");
5042 Builder.defineMacro("__ARM64_ARCH_8__");
5043 Builder.defineMacro("__ARM_NEON__");
5044 Builder.defineMacro("__LITTLE_ENDIAN__");
5045 Builder.defineMacro("__REGISTER_PREFIX__", "");
5046 Builder.defineMacro("__arm64", "1");
5047 Builder.defineMacro("__arm64__", "1");
5048
5049 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5050 }
5051
Tim Northovera2ee4332014-03-29 15:09:45 +00005052public:
Tim Northover573cbee2014-05-24 12:52:07 +00005053 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5054 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005055 Int64Type = SignedLongLong;
5056 WCharType = SignedInt;
5057 UseSignedCharForObjCBool = false;
5058
Tim Northovera6a19f12015-02-06 01:25:07 +00005059 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005060 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5061
5062 TheCXXABI.set(TargetCXXABI::iOS64);
5063 }
5064
David Blaikie1cbb9712014-11-14 19:09:44 +00005065 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005066 return TargetInfo::CharPtrBuiltinVaList;
5067 }
5068};
Tim Northovera2ee4332014-03-29 15:09:45 +00005069
Tony Linthicum76329bf2011-12-12 21:14:55 +00005070// Hexagon abstract base class
5071class HexagonTargetInfo : public TargetInfo {
5072 static const Builtin::Info BuiltinInfo[];
5073 static const char * const GCCRegNames[];
5074 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5075 std::string CPU;
5076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005077 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005078 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005079 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005080
5081 // {} in inline assembly are packet specifiers, not assembly variant
5082 // specifiers.
5083 NoAsmVariants = true;
5084 }
5085
Craig Topper3164f332014-03-11 03:39:26 +00005086 void getTargetBuiltins(const Builtin::Info *&Records,
5087 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005088 Records = BuiltinInfo;
5089 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5090 }
5091
Craig Topper3164f332014-03-11 03:39:26 +00005092 bool validateAsmConstraint(const char *&Name,
5093 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005094 return true;
5095 }
5096
Craig Topper3164f332014-03-11 03:39:26 +00005097 void getTargetDefines(const LangOptions &Opts,
5098 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005099
Craig Topper3164f332014-03-11 03:39:26 +00005100 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005101 return Feature == "hexagon";
5102 }
Craig Topper3164f332014-03-11 03:39:26 +00005103
5104 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005105 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005106 }
Craig Topper3164f332014-03-11 03:39:26 +00005107 void getGCCRegNames(const char * const *&Names,
5108 unsigned &NumNames) const override;
5109 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5110 unsigned &NumAliases) const override;
5111 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005112 return "";
5113 }
Sebastian Pop86500282012-01-13 20:37:10 +00005114
5115 static const char *getHexagonCPUSuffix(StringRef Name) {
5116 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005117 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005118 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005119 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005120 }
5121
Craig Topper3164f332014-03-11 03:39:26 +00005122 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005123 if (!getHexagonCPUSuffix(Name))
5124 return false;
5125
Tony Linthicum76329bf2011-12-12 21:14:55 +00005126 CPU = Name;
5127 return true;
5128 }
5129};
5130
5131void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5132 MacroBuilder &Builder) const {
5133 Builder.defineMacro("qdsp6");
5134 Builder.defineMacro("__qdsp6", "1");
5135 Builder.defineMacro("__qdsp6__", "1");
5136
5137 Builder.defineMacro("hexagon");
5138 Builder.defineMacro("__hexagon", "1");
5139 Builder.defineMacro("__hexagon__", "1");
5140
5141 if(CPU == "hexagonv1") {
5142 Builder.defineMacro("__HEXAGON_V1__");
5143 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5144 if(Opts.HexagonQdsp6Compat) {
5145 Builder.defineMacro("__QDSP6_V1__");
5146 Builder.defineMacro("__QDSP6_ARCH__", "1");
5147 }
5148 }
5149 else if(CPU == "hexagonv2") {
5150 Builder.defineMacro("__HEXAGON_V2__");
5151 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5152 if(Opts.HexagonQdsp6Compat) {
5153 Builder.defineMacro("__QDSP6_V2__");
5154 Builder.defineMacro("__QDSP6_ARCH__", "2");
5155 }
5156 }
5157 else if(CPU == "hexagonv3") {
5158 Builder.defineMacro("__HEXAGON_V3__");
5159 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5160 if(Opts.HexagonQdsp6Compat) {
5161 Builder.defineMacro("__QDSP6_V3__");
5162 Builder.defineMacro("__QDSP6_ARCH__", "3");
5163 }
5164 }
5165 else if(CPU == "hexagonv4") {
5166 Builder.defineMacro("__HEXAGON_V4__");
5167 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5168 if(Opts.HexagonQdsp6Compat) {
5169 Builder.defineMacro("__QDSP6_V4__");
5170 Builder.defineMacro("__QDSP6_ARCH__", "4");
5171 }
5172 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005173 else if(CPU == "hexagonv5") {
5174 Builder.defineMacro("__HEXAGON_V5__");
5175 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5176 if(Opts.HexagonQdsp6Compat) {
5177 Builder.defineMacro("__QDSP6_V5__");
5178 Builder.defineMacro("__QDSP6_ARCH__", "5");
5179 }
5180 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005181}
5182
5183const char * const HexagonTargetInfo::GCCRegNames[] = {
5184 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5185 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5186 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5187 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5188 "p0", "p1", "p2", "p3",
5189 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5190};
5191
5192void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5193 unsigned &NumNames) const {
5194 Names = GCCRegNames;
5195 NumNames = llvm::array_lengthof(GCCRegNames);
5196}
5197
5198
5199const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5200 { { "sp" }, "r29" },
5201 { { "fp" }, "r30" },
5202 { { "lr" }, "r31" },
5203 };
5204
5205void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5206 unsigned &NumAliases) const {
5207 Aliases = GCCRegAliases;
5208 NumAliases = llvm::array_lengthof(GCCRegAliases);
5209}
5210
5211
5212const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5213#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5214#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5215 ALL_LANGUAGES },
5216#include "clang/Basic/BuiltinsHexagon.def"
5217};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005218
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005219// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5220class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005221 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5222 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005223 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005224public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005225 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005226
Craig Topper3164f332014-03-11 03:39:26 +00005227 bool handleTargetFeatures(std::vector<std::string> &Features,
5228 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005229 SoftFloat = false;
5230 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5231 if (Features[i] == "+soft-float")
5232 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005233 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005234 }
Craig Topper3164f332014-03-11 03:39:26 +00005235 void getTargetDefines(const LangOptions &Opts,
5236 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005237 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005238 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005239
5240 if (SoftFloat)
5241 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005242 }
Craig Topper3164f332014-03-11 03:39:26 +00005243
5244 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005245 return llvm::StringSwitch<bool>(Feature)
5246 .Case("softfloat", SoftFloat)
5247 .Case("sparc", true)
5248 .Default(false);
5249 }
Craig Topper3164f332014-03-11 03:39:26 +00005250
5251 void getTargetBuiltins(const Builtin::Info *&Records,
5252 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005253 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005254 }
Craig Topper3164f332014-03-11 03:39:26 +00005255 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005256 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005257 }
Craig Topper3164f332014-03-11 03:39:26 +00005258 void getGCCRegNames(const char * const *&Names,
5259 unsigned &NumNames) const override;
5260 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5261 unsigned &NumAliases) const override;
5262 bool validateAsmConstraint(const char *&Name,
5263 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005264 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005265 switch (*Name) {
5266 case 'I': // Signed 13-bit constant
5267 case 'J': // Zero
5268 case 'K': // 32-bit constant with the low 12 bits clear
5269 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5270 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5271 case 'N': // Same as 'K' but zext (required for SIMode)
5272 case 'O': // The constant 4096
5273 return true;
5274 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005275 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005276 }
Craig Topper3164f332014-03-11 03:39:26 +00005277 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005278 // FIXME: Implement!
5279 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005280 }
5281};
5282
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005283const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005284 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5285 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5286 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5287 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5288};
5289
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005290void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5291 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005292 Names = GCCRegNames;
5293 NumNames = llvm::array_lengthof(GCCRegNames);
5294}
5295
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005296const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005297 { { "g0" }, "r0" },
5298 { { "g1" }, "r1" },
5299 { { "g2" }, "r2" },
5300 { { "g3" }, "r3" },
5301 { { "g4" }, "r4" },
5302 { { "g5" }, "r5" },
5303 { { "g6" }, "r6" },
5304 { { "g7" }, "r7" },
5305 { { "o0" }, "r8" },
5306 { { "o1" }, "r9" },
5307 { { "o2" }, "r10" },
5308 { { "o3" }, "r11" },
5309 { { "o4" }, "r12" },
5310 { { "o5" }, "r13" },
5311 { { "o6", "sp" }, "r14" },
5312 { { "o7" }, "r15" },
5313 { { "l0" }, "r16" },
5314 { { "l1" }, "r17" },
5315 { { "l2" }, "r18" },
5316 { { "l3" }, "r19" },
5317 { { "l4" }, "r20" },
5318 { { "l5" }, "r21" },
5319 { { "l6" }, "r22" },
5320 { { "l7" }, "r23" },
5321 { { "i0" }, "r24" },
5322 { { "i1" }, "r25" },
5323 { { "i2" }, "r26" },
5324 { { "i3" }, "r27" },
5325 { { "i4" }, "r28" },
5326 { { "i5" }, "r29" },
5327 { { "i6", "fp" }, "r30" },
5328 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005329};
5330
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005331void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5332 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005333 Aliases = GCCRegAliases;
5334 NumAliases = llvm::array_lengthof(GCCRegAliases);
5335}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005336
5337// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5338class SparcV8TargetInfo : public SparcTargetInfo {
5339public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005340 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005341 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005342 }
5343
Craig Topper3164f332014-03-11 03:39:26 +00005344 void getTargetDefines(const LangOptions &Opts,
5345 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005346 SparcTargetInfo::getTargetDefines(Opts, Builder);
5347 Builder.defineMacro("__sparcv8");
5348 }
5349};
5350
5351// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5352class SparcV9TargetInfo : public SparcTargetInfo {
5353public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005354 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005355 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005356 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005357 // This is an LP64 platform.
5358 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005359
5360 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005361 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005362 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005363 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005364 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005365 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005366
5367 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5368 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5369 LongDoubleWidth = 128;
5370 LongDoubleAlign = 128;
5371 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005372 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005373 }
5374
Craig Topper3164f332014-03-11 03:39:26 +00005375 void getTargetDefines(const LangOptions &Opts,
5376 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005377 SparcTargetInfo::getTargetDefines(Opts, Builder);
5378 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005379 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005380 // Solaris doesn't need these variants, but the BSDs do.
5381 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005382 Builder.defineMacro("__sparc64__");
5383 Builder.defineMacro("__sparc_v9__");
5384 Builder.defineMacro("__sparcv9__");
5385 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005386 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005387
Craig Topper3164f332014-03-11 03:39:26 +00005388 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005389 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5390 .Case("v9", true)
5391 .Case("ultrasparc", true)
5392 .Case("ultrasparc3", true)
5393 .Case("niagara", true)
5394 .Case("niagara2", true)
5395 .Case("niagara3", true)
5396 .Case("niagara4", true)
5397 .Default(false);
5398
5399 // No need to store the CPU yet. There aren't any CPU-specific
5400 // macros to define.
5401 return CPUKnown;
5402 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005403};
5404
Torok Edwinb2b37c62009-06-30 17:10:35 +00005405class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005406public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005407 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5408 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005409 SizeType = UnsignedInt;
5410 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005411 }
5412};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005413
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005414class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005415 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005416 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005417 std::string CPU;
5418 bool HasTransactionalExecution;
Ulrich Weigand47445072013-05-06 16:26:41 +00005419
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005420public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005421 SystemZTargetInfo(const llvm::Triple &Triple)
5422 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005423 IntMaxType = SignedLong;
5424 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005425 TLSSupported = true;
5426 IntWidth = IntAlign = 32;
5427 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5428 PointerWidth = PointerAlign = 64;
5429 LongDoubleWidth = 128;
5430 LongDoubleAlign = 64;
5431 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5432 MinGlobalAlign = 16;
5433 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5434 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5435 }
5436 void getTargetDefines(const LangOptions &Opts,
5437 MacroBuilder &Builder) const override {
5438 Builder.defineMacro("__s390__");
5439 Builder.defineMacro("__s390x__");
5440 Builder.defineMacro("__zarch__");
5441 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005442 if (HasTransactionalExecution)
5443 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005444 }
5445 void getTargetBuiltins(const Builtin::Info *&Records,
5446 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005447 Records = BuiltinInfo;
5448 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005449 }
5450
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005451 void getGCCRegNames(const char *const *&Names,
5452 unsigned &NumNames) const override;
5453 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5454 unsigned &NumAliases) const override {
5455 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005456 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005457 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005458 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005459 bool validateAsmConstraint(const char *&Name,
5460 TargetInfo::ConstraintInfo &info) const override;
5461 const char *getClobbers() const override {
5462 // FIXME: Is this really right?
5463 return "";
5464 }
5465 BuiltinVaListKind getBuiltinVaListKind() const override {
5466 return TargetInfo::SystemZBuiltinVaList;
5467 }
5468 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005469 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005470 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5471 .Case("z10", true)
5472 .Case("z196", true)
5473 .Case("zEC12", true)
5474 .Default(false);
5475
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005476 return CPUKnown;
5477 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005478 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5479 if (CPU == "zEC12")
5480 Features["transactional-execution"] = true;
5481 }
5482
5483 bool handleTargetFeatures(std::vector<std::string> &Features,
5484 DiagnosticsEngine &Diags) override {
5485 HasTransactionalExecution = false;
5486 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5487 if (Features[i] == "+transactional-execution")
5488 HasTransactionalExecution = true;
5489 }
5490 return true;
5491 }
5492
5493 bool hasFeature(StringRef Feature) const override {
5494 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005495 .Case("systemz", true)
5496 .Case("htm", HasTransactionalExecution)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005497 .Default(false);
5498 }
5499};
5500
5501const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5502#define BUILTIN(ID, TYPE, ATTRS) \
5503 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5504#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005505};
5506
5507const char *const SystemZTargetInfo::GCCRegNames[] = {
5508 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5509 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5510 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5511 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5512};
5513
5514void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5515 unsigned &NumNames) const {
5516 Names = GCCRegNames;
5517 NumNames = llvm::array_lengthof(GCCRegNames);
5518}
5519
5520bool SystemZTargetInfo::
5521validateAsmConstraint(const char *&Name,
5522 TargetInfo::ConstraintInfo &Info) const {
5523 switch (*Name) {
5524 default:
5525 return false;
5526
5527 case 'a': // Address register
5528 case 'd': // Data register (equivalent to 'r')
5529 case 'f': // Floating-point register
5530 Info.setAllowsRegister();
5531 return true;
5532
5533 case 'I': // Unsigned 8-bit constant
5534 case 'J': // Unsigned 12-bit constant
5535 case 'K': // Signed 16-bit constant
5536 case 'L': // Signed 20-bit displacement (on all targets we support)
5537 case 'M': // 0x7fffffff
5538 return true;
5539
5540 case 'Q': // Memory with base and unsigned 12-bit displacement
5541 case 'R': // Likewise, plus an index
5542 case 'S': // Memory with base and signed 20-bit displacement
5543 case 'T': // Likewise, plus an index
5544 Info.setAllowsMemory();
5545 return true;
5546 }
5547}
Ulrich Weigand47445072013-05-06 16:26:41 +00005548
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005549 class MSP430TargetInfo : public TargetInfo {
5550 static const char * const GCCRegNames[];
5551 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005552 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005553 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005554 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005555 IntWidth = 16; IntAlign = 16;
5556 LongWidth = 32; LongLongWidth = 64;
5557 LongAlign = LongLongAlign = 16;
5558 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005559 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005560 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005561 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005562 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005563 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005564 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005565 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005566 }
5567 void getTargetDefines(const LangOptions &Opts,
5568 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005569 Builder.defineMacro("MSP430");
5570 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005571 // FIXME: defines for different 'flavours' of MCU
5572 }
Craig Topper3164f332014-03-11 03:39:26 +00005573 void getTargetBuiltins(const Builtin::Info *&Records,
5574 unsigned &NumRecords) const override {
5575 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005576 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005577 NumRecords = 0;
5578 }
Craig Topper3164f332014-03-11 03:39:26 +00005579 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005580 return Feature == "msp430";
5581 }
Craig Topper3164f332014-03-11 03:39:26 +00005582 void getGCCRegNames(const char * const *&Names,
5583 unsigned &NumNames) const override;
5584 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5585 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005586 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005587 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005588 NumAliases = 0;
5589 }
Eric Christopher917e9522014-11-18 22:36:15 +00005590 bool
5591 validateAsmConstraint(const char *&Name,
5592 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005593 // FIXME: implement
5594 switch (*Name) {
5595 case 'K': // the constant 1
5596 case 'L': // constant -1^20 .. 1^19
5597 case 'M': // constant 1-4:
5598 return true;
5599 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005600 // No target constraints for now.
5601 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005602 }
Craig Topper3164f332014-03-11 03:39:26 +00005603 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005604 // FIXME: Is this really right?
5605 return "";
5606 }
Craig Topper3164f332014-03-11 03:39:26 +00005607 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005608 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005609 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005610 }
5611 };
5612
5613 const char * const MSP430TargetInfo::GCCRegNames[] = {
5614 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5615 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5616 };
5617
5618 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5619 unsigned &NumNames) const {
5620 Names = GCCRegNames;
5621 NumNames = llvm::array_lengthof(GCCRegNames);
5622 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005623
Mike Stump11289f42009-09-09 15:08:12 +00005624 // LLVM and Clang cannot be used directly to output native binaries for
5625 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005626 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005627 //
5628 // TCE uses the llvm bitcode as input and uses it for generating customized
5629 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005630 // publicly available in http://tce.cs.tut.fi
5631
Eli Friedman1f191002011-10-07 19:51:42 +00005632 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5633 3, // opencl_global
5634 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005635 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005636 // FIXME: generic has to be added to the target
5637 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005638 0, // cuda_device
5639 0, // cuda_constant
5640 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005641 };
5642
Eli Friedmana9c3d712009-08-19 20:47:07 +00005643 class TCETargetInfo : public TargetInfo{
5644 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005645 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005646 TLSSupported = false;
5647 IntWidth = 32;
5648 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005649 PointerWidth = 32;
5650 IntAlign = 32;
5651 LongAlign = LongLongAlign = 32;
5652 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005653 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005654 SizeType = UnsignedInt;
5655 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005656 IntPtrType = SignedInt;
5657 PtrDiffType = SignedInt;
5658 FloatWidth = 32;
5659 FloatAlign = 32;
5660 DoubleWidth = 32;
5661 DoubleAlign = 32;
5662 LongDoubleWidth = 32;
5663 LongDoubleAlign = 32;
5664 FloatFormat = &llvm::APFloat::IEEEsingle;
5665 DoubleFormat = &llvm::APFloat::IEEEsingle;
5666 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005667 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5668 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005669 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005670 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005671 }
5672
Craig Topper3164f332014-03-11 03:39:26 +00005673 void getTargetDefines(const LangOptions &Opts,
5674 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005675 DefineStd(Builder, "tce", Opts);
5676 Builder.defineMacro("__TCE__");
5677 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005678 }
Craig Topper3164f332014-03-11 03:39:26 +00005679 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005680 return Feature == "tce";
5681 }
Craig Topper3164f332014-03-11 03:39:26 +00005682
5683 void getTargetBuiltins(const Builtin::Info *&Records,
5684 unsigned &NumRecords) const override {}
5685 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005686 return "";
5687 }
Craig Topper3164f332014-03-11 03:39:26 +00005688 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005689 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005690 }
Craig Topper3164f332014-03-11 03:39:26 +00005691 void getGCCRegNames(const char * const *&Names,
5692 unsigned &NumNames) const override {}
5693 bool validateAsmConstraint(const char *&Name,
5694 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005695 return true;
5696 }
Craig Topper3164f332014-03-11 03:39:26 +00005697 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5698 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005699 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005700
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005701class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005702 virtual void setDescriptionString() = 0;
5703
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005704 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005705 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005706 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005707 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005708 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005709 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005710 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005711 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005712 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005713 enum DspRevEnum {
5714 NoDSP, DSP1, DSP2
5715 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005716 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005717
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005718protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005719 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005720 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005721
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005722public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005723 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5724 const std::string &CPUStr)
5725 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005726 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005727 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5728 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5729 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005730
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005731 bool isNaN2008Default() const {
5732 return CPU == "mips32r6" || CPU == "mips64r6";
5733 }
5734
5735 bool isFP64Default() const {
5736 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5737 }
5738
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005739 bool isNan2008() const override {
5740 return IsNan2008;
5741 }
5742
Alp Toker4925ba72014-06-07 23:30:42 +00005743 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005744 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005745 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5746 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005747 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005748 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005749 .Case("mips1", IsMips32)
5750 .Case("mips2", IsMips32)
5751 .Case("mips3", true)
5752 .Case("mips4", true)
5753 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005754 .Case("mips32", IsMips32)
5755 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005756 .Case("mips32r3", IsMips32)
5757 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005758 .Case("mips32r6", IsMips32)
5759 .Case("mips64", true)
5760 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005761 .Case("mips64r3", true)
5762 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005763 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005764 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005765 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005766 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005767 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005768 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005769 if (CPU == "octeon")
5770 Features["mips64r2"] = Features["cnmips"] = true;
5771 else
5772 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005773 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005774
Craig Topper3164f332014-03-11 03:39:26 +00005775 void getTargetDefines(const LangOptions &Opts,
5776 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005777 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005778 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005779 if (Opts.GNUMode)
5780 Builder.defineMacro("mips");
5781
Simon Atanasyan683535b2012-08-29 19:14:58 +00005782 Builder.defineMacro("__REGISTER_PREFIX__", "");
5783
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005784 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005785 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005786 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005787 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005788 case SoftFloat:
5789 Builder.defineMacro("__mips_soft_float", Twine(1));
5790 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005791 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005792
Simon Atanasyan16071912013-04-14 14:07:30 +00005793 if (IsSingleFloat)
5794 Builder.defineMacro("__mips_single_float", Twine(1));
5795
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005796 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5797 Builder.defineMacro("_MIPS_FPSET",
5798 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5799
Simon Atanasyan72244b62012-07-05 16:06:06 +00005800 if (IsMips16)
5801 Builder.defineMacro("__mips16", Twine(1));
5802
Simon Atanasyan60777612013-04-14 14:07:51 +00005803 if (IsMicromips)
5804 Builder.defineMacro("__mips_micromips", Twine(1));
5805
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005806 if (IsNan2008)
5807 Builder.defineMacro("__mips_nan2008", Twine(1));
5808
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005809 switch (DspRev) {
5810 default:
5811 break;
5812 case DSP1:
5813 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5814 Builder.defineMacro("__mips_dsp", Twine(1));
5815 break;
5816 case DSP2:
5817 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5818 Builder.defineMacro("__mips_dspr2", Twine(1));
5819 Builder.defineMacro("__mips_dsp", Twine(1));
5820 break;
5821 }
5822
Jack Carter44ff1e52013-08-12 17:20:29 +00005823 if (HasMSA)
5824 Builder.defineMacro("__mips_msa", Twine(1));
5825
Simon Atanasyan26f19672012-04-05 19:28:31 +00005826 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5827 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5828 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005829
5830 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5831 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005832 }
5833
Craig Topper3164f332014-03-11 03:39:26 +00005834 void getTargetBuiltins(const Builtin::Info *&Records,
5835 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005836 Records = BuiltinInfo;
5837 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005838 }
Craig Topper3164f332014-03-11 03:39:26 +00005839 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005840 return llvm::StringSwitch<bool>(Feature)
5841 .Case("mips", true)
5842 .Case("fp64", HasFP64)
5843 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005844 }
Craig Topper3164f332014-03-11 03:39:26 +00005845 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005846 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005847 }
Craig Topper3164f332014-03-11 03:39:26 +00005848 void getGCCRegNames(const char * const *&Names,
5849 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005850 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005851 // CPU register names
5852 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005853 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5854 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5855 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005856 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5857 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005858 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5859 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5860 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5861 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005862 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005863 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005864 "$fcc5","$fcc6","$fcc7",
5865 // MSA register names
5866 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5867 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5868 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5869 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5870 // MSA control register names
5871 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5872 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005873 };
5874 Names = GCCRegNames;
5875 NumNames = llvm::array_lengthof(GCCRegNames);
5876 }
Craig Topper3164f332014-03-11 03:39:26 +00005877 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5878 unsigned &NumAliases) const override = 0;
5879 bool validateAsmConstraint(const char *&Name,
5880 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005881 switch (*Name) {
5882 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005883 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005884 case 'r': // CPU registers.
5885 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005886 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005887 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005888 case 'c': // $25 for indirect jumps
5889 case 'l': // lo register
5890 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005891 Info.setAllowsRegister();
5892 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005893 case 'I': // Signed 16-bit constant
5894 case 'J': // Integer 0
5895 case 'K': // Unsigned 16-bit constant
5896 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5897 case 'M': // Constants not loadable via lui, addiu, or ori
5898 case 'N': // Constant -1 to -65535
5899 case 'O': // A signed 15-bit constant
5900 case 'P': // A constant between 1 go 65535
5901 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005902 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005903 Info.setAllowsMemory();
5904 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005905 case 'Z':
5906 if (Name[1] == 'C') { // An address usable by ll, and sc.
5907 Info.setAllowsMemory();
5908 Name++; // Skip over 'Z'.
5909 return true;
5910 }
5911 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005912 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005913 }
5914
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005915 std::string convertConstraint(const char *&Constraint) const override {
5916 std::string R;
5917 switch (*Constraint) {
5918 case 'Z': // Two-character constraint; add "^" hint for later parsing.
5919 if (Constraint[1] == 'C') {
5920 R = std::string("^") + std::string(Constraint, 2);
5921 Constraint++;
5922 return R;
5923 }
5924 break;
5925 }
5926 return TargetInfo::convertConstraint(Constraint);
5927 }
5928
Craig Topper3164f332014-03-11 03:39:26 +00005929 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005930 // In GCC, $1 is not widely used in generated code (it's used only in a few
5931 // specific situations), so there is no real need for users to add it to
5932 // the clobbers list if they want to use it in their inline assembly code.
5933 //
5934 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5935 // code generation, so using it in inline assembly without adding it to the
5936 // clobbers list can cause conflicts between the inline assembly code and
5937 // the surrounding generated code.
5938 //
5939 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5940 // operands, which will conflict with the ".set at" assembler option (which
5941 // we use only for inline assembly, in order to maintain compatibility with
5942 // GCC) and will also conflict with the user's usage of $1.
5943 //
5944 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5945 // register for generated code is to automatically clobber $1 for all inline
5946 // assembly code.
5947 //
5948 // FIXME: We should automatically clobber $1 only for inline assembly code
5949 // which actually uses it. This would allow LLVM to use $1 for inline
5950 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005951 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005952 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005953
Craig Topper3164f332014-03-11 03:39:26 +00005954 bool handleTargetFeatures(std::vector<std::string> &Features,
5955 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005956 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005957 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005958 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005959 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005960 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005961 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005962 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005963
5964 for (std::vector<std::string>::iterator it = Features.begin(),
5965 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005966 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005967 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005968 else if (*it == "+soft-float")
5969 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005970 else if (*it == "+mips16")
5971 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005972 else if (*it == "+micromips")
5973 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005974 else if (*it == "+dsp")
5975 DspRev = std::max(DspRev, DSP1);
5976 else if (*it == "+dspr2")
5977 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005978 else if (*it == "+msa")
5979 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005980 else if (*it == "+fp64")
5981 HasFP64 = true;
5982 else if (*it == "-fp64")
5983 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005984 else if (*it == "+nan2008")
5985 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005986 else if (*it == "-nan2008")
5987 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005988 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005989
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005990 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005991 std::vector<std::string>::iterator it =
5992 std::find(Features.begin(), Features.end(), "+soft-float");
5993 if (it != Features.end())
5994 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005995
Akira Hatanaka9064e362013-10-29 18:30:33 +00005996 setDescriptionString();
5997
Rafael Espindolaeb265472013-08-21 21:59:03 +00005998 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005999 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006000
Craig Topper3164f332014-03-11 03:39:26 +00006001 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006002 if (RegNo == 0) return 4;
6003 if (RegNo == 1) return 5;
6004 return -1;
6005 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006006
6007 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006008};
6009
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006010const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6011#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6012#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6013 ALL_LANGUAGES },
6014#include "clang/Basic/BuiltinsMips.def"
6015};
6016
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006017class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006018public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006019 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006020 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006021 SizeType = UnsignedInt;
6022 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006023 Int64Type = SignedLongLong;
6024 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006025 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006026 }
Craig Topper3164f332014-03-11 03:39:26 +00006027 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006028 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006029 ABI = Name;
6030 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006031 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006032 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006033 }
Craig Topper3164f332014-03-11 03:39:26 +00006034 void getTargetDefines(const LangOptions &Opts,
6035 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006036 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006037
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006038 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006039 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6040
6041 const std::string& CPUStr = getCPU();
6042 if (CPUStr == "mips32")
6043 Builder.defineMacro("__mips_isa_rev", "1");
6044 else if (CPUStr == "mips32r2")
6045 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006046 else if (CPUStr == "mips32r3")
6047 Builder.defineMacro("__mips_isa_rev", "3");
6048 else if (CPUStr == "mips32r5")
6049 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006050 else if (CPUStr == "mips32r6")
6051 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006052
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006053 if (ABI == "o32") {
6054 Builder.defineMacro("__mips_o32");
6055 Builder.defineMacro("_ABIO32", "1");
6056 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6057 }
6058 else if (ABI == "eabi")
6059 Builder.defineMacro("__mips_eabi");
6060 else
David Blaikie83d382b2011-09-23 05:06:16 +00006061 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006062 }
Craig Topper3164f332014-03-11 03:39:26 +00006063 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6064 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006065 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6066 { { "at" }, "$1" },
6067 { { "v0" }, "$2" },
6068 { { "v1" }, "$3" },
6069 { { "a0" }, "$4" },
6070 { { "a1" }, "$5" },
6071 { { "a2" }, "$6" },
6072 { { "a3" }, "$7" },
6073 { { "t0" }, "$8" },
6074 { { "t1" }, "$9" },
6075 { { "t2" }, "$10" },
6076 { { "t3" }, "$11" },
6077 { { "t4" }, "$12" },
6078 { { "t5" }, "$13" },
6079 { { "t6" }, "$14" },
6080 { { "t7" }, "$15" },
6081 { { "s0" }, "$16" },
6082 { { "s1" }, "$17" },
6083 { { "s2" }, "$18" },
6084 { { "s3" }, "$19" },
6085 { { "s4" }, "$20" },
6086 { { "s5" }, "$21" },
6087 { { "s6" }, "$22" },
6088 { { "s7" }, "$23" },
6089 { { "t8" }, "$24" },
6090 { { "t9" }, "$25" },
6091 { { "k0" }, "$26" },
6092 { { "k1" }, "$27" },
6093 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006094 { { "sp","$sp" }, "$29" },
6095 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006096 { { "ra" }, "$31" }
6097 };
6098 Aliases = GCCRegAliases;
6099 NumAliases = llvm::array_lengthof(GCCRegAliases);
6100 }
6101};
6102
6103class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006104 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006105 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006106 }
6107
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006108public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006109 Mips32EBTargetInfo(const llvm::Triple &Triple)
6110 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006111 }
Craig Topper3164f332014-03-11 03:39:26 +00006112 void getTargetDefines(const LangOptions &Opts,
6113 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006114 DefineStd(Builder, "MIPSEB", Opts);
6115 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006116 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006117 }
6118};
6119
6120class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006121 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006122 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006123 }
6124
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006125public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006126 Mips32ELTargetInfo(const llvm::Triple &Triple)
6127 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006128 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006129 }
Craig Topper3164f332014-03-11 03:39:26 +00006130 void getTargetDefines(const LangOptions &Opts,
6131 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006132 DefineStd(Builder, "MIPSEL", Opts);
6133 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006134 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006135 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006136};
Akira Hatanakabef17452011-09-20 19:21:49 +00006137
6138class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006139public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006140 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006141 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006142 LongDoubleWidth = LongDoubleAlign = 128;
6143 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006144 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6145 LongDoubleWidth = LongDoubleAlign = 64;
6146 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6147 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006148 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006149 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006150 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006151 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006152
6153 void setN64ABITypes() {
6154 LongWidth = LongAlign = 64;
6155 PointerWidth = PointerAlign = 64;
6156 SizeType = UnsignedLong;
6157 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006158 Int64Type = SignedLong;
6159 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006160 }
6161
6162 void setN32ABITypes() {
6163 LongWidth = LongAlign = 32;
6164 PointerWidth = PointerAlign = 32;
6165 SizeType = UnsignedInt;
6166 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006167 Int64Type = SignedLongLong;
6168 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006169 }
6170
Craig Topper3164f332014-03-11 03:39:26 +00006171 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006172 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006173 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006174 ABI = Name;
6175 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006176 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006177 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006178 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006179 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006180 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006181 }
6182 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006183 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006184
Craig Topper3164f332014-03-11 03:39:26 +00006185 void getTargetDefines(const LangOptions &Opts,
6186 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006187 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006188
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006189 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006190 Builder.defineMacro("__mips64");
6191 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006192 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6193
6194 const std::string& CPUStr = getCPU();
6195 if (CPUStr == "mips64")
6196 Builder.defineMacro("__mips_isa_rev", "1");
6197 else if (CPUStr == "mips64r2")
6198 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006199 else if (CPUStr == "mips64r3")
6200 Builder.defineMacro("__mips_isa_rev", "3");
6201 else if (CPUStr == "mips64r5")
6202 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006203 else if (CPUStr == "mips64r6")
6204 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006205
Akira Hatanakabef17452011-09-20 19:21:49 +00006206 if (ABI == "n32") {
6207 Builder.defineMacro("__mips_n32");
6208 Builder.defineMacro("_ABIN32", "2");
6209 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6210 }
6211 else if (ABI == "n64") {
6212 Builder.defineMacro("__mips_n64");
6213 Builder.defineMacro("_ABI64", "3");
6214 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6215 }
6216 else
David Blaikie83d382b2011-09-23 05:06:16 +00006217 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006218 }
Craig Topper3164f332014-03-11 03:39:26 +00006219 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6220 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006221 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6222 { { "at" }, "$1" },
6223 { { "v0" }, "$2" },
6224 { { "v1" }, "$3" },
6225 { { "a0" }, "$4" },
6226 { { "a1" }, "$5" },
6227 { { "a2" }, "$6" },
6228 { { "a3" }, "$7" },
6229 { { "a4" }, "$8" },
6230 { { "a5" }, "$9" },
6231 { { "a6" }, "$10" },
6232 { { "a7" }, "$11" },
6233 { { "t0" }, "$12" },
6234 { { "t1" }, "$13" },
6235 { { "t2" }, "$14" },
6236 { { "t3" }, "$15" },
6237 { { "s0" }, "$16" },
6238 { { "s1" }, "$17" },
6239 { { "s2" }, "$18" },
6240 { { "s3" }, "$19" },
6241 { { "s4" }, "$20" },
6242 { { "s5" }, "$21" },
6243 { { "s6" }, "$22" },
6244 { { "s7" }, "$23" },
6245 { { "t8" }, "$24" },
6246 { { "t9" }, "$25" },
6247 { { "k0" }, "$26" },
6248 { { "k1" }, "$27" },
6249 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006250 { { "sp","$sp" }, "$29" },
6251 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006252 { { "ra" }, "$31" }
6253 };
6254 Aliases = GCCRegAliases;
6255 NumAliases = llvm::array_lengthof(GCCRegAliases);
6256 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006257
6258 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006259};
6260
6261class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006262 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006263 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006264 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006265 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006266 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006267
Akira Hatanakabef17452011-09-20 19:21:49 +00006268 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006269
Akira Hatanakabef17452011-09-20 19:21:49 +00006270public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006271 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006272 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006273 void getTargetDefines(const LangOptions &Opts,
6274 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006275 DefineStd(Builder, "MIPSEB", Opts);
6276 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006277 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006278 }
6279};
6280
6281class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006282 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006283 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006284 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006285 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006286 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006287 }
6288public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006289 Mips64ELTargetInfo(const llvm::Triple &Triple)
6290 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006291 // Default ABI is n64.
6292 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006293 }
Craig Topper3164f332014-03-11 03:39:26 +00006294 void getTargetDefines(const LangOptions &Opts,
6295 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006296 DefineStd(Builder, "MIPSEL", Opts);
6297 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006298 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006299 }
6300};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006301
Ivan Krasindd7403e2011-08-24 20:22:22 +00006302class PNaClTargetInfo : public TargetInfo {
6303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006304 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006305 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006306 this->UserLabelPrefix = "";
6307 this->LongAlign = 32;
6308 this->LongWidth = 32;
6309 this->PointerAlign = 32;
6310 this->PointerWidth = 32;
6311 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006312 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006313 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006314 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006315 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006316 this->SizeType = TargetInfo::UnsignedInt;
6317 this->PtrDiffType = TargetInfo::SignedInt;
6318 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006319 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006320 }
6321
Craig Topper3164f332014-03-11 03:39:26 +00006322 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006323 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006324 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006325 Builder.defineMacro("__le32__");
6326 Builder.defineMacro("__pnacl__");
6327 }
Craig Topper3164f332014-03-11 03:39:26 +00006328 void getTargetDefines(const LangOptions &Opts,
6329 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006330 getArchDefines(Opts, Builder);
6331 }
Craig Topper3164f332014-03-11 03:39:26 +00006332 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006333 return Feature == "pnacl";
6334 }
Craig Topper3164f332014-03-11 03:39:26 +00006335 void getTargetBuiltins(const Builtin::Info *&Records,
6336 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006337 }
Craig Topper3164f332014-03-11 03:39:26 +00006338 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006339 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006340 }
Craig Topper3164f332014-03-11 03:39:26 +00006341 void getGCCRegNames(const char * const *&Names,
6342 unsigned &NumNames) const override;
6343 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6344 unsigned &NumAliases) const override;
6345 bool validateAsmConstraint(const char *&Name,
6346 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006347 return false;
6348 }
6349
Craig Topper3164f332014-03-11 03:39:26 +00006350 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006351 return "";
6352 }
6353};
6354
6355void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6356 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006357 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006358 NumNames = 0;
6359}
6360
6361void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6362 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006363 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006364 NumAliases = 0;
6365}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006366
JF Bastien643817d2014-09-12 17:52:47 +00006367class Le64TargetInfo : public TargetInfo {
6368 static const Builtin::Info BuiltinInfo[];
6369
6370public:
6371 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6372 BigEndian = false;
6373 NoAsmVariants = true;
6374 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6375 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6376 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006377 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006378 }
6379
6380 void getTargetDefines(const LangOptions &Opts,
6381 MacroBuilder &Builder) const override {
6382 DefineStd(Builder, "unix", Opts);
6383 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6384 Builder.defineMacro("__ELF__");
6385 }
6386 void getTargetBuiltins(const Builtin::Info *&Records,
6387 unsigned &NumRecords) const override {
6388 Records = BuiltinInfo;
6389 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6390 }
6391 BuiltinVaListKind getBuiltinVaListKind() const override {
6392 return TargetInfo::PNaClABIBuiltinVaList;
6393 }
6394 const char *getClobbers() const override { return ""; }
6395 void getGCCRegNames(const char *const *&Names,
6396 unsigned &NumNames) const override {
6397 Names = nullptr;
6398 NumNames = 0;
6399 }
6400 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6401 unsigned &NumAliases) const override {
6402 Aliases = nullptr;
6403 NumAliases = 0;
6404 }
6405 bool validateAsmConstraint(const char *&Name,
6406 TargetInfo::ConstraintInfo &Info) const override {
6407 return false;
6408 }
6409
6410 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006411};
6412} // end anonymous namespace.
6413
6414const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6415#define BUILTIN(ID, TYPE, ATTRS) \
6416 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6417#include "clang/Basic/BuiltinsLe64.def"
6418};
6419
6420namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006421 static const unsigned SPIRAddrSpaceMap[] = {
6422 1, // opencl_global
6423 3, // opencl_local
6424 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006425 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006426 0, // cuda_device
6427 0, // cuda_constant
6428 0 // cuda_shared
6429 };
6430 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006431 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006432 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006433 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6434 "SPIR target must use unknown OS");
6435 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6436 "SPIR target must use unknown environment type");
6437 BigEndian = false;
6438 TLSSupported = false;
6439 LongWidth = LongAlign = 64;
6440 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006441 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006442 // Define available target features
6443 // These must be defined in sorted order!
6444 NoAsmVariants = true;
6445 }
Craig Topper3164f332014-03-11 03:39:26 +00006446 void getTargetDefines(const LangOptions &Opts,
6447 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006448 DefineStd(Builder, "SPIR", Opts);
6449 }
Craig Topper3164f332014-03-11 03:39:26 +00006450 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006451 return Feature == "spir";
6452 }
Craig Topper3164f332014-03-11 03:39:26 +00006453
6454 void getTargetBuiltins(const Builtin::Info *&Records,
6455 unsigned &NumRecords) const override {}
6456 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006457 return "";
6458 }
Craig Topper3164f332014-03-11 03:39:26 +00006459 void getGCCRegNames(const char * const *&Names,
6460 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006461 bool
6462 validateAsmConstraint(const char *&Name,
6463 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006464 return true;
6465 }
Craig Topper3164f332014-03-11 03:39:26 +00006466 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6467 unsigned &NumAliases) const override {}
6468 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006469 return TargetInfo::VoidPtrBuiltinVaList;
6470 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006471
6472 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6473 return (CC == CC_SpirFunction ||
6474 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6475 }
6476
6477 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6478 return CC_SpirFunction;
6479 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006480 };
6481
6482
6483 class SPIR32TargetInfo : public SPIRTargetInfo {
6484 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006485 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006486 PointerWidth = PointerAlign = 32;
6487 SizeType = TargetInfo::UnsignedInt;
6488 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6489 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006490 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6491 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006492 }
Craig Topper3164f332014-03-11 03:39:26 +00006493 void getTargetDefines(const LangOptions &Opts,
6494 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006495 DefineStd(Builder, "SPIR32", Opts);
6496 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006497 };
6498
6499 class SPIR64TargetInfo : public SPIRTargetInfo {
6500 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006501 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006502 PointerWidth = PointerAlign = 64;
6503 SizeType = TargetInfo::UnsignedLong;
6504 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006505 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6506 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006507 }
Craig Topper3164f332014-03-11 03:39:26 +00006508 void getTargetDefines(const LangOptions &Opts,
6509 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006510 DefineStd(Builder, "SPIR64", Opts);
6511 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006512 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006513
Robert Lytton0e076492013-08-13 09:43:10 +00006514class XCoreTargetInfo : public TargetInfo {
6515 static const Builtin::Info BuiltinInfo[];
6516public:
6517 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6518 BigEndian = false;
6519 NoAsmVariants = true;
6520 LongLongAlign = 32;
6521 SuitableAlign = 32;
6522 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006523 SizeType = UnsignedInt;
6524 PtrDiffType = SignedInt;
6525 IntPtrType = SignedInt;
6526 WCharType = UnsignedChar;
6527 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006528 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006529 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00006530 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006531 }
Craig Topper3164f332014-03-11 03:39:26 +00006532 void getTargetDefines(const LangOptions &Opts,
6533 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006534 Builder.defineMacro("__XS1B__");
6535 }
Craig Topper3164f332014-03-11 03:39:26 +00006536 void getTargetBuiltins(const Builtin::Info *&Records,
6537 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006538 Records = BuiltinInfo;
6539 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6540 }
Craig Topper3164f332014-03-11 03:39:26 +00006541 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006542 return TargetInfo::VoidPtrBuiltinVaList;
6543 }
Craig Topper3164f332014-03-11 03:39:26 +00006544 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006545 return "";
6546 }
Craig Topper3164f332014-03-11 03:39:26 +00006547 void getGCCRegNames(const char * const *&Names,
6548 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006549 static const char * const GCCRegNames[] = {
6550 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6551 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6552 };
6553 Names = GCCRegNames;
6554 NumNames = llvm::array_lengthof(GCCRegNames);
6555 }
Craig Topper3164f332014-03-11 03:39:26 +00006556 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6557 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006558 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006559 NumAliases = 0;
6560 }
Craig Topper3164f332014-03-11 03:39:26 +00006561 bool validateAsmConstraint(const char *&Name,
6562 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006563 return false;
6564 }
Craig Topper3164f332014-03-11 03:39:26 +00006565 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006566 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6567 return (RegNo < 2)? RegNo : -1;
6568 }
Robert Lytton0e076492013-08-13 09:43:10 +00006569};
6570
6571const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6572#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6573#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6574 ALL_LANGUAGES },
6575#include "clang/Basic/BuiltinsXCore.def"
6576};
6577} // end anonymous namespace.
6578
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006579namespace {
6580// x86_32 Android target
6581class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6582public:
6583 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6584 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6585 SuitableAlign = 32;
6586 LongDoubleWidth = 64;
6587 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6588 }
6589};
6590} // end anonymous namespace
6591
6592namespace {
6593// x86_64 Android target
6594class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6595public:
6596 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6597 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6598 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6599 }
6600};
6601} // end anonymous namespace
6602
Ivan Krasindd7403e2011-08-24 20:22:22 +00006603
Chris Lattner5ba61f02006-10-14 07:39:34 +00006604//===----------------------------------------------------------------------===//
6605// Driver code
6606//===----------------------------------------------------------------------===//
6607
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006608static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006609 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006610
Daniel Dunbar52322032009-08-18 05:47:58 +00006611 switch (Triple.getArch()) {
6612 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006613 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006614
Tim Northover2a0783d2014-05-30 14:14:07 +00006615 case llvm::Triple::xcore:
6616 return new XCoreTargetInfo(Triple);
6617
6618 case llvm::Triple::hexagon:
6619 return new HexagonTargetInfo(Triple);
6620
6621 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006622 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006623 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006624
6625 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006626 case llvm::Triple::FreeBSD:
6627 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006628 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006629 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006630 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006631 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006632 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006633 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006634 }
6635
Christian Pirker9b019ae2014-02-25 13:51:00 +00006636 case llvm::Triple::aarch64_be:
6637 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006638 case llvm::Triple::FreeBSD:
6639 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006640 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006641 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006642 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006643 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006644 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006645 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006646 }
6647
Daniel Dunbar52322032009-08-18 05:47:58 +00006648 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006649 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006650 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006651 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006652
Daniel Dunbar52322032009-08-18 05:47:58 +00006653 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006654 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006655 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006656 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006657 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006658 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006659 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006660 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006661 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006662 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006663 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006664 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006665 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006666 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006667 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006668 case llvm::Triple::Win32:
6669 switch (Triple.getEnvironment()) {
6670 default:
6671 return new ARMleTargetInfo(Triple);
6672 case llvm::Triple::Itanium:
6673 return new ItaniumWindowsARMleTargetInfo(Triple);
6674 case llvm::Triple::MSVC:
6675 return new MicrosoftARMleTargetInfo(Triple);
6676 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006677 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006678 return new ARMleTargetInfo(Triple);
6679 }
6680
6681 case llvm::Triple::armeb:
6682 case llvm::Triple::thumbeb:
6683 if (Triple.isOSDarwin())
6684 return new DarwinARMTargetInfo(Triple);
6685
6686 switch (os) {
6687 case llvm::Triple::Linux:
6688 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6689 case llvm::Triple::FreeBSD:
6690 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6691 case llvm::Triple::NetBSD:
6692 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6693 case llvm::Triple::OpenBSD:
6694 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6695 case llvm::Triple::Bitrig:
6696 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6697 case llvm::Triple::RTEMS:
6698 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6699 case llvm::Triple::NaCl:
6700 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6701 default:
6702 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006703 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006704
Daniel Dunbar52322032009-08-18 05:47:58 +00006705 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006706 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006707
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006708 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006709 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006710 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006711 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006712 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006713 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006714 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006715 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006716 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006717 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006718 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006719 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006720 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006721
6722 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006723 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006724 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006725 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006726 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006727 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006728 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006729 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006730 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006732 case llvm::Triple::NaCl:
6733 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006734 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006735 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006736 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006737
Akira Hatanakabef17452011-09-20 19:21:49 +00006738 case llvm::Triple::mips64:
6739 switch (os) {
6740 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006741 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006742 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006743 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006744 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006745 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006746 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006747 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006748 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006750 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006751 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006752 }
6753
6754 case llvm::Triple::mips64el:
6755 switch (os) {
6756 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006757 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006758 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006759 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006760 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006761 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006762 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006764 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006766 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006768 }
6769
Ivan Krasindd7403e2011-08-24 20:22:22 +00006770 case llvm::Triple::le32:
6771 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006772 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006773 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006774 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006775 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006776 }
6777
JF Bastien643817d2014-09-12 17:52:47 +00006778 case llvm::Triple::le64:
6779 return new Le64TargetInfo(Triple);
6780
Daniel Dunbar52322032009-08-18 05:47:58 +00006781 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006782 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006783 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006784 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006785 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006786 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006787 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006788 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006789 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006790 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006791 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006792 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006793 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006794 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006795 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006797 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006798
6799 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006800 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006801 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006802 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006803 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006804 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006805 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006806 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006807 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006808 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006809 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006810 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006811 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006813 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006814
Bill Schmidt778d3872013-07-26 01:36:11 +00006815 case llvm::Triple::ppc64le:
6816 switch (os) {
6817 case llvm::Triple::Linux:
6818 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6819 default:
6820 return new PPC64TargetInfo(Triple);
6821 }
6822
Peter Collingbournec947aae2012-05-20 23:28:41 +00006823 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006824 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006825 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006826 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006827
Tom Stellardd8e38a32015-01-06 20:34:47 +00006828 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006829 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006830 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006831
Daniel Dunbar52322032009-08-18 05:47:58 +00006832 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006833 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006834 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006835 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006836 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006838 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006839 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006840 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006841 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006842 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006843 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006844 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006845 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006846 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006847
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006848 case llvm::Triple::sparcv9:
6849 switch (os) {
6850 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006851 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006852 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006853 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006854 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006855 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006856 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006857 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006858 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006859 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006860 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006861 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006862 }
6863
Ulrich Weigand47445072013-05-06 16:26:41 +00006864 case llvm::Triple::systemz:
6865 switch (os) {
6866 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006867 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006868 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006869 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006870 }
6871
Eli Friedmana9c3d712009-08-19 20:47:07 +00006872 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006873 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006874
Daniel Dunbar52322032009-08-18 05:47:58 +00006875 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006876 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006878
Daniel Dunbar52322032009-08-18 05:47:58 +00006879 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006880 case llvm::Triple::Linux: {
6881 switch (Triple.getEnvironment()) {
6882 default:
6883 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6884 case llvm::Triple::Android:
6885 return new AndroidX86_32TargetInfo(Triple);
6886 }
6887 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006888 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006889 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006890 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006891 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006892 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006893 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006894 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006895 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006896 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006897 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006898 case llvm::Triple::KFreeBSD:
6899 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006900 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006901 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006902 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006903 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006904 case llvm::Triple::Win32: {
6905 switch (Triple.getEnvironment()) {
6906 default:
6907 return new X86_32TargetInfo(Triple);
6908 case llvm::Triple::Cygnus:
6909 return new CygwinX86_32TargetInfo(Triple);
6910 case llvm::Triple::GNU:
6911 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006912 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006913 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006914 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006915 }
6916 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006917 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006918 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006919 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006920 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006921 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006922 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006923 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006924 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006925 }
6926
6927 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006928 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006929 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006930
Daniel Dunbar52322032009-08-18 05:47:58 +00006931 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00006932 case llvm::Triple::CloudABI:
6933 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006934 case llvm::Triple::Linux: {
6935 switch (Triple.getEnvironment()) {
6936 default:
6937 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6938 case llvm::Triple::Android:
6939 return new AndroidX86_64TargetInfo(Triple);
6940 }
6941 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00006942 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006943 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006944 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006945 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006946 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006947 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006948 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006949 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006950 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006951 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006952 case llvm::Triple::KFreeBSD:
6953 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006954 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006955 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006956 case llvm::Triple::Win32: {
6957 switch (Triple.getEnvironment()) {
6958 default:
6959 return new X86_64TargetInfo(Triple);
6960 case llvm::Triple::GNU:
6961 return new MinGWX86_64TargetInfo(Triple);
6962 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006963 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006964 }
6965 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006966 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006967 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006968 case llvm::Triple::PS4:
6969 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006970 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006971 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006972 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006973
6974 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006975 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006976 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006977 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006978 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006979 }
6980 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006981 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006982 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006983 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006984 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006985 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006986 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006987}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006988
6989/// CreateTargetInfo - Return the target info object for the specified target
6990/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006991TargetInfo *
6992TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6993 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006994 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006995
6996 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006997 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006998 if (!Target) {
6999 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007000 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007001 }
Alp Toker80758082014-07-06 05:26:44 +00007002 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007003
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007004 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007005 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7006 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007007 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007008 }
7009
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007010 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007011 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7012 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007013 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007014 }
7015
Rafael Espindolaeb265472013-08-21 21:59:03 +00007016 // Set the fp math unit.
7017 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7018 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007019 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007020 }
7021
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007022 // Compute the default target features, we need the target to handle this
7023 // because features may have dependencies on one another.
7024 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007025 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007026
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007027 // Apply the user specified deltas.
7028 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7029 I < N; ++I) {
7030 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007031 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007032 bool Enabled = Name[0] == '+';
7033 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007034 }
7035
7036 // Add the features to the compile options.
7037 //
7038 // FIXME: If we are completely confident that we have the right set, we only
7039 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007040 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007041 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7042 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007043 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007044 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007045 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007046
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007047 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007048}