blob: 395f452ea8325f6e32478bd8f117a7e0e85bd08c [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"
Renato Golinf5c4dec2015-05-27 13:33:00 +000030#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000187namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000188// CloudABI Target
189template <typename Target>
190class CloudABITargetInfo : public OSTargetInfo<Target> {
191protected:
192 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
193 MacroBuilder &Builder) const override {
194 Builder.defineMacro("__CloudABI__");
195 Builder.defineMacro("__ELF__");
196
197 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
198 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
199 Builder.defineMacro("__STDC_UTF_16__");
200 Builder.defineMacro("__STDC_UTF_32__");
201 }
202
203public:
204 CloudABITargetInfo(const llvm::Triple &Triple)
205 : OSTargetInfo<Target>(Triple) {
206 this->UserLabelPrefix = "";
207 }
208};
209
Torok Edwinb2b37c62009-06-30 17:10:35 +0000210template<typename Target>
211class DarwinTargetInfo : public OSTargetInfo<Target> {
212protected:
Craig Topper3164f332014-03-11 03:39:26 +0000213 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
214 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000215 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000216 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000217 }
Mike Stump11289f42009-09-09 15:08:12 +0000218
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000220 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
221 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
222 this->MCountName = "\01mcount";
223 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224
Craig Topper3164f332014-03-11 03:39:26 +0000225 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000226 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000227 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000228 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000229 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000230 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000231 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000232 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000233
Craig Topper3164f332014-03-11 03:39:26 +0000234 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000235 // FIXME: We should return 0 when building kexts.
236 return "__TEXT,__StaticInit,regular,pure_instructions";
237 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000238
John McCalleed64c72012-01-29 01:20:30 +0000239 /// Darwin does not support protected visibility. Darwin's "default"
240 /// is very similar to ELF's "protected"; Darwin requires a "weak"
241 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000242 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000243 return false;
244 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245};
246
Chris Lattner30ba6742009-08-10 19:03:04 +0000247
Torok Edwinb2b37c62009-06-30 17:10:35 +0000248// DragonFlyBSD Target
249template<typename Target>
250class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
251protected:
Craig Topper3164f332014-03-11 03:39:26 +0000252 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
253 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000254 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000255 Builder.defineMacro("__DragonFly__");
256 Builder.defineMacro("__DragonFly_cc_version", "100001");
257 Builder.defineMacro("__ELF__");
258 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
259 Builder.defineMacro("__tune_i386__");
260 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 }
262public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000263 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
264 : OSTargetInfo<Target>(Triple) {
265 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000266
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000267 switch (Triple.getArch()) {
268 default:
269 case llvm::Triple::x86:
270 case llvm::Triple::x86_64:
271 this->MCountName = ".mcount";
272 break;
273 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000274 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000275};
276
277// FreeBSD Target
278template<typename Target>
279class FreeBSDTargetInfo : public OSTargetInfo<Target> {
280protected:
Craig Topper3164f332014-03-11 03:39:26 +0000281 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
282 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 // FreeBSD defines; list based off of gcc output
284
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000285 unsigned Release = Triple.getOSMajorVersion();
286 if (Release == 0U)
287 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000288
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000289 Builder.defineMacro("__FreeBSD__", Twine(Release));
290 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
292 DefineStd(Builder, "unix", Opts);
293 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000294
295 // On FreeBSD, wchar_t contains the number of the code point as
296 // used by the character set of the locale. These character sets are
297 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000298 //
299 // FIXME: This is wrong; the macro refers to the numerical values
300 // of wchar_t *literals*, which are not locale-dependent. However,
301 // FreeBSD systems apparently depend on us getting this wrong, and
302 // setting this to 1 is conforming even if all the basic source
303 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000304 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000305 }
306public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000307 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
308 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000309
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000310 switch (Triple.getArch()) {
311 default:
312 case llvm::Triple::x86:
313 case llvm::Triple::x86_64:
314 this->MCountName = ".mcount";
315 break;
316 case llvm::Triple::mips:
317 case llvm::Triple::mipsel:
318 case llvm::Triple::ppc:
319 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000320 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000321 this->MCountName = "_mcount";
322 break;
323 case llvm::Triple::arm:
324 this->MCountName = "__mcount";
325 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000326 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000327 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328};
329
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000330// GNU/kFreeBSD Target
331template<typename Target>
332class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
333protected:
Craig Topper3164f332014-03-11 03:39:26 +0000334 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
335 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000336 // GNU/kFreeBSD defines; list based off of gcc output
337
338 DefineStd(Builder, "unix", Opts);
339 Builder.defineMacro("__FreeBSD_kernel__");
340 Builder.defineMacro("__GLIBC__");
341 Builder.defineMacro("__ELF__");
342 if (Opts.POSIXThreads)
343 Builder.defineMacro("_REENTRANT");
344 if (Opts.CPlusPlus)
345 Builder.defineMacro("_GNU_SOURCE");
346 }
347public:
Eric Christopher917e9522014-11-18 22:36:15 +0000348 KFreeBSDTargetInfo(const llvm::Triple &Triple)
349 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000350 this->UserLabelPrefix = "";
351 }
352};
353
Chris Lattner3e2ee142010-07-07 16:01:42 +0000354// Minix Target
355template<typename Target>
356class MinixTargetInfo : public OSTargetInfo<Target> {
357protected:
Craig Topper3164f332014-03-11 03:39:26 +0000358 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
359 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000360 // Minix defines
361
362 Builder.defineMacro("__minix", "3");
363 Builder.defineMacro("_EM_WSIZE", "4");
364 Builder.defineMacro("_EM_PSIZE", "4");
365 Builder.defineMacro("_EM_SSIZE", "2");
366 Builder.defineMacro("_EM_LSIZE", "4");
367 Builder.defineMacro("_EM_FSIZE", "4");
368 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000369 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000370 DefineStd(Builder, "unix", Opts);
371 }
372public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000373 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
374 this->UserLabelPrefix = "";
375 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000376};
377
Torok Edwinb2b37c62009-06-30 17:10:35 +0000378// Linux target
379template<typename Target>
380class LinuxTargetInfo : public OSTargetInfo<Target> {
381protected:
Craig Topper3164f332014-03-11 03:39:26 +0000382 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
383 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000384 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000385 DefineStd(Builder, "unix", Opts);
386 DefineStd(Builder, "linux", Opts);
387 Builder.defineMacro("__gnu_linux__");
388 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000389 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000390 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000391 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000392 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000393 this->PlatformName = "android";
394 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
395 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000396 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000397 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000398 if (Opts.CPlusPlus)
399 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 }
401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000402 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000403 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000404 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000405
406 switch (Triple.getArch()) {
407 default:
408 break;
409 case llvm::Triple::ppc:
410 case llvm::Triple::ppc64:
411 case llvm::Triple::ppc64le:
412 this->MCountName = "_mcount";
413 break;
414 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000415 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000416
Craig Topper3164f332014-03-11 03:39:26 +0000417 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000418 return ".text.startup";
419 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000420};
421
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000422// NetBSD Target
423template<typename Target>
424class NetBSDTargetInfo : public OSTargetInfo<Target> {
425protected:
Craig Topper3164f332014-03-11 03:39:26 +0000426 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
427 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000428 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000429 Builder.defineMacro("__NetBSD__");
430 Builder.defineMacro("__unix__");
431 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000432 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000433 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000434
435 switch (Triple.getArch()) {
436 default:
437 break;
438 case llvm::Triple::arm:
439 case llvm::Triple::armeb:
440 case llvm::Triple::thumb:
441 case llvm::Triple::thumbeb:
442 Builder.defineMacro("__ARM_DWARF_EH__");
443 break;
444 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000445 }
446public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000447 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
448 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000449 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000450 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000451};
452
Torok Edwinb2b37c62009-06-30 17:10:35 +0000453// OpenBSD Target
454template<typename Target>
455class OpenBSDTargetInfo : public OSTargetInfo<Target> {
456protected:
Craig Topper3164f332014-03-11 03:39:26 +0000457 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
458 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000459 // OpenBSD defines; list based off of gcc output
460
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000461 Builder.defineMacro("__OpenBSD__");
462 DefineStd(Builder, "unix", Opts);
463 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000464 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000465 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000466 }
467public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000468 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
469 this->UserLabelPrefix = "";
470 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000471
Eli Friedman3715d1f2011-12-15 02:15:56 +0000472 switch (Triple.getArch()) {
473 default:
474 case llvm::Triple::x86:
475 case llvm::Triple::x86_64:
476 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000477 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000478 this->MCountName = "__mcount";
479 break;
480 case llvm::Triple::mips64:
481 case llvm::Triple::mips64el:
482 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000483 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000484 this->MCountName = "_mcount";
485 break;
486 }
487 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000488};
489
Eli Friedman9fa28852012-08-08 23:57:20 +0000490// Bitrig Target
491template<typename Target>
492class BitrigTargetInfo : public OSTargetInfo<Target> {
493protected:
Craig Topper3164f332014-03-11 03:39:26 +0000494 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
495 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000496 // Bitrig defines; list based off of gcc output
497
498 Builder.defineMacro("__Bitrig__");
499 DefineStd(Builder, "unix", Opts);
500 Builder.defineMacro("__ELF__");
501 if (Opts.POSIXThreads)
502 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000503
504 switch (Triple.getArch()) {
505 default:
506 break;
507 case llvm::Triple::arm:
508 case llvm::Triple::armeb:
509 case llvm::Triple::thumb:
510 case llvm::Triple::thumbeb:
511 Builder.defineMacro("__ARM_DWARF_EH__");
512 break;
513 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000514 }
515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000516 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
517 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000518 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000519 }
520};
521
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000522// PSP Target
523template<typename Target>
524class PSPTargetInfo : public OSTargetInfo<Target> {
525protected:
Craig Topper3164f332014-03-11 03:39:26 +0000526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
527 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000528 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000529 Builder.defineMacro("PSP");
530 Builder.defineMacro("_PSP");
531 Builder.defineMacro("__psp__");
532 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 }
534public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000535 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000536 this->UserLabelPrefix = "";
537 }
538};
539
John Thompsone467e192009-11-19 17:18:50 +0000540// PS3 PPU Target
541template<typename Target>
542class PS3PPUTargetInfo : public OSTargetInfo<Target> {
543protected:
Craig Topper3164f332014-03-11 03:39:26 +0000544 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
545 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000546 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000547 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000548 Builder.defineMacro("__PPU__");
549 Builder.defineMacro("__CELLOS_LV2__");
550 Builder.defineMacro("__ELF__");
551 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000552 Builder.defineMacro("_ARCH_PPC64");
553 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000554 }
555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000556 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000557 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000558 this->LongWidth = this->LongAlign = 32;
559 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000560 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000561 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000562 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000563 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000564 }
565};
566
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000567template <typename Target>
568class PS4OSTargetInfo : public OSTargetInfo<Target> {
569protected:
570 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
571 MacroBuilder &Builder) const override {
572 Builder.defineMacro("__FreeBSD__", "9");
573 Builder.defineMacro("__FreeBSD_cc_version", "900001");
574 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
575 DefineStd(Builder, "unix", Opts);
576 Builder.defineMacro("__ELF__");
577 Builder.defineMacro("__PS4__");
578 }
579public:
580 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
581 this->WCharType = this->UnsignedShort;
582
583 this->UserLabelPrefix = "";
584
585 switch (Triple.getArch()) {
586 default:
587 case llvm::Triple::x86_64:
588 this->MCountName = ".mcount";
589 break;
590 }
591 }
592};
593
Torok Edwinb2b37c62009-06-30 17:10:35 +0000594// Solaris target
595template<typename Target>
596class SolarisTargetInfo : public OSTargetInfo<Target> {
597protected:
Craig Topper3164f332014-03-11 03:39:26 +0000598 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
599 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000600 DefineStd(Builder, "sun", Opts);
601 DefineStd(Builder, "unix", Opts);
602 Builder.defineMacro("__ELF__");
603 Builder.defineMacro("__svr4__");
604 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000605 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
606 // newer, but to 500 for everything else. feature_test.h has a check to
607 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000608 // with a new version.
609 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000610 Builder.defineMacro("_XOPEN_SOURCE", "600");
611 else
612 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000613 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000614 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000615 Builder.defineMacro("_LARGEFILE_SOURCE");
616 Builder.defineMacro("_LARGEFILE64_SOURCE");
617 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000618 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000619 }
620public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000621 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000623 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000624 // FIXME: WIntType should be SignedLong
625 }
626};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000627
628// Windows target
629template<typename Target>
630class WindowsTargetInfo : public OSTargetInfo<Target> {
631protected:
Craig Topper3164f332014-03-11 03:39:26 +0000632 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
633 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000634 Builder.defineMacro("_WIN32");
635 }
636 void getVisualStudioDefines(const LangOptions &Opts,
637 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000638 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000639 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000640 Builder.defineMacro("_CPPRTTI");
641
Reid Kleckner16514352015-01-30 21:42:55 +0000642 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000643 Builder.defineMacro("_CPPUNWIND");
644 }
645
646 if (!Opts.CharIsSigned)
647 Builder.defineMacro("_CHAR_UNSIGNED");
648
649 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
650 // but it works for now.
651 if (Opts.POSIXThreads)
652 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000653
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000654 if (Opts.MSCompatibilityVersion) {
655 Builder.defineMacro("_MSC_VER",
656 Twine(Opts.MSCompatibilityVersion / 100000));
657 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000658 // FIXME We cannot encode the revision information into 32-bits
659 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000660
David Majnemerb710a932015-05-11 03:57:49 +0000661 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000662 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000663 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000664
665 if (Opts.MicrosoftExt) {
666 Builder.defineMacro("_MSC_EXTENSIONS");
667
668 if (Opts.CPlusPlus11) {
669 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
670 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
671 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
672 }
673 }
674
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000675 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000676 }
677
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000678public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000679 WindowsTargetInfo(const llvm::Triple &Triple)
680 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000681};
682
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000683template <typename Target>
684class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000685protected:
Craig Topper3164f332014-03-11 03:39:26 +0000686 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
687 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000688 if (Opts.POSIXThreads)
689 Builder.defineMacro("_REENTRANT");
690 if (Opts.CPlusPlus)
691 Builder.defineMacro("_GNU_SOURCE");
692
693 DefineStd(Builder, "unix", Opts);
694 Builder.defineMacro("__ELF__");
695 Builder.defineMacro("__native_client__");
696 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000697
698public:
699 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000700 this->UserLabelPrefix = "";
701 this->LongAlign = 32;
702 this->LongWidth = 32;
703 this->PointerAlign = 32;
704 this->PointerWidth = 32;
705 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000706 this->Int64Type = TargetInfo::SignedLongLong;
707 this->DoubleAlign = 64;
708 this->LongDoubleWidth = 64;
709 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000710 this->LongLongWidth = 64;
711 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000712 this->SizeType = TargetInfo::UnsignedInt;
713 this->PtrDiffType = TargetInfo::SignedInt;
714 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000715 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000716 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000717 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000718 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000720 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000722 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 } else if (Triple.getArch() == llvm::Triple::mipsel) {
724 // Handled on mips' setDescriptionString.
725 } else {
726 assert(Triple.getArch() == llvm::Triple::le32);
727 this->DescriptionString = "e-p:32:32-i64:64";
728 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000729 }
730};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000731
Chris Lattner09d98f52008-10-05 21:50:58 +0000732//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000733// Specific target implementations.
734//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000735
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000736// PPC abstract base class
737class PPCTargetInfo : public TargetInfo {
738 static const Builtin::Info BuiltinInfo[];
739 static const char * const GCCRegNames[];
740 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000741 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000742
743 // Target cpu features.
744 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000745 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000746 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000747 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000748 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000749 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000750 bool HasBPERMD;
751 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000752
Ulrich Weigand8afad612014-07-28 13:17:52 +0000753protected:
754 std::string ABI;
755
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000756public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000757 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000758 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000759 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000760 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000761 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000762 LongDoubleWidth = LongDoubleAlign = 128;
763 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
764 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000765
Hal Finkel6b984f02012-07-03 16:51:04 +0000766 /// \brief Flags for architecture specific defines.
767 typedef enum {
768 ArchDefineNone = 0,
769 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
770 ArchDefinePpcgr = 1 << 1,
771 ArchDefinePpcsq = 1 << 2,
772 ArchDefine440 = 1 << 3,
773 ArchDefine603 = 1 << 4,
774 ArchDefine604 = 1 << 5,
775 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000776 ArchDefinePwr5 = 1 << 7,
777 ArchDefinePwr5x = 1 << 8,
778 ArchDefinePwr6 = 1 << 9,
779 ArchDefinePwr6x = 1 << 10,
780 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000781 ArchDefinePwr8 = 1 << 12,
782 ArchDefineA2 = 1 << 13,
783 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000784 } ArchDefineTypes;
785
Bill Schmidt38378a02013-02-01 20:23:10 +0000786 // Note: GCC recognizes the following additional cpus:
787 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
788 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
789 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000790 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000791 bool CPUKnown = llvm::StringSwitch<bool>(Name)
792 .Case("generic", true)
793 .Case("440", true)
794 .Case("450", true)
795 .Case("601", true)
796 .Case("602", true)
797 .Case("603", true)
798 .Case("603e", true)
799 .Case("603ev", true)
800 .Case("604", true)
801 .Case("604e", true)
802 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000803 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000804 .Case("g3", true)
805 .Case("7400", true)
806 .Case("g4", true)
807 .Case("7450", true)
808 .Case("g4+", true)
809 .Case("750", true)
810 .Case("970", true)
811 .Case("g5", true)
812 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000813 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000814 .Case("e500mc", true)
815 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000816 .Case("power3", true)
817 .Case("pwr3", true)
818 .Case("power4", true)
819 .Case("pwr4", true)
820 .Case("power5", true)
821 .Case("pwr5", true)
822 .Case("power5x", true)
823 .Case("pwr5x", true)
824 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000825 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000826 .Case("power6x", true)
827 .Case("pwr6x", true)
828 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000829 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000830 .Case("power8", true)
831 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000832 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000833 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000834 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000835 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000836 .Case("powerpc64le", true)
837 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000838 .Default(false);
839
840 if (CPUKnown)
841 CPU = Name;
842
843 return CPUKnown;
844 }
845
Ulrich Weigand8afad612014-07-28 13:17:52 +0000846
847 StringRef getABI() const override { return ABI; }
848
Craig Topper3164f332014-03-11 03:39:26 +0000849 void getTargetBuiltins(const Builtin::Info *&Records,
850 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000851 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000852 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000853 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000854
Craig Topper3164f332014-03-11 03:39:26 +0000855 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000856
Craig Topper3164f332014-03-11 03:39:26 +0000857 void getTargetDefines(const LangOptions &Opts,
858 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000859
Craig Topper3164f332014-03-11 03:39:26 +0000860 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000861
Craig Topper3164f332014-03-11 03:39:26 +0000862 bool handleTargetFeatures(std::vector<std::string> &Features,
863 DiagnosticsEngine &Diags) override;
864 bool hasFeature(StringRef Feature) const override;
865
866 void getGCCRegNames(const char * const *&Names,
867 unsigned &NumNames) const override;
868 void getGCCRegAliases(const GCCRegAlias *&Aliases,
869 unsigned &NumAliases) const override;
870 bool validateAsmConstraint(const char *&Name,
871 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000872 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000873 default: return false;
874 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000875 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000876 case 'b': // Base register
877 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000878 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000879 break;
880 // FIXME: The following are added to allow parsing.
881 // I just took a guess at what the actions should be.
882 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000883 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000884 case 'v': // Altivec vector register
885 Info.setAllowsRegister();
886 break;
887 case 'w':
888 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000889 case 'd':// VSX vector register to hold vector double data
890 case 'f':// VSX vector register to hold vector float data
891 case 's':// VSX vector register to hold scalar float data
892 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000893 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000894 break;
895 default:
896 return false;
897 }
898 Info.setAllowsRegister();
899 Name++; // Skip over 'w'.
900 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000901 case 'h': // `MQ', `CTR', or `LINK' register
902 case 'q': // `MQ' register
903 case 'c': // `CTR' register
904 case 'l': // `LINK' register
905 case 'x': // `CR' register (condition register) number 0
906 case 'y': // `CR' register (condition register)
907 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000908 Info.setAllowsRegister();
909 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000910 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000911 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000912 // (use `L' instead for SImode constants)
913 case 'K': // Unsigned 16-bit constant
914 case 'L': // Signed 16-bit constant shifted left 16 bits
915 case 'M': // Constant larger than 31
916 case 'N': // Exact power of 2
917 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000919 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000920 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000921 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000922 break;
923 case 'm': // Memory operand. Note that on PowerPC targets, m can
924 // include addresses that update the base register. It
925 // is therefore only safe to use `m' in an asm statement
926 // if that asm statement accesses the operand exactly once.
927 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000928 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000930 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000931 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000932 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
933 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000934 // register to be updated.
935 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000936 if (Name[1] != 's')
937 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000938 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000939 // include any automodification of the base register. Unlike
940 // `m', this constraint can be used in asm statements that
941 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000942 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000943 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000944 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000945 break;
946 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000947 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000948 case 'Z': // Memory operand that is an indexed or indirect from a
949 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000951 Info.setAllowsMemory();
952 Info.setAllowsRegister();
953 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000955 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000956 // register (`p' is preferable for asm statements)
957 case 'S': // Constant suitable as a 64-bit mask operand
958 case 'T': // Constant suitable as a 32-bit mask operand
959 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000960 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // instructions
962 case 'W': // Vector constant that does not require memory
963 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000964 break;
965 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000966 }
John Thompson07a61a42010-06-24 22:44:13 +0000967 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000968 }
Craig Topper3164f332014-03-11 03:39:26 +0000969 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000970 std::string R;
971 switch (*Constraint) {
972 case 'e':
973 case 'w':
974 // Two-character constraint; add "^" hint for later parsing.
975 R = std::string("^") + std::string(Constraint, 2);
976 Constraint++;
977 break;
978 default:
979 return TargetInfo::convertConstraint(Constraint);
980 }
981 return R;
982 }
Craig Topper3164f332014-03-11 03:39:26 +0000983 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000984 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000985 }
Craig Topper3164f332014-03-11 03:39:26 +0000986 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000987 if (RegNo == 0) return 3;
988 if (RegNo == 1) return 4;
989 return -1;
990 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000991
992 bool hasSjLjLowering() const override {
993 return true;
994 }
David Majnemer2617ea62015-06-09 18:05:33 +0000995
996 bool useFloat128ManglingForLongDouble() const override {
997 return LongDoubleWidth == 128 &&
998 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
999 getTriple().isOSBinFormatELF();
1000 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001001};
Anders Carlssonf511f642007-11-27 04:11:28 +00001002
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001003const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001004#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001005#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001006 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001007#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001008};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001009
Eric Christopher917e9522014-11-18 22:36:15 +00001010/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001011/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001012bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001013 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001014 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1015 // Ignore disabled features.
1016 if (Features[i][0] == '-')
1017 continue;
1018
1019 StringRef Feature = StringRef(Features[i]).substr(1);
1020
1021 if (Feature == "vsx") {
1022 HasVSX = true;
1023 continue;
1024 }
1025
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001026 if (Feature == "bpermd") {
1027 HasBPERMD = true;
1028 continue;
1029 }
1030
1031 if (Feature == "extdiv") {
1032 HasExtDiv = true;
1033 continue;
1034 }
1035
Bill Schmidt59eb7672014-10-10 15:09:43 +00001036 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001037 HasP8Vector = true;
Bill Schmidt41e14c42015-05-16 01:02:25 +00001038 HasVSX = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001039 continue;
1040 }
1041
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001042 if (Feature == "crypto") {
1043 HasP8Crypto = true;
1044 continue;
1045 }
1046
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001047 if (Feature == "direct-move") {
1048 HasDirectMove = true;
Bill Schmidt41e14c42015-05-16 01:02:25 +00001049 HasVSX = true;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001050 continue;
1051 }
1052
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001053 if (Feature == "qpx") {
1054 HasQPX = true;
1055 continue;
1056 }
1057
Kit Barton8246f282015-03-25 19:41:41 +00001058 if (Feature == "htm") {
1059 HasHTM = true;
1060 continue;
1061 }
1062
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001063 // TODO: Finish this list and add an assert that we've handled them
1064 // all.
1065 }
1066
1067 return true;
1068}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001069
Chris Lattnerecd49032009-03-02 22:27:17 +00001070/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1071/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001072void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001073 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001074 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001075 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001076 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001078 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001079 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001080 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001081 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001082 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001084 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001085 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001086
Chris Lattnerecd49032009-03-02 22:27:17 +00001087 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001088 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1089 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001090 } else {
1091 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1092 getTriple().getOS() != llvm::Triple::OpenBSD)
1093 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001094 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001095
Ulrich Weigand8afad612014-07-28 13:17:52 +00001096 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001097 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001098 Builder.defineMacro("_CALL_ELF", "1");
1099 if (ABI == "elfv2")
1100 Builder.defineMacro("_CALL_ELF", "2");
1101
Chris Lattnerecd49032009-03-02 22:27:17 +00001102 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001103 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1104 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001105
Chris Lattnerecd49032009-03-02 22:27:17 +00001106 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001107 if (LongDoubleWidth == 128)
1108 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001109
John Thompsone467e192009-11-19 17:18:50 +00001110 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001111 Builder.defineMacro("__VEC__", "10206");
1112 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001113 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001114
1115 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001116 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1117 .Case("440", ArchDefineName)
1118 .Case("450", ArchDefineName | ArchDefine440)
1119 .Case("601", ArchDefineName)
1120 .Case("602", ArchDefineName | ArchDefinePpcgr)
1121 .Case("603", ArchDefineName | ArchDefinePpcgr)
1122 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1123 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1124 .Case("604", ArchDefineName | ArchDefinePpcgr)
1125 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1126 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001127 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001128 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1129 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1130 .Case("750", ArchDefineName | ArchDefinePpcgr)
1131 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1132 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001133 .Case("a2", ArchDefineA2)
1134 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001135 .Case("pwr3", ArchDefinePpcgr)
1136 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1137 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1138 | ArchDefinePpcsq)
1139 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1140 | ArchDefinePpcgr | ArchDefinePpcsq)
1141 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1142 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1143 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1144 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1145 | ArchDefinePpcsq)
1146 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1147 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001148 | ArchDefinePpcgr | ArchDefinePpcsq)
1149 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1150 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1151 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001152 .Case("power3", ArchDefinePpcgr)
1153 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1157 | ArchDefinePpcgr | ArchDefinePpcsq)
1158 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1159 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1160 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1161 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1162 | ArchDefinePpcsq)
1163 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1164 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001165 | ArchDefinePpcgr | ArchDefinePpcsq)
1166 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1167 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1168 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001169 .Default(ArchDefineNone);
1170
1171 if (defs & ArchDefineName)
1172 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1173 if (defs & ArchDefinePpcgr)
1174 Builder.defineMacro("_ARCH_PPCGR");
1175 if (defs & ArchDefinePpcsq)
1176 Builder.defineMacro("_ARCH_PPCSQ");
1177 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001178 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001179 if (defs & ArchDefine603)
1180 Builder.defineMacro("_ARCH_603");
1181 if (defs & ArchDefine604)
1182 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001183 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001184 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001185 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001186 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001187 if (defs & ArchDefinePwr5x)
1188 Builder.defineMacro("_ARCH_PWR5X");
1189 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001190 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001191 if (defs & ArchDefinePwr6x)
1192 Builder.defineMacro("_ARCH_PWR6X");
1193 if (defs & ArchDefinePwr7)
1194 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001195 if (defs & ArchDefinePwr8)
1196 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001197 if (defs & ArchDefineA2)
1198 Builder.defineMacro("_ARCH_A2");
1199 if (defs & ArchDefineA2q) {
1200 Builder.defineMacro("_ARCH_A2Q");
1201 Builder.defineMacro("_ARCH_QP");
1202 }
1203
1204 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1205 Builder.defineMacro("__bg__");
1206 Builder.defineMacro("__THW_BLUEGENE__");
1207 Builder.defineMacro("__bgq__");
1208 Builder.defineMacro("__TOS_BGQ__");
1209 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001210
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001211 if (HasVSX)
1212 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001213 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001214 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001215 if (HasP8Crypto)
1216 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001217 if (HasHTM)
1218 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001219 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001220 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001221 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1222 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1223 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1224 if (PointerWidth == 64)
1225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1226 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001227
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 // FIXME: The following are not yet generated here by Clang, but are
1229 // generated by GCC:
1230 //
1231 // _SOFT_FLOAT_
1232 // __RECIP_PRECISION__
1233 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001234 // __RECIP__
1235 // __RECIPF__
1236 // __RSQRTE__
1237 // __RSQRTEF__
1238 // _SOFT_DOUBLE_
1239 // __NO_LWSYNC__
1240 // __HAVE_BSWAP__
1241 // __LONGDOUBLE128
1242 // __CMODEL_MEDIUM__
1243 // __CMODEL_LARGE__
1244 // _CALL_SYSV
1245 // _CALL_DARWIN
1246 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001247}
1248
1249void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1250 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1251 .Case("7400", true)
1252 .Case("g4", true)
1253 .Case("7450", true)
1254 .Case("g4+", true)
1255 .Case("970", true)
1256 .Case("g5", true)
1257 .Case("pwr6", true)
1258 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001259 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001260 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001261 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001262 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001263
1264 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001265 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1266 .Case("ppc64le", true)
1267 .Case("pwr8", true)
1268 .Default(false);
1269 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1270 .Case("ppc64le", true)
1271 .Case("pwr8", true)
1272 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001273 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1274 .Case("ppc64le", true)
1275 .Case("pwr8", true)
1276 .Case("pwr7", true)
1277 .Default(false);
1278 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1279 .Case("ppc64le", true)
1280 .Case("pwr8", true)
1281 .Case("pwr7", true)
1282 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001283 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1284 .Case("ppc64le", true)
1285 .Case("pwr8", true)
1286 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001287}
1288
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001289bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001290 return llvm::StringSwitch<bool>(Feature)
1291 .Case("powerpc", true)
1292 .Case("vsx", HasVSX)
1293 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001294 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001295 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001296 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001297 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001298 .Case("bpermd", HasBPERMD)
1299 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001300 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001301}
Chris Lattner17df24e2008-04-21 18:56:49 +00001302
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001303const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001304 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1305 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1306 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1307 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1308 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1309 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1310 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1311 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001312 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001313 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001314 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001315 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1316 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1317 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1318 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001319 "vrsave", "vscr",
1320 "spe_acc", "spefscr",
1321 "sfp"
1322};
Chris Lattner10a5b382007-01-29 05:24:35 +00001323
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001324void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001325 unsigned &NumNames) const {
1326 Names = GCCRegNames;
1327 NumNames = llvm::array_lengthof(GCCRegNames);
1328}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001329
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001330const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1331 // While some of these aliases do map to different registers
1332 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001333 { { "0" }, "r0" },
1334 { { "1"}, "r1" },
1335 { { "2" }, "r2" },
1336 { { "3" }, "r3" },
1337 { { "4" }, "r4" },
1338 { { "5" }, "r5" },
1339 { { "6" }, "r6" },
1340 { { "7" }, "r7" },
1341 { { "8" }, "r8" },
1342 { { "9" }, "r9" },
1343 { { "10" }, "r10" },
1344 { { "11" }, "r11" },
1345 { { "12" }, "r12" },
1346 { { "13" }, "r13" },
1347 { { "14" }, "r14" },
1348 { { "15" }, "r15" },
1349 { { "16" }, "r16" },
1350 { { "17" }, "r17" },
1351 { { "18" }, "r18" },
1352 { { "19" }, "r19" },
1353 { { "20" }, "r20" },
1354 { { "21" }, "r21" },
1355 { { "22" }, "r22" },
1356 { { "23" }, "r23" },
1357 { { "24" }, "r24" },
1358 { { "25" }, "r25" },
1359 { { "26" }, "r26" },
1360 { { "27" }, "r27" },
1361 { { "28" }, "r28" },
1362 { { "29" }, "r29" },
1363 { { "30" }, "r30" },
1364 { { "31" }, "r31" },
1365 { { "fr0" }, "f0" },
1366 { { "fr1" }, "f1" },
1367 { { "fr2" }, "f2" },
1368 { { "fr3" }, "f3" },
1369 { { "fr4" }, "f4" },
1370 { { "fr5" }, "f5" },
1371 { { "fr6" }, "f6" },
1372 { { "fr7" }, "f7" },
1373 { { "fr8" }, "f8" },
1374 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001375 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001376 { { "fr11" }, "f11" },
1377 { { "fr12" }, "f12" },
1378 { { "fr13" }, "f13" },
1379 { { "fr14" }, "f14" },
1380 { { "fr15" }, "f15" },
1381 { { "fr16" }, "f16" },
1382 { { "fr17" }, "f17" },
1383 { { "fr18" }, "f18" },
1384 { { "fr19" }, "f19" },
1385 { { "fr20" }, "f20" },
1386 { { "fr21" }, "f21" },
1387 { { "fr22" }, "f22" },
1388 { { "fr23" }, "f23" },
1389 { { "fr24" }, "f24" },
1390 { { "fr25" }, "f25" },
1391 { { "fr26" }, "f26" },
1392 { { "fr27" }, "f27" },
1393 { { "fr28" }, "f28" },
1394 { { "fr29" }, "f29" },
1395 { { "fr30" }, "f30" },
1396 { { "fr31" }, "f31" },
1397 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001398};
1399
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001400void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001401 unsigned &NumAliases) const {
1402 Aliases = GCCRegAliases;
1403 NumAliases = llvm::array_lengthof(GCCRegAliases);
1404}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001405
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001406class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001407public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001408 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001409 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001410
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001411 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001412 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001413 case llvm::Triple::FreeBSD:
1414 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001415 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001416 PtrDiffType = SignedInt;
1417 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001418 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001419 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001420 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001421 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001422
Roman Divacky3ffe7462012-03-13 19:20:17 +00001423 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1424 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001425 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001426 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001427
1428 // PPC32 supports atomics up to 4 bytes.
1429 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001430 }
1431
Craig Topper3164f332014-03-11 03:39:26 +00001432 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001433 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001434 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001435 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001436};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001437
Bill Schmidt778d3872013-07-26 01:36:11 +00001438// Note: ABI differences may eventually require us to have a separate
1439// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001440class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001441public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001442 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001443 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001444 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001445 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001446
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001447 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1448 DescriptionString = "e-m:e-i64:64-n32:64";
1449 ABI = "elfv2";
1450 } else {
1451 DescriptionString = "E-m:e-i64:64-n32:64";
1452 ABI = "elfv1";
1453 }
1454
1455 switch (getTriple().getOS()) {
1456 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001457 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001458 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001459 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001460 case llvm::Triple::NetBSD:
1461 IntMaxType = SignedLongLong;
1462 Int64Type = SignedLongLong;
1463 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001464 default:
1465 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001466 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001467
1468 // PPC64 supports atomics up to 8 bytes.
1469 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001470 }
Craig Topper3164f332014-03-11 03:39:26 +00001471 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001472 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001473 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001474 // PPC64 Linux-specifc ABI options.
1475 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001476 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001477 ABI = Name;
1478 return true;
1479 }
1480 return false;
1481 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001482};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001483
Roman Divacky965b0b72011-01-06 08:27:10 +00001484class DarwinPPC32TargetInfo :
1485 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001486public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001487 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1488 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001489 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001490 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001491 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001492 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001493 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001494 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001495 }
Craig Topper3164f332014-03-11 03:39:26 +00001496 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001497 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001498 }
1499};
1500
1501class DarwinPPC64TargetInfo :
1502 public DarwinTargetInfo<PPC64TargetInfo> {
1503public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001504 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1505 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001506 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001507 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001508 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001509 }
1510};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001511
Peter Collingbournec947aae2012-05-20 23:28:41 +00001512 static const unsigned NVPTXAddrSpaceMap[] = {
1513 1, // opencl_global
1514 3, // opencl_local
1515 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001516 // FIXME: generic has to be added to the target
1517 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001518 1, // cuda_device
1519 4, // cuda_constant
1520 3, // cuda_shared
1521 };
1522 class NVPTXTargetInfo : public TargetInfo {
1523 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001524 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001525
1526 // The GPU profiles supported by the NVPTX backend
1527 enum GPUKind {
1528 GK_NONE,
1529 GK_SM20,
1530 GK_SM21,
1531 GK_SM30,
1532 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001533 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001534 } GPU;
1535
Peter Collingbournec947aae2012-05-20 23:28:41 +00001536 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001537 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001538 BigEndian = false;
1539 TLSSupported = false;
1540 LongWidth = LongAlign = 64;
1541 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001542 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001543 // Define available target features
1544 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001545 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001546 // Set the default GPU to sm20
1547 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001548 }
Craig Topper3164f332014-03-11 03:39:26 +00001549 void getTargetDefines(const LangOptions &Opts,
1550 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001551 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001552 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001553 if (Opts.CUDAIsDevice) {
1554 // Set __CUDA_ARCH__ for the GPU specified.
1555 std::string CUDAArchCode;
1556 switch (GPU) {
1557 case GK_SM20:
1558 CUDAArchCode = "200";
1559 break;
1560 case GK_SM21:
1561 CUDAArchCode = "210";
1562 break;
1563 case GK_SM30:
1564 CUDAArchCode = "300";
1565 break;
1566 case GK_SM35:
1567 CUDAArchCode = "350";
1568 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001569 case GK_SM37:
1570 CUDAArchCode = "370";
1571 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001572 default:
1573 llvm_unreachable("Unhandled target CPU");
1574 }
1575 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1576 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001577 }
Craig Topper3164f332014-03-11 03:39:26 +00001578 void getTargetBuiltins(const Builtin::Info *&Records,
1579 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001580 Records = BuiltinInfo;
1581 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001582 }
Craig Topper3164f332014-03-11 03:39:26 +00001583 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001584 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001585 }
Craig Topper3164f332014-03-11 03:39:26 +00001586
1587 void getGCCRegNames(const char * const *&Names,
1588 unsigned &NumNames) const override;
1589 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1590 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001591 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001592 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001593 NumAliases = 0;
1594 }
Eric Christopher917e9522014-11-18 22:36:15 +00001595 bool
1596 validateAsmConstraint(const char *&Name,
1597 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001598 switch (*Name) {
1599 default: return false;
1600 case 'c':
1601 case 'h':
1602 case 'r':
1603 case 'l':
1604 case 'f':
1605 case 'd':
1606 Info.setAllowsRegister();
1607 return true;
1608 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001609 }
Craig Topper3164f332014-03-11 03:39:26 +00001610 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001611 // FIXME: Is this really right?
1612 return "";
1613 }
Craig Topper3164f332014-03-11 03:39:26 +00001614 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001615 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001616 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001617 }
Craig Topper3164f332014-03-11 03:39:26 +00001618 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001619 GPU = llvm::StringSwitch<GPUKind>(Name)
1620 .Case("sm_20", GK_SM20)
1621 .Case("sm_21", GK_SM21)
1622 .Case("sm_30", GK_SM30)
1623 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001624 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001625 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001626
Reid Klecknerbbc01782014-12-03 21:53:36 +00001627 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001628 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001629 };
1630
1631 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1632#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1633#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1634 ALL_LANGUAGES },
1635#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001636 };
1637
1638 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1639 "r0"
1640 };
1641
1642 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1643 unsigned &NumNames) const {
1644 Names = GCCRegNames;
1645 NumNames = llvm::array_lengthof(GCCRegNames);
1646 }
1647
1648 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1649 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001650 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001651 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001652 SizeType = TargetInfo::UnsignedInt;
1653 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001654 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001655 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001656 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001657 };
1658
1659 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1660 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001661 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001662 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001663 SizeType = TargetInfo::UnsignedLong;
1664 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001665 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001666 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001667 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001668 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001669
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001670static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001671 1, // opencl_global
1672 3, // opencl_local
1673 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001674 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001675 1, // cuda_device
1676 2, // cuda_constant
1677 3 // cuda_shared
1678};
1679
Tom Stellarda96344b2014-08-21 13:58:40 +00001680// If you edit the description strings, make sure you update
1681// getPointerWidthV().
1682
Tom Stellardc74b1e02013-03-04 17:40:53 +00001683static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001684 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1685 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001686
1687static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001688 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1689 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001690
1691static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001692 "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 +00001693 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1694 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001695
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001696class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001697 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001698 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001699
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001700 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001701 enum GPUKind {
1702 GK_NONE,
1703 GK_R600,
1704 GK_R600_DOUBLE_OPS,
1705 GK_R700,
1706 GK_R700_DOUBLE_OPS,
1707 GK_EVERGREEN,
1708 GK_EVERGREEN_DOUBLE_OPS,
1709 GK_NORTHERN_ISLANDS,
1710 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001711 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001712 GK_SEA_ISLANDS,
1713 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001714 } GPU;
1715
Jan Veselyeebeaea2015-05-04 19:53:36 +00001716 bool hasFP64:1;
1717 bool hasFMAF:1;
1718 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001719
Eli Friedmand13b41e2012-10-12 23:32:00 +00001720public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001721 AMDGPUTargetInfo(const llvm::Triple &Triple)
1722 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001723
1724 if (Triple.getArch() == llvm::Triple::amdgcn) {
1725 DescriptionString = DescriptionStringSI;
1726 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001727 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001728 hasFMAF = true;
1729 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001730 } else {
1731 DescriptionString = DescriptionStringR600;
1732 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001733 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001734 hasFMAF = false;
1735 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001736 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001737 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001738 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001739 }
1740
Tom Stellarda96344b2014-08-21 13:58:40 +00001741 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1742 if (GPU <= GK_CAYMAN)
1743 return 32;
1744
1745 switch(AddrSpace) {
1746 default:
1747 return 64;
1748 case 0:
1749 case 3:
1750 case 5:
1751 return 32;
1752 }
1753 }
1754
Craig Topper3164f332014-03-11 03:39:26 +00001755 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001756 return "";
1757 }
1758
Craig Topper3164f332014-03-11 03:39:26 +00001759 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001760 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001761
Craig Topper3164f332014-03-11 03:39:26 +00001762 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1763 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001764 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001765 NumAliases = 0;
1766 }
1767
Craig Topper3164f332014-03-11 03:39:26 +00001768 bool validateAsmConstraint(const char *&Name,
1769 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001770 return true;
1771 }
1772
Craig Topper3164f332014-03-11 03:39:26 +00001773 void getTargetBuiltins(const Builtin::Info *&Records,
1774 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001775 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001776 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001777 }
1778
Craig Topper3164f332014-03-11 03:39:26 +00001779 void getTargetDefines(const LangOptions &Opts,
1780 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001781 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001782 if (hasFMAF)
1783 Builder.defineMacro("__HAS_FMAF__");
1784 if (hasLDEXPF)
1785 Builder.defineMacro("__HAS_LDEXPF__");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001786 if (hasFP64 && Opts.OpenCL) {
Tom Stellardfded50f2015-02-27 15:10:19 +00001787 Builder.defineMacro("cl_khr_fp64");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001788 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001789 }
1790
Craig Topper3164f332014-03-11 03:39:26 +00001791 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001792 return TargetInfo::CharPtrBuiltinVaList;
1793 }
1794
Craig Topper3164f332014-03-11 03:39:26 +00001795 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001796 GPU = llvm::StringSwitch<GPUKind>(Name)
1797 .Case("r600" , GK_R600)
1798 .Case("rv610", GK_R600)
1799 .Case("rv620", GK_R600)
1800 .Case("rv630", GK_R600)
1801 .Case("rv635", GK_R600)
1802 .Case("rs780", GK_R600)
1803 .Case("rs880", GK_R600)
1804 .Case("rv670", GK_R600_DOUBLE_OPS)
1805 .Case("rv710", GK_R700)
1806 .Case("rv730", GK_R700)
1807 .Case("rv740", GK_R700_DOUBLE_OPS)
1808 .Case("rv770", GK_R700_DOUBLE_OPS)
1809 .Case("palm", GK_EVERGREEN)
1810 .Case("cedar", GK_EVERGREEN)
1811 .Case("sumo", GK_EVERGREEN)
1812 .Case("sumo2", GK_EVERGREEN)
1813 .Case("redwood", GK_EVERGREEN)
1814 .Case("juniper", GK_EVERGREEN)
1815 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1816 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1817 .Case("barts", GK_NORTHERN_ISLANDS)
1818 .Case("turks", GK_NORTHERN_ISLANDS)
1819 .Case("caicos", GK_NORTHERN_ISLANDS)
1820 .Case("cayman", GK_CAYMAN)
1821 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001822 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001823 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1824 .Case("verde", GK_SOUTHERN_ISLANDS)
1825 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001826 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001827 .Case("bonaire", GK_SEA_ISLANDS)
1828 .Case("kabini", GK_SEA_ISLANDS)
1829 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001830 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001831 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001832 .Case("tonga", GK_VOLCANIC_ISLANDS)
1833 .Case("iceland", GK_VOLCANIC_ISLANDS)
1834 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001835 .Default(GK_NONE);
1836
1837 if (GPU == GK_NONE) {
1838 return false;
1839 }
1840
1841 // Set the correct data layout
1842 switch (GPU) {
1843 case GK_NONE:
1844 case GK_R600:
1845 case GK_R700:
1846 case GK_EVERGREEN:
1847 case GK_NORTHERN_ISLANDS:
1848 DescriptionString = DescriptionStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001849 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001850 hasFMAF = false;
1851 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001852 break;
1853 case GK_R600_DOUBLE_OPS:
1854 case GK_R700_DOUBLE_OPS:
1855 case GK_EVERGREEN_DOUBLE_OPS:
1856 case GK_CAYMAN:
1857 DescriptionString = DescriptionStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001858 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001859 hasFMAF = true;
1860 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001861 break;
1862 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001863 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001864 case GK_VOLCANIC_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001865 DescriptionString = DescriptionStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001866 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001867 hasFMAF = true;
1868 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001869 break;
1870 }
1871
1872 return true;
1873 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001874};
1875
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001876const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001877#define BUILTIN(ID, TYPE, ATTRS) \
1878 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001879#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001880};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001881const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001882 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1883 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1884 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1885 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1886 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1887 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1888 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1889 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1890 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1891 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1892 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1893 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1894 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1895 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1896 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1897 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1898 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1899 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1900 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1901 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1902 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1903 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1904 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1905 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1906 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1907 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1908 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1909 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1910 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1911 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1912 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1913 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1914 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1915 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1916 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1917 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1918 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1919 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1920 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1921 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1922 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1923 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1924 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1925 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1926 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1927 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1928 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1929 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1930 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1931 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1932};
1933
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001934void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
1935 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001936 Names = GCCRegNames;
1937 NumNames = llvm::array_lengthof(GCCRegNames);
1938}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001939
Eli Friedman3fd920a2008-08-20 02:34:37 +00001940// Namespace for x86 abstract base class
1941const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001942#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001943#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001944 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001945#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001946};
Eli Friedmanb5366062008-05-20 14:21:01 +00001947
Nuno Lopescfca1f02009-12-23 17:49:57 +00001948static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001949 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1950 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001951 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001952 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1953 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1954 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001955 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001956 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1957 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001958};
1959
Eric Christophercdd36352011-06-21 00:05:20 +00001960const TargetInfo::AddlRegName AddlRegNames[] = {
1961 { { "al", "ah", "eax", "rax" }, 0 },
1962 { { "bl", "bh", "ebx", "rbx" }, 3 },
1963 { { "cl", "ch", "ecx", "rcx" }, 2 },
1964 { { "dl", "dh", "edx", "rdx" }, 1 },
1965 { { "esi", "rsi" }, 4 },
1966 { { "edi", "rdi" }, 5 },
1967 { { "esp", "rsp" }, 7 },
1968 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001969};
1970
1971// X86 target abstract base class; x86-32 and x86-64 are very close, so
1972// most of the implementation can be shared.
1973class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001974 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001975 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001976 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001977 enum MMX3DNowEnum {
1978 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1979 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001980 enum XOPEnum {
1981 NoXOP,
1982 SSE4A,
1983 FMA4,
1984 XOP
1985 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001986
Eric Christophere1ddaf92010-04-02 23:50:19 +00001987 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001988 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001989 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001990 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001991 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001992 bool HasBMI;
1993 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001994 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001995 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001996 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001997 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001998 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001999 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002000 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002001 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002002 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2003 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002004 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002005 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002006
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002007 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2008 ///
2009 /// Each enumeration represents a particular CPU supported by Clang. These
2010 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2011 enum CPUKind {
2012 CK_Generic,
2013
2014 /// \name i386
2015 /// i386-generation processors.
2016 //@{
2017 CK_i386,
2018 //@}
2019
2020 /// \name i486
2021 /// i486-generation processors.
2022 //@{
2023 CK_i486,
2024 CK_WinChipC6,
2025 CK_WinChip2,
2026 CK_C3,
2027 //@}
2028
2029 /// \name i586
2030 /// i586-generation processors, P5 microarchitecture based.
2031 //@{
2032 CK_i586,
2033 CK_Pentium,
2034 CK_PentiumMMX,
2035 //@}
2036
2037 /// \name i686
2038 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2039 //@{
2040 CK_i686,
2041 CK_PentiumPro,
2042 CK_Pentium2,
2043 CK_Pentium3,
2044 CK_Pentium3M,
2045 CK_PentiumM,
2046 CK_C3_2,
2047
2048 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2049 /// Clang however has some logic to suport this.
2050 // FIXME: Warn, deprecate, and potentially remove this.
2051 CK_Yonah,
2052 //@}
2053
2054 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002055 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002056 //@{
2057 CK_Pentium4,
2058 CK_Pentium4M,
2059 CK_Prescott,
2060 CK_Nocona,
2061 //@}
2062
2063 /// \name Core
2064 /// Core microarchitecture based processors.
2065 //@{
2066 CK_Core2,
2067
2068 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2069 /// codename which GCC no longer accepts as an option to -march, but Clang
2070 /// has some logic for recognizing it.
2071 // FIXME: Warn, deprecate, and potentially remove this.
2072 CK_Penryn,
2073 //@}
2074
2075 /// \name Atom
2076 /// Atom processors
2077 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002078 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002079 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002080 //@}
2081
2082 /// \name Nehalem
2083 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002084 CK_Nehalem,
2085
2086 /// \name Westmere
2087 /// Westmere microarchitecture based processors.
2088 CK_Westmere,
2089
2090 /// \name Sandy Bridge
2091 /// Sandy Bridge microarchitecture based processors.
2092 CK_SandyBridge,
2093
2094 /// \name Ivy Bridge
2095 /// Ivy Bridge microarchitecture based processors.
2096 CK_IvyBridge,
2097
2098 /// \name Haswell
2099 /// Haswell microarchitecture based processors.
2100 CK_Haswell,
2101
2102 /// \name Broadwell
2103 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002104 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002105
2106 /// \name Skylake
2107 /// Skylake microarchitecture based processors.
2108 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002109
Craig Topper449314e2013-08-20 07:09:39 +00002110 /// \name Knights Landing
2111 /// Knights Landing processor.
2112 CK_KNL,
2113
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002114 /// \name K6
2115 /// K6 architecture processors.
2116 //@{
2117 CK_K6,
2118 CK_K6_2,
2119 CK_K6_3,
2120 //@}
2121
2122 /// \name K7
2123 /// K7 architecture processors.
2124 //@{
2125 CK_Athlon,
2126 CK_AthlonThunderbird,
2127 CK_Athlon4,
2128 CK_AthlonXP,
2129 CK_AthlonMP,
2130 //@}
2131
2132 /// \name K8
2133 /// K8 architecture processors.
2134 //@{
2135 CK_Athlon64,
2136 CK_Athlon64SSE3,
2137 CK_AthlonFX,
2138 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002139 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002140 CK_Opteron,
2141 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002142 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002143 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002144
Benjamin Kramer569f2152012-01-10 11:50:18 +00002145 /// \name Bobcat
2146 /// Bobcat architecture processors.
2147 //@{
2148 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002149 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002150 //@}
2151
2152 /// \name Bulldozer
2153 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002154 //@{
2155 CK_BDVER1,
2156 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002157 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002158 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002159 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002160
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002161 /// This specification is deprecated and will be removed in the future.
2162 /// Users should prefer \see CK_K8.
2163 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002164 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002165 CK_x86_64,
2166 //@}
2167
2168 /// \name Geode
2169 /// Geode processors.
2170 //@{
2171 CK_Geode
2172 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002173 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002174
Rafael Espindolaeb265472013-08-21 21:59:03 +00002175 enum FPMathKind {
2176 FP_Default,
2177 FP_SSE,
2178 FP_387
2179 } FPMath;
2180
Eli Friedman3fd920a2008-08-20 02:34:37 +00002181public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002182 X86TargetInfo(const llvm::Triple &Triple)
2183 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002184 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002185 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2186 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2187 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2188 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2189 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2190 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002191 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002192 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002193 }
Craig Topper3164f332014-03-11 03:39:26 +00002194 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002195 // X87 evaluates with 80 bits "long double" precision.
2196 return SSELevel == NoSSE ? 2 : 0;
2197 }
Craig Topper3164f332014-03-11 03:39:26 +00002198 void getTargetBuiltins(const Builtin::Info *&Records,
2199 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002200 Records = BuiltinInfo;
2201 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002202 }
Craig Topper3164f332014-03-11 03:39:26 +00002203 void getGCCRegNames(const char * const *&Names,
2204 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002205 Names = GCCRegNames;
2206 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002207 }
Craig Topper3164f332014-03-11 03:39:26 +00002208 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2209 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002210 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002211 NumAliases = 0;
2212 }
Craig Topper3164f332014-03-11 03:39:26 +00002213 void getGCCAddlRegNames(const AddlRegName *&Names,
2214 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002215 Names = AddlRegNames;
2216 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002217 }
Eric Christopherd9832702015-06-29 21:00:05 +00002218 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002219 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002220 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002221
Akira Hatanaka974131e2014-09-18 18:17:18 +00002222 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2223
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002224 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2225
Akira Hatanaka974131e2014-09-18 18:17:18 +00002226 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2227
Craig Topper3164f332014-03-11 03:39:26 +00002228 std::string convertConstraint(const char *&Constraint) const override;
2229 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002230 return "~{dirflag},~{fpsr},~{flags}";
2231 }
Craig Topper3164f332014-03-11 03:39:26 +00002232 void getTargetDefines(const LangOptions &Opts,
2233 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002234 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2235 bool Enabled);
2236 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2237 bool Enabled);
2238 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2239 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002240 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2241 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002242 setFeatureEnabledImpl(Features, Name, Enabled);
2243 }
2244 // This exists purely to cut down on the number of virtual calls in
2245 // getDefaultFeatures which calls this repeatedly.
2246 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2247 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002248 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2249 bool hasFeature(StringRef Feature) const override;
2250 bool handleTargetFeatures(std::vector<std::string> &Features,
2251 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002252 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002253 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2254 return "avx512";
2255 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002256 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002257 else if (getTriple().getArch() == llvm::Triple::x86 &&
2258 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002259 return "no-mmx";
2260 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002261 }
Craig Topper3164f332014-03-11 03:39:26 +00002262 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002263 CPU = llvm::StringSwitch<CPUKind>(Name)
2264 .Case("i386", CK_i386)
2265 .Case("i486", CK_i486)
2266 .Case("winchip-c6", CK_WinChipC6)
2267 .Case("winchip2", CK_WinChip2)
2268 .Case("c3", CK_C3)
2269 .Case("i586", CK_i586)
2270 .Case("pentium", CK_Pentium)
2271 .Case("pentium-mmx", CK_PentiumMMX)
2272 .Case("i686", CK_i686)
2273 .Case("pentiumpro", CK_PentiumPro)
2274 .Case("pentium2", CK_Pentium2)
2275 .Case("pentium3", CK_Pentium3)
2276 .Case("pentium3m", CK_Pentium3M)
2277 .Case("pentium-m", CK_PentiumM)
2278 .Case("c3-2", CK_C3_2)
2279 .Case("yonah", CK_Yonah)
2280 .Case("pentium4", CK_Pentium4)
2281 .Case("pentium4m", CK_Pentium4M)
2282 .Case("prescott", CK_Prescott)
2283 .Case("nocona", CK_Nocona)
2284 .Case("core2", CK_Core2)
2285 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002286 .Case("bonnell", CK_Bonnell)
2287 .Case("atom", CK_Bonnell) // Legacy name.
2288 .Case("silvermont", CK_Silvermont)
2289 .Case("slm", CK_Silvermont) // Legacy name.
2290 .Case("nehalem", CK_Nehalem)
2291 .Case("corei7", CK_Nehalem) // Legacy name.
2292 .Case("westmere", CK_Westmere)
2293 .Case("sandybridge", CK_SandyBridge)
2294 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2295 .Case("ivybridge", CK_IvyBridge)
2296 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2297 .Case("haswell", CK_Haswell)
2298 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002299 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002300 .Case("skylake", CK_Skylake)
2301 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002302 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002303 .Case("k6", CK_K6)
2304 .Case("k6-2", CK_K6_2)
2305 .Case("k6-3", CK_K6_3)
2306 .Case("athlon", CK_Athlon)
2307 .Case("athlon-tbird", CK_AthlonThunderbird)
2308 .Case("athlon-4", CK_Athlon4)
2309 .Case("athlon-xp", CK_AthlonXP)
2310 .Case("athlon-mp", CK_AthlonMP)
2311 .Case("athlon64", CK_Athlon64)
2312 .Case("athlon64-sse3", CK_Athlon64SSE3)
2313 .Case("athlon-fx", CK_AthlonFX)
2314 .Case("k8", CK_K8)
2315 .Case("k8-sse3", CK_K8SSE3)
2316 .Case("opteron", CK_Opteron)
2317 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002318 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002319 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002320 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002321 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002322 .Case("bdver1", CK_BDVER1)
2323 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002324 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002325 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002326 .Case("x86-64", CK_x86_64)
2327 .Case("geode", CK_Geode)
2328 .Default(CK_Generic);
2329
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002330 // Perform any per-CPU checks necessary to determine if this CPU is
2331 // acceptable.
2332 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2333 // invalid without explaining *why*.
2334 switch (CPU) {
2335 case CK_Generic:
2336 // No processor selected!
2337 return false;
2338
2339 case CK_i386:
2340 case CK_i486:
2341 case CK_WinChipC6:
2342 case CK_WinChip2:
2343 case CK_C3:
2344 case CK_i586:
2345 case CK_Pentium:
2346 case CK_PentiumMMX:
2347 case CK_i686:
2348 case CK_PentiumPro:
2349 case CK_Pentium2:
2350 case CK_Pentium3:
2351 case CK_Pentium3M:
2352 case CK_PentiumM:
2353 case CK_Yonah:
2354 case CK_C3_2:
2355 case CK_Pentium4:
2356 case CK_Pentium4M:
2357 case CK_Prescott:
2358 case CK_K6:
2359 case CK_K6_2:
2360 case CK_K6_3:
2361 case CK_Athlon:
2362 case CK_AthlonThunderbird:
2363 case CK_Athlon4:
2364 case CK_AthlonXP:
2365 case CK_AthlonMP:
2366 case CK_Geode:
2367 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002368 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002369 return false;
2370
2371 // Fallthrough
2372 case CK_Nocona:
2373 case CK_Core2:
2374 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002375 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002376 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002377 case CK_Nehalem:
2378 case CK_Westmere:
2379 case CK_SandyBridge:
2380 case CK_IvyBridge:
2381 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002382 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002383 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002384 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002385 case CK_Athlon64:
2386 case CK_Athlon64SSE3:
2387 case CK_AthlonFX:
2388 case CK_K8:
2389 case CK_K8SSE3:
2390 case CK_Opteron:
2391 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002392 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002393 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002394 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002395 case CK_BDVER1:
2396 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002397 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002398 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002399 case CK_x86_64:
2400 return true;
2401 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002402 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002403 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002404
Craig Topper3164f332014-03-11 03:39:26 +00002405 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002406
Craig Topper3164f332014-03-11 03:39:26 +00002407 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002408 // We accept all non-ARM calling conventions
2409 return (CC == CC_X86ThisCall ||
2410 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002411 CC == CC_X86StdCall ||
2412 CC == CC_X86VectorCall ||
2413 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002414 CC == CC_X86Pascal ||
2415 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002416 }
2417
Craig Topper3164f332014-03-11 03:39:26 +00002418 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002419 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002420 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002421
2422 bool hasSjLjLowering() const override {
2423 return true;
2424 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002425};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002426
Rafael Espindolaeb265472013-08-21 21:59:03 +00002427bool X86TargetInfo::setFPMath(StringRef Name) {
2428 if (Name == "387") {
2429 FPMath = FP_387;
2430 return true;
2431 }
2432 if (Name == "sse") {
2433 FPMath = FP_SSE;
2434 return true;
2435 }
2436 return false;
2437}
2438
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002439void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002440 // FIXME: This *really* should not be here.
2441
2442 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002443 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002444 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002445
Chandler Carruth212334f2011-09-28 08:55:37 +00002446 switch (CPU) {
2447 case CK_Generic:
2448 case CK_i386:
2449 case CK_i486:
2450 case CK_i586:
2451 case CK_Pentium:
2452 case CK_i686:
2453 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002454 break;
2455 case CK_PentiumMMX:
2456 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002457 case CK_K6:
2458 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002459 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002460 break;
2461 case CK_Pentium3:
2462 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002463 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002464 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002465 break;
2466 case CK_PentiumM:
2467 case CK_Pentium4:
2468 case CK_Pentium4M:
2469 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002470 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002471 break;
2472 case CK_Yonah:
2473 case CK_Prescott:
2474 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002475 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002476 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002477 break;
2478 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002479 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002480 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002481 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002482 break;
2483 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002484 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002485 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002486 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002487 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002488 setFeatureEnabledImpl(Features, "avx512f", true);
2489 setFeatureEnabledImpl(Features, "avx512cd", true);
2490 setFeatureEnabledImpl(Features, "avx512dq", true);
2491 setFeatureEnabledImpl(Features, "avx512bw", true);
2492 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002493 // FALLTHROUGH
2494 case CK_Broadwell:
2495 setFeatureEnabledImpl(Features, "rdseed", true);
2496 setFeatureEnabledImpl(Features, "adx", true);
2497 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002498 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002499 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002500 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002501 setFeatureEnabledImpl(Features, "bmi", true);
2502 setFeatureEnabledImpl(Features, "bmi2", true);
2503 setFeatureEnabledImpl(Features, "rtm", true);
2504 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002505 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002506 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002507 setFeatureEnabledImpl(Features, "rdrnd", true);
2508 setFeatureEnabledImpl(Features, "f16c", true);
2509 setFeatureEnabledImpl(Features, "fsgsbase", true);
2510 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002511 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002512 setFeatureEnabledImpl(Features, "avx", true);
2513 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002514 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002515 case CK_Silvermont:
2516 setFeatureEnabledImpl(Features, "aes", true);
2517 setFeatureEnabledImpl(Features, "pclmul", true);
2518 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002519 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002520 setFeatureEnabledImpl(Features, "sse4.2", true);
2521 setFeatureEnabledImpl(Features, "cx16", true);
2522 break;
2523 case CK_KNL:
2524 setFeatureEnabledImpl(Features, "avx512f", true);
2525 setFeatureEnabledImpl(Features, "avx512cd", true);
2526 setFeatureEnabledImpl(Features, "avx512er", true);
2527 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002528 setFeatureEnabledImpl(Features, "rdseed", true);
2529 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002530 setFeatureEnabledImpl(Features, "lzcnt", true);
2531 setFeatureEnabledImpl(Features, "bmi", true);
2532 setFeatureEnabledImpl(Features, "bmi2", true);
2533 setFeatureEnabledImpl(Features, "rtm", true);
2534 setFeatureEnabledImpl(Features, "fma", true);
2535 setFeatureEnabledImpl(Features, "rdrnd", true);
2536 setFeatureEnabledImpl(Features, "f16c", true);
2537 setFeatureEnabledImpl(Features, "fsgsbase", true);
2538 setFeatureEnabledImpl(Features, "aes", true);
2539 setFeatureEnabledImpl(Features, "pclmul", true);
2540 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002541 break;
2542 case CK_K6_2:
2543 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002544 case CK_WinChip2:
2545 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002546 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002547 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002548 case CK_Athlon:
2549 case CK_AthlonThunderbird:
2550 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002551 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002552 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002553 case CK_Athlon4:
2554 case CK_AthlonXP:
2555 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002556 setFeatureEnabledImpl(Features, "sse", true);
2557 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002558 break;
2559 case CK_K8:
2560 case CK_Opteron:
2561 case CK_Athlon64:
2562 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002563 setFeatureEnabledImpl(Features, "sse2", true);
2564 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002565 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002566 case CK_AMDFAM10:
2567 setFeatureEnabledImpl(Features, "sse4a", true);
2568 setFeatureEnabledImpl(Features, "lzcnt", true);
2569 setFeatureEnabledImpl(Features, "popcnt", true);
2570 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002571 case CK_K8SSE3:
2572 case CK_OpteronSSE3:
2573 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002574 setFeatureEnabledImpl(Features, "sse3", true);
2575 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002576 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002577 case CK_BTVER2:
2578 setFeatureEnabledImpl(Features, "avx", true);
2579 setFeatureEnabledImpl(Features, "aes", true);
2580 setFeatureEnabledImpl(Features, "pclmul", true);
2581 setFeatureEnabledImpl(Features, "bmi", true);
2582 setFeatureEnabledImpl(Features, "f16c", true);
2583 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002584 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002585 setFeatureEnabledImpl(Features, "ssse3", true);
2586 setFeatureEnabledImpl(Features, "sse4a", true);
2587 setFeatureEnabledImpl(Features, "lzcnt", true);
2588 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002589 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002590 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002591 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002592 case CK_BDVER4:
2593 setFeatureEnabledImpl(Features, "avx2", true);
2594 setFeatureEnabledImpl(Features, "bmi2", true);
2595 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002596 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002597 setFeatureEnabledImpl(Features, "fsgsbase", true);
2598 // FALLTHROUGH
2599 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002600 setFeatureEnabledImpl(Features, "bmi", true);
2601 setFeatureEnabledImpl(Features, "fma", true);
2602 setFeatureEnabledImpl(Features, "f16c", true);
2603 setFeatureEnabledImpl(Features, "tbm", true);
2604 // FALLTHROUGH
2605 case CK_BDVER1:
2606 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002607 setFeatureEnabledImpl(Features, "xop", true);
2608 setFeatureEnabledImpl(Features, "lzcnt", true);
2609 setFeatureEnabledImpl(Features, "aes", true);
2610 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002611 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002612 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002613 break;
Eli Friedman33465822011-07-08 23:31:17 +00002614 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002615}
2616
Rafael Espindolae62e2792013-08-20 13:44:29 +00002617void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002618 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002619 if (Enabled) {
2620 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002621 case AVX512F:
2622 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002623 case AVX2:
2624 Features["avx2"] = true;
2625 case AVX:
2626 Features["avx"] = true;
2627 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002628 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002629 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002630 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002631 case SSSE3:
2632 Features["ssse3"] = true;
2633 case SSE3:
2634 Features["sse3"] = true;
2635 case SSE2:
2636 Features["sse2"] = true;
2637 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002638 Features["sse"] = true;
2639 case NoSSE:
2640 break;
2641 }
2642 return;
2643 }
2644
2645 switch (Level) {
2646 case NoSSE:
2647 case SSE1:
2648 Features["sse"] = false;
2649 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002650 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2651 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002652 case SSE3:
2653 Features["sse3"] = false;
2654 setXOPLevel(Features, NoXOP, false);
2655 case SSSE3:
2656 Features["ssse3"] = false;
2657 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002658 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002659 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002660 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002661 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002662 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002663 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002664 case AVX2:
2665 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002666 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002667 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002668 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2669 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002670 }
2671}
2672
2673void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002674 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002675 if (Enabled) {
2676 switch (Level) {
2677 case AMD3DNowAthlon:
2678 Features["3dnowa"] = true;
2679 case AMD3DNow:
2680 Features["3dnow"] = true;
2681 case MMX:
2682 Features["mmx"] = true;
2683 case NoMMX3DNow:
2684 break;
2685 }
2686 return;
2687 }
2688
2689 switch (Level) {
2690 case NoMMX3DNow:
2691 case MMX:
2692 Features["mmx"] = false;
2693 case AMD3DNow:
2694 Features["3dnow"] = false;
2695 case AMD3DNowAthlon:
2696 Features["3dnowa"] = false;
2697 }
2698}
2699
2700void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002701 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002702 if (Enabled) {
2703 switch (Level) {
2704 case XOP:
2705 Features["xop"] = true;
2706 case FMA4:
2707 Features["fma4"] = true;
2708 setSSELevel(Features, AVX, true);
2709 case SSE4A:
2710 Features["sse4a"] = true;
2711 setSSELevel(Features, SSE3, true);
2712 case NoXOP:
2713 break;
2714 }
2715 return;
2716 }
2717
2718 switch (Level) {
2719 case NoXOP:
2720 case SSE4A:
2721 Features["sse4a"] = false;
2722 case FMA4:
2723 Features["fma4"] = false;
2724 case XOP:
2725 Features["xop"] = false;
2726 }
2727}
2728
Craig Topper86d79ef2013-09-17 04:51:29 +00002729void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2730 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002731 // This is a bit of a hack to deal with the sse4 target feature when used
2732 // as part of the target attribute. We handle sse4 correctly everywhere
2733 // else. See below for more information on how we handle the sse4 options.
2734 if (Name != "sse4")
2735 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002736
Craig Topper29561122013-09-19 01:13:07 +00002737 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002738 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002739 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002740 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002741 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002742 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002743 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002744 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002745 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002746 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002747 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002748 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002749 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002750 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002751 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002752 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002753 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002754 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002755 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002756 if (Enabled)
2757 setSSELevel(Features, SSE2, Enabled);
2758 } else if (Name == "pclmul") {
2759 if (Enabled)
2760 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002761 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002762 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002763 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002764 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002765 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002766 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002767 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2768 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002769 if (Enabled)
2770 setSSELevel(Features, AVX512F, Enabled);
2771 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002772 if (Enabled)
2773 setSSELevel(Features, AVX, Enabled);
2774 } else if (Name == "fma4") {
2775 setXOPLevel(Features, FMA4, Enabled);
2776 } else if (Name == "xop") {
2777 setXOPLevel(Features, XOP, Enabled);
2778 } else if (Name == "sse4a") {
2779 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002780 } else if (Name == "f16c") {
2781 if (Enabled)
2782 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002783 } else if (Name == "sha") {
2784 if (Enabled)
2785 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002786 } else if (Name == "sse4") {
2787 // We can get here via the __target__ attribute since that's not controlled
2788 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2789 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2790 // disabled.
2791 if (Enabled)
2792 setSSELevel(Features, SSE42, Enabled);
2793 else
2794 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002795 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002796}
2797
Eric Christopher3ff21b32013-10-16 21:26:26 +00002798/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002799/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002800bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002801 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002802 // Remember the maximum enabled sselevel.
2803 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2804 // Ignore disabled features.
2805 if (Features[i][0] == '-')
2806 continue;
2807
Benjamin Kramer27402c62012-03-05 15:10:44 +00002808 StringRef Feature = StringRef(Features[i]).substr(1);
2809
2810 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002811 HasAES = true;
2812 continue;
2813 }
2814
Craig Topper3f122a72012-05-31 05:18:48 +00002815 if (Feature == "pclmul") {
2816 HasPCLMUL = true;
2817 continue;
2818 }
2819
Benjamin Kramer27402c62012-03-05 15:10:44 +00002820 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002821 HasLZCNT = true;
2822 continue;
2823 }
2824
Rafael Espindola89049822013-08-23 20:21:37 +00002825 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002826 HasRDRND = true;
2827 continue;
2828 }
2829
Craig Topper8c7f2512014-11-03 06:51:41 +00002830 if (Feature == "fsgsbase") {
2831 HasFSGSBASE = true;
2832 continue;
2833 }
2834
Benjamin Kramer27402c62012-03-05 15:10:44 +00002835 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002836 HasBMI = true;
2837 continue;
2838 }
2839
Benjamin Kramer27402c62012-03-05 15:10:44 +00002840 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002841 HasBMI2 = true;
2842 continue;
2843 }
2844
Benjamin Kramer27402c62012-03-05 15:10:44 +00002845 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002846 HasPOPCNT = true;
2847 continue;
2848 }
2849
Michael Liao625a8752012-11-10 05:17:46 +00002850 if (Feature == "rtm") {
2851 HasRTM = true;
2852 continue;
2853 }
2854
Michael Liao74f4eaf2013-03-26 17:52:08 +00002855 if (Feature == "prfchw") {
2856 HasPRFCHW = true;
2857 continue;
2858 }
2859
Michael Liaoffaae352013-03-29 05:17:55 +00002860 if (Feature == "rdseed") {
2861 HasRDSEED = true;
2862 continue;
2863 }
2864
Robert Khasanov50e6f582014-09-19 09:53:48 +00002865 if (Feature == "adx") {
2866 HasADX = true;
2867 continue;
2868 }
2869
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002870 if (Feature == "tbm") {
2871 HasTBM = true;
2872 continue;
2873 }
2874
Craig Topperbba778b2012-06-03 21:46:30 +00002875 if (Feature == "fma") {
2876 HasFMA = true;
2877 continue;
2878 }
2879
Manman Rena45358c2012-10-11 00:59:55 +00002880 if (Feature == "f16c") {
2881 HasF16C = true;
2882 continue;
2883 }
2884
Craig Topper679b53a2013-08-21 05:29:10 +00002885 if (Feature == "avx512cd") {
2886 HasAVX512CD = true;
2887 continue;
2888 }
2889
2890 if (Feature == "avx512er") {
2891 HasAVX512ER = true;
2892 continue;
2893 }
2894
2895 if (Feature == "avx512pf") {
2896 HasAVX512PF = true;
2897 continue;
2898 }
2899
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002900 if (Feature == "avx512dq") {
2901 HasAVX512DQ = true;
2902 continue;
2903 }
2904
2905 if (Feature == "avx512bw") {
2906 HasAVX512BW = true;
2907 continue;
2908 }
2909
2910 if (Feature == "avx512vl") {
2911 HasAVX512VL = true;
2912 continue;
2913 }
2914
Ben Langmuir58078d02013-09-19 13:22:04 +00002915 if (Feature == "sha") {
2916 HasSHA = true;
2917 continue;
2918 }
2919
Nick Lewycky50e8f482013-10-05 20:14:27 +00002920 if (Feature == "cx16") {
2921 HasCX16 = true;
2922 continue;
2923 }
2924
Daniel Dunbar979586e2009-11-11 09:38:56 +00002925 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002926 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002927 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002928 .Case("avx2", AVX2)
2929 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002930 .Case("sse4.2", SSE42)
2931 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002932 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002933 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002934 .Case("sse2", SSE2)
2935 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002936 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002937 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002938
Eli Friedman33465822011-07-08 23:31:17 +00002939 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002940 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002941 .Case("3dnowa", AMD3DNowAthlon)
2942 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002943 .Case("mmx", MMX)
2944 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002945 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002946
2947 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2948 .Case("xop", XOP)
2949 .Case("fma4", FMA4)
2950 .Case("sse4a", SSE4A)
2951 .Default(NoXOP);
2952 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002953 }
Eli Friedman33465822011-07-08 23:31:17 +00002954
Craig Topper7481d8a2013-09-10 06:55:47 +00002955 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2956 // Can't do this earlier because we need to be able to explicitly enable
2957 // popcnt and still disable sse4.2.
2958 if (!HasPOPCNT && SSELevel >= SSE42 &&
2959 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2960 HasPOPCNT = true;
2961 Features.push_back("+popcnt");
2962 }
2963
Yunzhong Gao61089362013-10-16 19:07:02 +00002964 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2965 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2966 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2967 HasPRFCHW = true;
2968 Features.push_back("+prfchw");
2969 }
2970
Rafael Espindolaeb265472013-08-21 21:59:03 +00002971 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2972 // matches the selected sse level.
2973 if (FPMath == FP_SSE && SSELevel < SSE1) {
2974 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2975 return false;
2976 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2977 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2978 return false;
2979 }
2980
Eli Friedman33465822011-07-08 23:31:17 +00002981 // Don't tell the backend if we're turning off mmx; it will end up disabling
2982 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002983 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2984 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002985 std::vector<std::string>::iterator it;
2986 it = std::find(Features.begin(), Features.end(), "-mmx");
2987 if (it != Features.end())
2988 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002989 else if (SSELevel > NoSSE)
2990 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002991 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002992}
Chris Lattnerecd49032009-03-02 22:27:17 +00002993
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002994/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2995/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002996void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002997 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002998 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002999 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003000 Builder.defineMacro("__amd64__");
3001 Builder.defineMacro("__amd64");
3002 Builder.defineMacro("__x86_64");
3003 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003004 if (getTriple().getArchName() == "x86_64h") {
3005 Builder.defineMacro("__x86_64h");
3006 Builder.defineMacro("__x86_64h__");
3007 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003008 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003009 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003010 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003011
Chris Lattnerecd49032009-03-02 22:27:17 +00003012 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003013 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3014 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003015 switch (CPU) {
3016 case CK_Generic:
3017 break;
3018 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003019 // The rest are coming from the i386 define above.
3020 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003021 break;
3022 case CK_i486:
3023 case CK_WinChipC6:
3024 case CK_WinChip2:
3025 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003026 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003027 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003028 case CK_PentiumMMX:
3029 Builder.defineMacro("__pentium_mmx__");
3030 Builder.defineMacro("__tune_pentium_mmx__");
3031 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003032 case CK_i586:
3033 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003034 defineCPUMacros(Builder, "i586");
3035 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003036 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003037 case CK_Pentium3:
3038 case CK_Pentium3M:
3039 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003040 Builder.defineMacro("__tune_pentium3__");
3041 // Fallthrough
3042 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003043 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003044 Builder.defineMacro("__tune_pentium2__");
3045 // Fallthrough
3046 case CK_PentiumPro:
3047 Builder.defineMacro("__tune_i686__");
3048 Builder.defineMacro("__tune_pentiumpro__");
3049 // Fallthrough
3050 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003051 Builder.defineMacro("__i686");
3052 Builder.defineMacro("__i686__");
3053 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3054 Builder.defineMacro("__pentiumpro");
3055 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003056 break;
3057 case CK_Pentium4:
3058 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003059 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003060 break;
3061 case CK_Yonah:
3062 case CK_Prescott:
3063 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003064 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 break;
3066 case CK_Core2:
3067 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003068 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003069 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003070 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003071 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003072 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003073 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003074 defineCPUMacros(Builder, "slm");
3075 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003076 case CK_Nehalem:
3077 case CK_Westmere:
3078 case CK_SandyBridge:
3079 case CK_IvyBridge:
3080 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003081 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003082 // FIXME: Historically, we defined this legacy name, it would be nice to
3083 // remove it at some point. We've never exposed fine-grained names for
3084 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003085 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003086 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003087 case CK_Skylake:
3088 // FIXME: Historically, we defined this legacy name, it would be nice to
3089 // remove it at some point. This is the only fine-grained CPU macro in the
3090 // main intel CPU line, and it would be better to not have these and force
3091 // people to use ISA macros.
3092 defineCPUMacros(Builder, "skx");
3093 break;
Craig Topper449314e2013-08-20 07:09:39 +00003094 case CK_KNL:
3095 defineCPUMacros(Builder, "knl");
3096 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003097 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003098 Builder.defineMacro("__k6_2__");
3099 Builder.defineMacro("__tune_k6_2__");
3100 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003101 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003102 if (CPU != CK_K6_2) { // In case of fallthrough
3103 // FIXME: GCC may be enabling these in cases where some other k6
3104 // architecture is specified but -m3dnow is explicitly provided. The
3105 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003106 Builder.defineMacro("__k6_3__");
3107 Builder.defineMacro("__tune_k6_3__");
3108 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003109 // Fallthrough
3110 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003111 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003112 break;
3113 case CK_Athlon:
3114 case CK_AthlonThunderbird:
3115 case CK_Athlon4:
3116 case CK_AthlonXP:
3117 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003118 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003119 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003120 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003121 Builder.defineMacro("__tune_athlon_sse__");
3122 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003123 break;
3124 case CK_K8:
3125 case CK_K8SSE3:
3126 case CK_x86_64:
3127 case CK_Opteron:
3128 case CK_OpteronSSE3:
3129 case CK_Athlon64:
3130 case CK_Athlon64SSE3:
3131 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003132 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003133 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003134 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003135 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003136 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003137 case CK_BTVER1:
3138 defineCPUMacros(Builder, "btver1");
3139 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003140 case CK_BTVER2:
3141 defineCPUMacros(Builder, "btver2");
3142 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003143 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003144 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003145 break;
3146 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003147 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003148 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003149 case CK_BDVER3:
3150 defineCPUMacros(Builder, "bdver3");
3151 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003152 case CK_BDVER4:
3153 defineCPUMacros(Builder, "bdver4");
3154 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003155 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003156 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003157 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003158 }
Chris Lattner96e43572009-03-02 22:40:39 +00003159
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003160 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003161 Builder.defineMacro("__REGISTER_PREFIX__", "");
3162
Chris Lattner6df41af2009-04-19 17:32:33 +00003163 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3164 // functions in glibc header files that use FP Stack inline asm which the
3165 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003166 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003167
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003168 if (HasAES)
3169 Builder.defineMacro("__AES__");
3170
Craig Topper3f122a72012-05-31 05:18:48 +00003171 if (HasPCLMUL)
3172 Builder.defineMacro("__PCLMUL__");
3173
Craig Topper22967d42011-12-25 05:06:45 +00003174 if (HasLZCNT)
3175 Builder.defineMacro("__LZCNT__");
3176
Benjamin Kramer1e250392012-07-07 09:39:18 +00003177 if (HasRDRND)
3178 Builder.defineMacro("__RDRND__");
3179
Craig Topper8c7f2512014-11-03 06:51:41 +00003180 if (HasFSGSBASE)
3181 Builder.defineMacro("__FSGSBASE__");
3182
Craig Topper22967d42011-12-25 05:06:45 +00003183 if (HasBMI)
3184 Builder.defineMacro("__BMI__");
3185
3186 if (HasBMI2)
3187 Builder.defineMacro("__BMI2__");
3188
Craig Topper1de83482011-12-29 16:10:46 +00003189 if (HasPOPCNT)
3190 Builder.defineMacro("__POPCNT__");
3191
Michael Liao625a8752012-11-10 05:17:46 +00003192 if (HasRTM)
3193 Builder.defineMacro("__RTM__");
3194
Michael Liao74f4eaf2013-03-26 17:52:08 +00003195 if (HasPRFCHW)
3196 Builder.defineMacro("__PRFCHW__");
3197
Michael Liaoffaae352013-03-29 05:17:55 +00003198 if (HasRDSEED)
3199 Builder.defineMacro("__RDSEED__");
3200
Robert Khasanov50e6f582014-09-19 09:53:48 +00003201 if (HasADX)
3202 Builder.defineMacro("__ADX__");
3203
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003204 if (HasTBM)
3205 Builder.defineMacro("__TBM__");
3206
Rafael Espindolae62e2792013-08-20 13:44:29 +00003207 switch (XOPLevel) {
3208 case XOP:
3209 Builder.defineMacro("__XOP__");
3210 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003211 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003212 case SSE4A:
3213 Builder.defineMacro("__SSE4A__");
3214 case NoXOP:
3215 break;
3216 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003217
Craig Topperbba778b2012-06-03 21:46:30 +00003218 if (HasFMA)
3219 Builder.defineMacro("__FMA__");
3220
Manman Rena45358c2012-10-11 00:59:55 +00003221 if (HasF16C)
3222 Builder.defineMacro("__F16C__");
3223
Craig Topper679b53a2013-08-21 05:29:10 +00003224 if (HasAVX512CD)
3225 Builder.defineMacro("__AVX512CD__");
3226 if (HasAVX512ER)
3227 Builder.defineMacro("__AVX512ER__");
3228 if (HasAVX512PF)
3229 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003230 if (HasAVX512DQ)
3231 Builder.defineMacro("__AVX512DQ__");
3232 if (HasAVX512BW)
3233 Builder.defineMacro("__AVX512BW__");
3234 if (HasAVX512VL)
3235 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003236
Ben Langmuir58078d02013-09-19 13:22:04 +00003237 if (HasSHA)
3238 Builder.defineMacro("__SHA__");
3239
Nick Lewycky50e8f482013-10-05 20:14:27 +00003240 if (HasCX16)
3241 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3242
Chris Lattner96e43572009-03-02 22:40:39 +00003243 // Each case falls through to the previous one here.
3244 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003245 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003246 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003247 case AVX2:
3248 Builder.defineMacro("__AVX2__");
3249 case AVX:
3250 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003251 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003252 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003253 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003254 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003255 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003256 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003257 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003258 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003259 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003260 Builder.defineMacro("__SSE2__");
3261 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003262 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003263 Builder.defineMacro("__SSE__");
3264 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003265 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003266 break;
3267 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003268
Derek Schuffc7dd7222012-10-11 15:52:22 +00003269 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003270 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003271 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003272 case AVX2:
3273 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003274 case SSE42:
3275 case SSE41:
3276 case SSSE3:
3277 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003278 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003279 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003280 break;
3281 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003282 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003283 break;
3284 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003285 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003286 }
3287 }
3288
Anders Carlssone437c682010-01-27 03:47:49 +00003289 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003290 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003291 case AMD3DNowAthlon:
3292 Builder.defineMacro("__3dNOW_A__");
3293 case AMD3DNow:
3294 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003295 case MMX:
3296 Builder.defineMacro("__MMX__");
3297 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003298 break;
3299 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003300
3301 if (CPU >= CK_i486) {
3302 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3303 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3304 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3305 }
3306 if (CPU >= CK_i586)
3307 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003308}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003309
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003310bool X86TargetInfo::hasFeature(StringRef Feature) const {
3311 return llvm::StringSwitch<bool>(Feature)
3312 .Case("aes", HasAES)
3313 .Case("avx", SSELevel >= AVX)
3314 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003315 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003316 .Case("avx512cd", HasAVX512CD)
3317 .Case("avx512er", HasAVX512ER)
3318 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003319 .Case("avx512dq", HasAVX512DQ)
3320 .Case("avx512bw", HasAVX512BW)
3321 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003322 .Case("bmi", HasBMI)
3323 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003324 .Case("cx16", HasCX16)
3325 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003326 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003327 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003328 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003329 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003330 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3331 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3332 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003333 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003334 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003335 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003336 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003337 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003338 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003339 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003340 .Case("sse", SSELevel >= SSE1)
3341 .Case("sse2", SSELevel >= SSE2)
3342 .Case("sse3", SSELevel >= SSE3)
3343 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003344 .Case("sse4.1", SSELevel >= SSE41)
3345 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003346 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003347 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003348 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003349 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3350 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003351 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003352 .Default(false);
3353}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003354
Eric Christopherd9832702015-06-29 21:00:05 +00003355// We can't use a generic validation scheme for the features accepted here
3356// versus subtarget features accepted in the target attribute because the
3357// bitfield structure that's initialized in the runtime only supports the
3358// below currently rather than the full range of subtarget features. (See
3359// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3360bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3361 return llvm::StringSwitch<bool>(FeatureStr)
3362 .Case("cmov", true)
3363 .Case("mmx", true)
3364 .Case("popcnt", true)
3365 .Case("sse", true)
3366 .Case("sse2", true)
3367 .Case("sse3", true)
3368 .Case("sse4.1", true)
3369 .Case("sse4.2", true)
3370 .Case("avx", true)
3371 .Case("avx2", true)
3372 .Case("sse4a", true)
3373 .Case("fma4", true)
3374 .Case("xop", true)
3375 .Case("fma", true)
3376 .Case("avx512f", true)
3377 .Case("bmi", true)
3378 .Case("bmi2", true)
3379 .Default(false);
3380}
3381
Eli Friedman3fd920a2008-08-20 02:34:37 +00003382bool
Anders Carlsson58436352009-02-28 17:11:49 +00003383X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003384 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003385 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003386 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003387 case 'I':
3388 Info.setRequiresImmediate(0, 31);
3389 return true;
3390 case 'J':
3391 Info.setRequiresImmediate(0, 63);
3392 return true;
3393 case 'K':
3394 Info.setRequiresImmediate(-128, 127);
3395 return true;
3396 case 'L':
3397 // FIXME: properly analyze this constraint:
3398 // must be one of 0xff, 0xffff, or 0xffffffff
3399 return true;
3400 case 'M':
3401 Info.setRequiresImmediate(0, 3);
3402 return true;
3403 case 'N':
3404 Info.setRequiresImmediate(0, 255);
3405 return true;
3406 case 'O':
3407 Info.setRequiresImmediate(0, 127);
3408 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003409 case 'Y': // first letter of a pair:
3410 switch (*(Name+1)) {
3411 default: return false;
3412 case '0': // First SSE register.
3413 case 't': // Any SSE register, when SSE2 is enabled.
3414 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3415 case 'm': // any MMX register, when inter-unit moves enabled.
3416 break; // falls through to setAllowsRegister.
3417 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003418 case 'f': // any x87 floating point stack register.
3419 // Constraint 'f' cannot be used for output operands.
3420 if (Info.ConstraintStr[0] == '=')
3421 return false;
3422
3423 Info.setAllowsRegister();
3424 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003425 case 'a': // eax.
3426 case 'b': // ebx.
3427 case 'c': // ecx.
3428 case 'd': // edx.
3429 case 'S': // esi.
3430 case 'D': // edi.
3431 case 'A': // edx:eax.
3432 case 't': // top of floating point stack.
3433 case 'u': // second from top of floating point stack.
3434 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003435 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003436 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003437 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003438 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3439 case 'l': // "Index" registers: any general register that can be used as an
3440 // index in a base+index memory access.
3441 Info.setAllowsRegister();
3442 return true;
3443 case 'C': // SSE floating point constant.
3444 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003445 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003446 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003447 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003448 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003449 return true;
3450 }
3451}
3452
Akira Hatanaka974131e2014-09-18 18:17:18 +00003453bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3454 unsigned Size) const {
3455 // Strip off constraint modifiers.
3456 while (Constraint[0] == '=' ||
3457 Constraint[0] == '+' ||
3458 Constraint[0] == '&')
3459 Constraint = Constraint.substr(1);
3460
3461 return validateOperandSize(Constraint, Size);
3462}
3463
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003464bool X86TargetInfo::validateInputSize(StringRef Constraint,
3465 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003466 return validateOperandSize(Constraint, Size);
3467}
3468
3469bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3470 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003471 switch (Constraint[0]) {
3472 default: break;
3473 case 'y':
3474 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003475 case 'f':
3476 case 't':
3477 case 'u':
3478 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003479 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003480 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003481 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003482 }
3483
3484 return true;
3485}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003486
Eli Friedman3fd920a2008-08-20 02:34:37 +00003487std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003488X86TargetInfo::convertConstraint(const char *&Constraint) const {
3489 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003490 case 'a': return std::string("{ax}");
3491 case 'b': return std::string("{bx}");
3492 case 'c': return std::string("{cx}");
3493 case 'd': return std::string("{dx}");
3494 case 'S': return std::string("{si}");
3495 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003496 case 'p': // address
3497 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003498 case 't': // top of floating point stack.
3499 return std::string("{st}");
3500 case 'u': // second from top of floating point stack.
3501 return std::string("{st(1)}"); // second from top of floating point stack.
3502 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003503 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003504 }
3505}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003506
Eli Friedman3fd920a2008-08-20 02:34:37 +00003507// X86-32 generic target
3508class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003510 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003511 DoubleAlign = LongLongAlign = 32;
3512 LongDoubleWidth = 96;
3513 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003514 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003515 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003516 SizeType = UnsignedInt;
3517 PtrDiffType = SignedInt;
3518 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003519 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003520
3521 // Use fpret for all types.
3522 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3523 (1 << TargetInfo::Double) |
3524 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003525
3526 // x86-32 has atomics up to 8 bytes
3527 // FIXME: Check that we actually have cmpxchg8b before setting
3528 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3529 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003530 }
Craig Topper3164f332014-03-11 03:39:26 +00003531 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003532 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003533 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003534
Craig Topper3164f332014-03-11 03:39:26 +00003535 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003536 if (RegNo == 0) return 0;
3537 if (RegNo == 1) return 2;
3538 return -1;
3539 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003540 bool validateOperandSize(StringRef Constraint,
3541 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003542 switch (Constraint[0]) {
3543 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003544 case 'R':
3545 case 'q':
3546 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003547 case 'a':
3548 case 'b':
3549 case 'c':
3550 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003551 case 'S':
3552 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003553 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003554 case 'A':
3555 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003556 }
3557
Akira Hatanaka974131e2014-09-18 18:17:18 +00003558 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003559 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003560};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003561
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003562class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3563public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003564 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3565 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003566
Craig Topper3164f332014-03-11 03:39:26 +00003567 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003568 unsigned Major, Minor, Micro;
3569 getTriple().getOSVersion(Major, Minor, Micro);
3570 // New NetBSD uses the default rounding mode.
3571 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3572 return X86_32TargetInfo::getFloatEvalMethod();
3573 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003574 return 1;
3575 }
3576};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003577
Eli Friedmane3aa4542009-07-05 18:47:56 +00003578class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3579public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003580 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3581 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003582 SizeType = UnsignedLong;
3583 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003584 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003585 }
3586};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003587
Eli Friedman9fa28852012-08-08 23:57:20 +00003588class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3589public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003590 BitrigI386TargetInfo(const llvm::Triple &Triple)
3591 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003592 SizeType = UnsignedLong;
3593 IntPtrType = SignedLong;
3594 PtrDiffType = SignedLong;
3595 }
3596};
Eli Friedman9fa28852012-08-08 23:57:20 +00003597
Torok Edwinb2b37c62009-06-30 17:10:35 +00003598class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003599public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003600 DarwinI386TargetInfo(const llvm::Triple &Triple)
3601 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003602 LongDoubleWidth = 128;
3603 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003604 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003605 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003606 SizeType = UnsignedLong;
3607 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003608 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003609 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003610 }
3611
Eli Friedman3fd920a2008-08-20 02:34:37 +00003612};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003613
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003614// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003615class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003616public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003617 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3618 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003619 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003620 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003621 bool IsWinCOFF =
3622 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Reid Kleckneraf676022015-04-30 22:13:05 +00003623 DescriptionString = IsWinCOFF
3624 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3625 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003626 }
Craig Topper3164f332014-03-11 03:39:26 +00003627 void getTargetDefines(const LangOptions &Opts,
3628 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003629 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3630 }
3631};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003632
3633// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003634class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003635public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003636 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003637 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003638 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003639 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3640 }
Craig Topper3164f332014-03-11 03:39:26 +00003641 void getTargetDefines(const LangOptions &Opts,
3642 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003643 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3644 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3645 // The value of the following reflects processor type.
3646 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3647 // We lost the original triple, so we use the default.
3648 Builder.defineMacro("_M_IX86", "600");
3649 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003650};
3651} // end anonymous namespace
3652
David Majnemerae1ed0e2015-05-28 04:36:18 +00003653static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3654 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003655 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3656 // macro anyway for pre-processor compatibility.
3657 if (Opts.MicrosoftExt)
3658 Builder.defineMacro("__declspec", "__declspec");
3659 else
3660 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3661
3662 if (!Opts.MicrosoftExt) {
3663 // Provide macros for all the calling convention keywords. Provide both
3664 // single and double underscore prefixed variants. These are available on
3665 // x64 as well as x86, even though they have no effect.
3666 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3667 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003668 std::string GCCSpelling = "__attribute__((__";
3669 GCCSpelling += CC;
3670 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003671 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3672 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3673 }
3674 }
3675}
3676
David Majnemerae1ed0e2015-05-28 04:36:18 +00003677static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3678 Builder.defineMacro("__MSVCRT__");
3679 Builder.defineMacro("__MINGW32__");
3680 addCygMingDefines(Opts, Builder);
3681}
3682
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003683namespace {
3684// x86-32 MinGW target
3685class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3686public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003687 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3688 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003689 void getTargetDefines(const LangOptions &Opts,
3690 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003691 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003692 DefineStd(Builder, "WIN32", Opts);
3693 DefineStd(Builder, "WINNT", Opts);
3694 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003695 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003696 }
3697};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003698
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003699// x86-32 Cygwin target
3700class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3701public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003702 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3703 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003704 TLSSupported = false;
3705 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003706 DoubleAlign = LongLongAlign = 64;
Reid Kleckneraf676022015-04-30 22:13:05 +00003707 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003708 }
Craig Topper3164f332014-03-11 03:39:26 +00003709 void getTargetDefines(const LangOptions &Opts,
3710 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003711 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003712 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003713 Builder.defineMacro("__CYGWIN__");
3714 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003715 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003716 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003717 if (Opts.CPlusPlus)
3718 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003719 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003720};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003721
Chris Lattnerb986aba2010-04-11 19:29:39 +00003722// x86-32 Haiku target
3723class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3724public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003725 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003726 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003727 IntPtrType = SignedLong;
3728 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003729 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003730 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003731 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003732 }
Craig Topper3164f332014-03-11 03:39:26 +00003733 void getTargetDefines(const LangOptions &Opts,
3734 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003735 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3736 Builder.defineMacro("__INTEL__");
3737 Builder.defineMacro("__HAIKU__");
3738 }
3739};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003740
Douglas Gregor9fabd852011-07-01 22:41:14 +00003741// RTEMS Target
3742template<typename Target>
3743class RTEMSTargetInfo : public OSTargetInfo<Target> {
3744protected:
Craig Topper3164f332014-03-11 03:39:26 +00003745 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3746 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003747 // RTEMS defines; list based off of gcc output
3748
Douglas Gregor9fabd852011-07-01 22:41:14 +00003749 Builder.defineMacro("__rtems__");
3750 Builder.defineMacro("__ELF__");
3751 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003752
Douglas Gregor9fabd852011-07-01 22:41:14 +00003753public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003754 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3755 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003756
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003757 switch (Triple.getArch()) {
3758 default:
3759 case llvm::Triple::x86:
3760 // this->MCountName = ".mcount";
3761 break;
3762 case llvm::Triple::mips:
3763 case llvm::Triple::mipsel:
3764 case llvm::Triple::ppc:
3765 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003766 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003767 // this->MCountName = "_mcount";
3768 break;
3769 case llvm::Triple::arm:
3770 // this->MCountName = "__mcount";
3771 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003772 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003773 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003774};
3775
Douglas Gregor9fabd852011-07-01 22:41:14 +00003776// x86-32 RTEMS target
3777class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3778public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003779 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003780 SizeType = UnsignedLong;
3781 IntPtrType = SignedLong;
3782 PtrDiffType = SignedLong;
3783 this->UserLabelPrefix = "";
3784 }
Craig Topper3164f332014-03-11 03:39:26 +00003785 void getTargetDefines(const LangOptions &Opts,
3786 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003787 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3788 Builder.defineMacro("__INTEL__");
3789 Builder.defineMacro("__rtems__");
3790 }
3791};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003792
Eli Friedman3fd920a2008-08-20 02:34:37 +00003793// x86-64 generic target
3794class X86_64TargetInfo : public X86TargetInfo {
3795public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003796 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003797 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003798 bool IsWinCOFF =
3799 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003800 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003801 LongDoubleWidth = 128;
3802 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003803 LargeArrayMinWidth = 128;
3804 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003805 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003806 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3807 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3808 IntPtrType = IsX32 ? SignedInt : SignedLong;
3809 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003810 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003811 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003812
Eric Christopher917e9522014-11-18 22:36:15 +00003813 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003814 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3815 : IsWinCOFF
3816 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3817 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003818
3819 // Use fpret only for long double.
3820 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003821
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003822 // Use fp2ret for _Complex long double.
3823 ComplexLongDoubleUsesFP2Ret = true;
3824
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003825 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003826 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003827 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003828 }
Craig Topper3164f332014-03-11 03:39:26 +00003829 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003830 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003831 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003832
Craig Topper3164f332014-03-11 03:39:26 +00003833 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003834 if (RegNo == 0) return 0;
3835 if (RegNo == 1) return 1;
3836 return -1;
3837 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003838
Craig Topper3164f332014-03-11 03:39:26 +00003839 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003840 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003841 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003842 CC == CC_IntelOclBicc ||
3843 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003844 }
3845
Craig Topper3164f332014-03-11 03:39:26 +00003846 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003847 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003848 }
3849
Pavel Chupinfd223e12014-08-04 12:39:43 +00003850 // for x32 we need it here explicitly
3851 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003852};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003853
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003854// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003855class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003856public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003857 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3858 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003859 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003860 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003861 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003862 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003863 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003864 SizeType = UnsignedLongLong;
3865 PtrDiffType = SignedLongLong;
3866 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003867 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003868 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003869
Craig Topper3164f332014-03-11 03:39:26 +00003870 void getTargetDefines(const LangOptions &Opts,
3871 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003872 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003873 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003874 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003875
Craig Topper3164f332014-03-11 03:39:26 +00003876 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003877 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003878 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003879
Craig Topper3164f332014-03-11 03:39:26 +00003880 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003881 switch (CC) {
3882 case CC_X86StdCall:
3883 case CC_X86ThisCall:
3884 case CC_X86FastCall:
3885 return CCCR_Ignore;
3886 case CC_C:
3887 case CC_X86VectorCall:
3888 case CC_IntelOclBicc:
3889 case CC_X86_64SysV:
3890 return CCCR_OK;
3891 default:
3892 return CCCR_Warning;
3893 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003894 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003895};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003896
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003897// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003898class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003899public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003900 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003901 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003902 LongDoubleWidth = LongDoubleAlign = 64;
3903 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003904 }
Craig Topper3164f332014-03-11 03:39:26 +00003905 void getTargetDefines(const LangOptions &Opts,
3906 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003907 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3908 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003909 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003910 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003911 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003912};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003913
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003914// x86-64 MinGW target
3915class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3916public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003917 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3918 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003919 void getTargetDefines(const LangOptions &Opts,
3920 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003921 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003922 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003923 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003924 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003925
3926 // GCC defines this macro when it is using __gxx_personality_seh0.
3927 if (!Opts.SjLjExceptions)
3928 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003929 }
3930};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003931
Eli Friedman2857ccb2009-07-01 03:36:11 +00003932class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3933public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003934 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3935 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003936 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003937 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003938 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3939 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003940 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003941 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003942 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003943 }
3944};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003945
Eli Friedman245f2292009-07-05 22:31:18 +00003946class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3947public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003948 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3949 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003950 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003951 Int64Type = SignedLongLong;
3952 }
3953};
Eli Friedman245f2292009-07-05 22:31:18 +00003954
Eli Friedman9fa28852012-08-08 23:57:20 +00003955class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3956public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003957 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3958 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3959 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003960 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003961 }
3962};
Tim Northover9bb857a2013-01-31 12:13:10 +00003963
Eli Friedmanf05b7722008-08-20 07:44:10 +00003964class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003965 // Possible FPU choices.
3966 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003967 VFP2FPU = (1 << 0),
3968 VFP3FPU = (1 << 1),
3969 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003970 NeonFPU = (1 << 3),
3971 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003972 };
3973
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003974 // Possible HWDiv features.
3975 enum HWDivMode {
3976 HWDivThumb = (1 << 0),
3977 HWDivARM = (1 << 1)
3978 };
3979
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003980 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003981 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003982 }
3983
3984 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3985 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003986
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003987 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003988
Rafael Espindolaeb265472013-08-21 21:59:03 +00003989 enum {
3990 FP_Default,
3991 FP_VFP,
3992 FP_Neon
3993 } FPMath;
3994
Bernard Ogdenda13af32013-10-24 18:32:51 +00003995 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003996
Logan Chien57086ce2012-10-10 06:56:20 +00003997 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003998 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003999 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004000
4001 // Initialized via features.
4002 unsigned SoftFloat : 1;
4003 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004004
Bernard Ogden18b57012013-10-29 09:47:51 +00004005 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004006 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00004007
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004008 // ACLE 6.5.1 Hardware floating point
4009 enum {
4010 HW_FP_HP = (1 << 1), /// half (16-bit)
4011 HW_FP_SP = (1 << 2), /// single (32-bit)
4012 HW_FP_DP = (1 << 3), /// double (64-bit)
4013 };
4014 uint32_t HW_FP;
4015
Chris Lattner5cc15e02010-03-03 19:03:45 +00004016 static const Builtin::Info BuiltinInfo[];
4017
Rafael Espindola101d5b92013-05-13 20:09:47 +00004018 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00004019 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004020 if (T.getArch() == llvm::Triple::arm ||
4021 T.getArch() == llvm::Triple::armeb) {
4022 StringRef VersionStr;
4023 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00004024 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004025 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00004026 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004027 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00004028 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00004029 unsigned Version;
4030 if (VersionStr.getAsInteger(10, Version))
4031 return false;
4032 return Version >= 6;
4033 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004034 assert(T.getArch() == llvm::Triple::thumb ||
4035 T.getArch() == llvm::Triple::thumbeb);
4036 StringRef VersionStr;
4037 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00004038 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004039 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00004040 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004041 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00004042 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00004043 unsigned Version;
4044 if (VersionStr.getAsInteger(10, Version))
4045 return false;
4046 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004047 }
4048
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004049 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004050 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004051
4052 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004053 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004054
Renato Golin9ba39232015-02-27 16:35:48 +00004055 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4056 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4057 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004058 SizeType = UnsignedLong;
4059 else
4060 SizeType = UnsignedInt;
4061
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004062 switch (T.getOS()) {
4063 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004064 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004065 break;
4066 case llvm::Triple::Win32:
4067 WCharType = UnsignedShort;
4068 break;
4069 case llvm::Triple::Linux:
4070 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004071 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4072 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004073 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004074 }
4075
4076 UseBitFieldTypeAlignment = true;
4077
4078 ZeroLengthBitfieldBoundary = 0;
4079
Tim Northover147cd2f2014-10-14 22:12:21 +00004080 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4081 // so set preferred for small types to 32.
4082 if (T.isOSBinFormatMachO()) {
4083 DescriptionString =
4084 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4085 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4086 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004087 assert(!BigEndian && "Windows on ARM does not support big endian");
4088 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00004089 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00004090 "-p:32:32"
4091 "-i64:64"
4092 "-v128:64:128"
4093 "-a:0:32"
4094 "-n32"
4095 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004096 } else if (T.isOSNaCl()) {
4097 assert(!BigEndian && "NaCl on ARM does not support big endian");
4098 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004099 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00004100 DescriptionString =
4101 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4102 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004103 }
4104
4105 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004106 }
4107
4108 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004109 const llvm::Triple &T = getTriple();
4110
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004111 IsAAPCS = false;
4112
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004113 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004114
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004115 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004116 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004117 SizeType = UnsignedInt;
4118 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004119 SizeType = UnsignedLong;
4120
4121 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4122 WCharType = SignedInt;
4123
4124 // Do not respect the alignment of bit-field types when laying out
4125 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4126 UseBitFieldTypeAlignment = false;
4127
4128 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4129 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4130 /// gcc.
4131 ZeroLengthBitfieldBoundary = 32;
4132
Tim Northover147cd2f2014-10-14 22:12:21 +00004133 if (T.isOSBinFormatMachO())
4134 DescriptionString =
4135 BigEndian
4136 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4137 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4138 else
4139 DescriptionString =
4140 BigEndian
4141 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4142 : "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 +00004143
4144 // FIXME: Override "preferred align" for double and long long.
4145 }
4146
Chris Lattner17df24e2008-04-21 18:56:49 +00004147public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004148 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004149 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004150 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004151 BigEndian = IsBigEndian;
4152
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004153 switch (getTriple().getOS()) {
4154 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004155 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004156 break;
4157 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004158 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004159 break;
4160 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004161
Chris Lattner1a8f3942010-04-23 16:29:58 +00004162 // {} in inline assembly are neon specifiers, not assembly variant
4163 // specifiers.
4164 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004165
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004166 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004167 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004168
Eric Christopher0e261882014-12-05 01:06:59 +00004169 // FIXME: This duplicates code from the driver that sets the -target-abi
4170 // option - this code is used if -target-abi isn't passed and should
4171 // be unified in some way.
4172 if (Triple.isOSBinFormatMachO()) {
4173 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4174 // the frontend matches that.
4175 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4176 Triple.getOS() == llvm::Triple::UnknownOS ||
4177 StringRef(CPU).startswith("cortex-m")) {
4178 setABI("aapcs");
4179 } else {
4180 setABI("apcs-gnu");
4181 }
4182 } else if (Triple.isOSWindows()) {
4183 // FIXME: this is invalid for WindowsCE
4184 setABI("aapcs");
4185 } else {
4186 // Select the default based on the platform.
4187 switch (Triple.getEnvironment()) {
4188 case llvm::Triple::Android:
4189 case llvm::Triple::GNUEABI:
4190 case llvm::Triple::GNUEABIHF:
4191 setABI("aapcs-linux");
4192 break;
4193 case llvm::Triple::EABIHF:
4194 case llvm::Triple::EABI:
4195 setABI("aapcs");
4196 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004197 case llvm::Triple::GNU:
4198 setABI("apcs-gnu");
4199 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004200 default:
4201 if (Triple.getOS() == llvm::Triple::NetBSD)
4202 setABI("apcs-gnu");
4203 else
4204 setABI("aapcs");
4205 break;
4206 }
4207 }
John McCall86353412010-08-21 22:46:04 +00004208
4209 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004210 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004211
4212 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004213 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004214 if (shouldUseInlineAtomic(getTriple()))
4215 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004216
4217 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004218 // the alignment of the zero-length bitfield is greater than the member
4219 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004220 // zero length bitfield.
4221 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004222 }
Alp Toker4925ba72014-06-07 23:30:42 +00004223 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004224 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004225 ABI = Name;
4226
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004227 // The defaults (above) are for AAPCS, check if we need to change them.
4228 //
4229 // FIXME: We need support for -meabi... we could just mangle it into the
4230 // name.
4231 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004232 setABIAPCS();
4233 return true;
4234 }
4235 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4236 setABIAAPCS();
4237 return true;
4238 }
4239 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004240 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004241
Renato Golinf5c4dec2015-05-27 13:33:00 +00004242 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004243 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004244 StringRef ArchName = getTriple().getArchName();
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00004245 unsigned ArchKind = llvm::ARMTargetParser::parseArch(ArchName);
Renato Golinf5c4dec2015-05-27 13:33:00 +00004246 bool IsV8 = (ArchKind == llvm::ARM::AK_ARMV8A ||
4247 ArchKind == llvm::ARM::AK_ARMV8_1A);
4248
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004249 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4250 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004251 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004252 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004253 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004254 }
4255 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004256 Features["vfp4"] = true;
4257 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004258 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4259 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004260 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004261 Features["vfp4"] = true;
4262 Features["neon"] = true;
4263 Features["hwdiv"] = true;
4264 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004265 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4266 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004267 Features["fp-armv8"] = true;
4268 Features["neon"] = true;
4269 Features["hwdiv"] = true;
4270 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004271 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004272 Features["crypto"] = true;
Renato Golinf5c4dec2015-05-27 13:33:00 +00004273 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || IsV8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004274 Features["hwdiv"] = true;
4275 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004276 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004277 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004278 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004279 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004280 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004281
Craig Topper3164f332014-03-11 03:39:26 +00004282 bool handleTargetFeatures(std::vector<std::string> &Features,
4283 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004284 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004285 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004286 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004287 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004288 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004289
Ranjeet Singhac08e532015-06-24 23:39:25 +00004290 // This does not diagnose illegal cases like having both
4291 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4292 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004293 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004294 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004295 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004296 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004297 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004298 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004299 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004300 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004301 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004302 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004303 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004304 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004305 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004306 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004307 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004308 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004309 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004310 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004311 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004312 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004313 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004314 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004315 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004316 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004317 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004318 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004319 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004320 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004321 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004322 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004323 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004324 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004325 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004326
Rafael Espindolaeb265472013-08-21 21:59:03 +00004327 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4328 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4329 return false;
4330 }
4331
4332 if (FPMath == FP_Neon)
4333 Features.push_back("+neonfp");
4334 else if (FPMath == FP_VFP)
4335 Features.push_back("-neonfp");
4336
Daniel Dunbar893d4752009-12-19 04:15:38 +00004337 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004338 auto Feature =
4339 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4340 if (Feature != Features.end())
4341 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004342
Rafael Espindolaeb265472013-08-21 21:59:03 +00004343 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004344 }
4345
Craig Topper3164f332014-03-11 03:39:26 +00004346 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004347 return llvm::StringSwitch<bool>(Feature)
4348 .Case("arm", true)
4349 .Case("softfloat", SoftFloat)
4350 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004351 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004352 .Case("hwdiv", HWDiv & HWDivThumb)
4353 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004354 .Default(false);
4355 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004356 const char *getCPUDefineSuffix(StringRef Name) const {
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004357 if(Name == "generic") {
4358 auto subarch = getTriple().getSubArch();
4359 switch (subarch) {
4360 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4361 return "8_1A";
4362 default:
4363 break;
4364 }
4365 }
4366
Renato Golin391544c2015-05-28 12:11:11 +00004367 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
4368 if (ArchKind == llvm::ARM::AK_INVALID)
4369 return "";
4370
4371 // For most sub-arches, the build attribute CPU name is enough.
4372 // For Cortex variants, it's slightly different.
4373 switch(ArchKind) {
4374 default:
4375 return llvm::ARMTargetParser::getCPUAttr(ArchKind);
4376 case llvm::ARM::AK_ARMV6M:
4377 case llvm::ARM::AK_ARMV6SM:
4378 return "6M";
4379 case llvm::ARM::AK_ARMV7:
4380 case llvm::ARM::AK_ARMV7A:
Tim Northovera8c168d2015-05-29 21:28:25 +00004381 case llvm::ARM::AK_ARMV7S:
Renato Golin391544c2015-05-28 12:11:11 +00004382 return "7A";
4383 case llvm::ARM::AK_ARMV7R:
4384 return "7R";
4385 case llvm::ARM::AK_ARMV7M:
4386 return "7M";
4387 case llvm::ARM::AK_ARMV7EM:
4388 return "7EM";
4389 case llvm::ARM::AK_ARMV8A:
4390 return "8A";
4391 case llvm::ARM::AK_ARMV8_1A:
4392 return "8_1A";
4393 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004394 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004395 const char *getCPUProfile(StringRef Name) const {
4396 if(Name == "generic") {
4397 auto subarch = getTriple().getSubArch();
4398 switch (subarch) {
4399 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4400 return "A";
4401 default:
4402 break;
4403 }
4404 }
4405
Renato Golinf05bf002015-05-27 14:15:12 +00004406 unsigned CPUArch = llvm::ARMTargetParser::parseCPUArch(Name);
4407 if (CPUArch == llvm::ARM::AK_INVALID)
4408 return "";
4409
4410 StringRef ArchName = llvm::ARMTargetParser::getArchName(CPUArch);
4411 switch(llvm::ARMTargetParser::parseArchProfile(ArchName)) {
4412 case llvm::ARM::PK_A:
4413 return "A";
4414 case llvm::ARM::PK_R:
4415 return "R";
4416 case llvm::ARM::PK_M:
4417 return "M";
4418 default:
4419 return "";
4420 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004421 }
Craig Topper3164f332014-03-11 03:39:26 +00004422 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004423 if (!getCPUDefineSuffix(Name))
4424 return false;
4425
Tim Northovere8c37212014-07-09 09:24:43 +00004426 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4427 StringRef Profile = getCPUProfile(Name);
4428 if (Profile == "M" && MaxAtomicInlineWidth) {
4429 MaxAtomicPromoteWidth = 32;
4430 MaxAtomicInlineWidth = 32;
4431 }
4432
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004433 CPU = Name;
4434 return true;
4435 }
Craig Topper3164f332014-03-11 03:39:26 +00004436 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004437 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4438 unsigned CPUArchVer) const {
4439 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4440 (CPUArch.find('M') != StringRef::npos);
4441 }
4442 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4443 unsigned CPUArchVer) const {
4444 // We check both CPUArchVer and ArchName because when only triple is
4445 // specified, the default CPU is arm1136j-s.
4446 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004447 ArchName.endswith("v8.1a") ||
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004448 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4449 }
Craig Topper3164f332014-03-11 03:39:26 +00004450 void getTargetDefines(const LangOptions &Opts,
4451 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004452 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004453 Builder.defineMacro("__arm");
4454 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004455
Chris Lattnerecd49032009-03-02 22:27:17 +00004456 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004457 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004458
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004459 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004460 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004461 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004462 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004463 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004464
4465 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004466 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004467 StringRef ArchName = getTriple().getArchName();
4468
4469 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4470 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004471 if (CPUArch[0] >= '8') {
4472 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4473 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004474 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004475
4476 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4477 // is not defined for the M-profile.
4478 // NOTE that the deffault profile is assumed to be 'A'
4479 if (CPUProfile.empty() || CPUProfile != "M")
4480 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4481
4482 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4483 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4484 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4485 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4486 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4487 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4488 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4489
4490 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4491 // instruction set such as ARM or Thumb.
4492 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4493
4494 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4495
4496 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004497 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004498 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004499
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004500 // ACLE 6.5.1 Hardware Floating Point
4501 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004502 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004503
Yi Konga44c4d72014-06-27 21:25:42 +00004504 // ACLE predefines.
4505 Builder.defineMacro("__ARM_ACLE", "200");
4506
Mike Stump9d54bd72009-04-08 02:07:04 +00004507 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004508
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004509 // FIXME: It's more complicated than this and we don't really support
4510 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004511 // Windows on ARM does not "support" interworking
4512 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004513 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004514
David Tweed8f676532012-10-25 13:33:01 +00004515 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004516 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004517 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4518 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004519 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004520 Builder.defineMacro("__ARM_PCS", "1");
4521
David Tweed8f676532012-10-25 13:33:01 +00004522 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004523 Builder.defineMacro("__ARM_PCS_VFP", "1");
4524 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004525
Daniel Dunbar893d4752009-12-19 04:15:38 +00004526 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004527 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004528
4529 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004530 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004531
4532 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004533 Builder.defineMacro("__THUMBEL__");
4534 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004535 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004536 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004537 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004538 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4539 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004540
4541 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004542 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004543
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004544 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004545 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004546 if (FPU & VFP2FPU)
4547 Builder.defineMacro("__ARM_VFPV2__");
4548 if (FPU & VFP3FPU)
4549 Builder.defineMacro("__ARM_VFPV3__");
4550 if (FPU & VFP4FPU)
4551 Builder.defineMacro("__ARM_VFPV4__");
4552 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004553
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004554 // This only gets set when Neon instructions are actually available, unlike
4555 // the VFP define, hence the soft float and arch check. This is subtly
4556 // different from gcc, we follow the intent which was that it should be set
4557 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004558 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4559 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004560 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004561 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004562
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004563 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4564 Opts.ShortWChar ? "2" : "4");
4565
4566 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4567 Opts.ShortEnums ? "1" : "4");
4568
Bernard Ogden18b57012013-10-29 09:47:51 +00004569 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004570 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004571
Tim Northover02e38602014-02-03 17:28:04 +00004572 if (Crypto)
4573 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4574
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004575 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004576 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4577 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4578 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4579 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4580 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004581
4582 bool is5EOrAbove = (CPUArchVer >= 6 ||
4583 (CPUArchVer == 5 &&
4584 CPUArch.find('E') != StringRef::npos));
4585 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4586 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4587 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004588 }
Craig Topper3164f332014-03-11 03:39:26 +00004589 void getTargetBuiltins(const Builtin::Info *&Records,
4590 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004591 Records = BuiltinInfo;
4592 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004593 }
Craig Topper3164f332014-03-11 03:39:26 +00004594 bool isCLZForZeroUndef() const override { return false; }
4595 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004596 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004597 }
Craig Topper3164f332014-03-11 03:39:26 +00004598 void getGCCRegNames(const char * const *&Names,
4599 unsigned &NumNames) const override;
4600 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4601 unsigned &NumAliases) const override;
4602 bool validateAsmConstraint(const char *&Name,
4603 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004604 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004605 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004606 case 'l': // r0-r7
4607 case 'h': // r8-r15
4608 case 'w': // VFP Floating point register single precision
4609 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004610 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004611 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004612 case 'I':
4613 case 'J':
4614 case 'K':
4615 case 'L':
4616 case 'M':
4617 // FIXME
4618 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004619 case 'Q': // A memory address that is a single base register.
4620 Info.setAllowsMemory();
4621 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004622 case 'U': // a memory reference...
4623 switch (Name[1]) {
4624 case 'q': // ...ARMV4 ldrsb
4625 case 'v': // ...VFP load/store (reg+constant offset)
4626 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004627 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004628 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004629 case 'n': // valid address for Neon doubleword vector load/store
4630 case 'm': // valid address for Neon element and structure load/store
4631 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004632 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004633 Info.setAllowsMemory();
4634 Name++;
4635 return true;
4636 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004637 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004638 return false;
4639 }
Craig Topper3164f332014-03-11 03:39:26 +00004640 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004641 std::string R;
4642 switch (*Constraint) {
4643 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004644 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004645 Constraint++;
4646 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004647 case 'p': // 'p' should be translated to 'r' by default.
4648 R = std::string("r");
4649 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004650 default:
4651 return std::string(1, *Constraint);
4652 }
4653 return R;
4654 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004655 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004656 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004657 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004658 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004659 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004660
Bill Wendling9d1ee112012-10-25 23:28:48 +00004661 // Strip off constraint modifiers.
4662 while (Constraint[0] == '=' ||
4663 Constraint[0] == '+' ||
4664 Constraint[0] == '&')
4665 Constraint = Constraint.substr(1);
4666
4667 switch (Constraint[0]) {
4668 default: break;
4669 case 'r': {
4670 switch (Modifier) {
4671 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004672 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004673 case 'q':
4674 // A register of size 32 cannot fit a vector type.
4675 return false;
4676 }
4677 }
4678 }
4679
4680 return true;
4681 }
Craig Topper3164f332014-03-11 03:39:26 +00004682 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004683 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004684 return "";
4685 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004686
Craig Topper3164f332014-03-11 03:39:26 +00004687 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004688 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4689 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004690
Craig Topper3164f332014-03-11 03:39:26 +00004691 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004692 if (RegNo == 0) return 0;
4693 if (RegNo == 1) return 1;
4694 return -1;
4695 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004696};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004697
Rafael Espindolaeb265472013-08-21 21:59:03 +00004698bool ARMTargetInfo::setFPMath(StringRef Name) {
4699 if (Name == "neon") {
4700 FPMath = FP_Neon;
4701 return true;
4702 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4703 Name == "vfp4") {
4704 FPMath = FP_VFP;
4705 return true;
4706 }
4707 return false;
4708}
4709
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004710const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004711 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004712 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004713 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4714
4715 // Float registers
4716 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4717 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4718 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004719 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004720
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004721 // Double registers
4722 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4723 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004724 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4725 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004726
4727 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004728 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4729 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004730};
4731
4732void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004733 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004734 Names = GCCRegNames;
4735 NumNames = llvm::array_lengthof(GCCRegNames);
4736}
4737
4738const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004739 { { "a1" }, "r0" },
4740 { { "a2" }, "r1" },
4741 { { "a3" }, "r2" },
4742 { { "a4" }, "r3" },
4743 { { "v1" }, "r4" },
4744 { { "v2" }, "r5" },
4745 { { "v3" }, "r6" },
4746 { { "v4" }, "r7" },
4747 { { "v5" }, "r8" },
4748 { { "v6", "rfp" }, "r9" },
4749 { { "sl" }, "r10" },
4750 { { "fp" }, "r11" },
4751 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004752 { { "r13" }, "sp" },
4753 { { "r14" }, "lr" },
4754 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004755 // The S, D and Q registers overlap, but aren't really aliases; we
4756 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004757};
4758
4759void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4760 unsigned &NumAliases) const {
4761 Aliases = GCCRegAliases;
4762 NumAliases = llvm::array_lengthof(GCCRegAliases);
4763}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004764
4765const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004766#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004767#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004768 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004769#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004770
4771#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004772#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004773#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4774 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004775#include "clang/Basic/BuiltinsARM.def"
4776};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004777
4778class ARMleTargetInfo : public ARMTargetInfo {
4779public:
4780 ARMleTargetInfo(const llvm::Triple &Triple)
4781 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004782 void getTargetDefines(const LangOptions &Opts,
4783 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004784 Builder.defineMacro("__ARMEL__");
4785 ARMTargetInfo::getTargetDefines(Opts, Builder);
4786 }
4787};
4788
4789class ARMbeTargetInfo : public ARMTargetInfo {
4790public:
4791 ARMbeTargetInfo(const llvm::Triple &Triple)
4792 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004793 void getTargetDefines(const LangOptions &Opts,
4794 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004795 Builder.defineMacro("__ARMEB__");
4796 Builder.defineMacro("__ARM_BIG_ENDIAN");
4797 ARMTargetInfo::getTargetDefines(Opts, Builder);
4798 }
4799};
Chris Lattner17df24e2008-04-21 18:56:49 +00004800
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004801class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4802 const llvm::Triple Triple;
4803public:
4804 WindowsARMTargetInfo(const llvm::Triple &Triple)
4805 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4806 TLSSupported = false;
4807 WCharType = UnsignedShort;
4808 SizeType = UnsignedInt;
4809 UserLabelPrefix = "";
4810 }
4811 void getVisualStudioDefines(const LangOptions &Opts,
4812 MacroBuilder &Builder) const {
4813 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4814
4815 // FIXME: this is invalid for WindowsCE
4816 Builder.defineMacro("_M_ARM_NT", "1");
4817 Builder.defineMacro("_M_ARMT", "_M_ARM");
4818 Builder.defineMacro("_M_THUMB", "_M_ARM");
4819
4820 assert((Triple.getArch() == llvm::Triple::arm ||
4821 Triple.getArch() == llvm::Triple::thumb) &&
4822 "invalid architecture for Windows ARM target info");
4823 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4824 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4825
4826 // TODO map the complete set of values
4827 // 31: VFPv3 40: VFPv4
4828 Builder.defineMacro("_M_ARM_FP", "31");
4829 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004830 BuiltinVaListKind getBuiltinVaListKind() const override {
4831 return TargetInfo::CharPtrBuiltinVaList;
4832 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004833};
4834
4835// Windows ARM + Itanium C++ ABI Target
4836class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4837public:
4838 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4839 : WindowsARMTargetInfo(Triple) {
4840 TheCXXABI.set(TargetCXXABI::GenericARM);
4841 }
4842
4843 void getTargetDefines(const LangOptions &Opts,
4844 MacroBuilder &Builder) const override {
4845 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4846
4847 if (Opts.MSVCCompat)
4848 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4849 }
4850};
4851
4852// Windows ARM, MS (C++) ABI
4853class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4854public:
4855 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4856 : WindowsARMTargetInfo(Triple) {
4857 TheCXXABI.set(TargetCXXABI::Microsoft);
4858 }
4859
4860 void getTargetDefines(const LangOptions &Opts,
4861 MacroBuilder &Builder) const override {
4862 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4863 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4864 }
4865};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004866
Mike Stump11289f42009-09-09 15:08:12 +00004867class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004868 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004869protected:
Craig Topper3164f332014-03-11 03:39:26 +00004870 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4871 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004872 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004873 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004874
Torok Edwinb2b37c62009-06-30 17:10:35 +00004875public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004876 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004877 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004878 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004879 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004880 // FIXME: This should be based off of the target features in
4881 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004882 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004883
4884 // Darwin on iOS uses a variant of the ARM C++ ABI.
4885 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004886 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004887};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004888
Tim Northover573cbee2014-05-24 12:52:07 +00004889class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004890 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004891 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4892 static const char *const GCCRegNames[];
4893
James Molloy75f5f9e2014-04-16 15:33:48 +00004894 enum FPUModeEnum {
4895 FPUMode,
4896 NeonMode
4897 };
4898
4899 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004900 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004901 unsigned Crypto;
4902
Tim Northovera2ee4332014-03-29 15:09:45 +00004903 static const Builtin::Info BuiltinInfo[];
4904
4905 std::string ABI;
4906
4907public:
Tim Northover573cbee2014-05-24 12:52:07 +00004908 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004909 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004910
4911 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4912 WCharType = SignedInt;
4913
4914 // NetBSD apparently prefers consistency across ARM targets to consistency
4915 // across 64-bit targets.
4916 Int64Type = SignedLongLong;
4917 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004918 } else {
4919 WCharType = UnsignedInt;
4920 Int64Type = SignedLong;
4921 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004922 }
4923
Tim Northovera2ee4332014-03-29 15:09:45 +00004924 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004925 MaxVectorAlign = 128;
4926 RegParmMax = 8;
4927 MaxAtomicInlineWidth = 128;
4928 MaxAtomicPromoteWidth = 128;
4929
Tim Northovera6a19f12015-02-06 01:25:07 +00004930 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004931 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4932
Tim Northovera2ee4332014-03-29 15:09:45 +00004933 // {} in inline assembly are neon specifiers, not assembly variant
4934 // specifiers.
4935 NoAsmVariants = true;
4936
Tim Northover7ad87af2015-01-16 18:44:04 +00004937 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4938 // contributes to the alignment of the containing aggregate in the same way
4939 // a plain (non bit-field) member of that type would, without exception for
4940 // zero-sized or anonymous bit-fields."
4941 UseBitFieldTypeAlignment = true;
4942 UseZeroLengthBitfieldAlignment = true;
4943
Tim Northover573cbee2014-05-24 12:52:07 +00004944 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004945 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4946 }
4947
Alp Toker4925ba72014-06-07 23:30:42 +00004948 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004949 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004950 if (Name != "aapcs" && Name != "darwinpcs")
4951 return false;
4952
4953 ABI = Name;
4954 return true;
4955 }
4956
David Blaikie1cbb9712014-11-14 19:09:44 +00004957 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004958 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004959 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004960 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004961 .Case("cyclone", true)
4962 .Default(false);
4963 return CPUKnown;
4964 }
4965
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004966 void getTargetDefines(const LangOptions &Opts,
4967 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004968 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004969 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004970
4971 // Target properties.
4972 Builder.defineMacro("_LP64");
4973 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004974
4975 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4976 Builder.defineMacro("__ARM_ACLE", "200");
4977 Builder.defineMacro("__ARM_ARCH", "8");
4978 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4979
4980 Builder.defineMacro("__ARM_64BIT_STATE");
4981 Builder.defineMacro("__ARM_PCS_AAPCS64");
4982 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4983
4984 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4985 Builder.defineMacro("__ARM_FEATURE_CLZ");
4986 Builder.defineMacro("__ARM_FEATURE_FMA");
4987 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004988 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4989 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4990 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4991 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004992
4993 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4994
4995 // 0xe implies support for half, single and double precision operations.
4996 Builder.defineMacro("__ARM_FP", "0xe");
4997
4998 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4999 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
5000 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
5001
5002 if (Opts.FastMath || Opts.FiniteMathOnly)
5003 Builder.defineMacro("__ARM_FP_FAST");
5004
Richard Smithab506ad2014-10-20 23:26:58 +00005005 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005006 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5007
5008 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5009
5010 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5011 Opts.ShortEnums ? "1" : "4");
5012
James Molloy75f5f9e2014-04-16 15:33:48 +00005013 if (FPU == NeonMode) {
5014 Builder.defineMacro("__ARM_NEON");
5015 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00005016 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00005017 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005018
Bradley Smith418c5932014-05-02 15:17:51 +00005019 if (CRC)
5020 Builder.defineMacro("__ARM_FEATURE_CRC32");
5021
James Molloy75f5f9e2014-04-16 15:33:48 +00005022 if (Crypto)
5023 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00005024
5025 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5026 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5027 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5028 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5029 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005030 }
5031
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005032 void getTargetBuiltins(const Builtin::Info *&Records,
5033 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005034 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005035 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005036 }
5037
David Blaikie1cbb9712014-11-14 19:09:44 +00005038 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005039 return Feature == "aarch64" ||
5040 Feature == "arm64" ||
5041 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005042 }
5043
James Molloy5e73df52014-04-16 15:06:20 +00005044 bool handleTargetFeatures(std::vector<std::string> &Features,
5045 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005046 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005047 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005048 Crypto = 0;
5049 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5050 if (Features[i] == "+neon")
5051 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005052 if (Features[i] == "+crc")
5053 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005054 if (Features[i] == "+crypto")
5055 Crypto = 1;
5056 }
5057
James Molloy5e73df52014-04-16 15:06:20 +00005058 setDescriptionString();
5059
5060 return true;
5061 }
5062
David Blaikie1cbb9712014-11-14 19:09:44 +00005063 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005064
David Blaikie1cbb9712014-11-14 19:09:44 +00005065 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005066 return TargetInfo::AArch64ABIBuiltinVaList;
5067 }
5068
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005069 void getGCCRegNames(const char *const *&Names,
5070 unsigned &NumNames) const override;
5071 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5072 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005073
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005074 bool validateAsmConstraint(const char *&Name,
5075 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005076 switch (*Name) {
5077 default:
5078 return false;
5079 case 'w': // Floating point and SIMD registers (V0-V31)
5080 Info.setAllowsRegister();
5081 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005082 case 'I': // Constant that can be used with an ADD instruction
5083 case 'J': // Constant that can be used with a SUB instruction
5084 case 'K': // Constant that can be used with a 32-bit logical instruction
5085 case 'L': // Constant that can be used with a 64-bit logical instruction
5086 case 'M': // Constant that can be used as a 32-bit MOV immediate
5087 case 'N': // Constant that can be used as a 64-bit MOV immediate
5088 case 'Y': // Floating point constant zero
5089 case 'Z': // Integer constant zero
5090 return true;
5091 case 'Q': // A memory reference with base register and no offset
5092 Info.setAllowsMemory();
5093 return true;
5094 case 'S': // A symbolic address
5095 Info.setAllowsRegister();
5096 return true;
5097 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005098 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5099 // Utf: A memory address suitable for ldp/stp in TF mode.
5100 // Usa: An absolute symbolic address.
5101 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5102 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005103 case 'z': // Zero register, wzr or xzr
5104 Info.setAllowsRegister();
5105 return true;
5106 case 'x': // Floating point and SIMD registers (V0-V15)
5107 Info.setAllowsRegister();
5108 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005109 }
5110 return false;
5111 }
5112
Akira Hatanaka987f1862014-08-22 06:05:21 +00005113 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005114 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005115 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005116 // Strip off constraint modifiers.
5117 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5118 Constraint = Constraint.substr(1);
5119
5120 switch (Constraint[0]) {
5121 default:
5122 return true;
5123 case 'z':
5124 case 'r': {
5125 switch (Modifier) {
5126 case 'x':
5127 case 'w':
5128 // For now assume that the person knows what they're
5129 // doing with the modifier.
5130 return true;
5131 default:
5132 // By default an 'r' constraint will be in the 'x'
5133 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005134 if (Size == 64)
5135 return true;
5136
5137 SuggestedModifier = "w";
5138 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005139 }
5140 }
5141 }
5142 }
5143
David Blaikie1cbb9712014-11-14 19:09:44 +00005144 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005145
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005146 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005147 if (RegNo == 0)
5148 return 0;
5149 if (RegNo == 1)
5150 return 1;
5151 return -1;
5152 }
5153};
5154
Tim Northover573cbee2014-05-24 12:52:07 +00005155const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005156 // 32-bit Integer registers
5157 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5158 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5159 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5160
5161 // 64-bit Integer registers
5162 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5163 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5164 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5165
5166 // 32-bit floating point regsisters
5167 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5168 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5169 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5170
5171 // 64-bit floating point regsisters
5172 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5173 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5174 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5175
5176 // Vector registers
5177 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5178 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5179 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5180};
5181
Tim Northover573cbee2014-05-24 12:52:07 +00005182void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005183 unsigned &NumNames) const {
5184 Names = GCCRegNames;
5185 NumNames = llvm::array_lengthof(GCCRegNames);
5186}
5187
Tim Northover573cbee2014-05-24 12:52:07 +00005188const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005189 { { "w31" }, "wsp" },
5190 { { "x29" }, "fp" },
5191 { { "x30" }, "lr" },
5192 { { "x31" }, "sp" },
5193 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5194 // don't want to substitute one of these for a different-sized one.
5195};
5196
Tim Northover573cbee2014-05-24 12:52:07 +00005197void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005198 unsigned &NumAliases) const {
5199 Aliases = GCCRegAliases;
5200 NumAliases = llvm::array_lengthof(GCCRegAliases);
5201}
5202
Tim Northover573cbee2014-05-24 12:52:07 +00005203const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005204#define BUILTIN(ID, TYPE, ATTRS) \
5205 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5206#include "clang/Basic/BuiltinsNEON.def"
5207
5208#define BUILTIN(ID, TYPE, ATTRS) \
5209 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005210#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005211};
James Molloy5e73df52014-04-16 15:06:20 +00005212
Tim Northover573cbee2014-05-24 12:52:07 +00005213class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005214 void setDescriptionString() override {
5215 if (getTriple().isOSBinFormatMachO())
5216 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5217 else
5218 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5219 }
5220
5221public:
Tim Northover573cbee2014-05-24 12:52:07 +00005222 AArch64leTargetInfo(const llvm::Triple &Triple)
5223 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005224 BigEndian = false;
5225 }
5226 void getTargetDefines(const LangOptions &Opts,
5227 MacroBuilder &Builder) const override {
5228 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005229 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005230 }
5231};
5232
Tim Northover573cbee2014-05-24 12:52:07 +00005233class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005234 void setDescriptionString() override {
5235 assert(!getTriple().isOSBinFormatMachO());
5236 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5237 }
5238
5239public:
Tim Northover573cbee2014-05-24 12:52:07 +00005240 AArch64beTargetInfo(const llvm::Triple &Triple)
5241 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005242 void getTargetDefines(const LangOptions &Opts,
5243 MacroBuilder &Builder) const override {
5244 Builder.defineMacro("__AARCH64EB__");
5245 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5246 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005247 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005248 }
5249};
Tim Northovera2ee4332014-03-29 15:09:45 +00005250
Tim Northover573cbee2014-05-24 12:52:07 +00005251class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005252protected:
5253 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5254 MacroBuilder &Builder) const override {
5255 Builder.defineMacro("__AARCH64_SIMD__");
5256 Builder.defineMacro("__ARM64_ARCH_8__");
5257 Builder.defineMacro("__ARM_NEON__");
5258 Builder.defineMacro("__LITTLE_ENDIAN__");
5259 Builder.defineMacro("__REGISTER_PREFIX__", "");
5260 Builder.defineMacro("__arm64", "1");
5261 Builder.defineMacro("__arm64__", "1");
5262
5263 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5264 }
5265
Tim Northovera2ee4332014-03-29 15:09:45 +00005266public:
Tim Northover573cbee2014-05-24 12:52:07 +00005267 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5268 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005269 Int64Type = SignedLongLong;
5270 WCharType = SignedInt;
5271 UseSignedCharForObjCBool = false;
5272
Tim Northovera6a19f12015-02-06 01:25:07 +00005273 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005274 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5275
5276 TheCXXABI.set(TargetCXXABI::iOS64);
5277 }
5278
David Blaikie1cbb9712014-11-14 19:09:44 +00005279 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005280 return TargetInfo::CharPtrBuiltinVaList;
5281 }
5282};
Tim Northovera2ee4332014-03-29 15:09:45 +00005283
Tony Linthicum76329bf2011-12-12 21:14:55 +00005284// Hexagon abstract base class
5285class HexagonTargetInfo : public TargetInfo {
5286 static const Builtin::Info BuiltinInfo[];
5287 static const char * const GCCRegNames[];
5288 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5289 std::string CPU;
5290public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005291 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005292 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005293 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005294
5295 // {} in inline assembly are packet specifiers, not assembly variant
5296 // specifiers.
5297 NoAsmVariants = true;
5298 }
5299
Craig Topper3164f332014-03-11 03:39:26 +00005300 void getTargetBuiltins(const Builtin::Info *&Records,
5301 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005302 Records = BuiltinInfo;
5303 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5304 }
5305
Craig Topper3164f332014-03-11 03:39:26 +00005306 bool validateAsmConstraint(const char *&Name,
5307 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005308 return true;
5309 }
5310
Craig Topper3164f332014-03-11 03:39:26 +00005311 void getTargetDefines(const LangOptions &Opts,
5312 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005313
Craig Topper3164f332014-03-11 03:39:26 +00005314 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005315 return Feature == "hexagon";
5316 }
Craig Topper3164f332014-03-11 03:39:26 +00005317
5318 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005319 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005320 }
Craig Topper3164f332014-03-11 03:39:26 +00005321 void getGCCRegNames(const char * const *&Names,
5322 unsigned &NumNames) const override;
5323 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5324 unsigned &NumAliases) const override;
5325 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005326 return "";
5327 }
Sebastian Pop86500282012-01-13 20:37:10 +00005328
5329 static const char *getHexagonCPUSuffix(StringRef Name) {
5330 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005331 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005332 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005333 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005334 }
5335
Craig Topper3164f332014-03-11 03:39:26 +00005336 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005337 if (!getHexagonCPUSuffix(Name))
5338 return false;
5339
Tony Linthicum76329bf2011-12-12 21:14:55 +00005340 CPU = Name;
5341 return true;
5342 }
5343};
5344
5345void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5346 MacroBuilder &Builder) const {
5347 Builder.defineMacro("qdsp6");
5348 Builder.defineMacro("__qdsp6", "1");
5349 Builder.defineMacro("__qdsp6__", "1");
5350
5351 Builder.defineMacro("hexagon");
5352 Builder.defineMacro("__hexagon", "1");
5353 Builder.defineMacro("__hexagon__", "1");
5354
5355 if(CPU == "hexagonv1") {
5356 Builder.defineMacro("__HEXAGON_V1__");
5357 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5358 if(Opts.HexagonQdsp6Compat) {
5359 Builder.defineMacro("__QDSP6_V1__");
5360 Builder.defineMacro("__QDSP6_ARCH__", "1");
5361 }
5362 }
5363 else if(CPU == "hexagonv2") {
5364 Builder.defineMacro("__HEXAGON_V2__");
5365 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5366 if(Opts.HexagonQdsp6Compat) {
5367 Builder.defineMacro("__QDSP6_V2__");
5368 Builder.defineMacro("__QDSP6_ARCH__", "2");
5369 }
5370 }
5371 else if(CPU == "hexagonv3") {
5372 Builder.defineMacro("__HEXAGON_V3__");
5373 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5374 if(Opts.HexagonQdsp6Compat) {
5375 Builder.defineMacro("__QDSP6_V3__");
5376 Builder.defineMacro("__QDSP6_ARCH__", "3");
5377 }
5378 }
5379 else if(CPU == "hexagonv4") {
5380 Builder.defineMacro("__HEXAGON_V4__");
5381 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5382 if(Opts.HexagonQdsp6Compat) {
5383 Builder.defineMacro("__QDSP6_V4__");
5384 Builder.defineMacro("__QDSP6_ARCH__", "4");
5385 }
5386 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005387 else if(CPU == "hexagonv5") {
5388 Builder.defineMacro("__HEXAGON_V5__");
5389 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5390 if(Opts.HexagonQdsp6Compat) {
5391 Builder.defineMacro("__QDSP6_V5__");
5392 Builder.defineMacro("__QDSP6_ARCH__", "5");
5393 }
5394 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005395}
5396
5397const char * const HexagonTargetInfo::GCCRegNames[] = {
5398 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5399 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5400 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5401 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5402 "p0", "p1", "p2", "p3",
5403 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5404};
5405
5406void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5407 unsigned &NumNames) const {
5408 Names = GCCRegNames;
5409 NumNames = llvm::array_lengthof(GCCRegNames);
5410}
5411
5412
5413const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5414 { { "sp" }, "r29" },
5415 { { "fp" }, "r30" },
5416 { { "lr" }, "r31" },
5417 };
5418
5419void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5420 unsigned &NumAliases) const {
5421 Aliases = GCCRegAliases;
5422 NumAliases = llvm::array_lengthof(GCCRegAliases);
5423}
5424
5425
5426const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5427#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5428#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5429 ALL_LANGUAGES },
5430#include "clang/Basic/BuiltinsHexagon.def"
5431};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005432
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005433// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5434class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005435 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5436 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005437 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005438public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005439 SparcTargetInfo(const llvm::Triple &Triple)
5440 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005441
Craig Topper3164f332014-03-11 03:39:26 +00005442 bool handleTargetFeatures(std::vector<std::string> &Features,
5443 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005444 // The backend doesn't actually handle soft float yet, but in case someone
5445 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005446 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5447 if (Feature != Features.end()) {
5448 SoftFloat = true;
5449 Features.erase(Feature);
5450 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005451 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005452 }
Craig Topper3164f332014-03-11 03:39:26 +00005453 void getTargetDefines(const LangOptions &Opts,
5454 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005455 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005456 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005457
5458 if (SoftFloat)
5459 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005460 }
Craig Topper3164f332014-03-11 03:39:26 +00005461
5462 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005463 return llvm::StringSwitch<bool>(Feature)
5464 .Case("softfloat", SoftFloat)
5465 .Case("sparc", true)
5466 .Default(false);
5467 }
Craig Topper3164f332014-03-11 03:39:26 +00005468
5469 void getTargetBuiltins(const Builtin::Info *&Records,
5470 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005471 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005472 }
Craig Topper3164f332014-03-11 03:39:26 +00005473 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005474 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005475 }
Craig Topper3164f332014-03-11 03:39:26 +00005476 void getGCCRegNames(const char * const *&Names,
5477 unsigned &NumNames) const override;
5478 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5479 unsigned &NumAliases) const override;
5480 bool validateAsmConstraint(const char *&Name,
5481 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005482 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005483 switch (*Name) {
5484 case 'I': // Signed 13-bit constant
5485 case 'J': // Zero
5486 case 'K': // 32-bit constant with the low 12 bits clear
5487 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5488 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5489 case 'N': // Same as 'K' but zext (required for SIMode)
5490 case 'O': // The constant 4096
5491 return true;
5492 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005493 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005494 }
Craig Topper3164f332014-03-11 03:39:26 +00005495 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005496 // FIXME: Implement!
5497 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005498 }
5499};
5500
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005501const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005502 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5503 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5504 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5505 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5506};
5507
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005508void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5509 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005510 Names = GCCRegNames;
5511 NumNames = llvm::array_lengthof(GCCRegNames);
5512}
5513
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005514const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005515 { { "g0" }, "r0" },
5516 { { "g1" }, "r1" },
5517 { { "g2" }, "r2" },
5518 { { "g3" }, "r3" },
5519 { { "g4" }, "r4" },
5520 { { "g5" }, "r5" },
5521 { { "g6" }, "r6" },
5522 { { "g7" }, "r7" },
5523 { { "o0" }, "r8" },
5524 { { "o1" }, "r9" },
5525 { { "o2" }, "r10" },
5526 { { "o3" }, "r11" },
5527 { { "o4" }, "r12" },
5528 { { "o5" }, "r13" },
5529 { { "o6", "sp" }, "r14" },
5530 { { "o7" }, "r15" },
5531 { { "l0" }, "r16" },
5532 { { "l1" }, "r17" },
5533 { { "l2" }, "r18" },
5534 { { "l3" }, "r19" },
5535 { { "l4" }, "r20" },
5536 { { "l5" }, "r21" },
5537 { { "l6" }, "r22" },
5538 { { "l7" }, "r23" },
5539 { { "i0" }, "r24" },
5540 { { "i1" }, "r25" },
5541 { { "i2" }, "r26" },
5542 { { "i3" }, "r27" },
5543 { { "i4" }, "r28" },
5544 { { "i5" }, "r29" },
5545 { { "i6", "fp" }, "r30" },
5546 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005547};
5548
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005549void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5550 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005551 Aliases = GCCRegAliases;
5552 NumAliases = llvm::array_lengthof(GCCRegAliases);
5553}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005554
5555// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5556class SparcV8TargetInfo : public SparcTargetInfo {
5557public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005558 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005559 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
James Y Knight4b4d19e2015-06-04 15:36:29 +00005560 // NetBSD uses long (same as llvm default); everyone else uses int.
5561 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5562 SizeType = UnsignedLong;
5563 IntPtrType = SignedLong;
5564 PtrDiffType = SignedLong;
5565 } else {
5566 SizeType = UnsignedInt;
5567 IntPtrType = SignedInt;
5568 PtrDiffType = SignedInt;
5569 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005570 }
5571
Craig Topper3164f332014-03-11 03:39:26 +00005572 void getTargetDefines(const LangOptions &Opts,
5573 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005574 SparcTargetInfo::getTargetDefines(Opts, Builder);
5575 Builder.defineMacro("__sparcv8");
5576 }
5577};
5578
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005579// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5580class SparcV8elTargetInfo : public SparcV8TargetInfo {
5581 public:
5582 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
5583 DescriptionString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
5584 BigEndian = false;
5585 }
5586};
5587
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005588// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5589class SparcV9TargetInfo : public SparcTargetInfo {
5590public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005591 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005592 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005593 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005594 // This is an LP64 platform.
5595 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005596
5597 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005598 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005599 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005600 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005601 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005602 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005603
5604 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5605 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5606 LongDoubleWidth = 128;
5607 LongDoubleAlign = 128;
5608 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005609 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005610 }
5611
Craig Topper3164f332014-03-11 03:39:26 +00005612 void getTargetDefines(const LangOptions &Opts,
5613 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005614 SparcTargetInfo::getTargetDefines(Opts, Builder);
5615 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005616 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005617 // Solaris doesn't need these variants, but the BSDs do.
5618 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005619 Builder.defineMacro("__sparc64__");
5620 Builder.defineMacro("__sparc_v9__");
5621 Builder.defineMacro("__sparcv9__");
5622 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005623 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005624
Craig Topper3164f332014-03-11 03:39:26 +00005625 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005626 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5627 .Case("v9", true)
5628 .Case("ultrasparc", true)
5629 .Case("ultrasparc3", true)
5630 .Case("niagara", true)
5631 .Case("niagara2", true)
5632 .Case("niagara3", true)
5633 .Case("niagara4", true)
5634 .Default(false);
5635
5636 // No need to store the CPU yet. There aren't any CPU-specific
5637 // macros to define.
5638 return CPUKnown;
5639 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005640};
5641
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005642class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005643 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005644 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005645 std::string CPU;
5646 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005647 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005648
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005649public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005650 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005651 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005652 IntMaxType = SignedLong;
5653 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005654 TLSSupported = true;
5655 IntWidth = IntAlign = 32;
5656 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5657 PointerWidth = PointerAlign = 64;
5658 LongDoubleWidth = 128;
5659 LongDoubleAlign = 64;
5660 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005661 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005662 MinGlobalAlign = 16;
5663 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5664 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5665 }
5666 void getTargetDefines(const LangOptions &Opts,
5667 MacroBuilder &Builder) const override {
5668 Builder.defineMacro("__s390__");
5669 Builder.defineMacro("__s390x__");
5670 Builder.defineMacro("__zarch__");
5671 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005672 if (HasTransactionalExecution)
5673 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005674 }
5675 void getTargetBuiltins(const Builtin::Info *&Records,
5676 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005677 Records = BuiltinInfo;
5678 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005679 }
5680
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005681 void getGCCRegNames(const char *const *&Names,
5682 unsigned &NumNames) const override;
5683 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5684 unsigned &NumAliases) const override {
5685 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005686 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005687 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005688 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005689 bool validateAsmConstraint(const char *&Name,
5690 TargetInfo::ConstraintInfo &info) const override;
5691 const char *getClobbers() const override {
5692 // FIXME: Is this really right?
5693 return "";
5694 }
5695 BuiltinVaListKind getBuiltinVaListKind() const override {
5696 return TargetInfo::SystemZBuiltinVaList;
5697 }
5698 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005699 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005700 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5701 .Case("z10", true)
5702 .Case("z196", true)
5703 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005704 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005705 .Default(false);
5706
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005707 return CPUKnown;
5708 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005709 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5710 if (CPU == "zEC12")
5711 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005712 if (CPU == "z13") {
5713 Features["transactional-execution"] = true;
5714 Features["vector"] = true;
5715 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005716 }
5717
5718 bool handleTargetFeatures(std::vector<std::string> &Features,
5719 DiagnosticsEngine &Diags) override {
5720 HasTransactionalExecution = false;
5721 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5722 if (Features[i] == "+transactional-execution")
5723 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005724 if (Features[i] == "+vector")
5725 HasVector = true;
5726 }
5727 // If we use the vector ABI, vector types are 64-bit aligned.
5728 if (HasVector) {
5729 MaxVectorAlign = 64;
5730 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5731 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005732 }
5733 return true;
5734 }
5735
5736 bool hasFeature(StringRef Feature) const override {
5737 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005738 .Case("systemz", true)
5739 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005740 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005741 .Default(false);
5742 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005743
5744 StringRef getABI() const override {
5745 if (HasVector)
5746 return "vector";
5747 return "";
5748 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005749
5750 bool useFloat128ManglingForLongDouble() const override {
5751 return true;
5752 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005753};
5754
5755const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5756#define BUILTIN(ID, TYPE, ATTRS) \
5757 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5758#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005759};
5760
5761const char *const SystemZTargetInfo::GCCRegNames[] = {
5762 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5763 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5764 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5765 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5766};
5767
5768void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5769 unsigned &NumNames) const {
5770 Names = GCCRegNames;
5771 NumNames = llvm::array_lengthof(GCCRegNames);
5772}
5773
5774bool SystemZTargetInfo::
5775validateAsmConstraint(const char *&Name,
5776 TargetInfo::ConstraintInfo &Info) const {
5777 switch (*Name) {
5778 default:
5779 return false;
5780
5781 case 'a': // Address register
5782 case 'd': // Data register (equivalent to 'r')
5783 case 'f': // Floating-point register
5784 Info.setAllowsRegister();
5785 return true;
5786
5787 case 'I': // Unsigned 8-bit constant
5788 case 'J': // Unsigned 12-bit constant
5789 case 'K': // Signed 16-bit constant
5790 case 'L': // Signed 20-bit displacement (on all targets we support)
5791 case 'M': // 0x7fffffff
5792 return true;
5793
5794 case 'Q': // Memory with base and unsigned 12-bit displacement
5795 case 'R': // Likewise, plus an index
5796 case 'S': // Memory with base and signed 20-bit displacement
5797 case 'T': // Likewise, plus an index
5798 Info.setAllowsMemory();
5799 return true;
5800 }
5801}
Ulrich Weigand47445072013-05-06 16:26:41 +00005802
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005803 class MSP430TargetInfo : public TargetInfo {
5804 static const char * const GCCRegNames[];
5805 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005806 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005807 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005808 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005809 IntWidth = 16; IntAlign = 16;
5810 LongWidth = 32; LongLongWidth = 64;
5811 LongAlign = LongLongAlign = 16;
5812 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005813 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005814 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005815 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005816 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005817 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005818 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005819 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005820 }
5821 void getTargetDefines(const LangOptions &Opts,
5822 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005823 Builder.defineMacro("MSP430");
5824 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005825 // FIXME: defines for different 'flavours' of MCU
5826 }
Craig Topper3164f332014-03-11 03:39:26 +00005827 void getTargetBuiltins(const Builtin::Info *&Records,
5828 unsigned &NumRecords) const override {
5829 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005830 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005831 NumRecords = 0;
5832 }
Craig Topper3164f332014-03-11 03:39:26 +00005833 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005834 return Feature == "msp430";
5835 }
Craig Topper3164f332014-03-11 03:39:26 +00005836 void getGCCRegNames(const char * const *&Names,
5837 unsigned &NumNames) const override;
5838 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5839 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005840 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005841 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005842 NumAliases = 0;
5843 }
Eric Christopher917e9522014-11-18 22:36:15 +00005844 bool
5845 validateAsmConstraint(const char *&Name,
5846 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005847 // FIXME: implement
5848 switch (*Name) {
5849 case 'K': // the constant 1
5850 case 'L': // constant -1^20 .. 1^19
5851 case 'M': // constant 1-4:
5852 return true;
5853 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005854 // No target constraints for now.
5855 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005856 }
Craig Topper3164f332014-03-11 03:39:26 +00005857 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005858 // FIXME: Is this really right?
5859 return "";
5860 }
Craig Topper3164f332014-03-11 03:39:26 +00005861 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005862 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005863 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005864 }
5865 };
5866
5867 const char * const MSP430TargetInfo::GCCRegNames[] = {
5868 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5869 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5870 };
5871
5872 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5873 unsigned &NumNames) const {
5874 Names = GCCRegNames;
5875 NumNames = llvm::array_lengthof(GCCRegNames);
5876 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005877
Mike Stump11289f42009-09-09 15:08:12 +00005878 // LLVM and Clang cannot be used directly to output native binaries for
5879 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005880 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005881 //
5882 // TCE uses the llvm bitcode as input and uses it for generating customized
5883 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005884 // publicly available in http://tce.cs.tut.fi
5885
Eli Friedman1f191002011-10-07 19:51:42 +00005886 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5887 3, // opencl_global
5888 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005889 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005890 // FIXME: generic has to be added to the target
5891 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005892 0, // cuda_device
5893 0, // cuda_constant
5894 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005895 };
5896
Eli Friedmana9c3d712009-08-19 20:47:07 +00005897 class TCETargetInfo : public TargetInfo{
5898 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005899 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005900 TLSSupported = false;
5901 IntWidth = 32;
5902 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005903 PointerWidth = 32;
5904 IntAlign = 32;
5905 LongAlign = LongLongAlign = 32;
5906 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005907 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005908 SizeType = UnsignedInt;
5909 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005910 IntPtrType = SignedInt;
5911 PtrDiffType = SignedInt;
5912 FloatWidth = 32;
5913 FloatAlign = 32;
5914 DoubleWidth = 32;
5915 DoubleAlign = 32;
5916 LongDoubleWidth = 32;
5917 LongDoubleAlign = 32;
5918 FloatFormat = &llvm::APFloat::IEEEsingle;
5919 DoubleFormat = &llvm::APFloat::IEEEsingle;
5920 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005921 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5922 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005923 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005924 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005925 }
5926
Craig Topper3164f332014-03-11 03:39:26 +00005927 void getTargetDefines(const LangOptions &Opts,
5928 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005929 DefineStd(Builder, "tce", Opts);
5930 Builder.defineMacro("__TCE__");
5931 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005932 }
Craig Topper3164f332014-03-11 03:39:26 +00005933 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005934 return Feature == "tce";
5935 }
Craig Topper3164f332014-03-11 03:39:26 +00005936
5937 void getTargetBuiltins(const Builtin::Info *&Records,
5938 unsigned &NumRecords) const override {}
5939 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005940 return "";
5941 }
Craig Topper3164f332014-03-11 03:39:26 +00005942 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005943 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005944 }
Craig Topper3164f332014-03-11 03:39:26 +00005945 void getGCCRegNames(const char * const *&Names,
5946 unsigned &NumNames) const override {}
5947 bool validateAsmConstraint(const char *&Name,
5948 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005949 return true;
5950 }
Craig Topper3164f332014-03-11 03:39:26 +00005951 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5952 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005953 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005954
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00005955class BPFTargetInfo : public TargetInfo {
5956public:
5957 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5958 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
5959 SizeType = UnsignedLong;
5960 PtrDiffType = SignedLong;
5961 IntPtrType = SignedLong;
5962 IntMaxType = SignedLong;
5963 Int64Type = SignedLong;
5964 RegParmMax = 5;
5965 if (Triple.getArch() == llvm::Triple::bpfeb) {
5966 BigEndian = true;
5967 DescriptionString = "E-m:e-p:64:64-i64:64-n32:64-S128";
5968 } else {
5969 BigEndian = false;
5970 DescriptionString = "e-m:e-p:64:64-i64:64-n32:64-S128";
5971 }
5972 MaxAtomicPromoteWidth = 64;
5973 MaxAtomicInlineWidth = 64;
5974 TLSSupported = false;
5975 }
5976 void getTargetDefines(const LangOptions &Opts,
5977 MacroBuilder &Builder) const override {
5978 DefineStd(Builder, "bpf", Opts);
5979 Builder.defineMacro("__BPF__");
5980 }
5981 bool hasFeature(StringRef Feature) const override {
5982 return Feature == "bpf";
5983 }
5984
5985 void getTargetBuiltins(const Builtin::Info *&Records,
5986 unsigned &NumRecords) const override {}
5987 const char *getClobbers() const override {
5988 return "";
5989 }
5990 BuiltinVaListKind getBuiltinVaListKind() const override {
5991 return TargetInfo::VoidPtrBuiltinVaList;
5992 }
5993 void getGCCRegNames(const char * const *&Names,
5994 unsigned &NumNames) const override {
5995 Names = nullptr;
5996 NumNames = 0;
5997 }
5998 bool validateAsmConstraint(const char *&Name,
5999 TargetInfo::ConstraintInfo &info) const override {
6000 return true;
6001 }
6002 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6003 unsigned &NumAliases) const override {
6004 Aliases = nullptr;
6005 NumAliases = 0;
6006 }
6007};
6008
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006009class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006010 virtual void setDescriptionString() = 0;
6011
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006012 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006013 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006014 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006015 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006016 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006017 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006018 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006019 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006020 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006021 enum DspRevEnum {
6022 NoDSP, DSP1, DSP2
6023 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006024 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006025
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006026protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006027 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006028 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006029
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006030public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006031 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6032 const std::string &CPUStr)
6033 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006034 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006035 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6036 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6037 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006038
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006039 bool isNaN2008Default() const {
6040 return CPU == "mips32r6" || CPU == "mips64r6";
6041 }
6042
6043 bool isFP64Default() const {
6044 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6045 }
6046
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006047 bool isNan2008() const override {
6048 return IsNan2008;
6049 }
6050
Alp Toker4925ba72014-06-07 23:30:42 +00006051 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006052 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006053 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6054 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006055 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006056 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006057 .Case("mips1", IsMips32)
6058 .Case("mips2", IsMips32)
6059 .Case("mips3", true)
6060 .Case("mips4", true)
6061 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006062 .Case("mips32", IsMips32)
6063 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006064 .Case("mips32r3", IsMips32)
6065 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006066 .Case("mips32r6", IsMips32)
6067 .Case("mips64", true)
6068 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006069 .Case("mips64r3", true)
6070 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006071 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006072 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006073 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006074 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006075 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00006076 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006077 if (CPU == "octeon")
6078 Features["mips64r2"] = Features["cnmips"] = true;
6079 else
6080 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00006081 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006082
Craig Topper3164f332014-03-11 03:39:26 +00006083 void getTargetDefines(const LangOptions &Opts,
6084 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006085 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006086 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006087 if (Opts.GNUMode)
6088 Builder.defineMacro("mips");
6089
Simon Atanasyan683535b2012-08-29 19:14:58 +00006090 Builder.defineMacro("__REGISTER_PREFIX__", "");
6091
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006092 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006093 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006094 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006095 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006096 case SoftFloat:
6097 Builder.defineMacro("__mips_soft_float", Twine(1));
6098 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006099 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006100
Simon Atanasyan16071912013-04-14 14:07:30 +00006101 if (IsSingleFloat)
6102 Builder.defineMacro("__mips_single_float", Twine(1));
6103
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006104 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6105 Builder.defineMacro("_MIPS_FPSET",
6106 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6107
Simon Atanasyan72244b62012-07-05 16:06:06 +00006108 if (IsMips16)
6109 Builder.defineMacro("__mips16", Twine(1));
6110
Simon Atanasyan60777612013-04-14 14:07:51 +00006111 if (IsMicromips)
6112 Builder.defineMacro("__mips_micromips", Twine(1));
6113
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006114 if (IsNan2008)
6115 Builder.defineMacro("__mips_nan2008", Twine(1));
6116
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006117 switch (DspRev) {
6118 default:
6119 break;
6120 case DSP1:
6121 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6122 Builder.defineMacro("__mips_dsp", Twine(1));
6123 break;
6124 case DSP2:
6125 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6126 Builder.defineMacro("__mips_dspr2", Twine(1));
6127 Builder.defineMacro("__mips_dsp", Twine(1));
6128 break;
6129 }
6130
Jack Carter44ff1e52013-08-12 17:20:29 +00006131 if (HasMSA)
6132 Builder.defineMacro("__mips_msa", Twine(1));
6133
Simon Atanasyan26f19672012-04-05 19:28:31 +00006134 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6135 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6136 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006137
6138 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6139 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006140 }
6141
Craig Topper3164f332014-03-11 03:39:26 +00006142 void getTargetBuiltins(const Builtin::Info *&Records,
6143 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006144 Records = BuiltinInfo;
6145 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006146 }
Craig Topper3164f332014-03-11 03:39:26 +00006147 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006148 return llvm::StringSwitch<bool>(Feature)
6149 .Case("mips", true)
6150 .Case("fp64", HasFP64)
6151 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006152 }
Craig Topper3164f332014-03-11 03:39:26 +00006153 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006154 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006155 }
Craig Topper3164f332014-03-11 03:39:26 +00006156 void getGCCRegNames(const char * const *&Names,
6157 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006158 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006159 // CPU register names
6160 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006161 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6162 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6163 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006164 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6165 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006166 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6167 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6168 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6169 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006170 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006171 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006172 "$fcc5","$fcc6","$fcc7",
6173 // MSA register names
6174 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6175 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6176 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6177 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6178 // MSA control register names
6179 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6180 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006181 };
6182 Names = GCCRegNames;
6183 NumNames = llvm::array_lengthof(GCCRegNames);
6184 }
Craig Topper3164f332014-03-11 03:39:26 +00006185 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6186 unsigned &NumAliases) const override = 0;
6187 bool validateAsmConstraint(const char *&Name,
6188 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006189 switch (*Name) {
6190 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006191 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006192 case 'r': // CPU registers.
6193 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006194 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006195 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006196 case 'c': // $25 for indirect jumps
6197 case 'l': // lo register
6198 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006199 Info.setAllowsRegister();
6200 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006201 case 'I': // Signed 16-bit constant
6202 case 'J': // Integer 0
6203 case 'K': // Unsigned 16-bit constant
6204 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6205 case 'M': // Constants not loadable via lui, addiu, or ori
6206 case 'N': // Constant -1 to -65535
6207 case 'O': // A signed 15-bit constant
6208 case 'P': // A constant between 1 go 65535
6209 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006210 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006211 Info.setAllowsMemory();
6212 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006213 case 'Z':
6214 if (Name[1] == 'C') { // An address usable by ll, and sc.
6215 Info.setAllowsMemory();
6216 Name++; // Skip over 'Z'.
6217 return true;
6218 }
6219 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006220 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006221 }
6222
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006223 std::string convertConstraint(const char *&Constraint) const override {
6224 std::string R;
6225 switch (*Constraint) {
6226 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6227 if (Constraint[1] == 'C') {
6228 R = std::string("^") + std::string(Constraint, 2);
6229 Constraint++;
6230 return R;
6231 }
6232 break;
6233 }
6234 return TargetInfo::convertConstraint(Constraint);
6235 }
6236
Craig Topper3164f332014-03-11 03:39:26 +00006237 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006238 // In GCC, $1 is not widely used in generated code (it's used only in a few
6239 // specific situations), so there is no real need for users to add it to
6240 // the clobbers list if they want to use it in their inline assembly code.
6241 //
6242 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6243 // code generation, so using it in inline assembly without adding it to the
6244 // clobbers list can cause conflicts between the inline assembly code and
6245 // the surrounding generated code.
6246 //
6247 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6248 // operands, which will conflict with the ".set at" assembler option (which
6249 // we use only for inline assembly, in order to maintain compatibility with
6250 // GCC) and will also conflict with the user's usage of $1.
6251 //
6252 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6253 // register for generated code is to automatically clobber $1 for all inline
6254 // assembly code.
6255 //
6256 // FIXME: We should automatically clobber $1 only for inline assembly code
6257 // which actually uses it. This would allow LLVM to use $1 for inline
6258 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006259 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006260 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006261
Craig Topper3164f332014-03-11 03:39:26 +00006262 bool handleTargetFeatures(std::vector<std::string> &Features,
6263 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006264 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006265 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006266 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006267 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006268 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006269 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006270 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006271
6272 for (std::vector<std::string>::iterator it = Features.begin(),
6273 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006274 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006275 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006276 else if (*it == "+soft-float")
6277 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006278 else if (*it == "+mips16")
6279 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006280 else if (*it == "+micromips")
6281 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006282 else if (*it == "+dsp")
6283 DspRev = std::max(DspRev, DSP1);
6284 else if (*it == "+dspr2")
6285 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006286 else if (*it == "+msa")
6287 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006288 else if (*it == "+fp64")
6289 HasFP64 = true;
6290 else if (*it == "-fp64")
6291 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006292 else if (*it == "+nan2008")
6293 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006294 else if (*it == "-nan2008")
6295 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006296 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006297
Akira Hatanaka9064e362013-10-29 18:30:33 +00006298 setDescriptionString();
6299
Rafael Espindolaeb265472013-08-21 21:59:03 +00006300 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006301 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006302
Craig Topper3164f332014-03-11 03:39:26 +00006303 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006304 if (RegNo == 0) return 4;
6305 if (RegNo == 1) return 5;
6306 return -1;
6307 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006308
6309 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006310};
6311
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006312const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6313#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6314#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6315 ALL_LANGUAGES },
6316#include "clang/Basic/BuiltinsMips.def"
6317};
6318
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006319class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006320public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006321 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006322 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006323 SizeType = UnsignedInt;
6324 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006325 Int64Type = SignedLongLong;
6326 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006327 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006328 }
Craig Topper3164f332014-03-11 03:39:26 +00006329 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006330 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006331 ABI = Name;
6332 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006333 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006334 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006335 }
Craig Topper3164f332014-03-11 03:39:26 +00006336 void getTargetDefines(const LangOptions &Opts,
6337 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006338 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006339
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006340 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006341 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6342
6343 const std::string& CPUStr = getCPU();
6344 if (CPUStr == "mips32")
6345 Builder.defineMacro("__mips_isa_rev", "1");
6346 else if (CPUStr == "mips32r2")
6347 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006348 else if (CPUStr == "mips32r3")
6349 Builder.defineMacro("__mips_isa_rev", "3");
6350 else if (CPUStr == "mips32r5")
6351 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006352 else if (CPUStr == "mips32r6")
6353 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006354
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006355 if (ABI == "o32") {
6356 Builder.defineMacro("__mips_o32");
6357 Builder.defineMacro("_ABIO32", "1");
6358 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6359 }
6360 else if (ABI == "eabi")
6361 Builder.defineMacro("__mips_eabi");
6362 else
David Blaikie83d382b2011-09-23 05:06:16 +00006363 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006364 }
Craig Topper3164f332014-03-11 03:39:26 +00006365 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6366 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006367 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6368 { { "at" }, "$1" },
6369 { { "v0" }, "$2" },
6370 { { "v1" }, "$3" },
6371 { { "a0" }, "$4" },
6372 { { "a1" }, "$5" },
6373 { { "a2" }, "$6" },
6374 { { "a3" }, "$7" },
6375 { { "t0" }, "$8" },
6376 { { "t1" }, "$9" },
6377 { { "t2" }, "$10" },
6378 { { "t3" }, "$11" },
6379 { { "t4" }, "$12" },
6380 { { "t5" }, "$13" },
6381 { { "t6" }, "$14" },
6382 { { "t7" }, "$15" },
6383 { { "s0" }, "$16" },
6384 { { "s1" }, "$17" },
6385 { { "s2" }, "$18" },
6386 { { "s3" }, "$19" },
6387 { { "s4" }, "$20" },
6388 { { "s5" }, "$21" },
6389 { { "s6" }, "$22" },
6390 { { "s7" }, "$23" },
6391 { { "t8" }, "$24" },
6392 { { "t9" }, "$25" },
6393 { { "k0" }, "$26" },
6394 { { "k1" }, "$27" },
6395 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006396 { { "sp","$sp" }, "$29" },
6397 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006398 { { "ra" }, "$31" }
6399 };
6400 Aliases = GCCRegAliases;
6401 NumAliases = llvm::array_lengthof(GCCRegAliases);
6402 }
6403};
6404
6405class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006406 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006407 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006408 }
6409
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006410public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006411 Mips32EBTargetInfo(const llvm::Triple &Triple)
6412 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006413 }
Craig Topper3164f332014-03-11 03:39:26 +00006414 void getTargetDefines(const LangOptions &Opts,
6415 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006416 DefineStd(Builder, "MIPSEB", Opts);
6417 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006418 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006419 }
6420};
6421
6422class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006423 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006424 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006425 }
6426
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006427public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006428 Mips32ELTargetInfo(const llvm::Triple &Triple)
6429 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006430 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006431 }
Craig Topper3164f332014-03-11 03:39:26 +00006432 void getTargetDefines(const LangOptions &Opts,
6433 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006434 DefineStd(Builder, "MIPSEL", Opts);
6435 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006436 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006437 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006438};
Akira Hatanakabef17452011-09-20 19:21:49 +00006439
6440class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006441public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006442 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006443 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006444 LongDoubleWidth = LongDoubleAlign = 128;
6445 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006446 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6447 LongDoubleWidth = LongDoubleAlign = 64;
6448 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6449 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006450 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006451 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006452 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006453 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006454
6455 void setN64ABITypes() {
6456 LongWidth = LongAlign = 64;
6457 PointerWidth = PointerAlign = 64;
6458 SizeType = UnsignedLong;
6459 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006460 Int64Type = SignedLong;
6461 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006462 }
6463
6464 void setN32ABITypes() {
6465 LongWidth = LongAlign = 32;
6466 PointerWidth = PointerAlign = 32;
6467 SizeType = UnsignedInt;
6468 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006469 Int64Type = SignedLongLong;
6470 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006471 }
6472
Craig Topper3164f332014-03-11 03:39:26 +00006473 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006474 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006475 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006476 ABI = Name;
6477 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006478 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006479 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006480 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006481 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006482 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006483 }
6484 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006485 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006486
Craig Topper3164f332014-03-11 03:39:26 +00006487 void getTargetDefines(const LangOptions &Opts,
6488 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006489 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006490
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006491 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006492 Builder.defineMacro("__mips64");
6493 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006494 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6495
6496 const std::string& CPUStr = getCPU();
6497 if (CPUStr == "mips64")
6498 Builder.defineMacro("__mips_isa_rev", "1");
6499 else if (CPUStr == "mips64r2")
6500 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006501 else if (CPUStr == "mips64r3")
6502 Builder.defineMacro("__mips_isa_rev", "3");
6503 else if (CPUStr == "mips64r5")
6504 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006505 else if (CPUStr == "mips64r6")
6506 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006507
Akira Hatanakabef17452011-09-20 19:21:49 +00006508 if (ABI == "n32") {
6509 Builder.defineMacro("__mips_n32");
6510 Builder.defineMacro("_ABIN32", "2");
6511 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6512 }
6513 else if (ABI == "n64") {
6514 Builder.defineMacro("__mips_n64");
6515 Builder.defineMacro("_ABI64", "3");
6516 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6517 }
6518 else
David Blaikie83d382b2011-09-23 05:06:16 +00006519 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006520 }
Craig Topper3164f332014-03-11 03:39:26 +00006521 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6522 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006523 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6524 { { "at" }, "$1" },
6525 { { "v0" }, "$2" },
6526 { { "v1" }, "$3" },
6527 { { "a0" }, "$4" },
6528 { { "a1" }, "$5" },
6529 { { "a2" }, "$6" },
6530 { { "a3" }, "$7" },
6531 { { "a4" }, "$8" },
6532 { { "a5" }, "$9" },
6533 { { "a6" }, "$10" },
6534 { { "a7" }, "$11" },
6535 { { "t0" }, "$12" },
6536 { { "t1" }, "$13" },
6537 { { "t2" }, "$14" },
6538 { { "t3" }, "$15" },
6539 { { "s0" }, "$16" },
6540 { { "s1" }, "$17" },
6541 { { "s2" }, "$18" },
6542 { { "s3" }, "$19" },
6543 { { "s4" }, "$20" },
6544 { { "s5" }, "$21" },
6545 { { "s6" }, "$22" },
6546 { { "s7" }, "$23" },
6547 { { "t8" }, "$24" },
6548 { { "t9" }, "$25" },
6549 { { "k0" }, "$26" },
6550 { { "k1" }, "$27" },
6551 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006552 { { "sp","$sp" }, "$29" },
6553 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006554 { { "ra" }, "$31" }
6555 };
6556 Aliases = GCCRegAliases;
6557 NumAliases = llvm::array_lengthof(GCCRegAliases);
6558 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006559
6560 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006561};
6562
6563class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006564 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006565 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006566 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 +00006567 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006568 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006569
Akira Hatanakabef17452011-09-20 19:21:49 +00006570 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006571
Akira Hatanakabef17452011-09-20 19:21:49 +00006572public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006573 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006574 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006575 void getTargetDefines(const LangOptions &Opts,
6576 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006577 DefineStd(Builder, "MIPSEB", Opts);
6578 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006579 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006580 }
6581};
6582
6583class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006584 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006585 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006586 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 +00006587 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006588 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006589 }
6590public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006591 Mips64ELTargetInfo(const llvm::Triple &Triple)
6592 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006593 // Default ABI is n64.
6594 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006595 }
Craig Topper3164f332014-03-11 03:39:26 +00006596 void getTargetDefines(const LangOptions &Opts,
6597 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006598 DefineStd(Builder, "MIPSEL", Opts);
6599 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006600 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006601 }
6602};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006603
Ivan Krasindd7403e2011-08-24 20:22:22 +00006604class PNaClTargetInfo : public TargetInfo {
6605public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006606 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006607 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006608 this->UserLabelPrefix = "";
6609 this->LongAlign = 32;
6610 this->LongWidth = 32;
6611 this->PointerAlign = 32;
6612 this->PointerWidth = 32;
6613 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006614 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006615 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006616 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006617 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006618 this->SizeType = TargetInfo::UnsignedInt;
6619 this->PtrDiffType = TargetInfo::SignedInt;
6620 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006621 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006622 }
6623
Craig Topper3164f332014-03-11 03:39:26 +00006624 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006625 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006626 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006627 Builder.defineMacro("__le32__");
6628 Builder.defineMacro("__pnacl__");
6629 }
Craig Topper3164f332014-03-11 03:39:26 +00006630 void getTargetDefines(const LangOptions &Opts,
6631 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006632 getArchDefines(Opts, Builder);
6633 }
Craig Topper3164f332014-03-11 03:39:26 +00006634 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006635 return Feature == "pnacl";
6636 }
Craig Topper3164f332014-03-11 03:39:26 +00006637 void getTargetBuiltins(const Builtin::Info *&Records,
6638 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006639 }
Craig Topper3164f332014-03-11 03:39:26 +00006640 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006641 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006642 }
Craig Topper3164f332014-03-11 03:39:26 +00006643 void getGCCRegNames(const char * const *&Names,
6644 unsigned &NumNames) const override;
6645 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6646 unsigned &NumAliases) const override;
6647 bool validateAsmConstraint(const char *&Name,
6648 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006649 return false;
6650 }
6651
Craig Topper3164f332014-03-11 03:39:26 +00006652 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006653 return "";
6654 }
6655};
6656
6657void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6658 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006659 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006660 NumNames = 0;
6661}
6662
6663void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6664 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006665 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006666 NumAliases = 0;
6667}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006668
JF Bastien643817d2014-09-12 17:52:47 +00006669class Le64TargetInfo : public TargetInfo {
6670 static const Builtin::Info BuiltinInfo[];
6671
6672public:
6673 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6674 BigEndian = false;
6675 NoAsmVariants = true;
6676 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6677 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6678 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006679 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006680 }
6681
6682 void getTargetDefines(const LangOptions &Opts,
6683 MacroBuilder &Builder) const override {
6684 DefineStd(Builder, "unix", Opts);
6685 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6686 Builder.defineMacro("__ELF__");
6687 }
6688 void getTargetBuiltins(const Builtin::Info *&Records,
6689 unsigned &NumRecords) const override {
6690 Records = BuiltinInfo;
6691 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6692 }
6693 BuiltinVaListKind getBuiltinVaListKind() const override {
6694 return TargetInfo::PNaClABIBuiltinVaList;
6695 }
6696 const char *getClobbers() const override { return ""; }
6697 void getGCCRegNames(const char *const *&Names,
6698 unsigned &NumNames) const override {
6699 Names = nullptr;
6700 NumNames = 0;
6701 }
6702 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6703 unsigned &NumAliases) const override {
6704 Aliases = nullptr;
6705 NumAliases = 0;
6706 }
6707 bool validateAsmConstraint(const char *&Name,
6708 TargetInfo::ConstraintInfo &Info) const override {
6709 return false;
6710 }
6711
6712 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006713};
6714} // end anonymous namespace.
6715
6716const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6717#define BUILTIN(ID, TYPE, ATTRS) \
6718 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6719#include "clang/Basic/BuiltinsLe64.def"
6720};
6721
6722namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006723 static const unsigned SPIRAddrSpaceMap[] = {
6724 1, // opencl_global
6725 3, // opencl_local
6726 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006727 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006728 0, // cuda_device
6729 0, // cuda_constant
6730 0 // cuda_shared
6731 };
6732 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006733 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006734 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006735 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6736 "SPIR target must use unknown OS");
6737 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6738 "SPIR target must use unknown environment type");
6739 BigEndian = false;
6740 TLSSupported = false;
6741 LongWidth = LongAlign = 64;
6742 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006743 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006744 // Define available target features
6745 // These must be defined in sorted order!
6746 NoAsmVariants = true;
6747 }
Craig Topper3164f332014-03-11 03:39:26 +00006748 void getTargetDefines(const LangOptions &Opts,
6749 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006750 DefineStd(Builder, "SPIR", Opts);
6751 }
Craig Topper3164f332014-03-11 03:39:26 +00006752 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006753 return Feature == "spir";
6754 }
Craig Topper3164f332014-03-11 03:39:26 +00006755
6756 void getTargetBuiltins(const Builtin::Info *&Records,
6757 unsigned &NumRecords) const override {}
6758 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006759 return "";
6760 }
Craig Topper3164f332014-03-11 03:39:26 +00006761 void getGCCRegNames(const char * const *&Names,
6762 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006763 bool
6764 validateAsmConstraint(const char *&Name,
6765 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006766 return true;
6767 }
Craig Topper3164f332014-03-11 03:39:26 +00006768 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6769 unsigned &NumAliases) const override {}
6770 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006771 return TargetInfo::VoidPtrBuiltinVaList;
6772 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006773
6774 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6775 return (CC == CC_SpirFunction ||
6776 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6777 }
6778
6779 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6780 return CC_SpirFunction;
6781 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006782 };
6783
6784
6785 class SPIR32TargetInfo : public SPIRTargetInfo {
6786 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006787 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006788 PointerWidth = PointerAlign = 32;
6789 SizeType = TargetInfo::UnsignedInt;
6790 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6791 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006792 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6793 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006794 }
Craig Topper3164f332014-03-11 03:39:26 +00006795 void getTargetDefines(const LangOptions &Opts,
6796 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006797 DefineStd(Builder, "SPIR32", Opts);
6798 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006799 };
6800
6801 class SPIR64TargetInfo : public SPIRTargetInfo {
6802 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006803 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006804 PointerWidth = PointerAlign = 64;
6805 SizeType = TargetInfo::UnsignedLong;
6806 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006807 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6808 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006809 }
Craig Topper3164f332014-03-11 03:39:26 +00006810 void getTargetDefines(const LangOptions &Opts,
6811 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006812 DefineStd(Builder, "SPIR64", Opts);
6813 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006814 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006815
Robert Lytton0e076492013-08-13 09:43:10 +00006816class XCoreTargetInfo : public TargetInfo {
6817 static const Builtin::Info BuiltinInfo[];
6818public:
6819 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6820 BigEndian = false;
6821 NoAsmVariants = true;
6822 LongLongAlign = 32;
6823 SuitableAlign = 32;
6824 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006825 SizeType = UnsignedInt;
6826 PtrDiffType = SignedInt;
6827 IntPtrType = SignedInt;
6828 WCharType = UnsignedChar;
6829 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006830 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006831 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 +00006832 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006833 }
Craig Topper3164f332014-03-11 03:39:26 +00006834 void getTargetDefines(const LangOptions &Opts,
6835 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006836 Builder.defineMacro("__XS1B__");
6837 }
Craig Topper3164f332014-03-11 03:39:26 +00006838 void getTargetBuiltins(const Builtin::Info *&Records,
6839 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006840 Records = BuiltinInfo;
6841 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6842 }
Craig Topper3164f332014-03-11 03:39:26 +00006843 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006844 return TargetInfo::VoidPtrBuiltinVaList;
6845 }
Craig Topper3164f332014-03-11 03:39:26 +00006846 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006847 return "";
6848 }
Craig Topper3164f332014-03-11 03:39:26 +00006849 void getGCCRegNames(const char * const *&Names,
6850 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006851 static const char * const GCCRegNames[] = {
6852 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6853 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6854 };
6855 Names = GCCRegNames;
6856 NumNames = llvm::array_lengthof(GCCRegNames);
6857 }
Craig Topper3164f332014-03-11 03:39:26 +00006858 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6859 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006860 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006861 NumAliases = 0;
6862 }
Craig Topper3164f332014-03-11 03:39:26 +00006863 bool validateAsmConstraint(const char *&Name,
6864 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006865 return false;
6866 }
Craig Topper3164f332014-03-11 03:39:26 +00006867 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006868 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6869 return (RegNo < 2)? RegNo : -1;
6870 }
Robert Lytton0e076492013-08-13 09:43:10 +00006871};
6872
6873const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6874#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6875#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6876 ALL_LANGUAGES },
6877#include "clang/Basic/BuiltinsXCore.def"
6878};
6879} // end anonymous namespace.
6880
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006881namespace {
6882// x86_32 Android target
6883class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6884public:
6885 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6886 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6887 SuitableAlign = 32;
6888 LongDoubleWidth = 64;
6889 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6890 }
6891};
6892} // end anonymous namespace
6893
6894namespace {
6895// x86_64 Android target
6896class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6897public:
6898 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6899 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6900 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6901 }
6902};
6903} // end anonymous namespace
6904
Ivan Krasindd7403e2011-08-24 20:22:22 +00006905
Chris Lattner5ba61f02006-10-14 07:39:34 +00006906//===----------------------------------------------------------------------===//
6907// Driver code
6908//===----------------------------------------------------------------------===//
6909
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006911 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006912
Daniel Dunbar52322032009-08-18 05:47:58 +00006913 switch (Triple.getArch()) {
6914 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006915 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006916
Tim Northover2a0783d2014-05-30 14:14:07 +00006917 case llvm::Triple::xcore:
6918 return new XCoreTargetInfo(Triple);
6919
6920 case llvm::Triple::hexagon:
6921 return new HexagonTargetInfo(Triple);
6922
6923 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006924 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006925 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006926
6927 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006928 case llvm::Triple::FreeBSD:
6929 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006930 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006931 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006932 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006933 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006934 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006935 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006936 }
6937
Christian Pirker9b019ae2014-02-25 13:51:00 +00006938 case llvm::Triple::aarch64_be:
6939 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006940 case llvm::Triple::FreeBSD:
6941 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006942 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006943 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006944 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006945 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006946 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006947 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006948 }
6949
Daniel Dunbar52322032009-08-18 05:47:58 +00006950 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006951 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006952 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006953 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006954
Daniel Dunbar52322032009-08-18 05:47:58 +00006955 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006956 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006957 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006958 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006959 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006960 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006961 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006962 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006963 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006964 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006965 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006966 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006967 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006968 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006969 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006970 case llvm::Triple::Win32:
6971 switch (Triple.getEnvironment()) {
6972 default:
6973 return new ARMleTargetInfo(Triple);
6974 case llvm::Triple::Itanium:
6975 return new ItaniumWindowsARMleTargetInfo(Triple);
6976 case llvm::Triple::MSVC:
6977 return new MicrosoftARMleTargetInfo(Triple);
6978 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006979 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006980 return new ARMleTargetInfo(Triple);
6981 }
6982
6983 case llvm::Triple::armeb:
6984 case llvm::Triple::thumbeb:
6985 if (Triple.isOSDarwin())
6986 return new DarwinARMTargetInfo(Triple);
6987
6988 switch (os) {
6989 case llvm::Triple::Linux:
6990 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6991 case llvm::Triple::FreeBSD:
6992 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6993 case llvm::Triple::NetBSD:
6994 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6995 case llvm::Triple::OpenBSD:
6996 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6997 case llvm::Triple::Bitrig:
6998 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6999 case llvm::Triple::RTEMS:
7000 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7001 case llvm::Triple::NaCl:
7002 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7003 default:
7004 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007005 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007006
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007007 case llvm::Triple::bpfeb:
7008 case llvm::Triple::bpfel:
7009 return new BPFTargetInfo(Triple);
7010
Daniel Dunbar52322032009-08-18 05:47:58 +00007011 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007012 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007013
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007014 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007015 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007016 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007017 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007018 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007019 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007020 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007021 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007022 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007023 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007024 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007025 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007026 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007027
7028 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007029 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007030 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007031 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007032 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007033 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007034 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007035 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007036 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007037 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007038 case llvm::Triple::NaCl:
7039 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007040 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007041 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007042 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007043
Akira Hatanakabef17452011-09-20 19:21:49 +00007044 case llvm::Triple::mips64:
7045 switch (os) {
7046 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007047 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007048 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007049 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007050 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007051 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007052 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007053 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007054 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007055 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007056 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007057 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007058 }
7059
7060 case llvm::Triple::mips64el:
7061 switch (os) {
7062 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007063 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007064 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007065 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007066 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007067 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007068 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007069 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007070 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007071 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007072 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007073 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007074 }
7075
Ivan Krasindd7403e2011-08-24 20:22:22 +00007076 case llvm::Triple::le32:
7077 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007078 case llvm::Triple::NaCl:
7079 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7080 default:
7081 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007082 }
7083
JF Bastien643817d2014-09-12 17:52:47 +00007084 case llvm::Triple::le64:
7085 return new Le64TargetInfo(Triple);
7086
Daniel Dunbar52322032009-08-18 05:47:58 +00007087 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007088 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007089 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007090 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007091 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007092 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007093 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007094 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007095 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007096 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007097 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007098 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007099 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007100 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007101 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007102 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007103 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007104
7105 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007106 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007107 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007108 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007109 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007110 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007111 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007112 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007113 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007114 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007115 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007116 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007117 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007118 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007119 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007120
Bill Schmidt778d3872013-07-26 01:36:11 +00007121 case llvm::Triple::ppc64le:
7122 switch (os) {
7123 case llvm::Triple::Linux:
7124 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007125 case llvm::Triple::NetBSD:
7126 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007127 default:
7128 return new PPC64TargetInfo(Triple);
7129 }
7130
Peter Collingbournec947aae2012-05-20 23:28:41 +00007131 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007132 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007133 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007134 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007135
Tom Stellardd8e38a32015-01-06 20:34:47 +00007136 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007137 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007138 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007139
Daniel Dunbar52322032009-08-18 05:47:58 +00007140 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007141 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007142 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007143 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007144 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007145 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007146 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007147 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007148 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007149 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007150 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007151 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007152 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007153 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007154 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007155
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007156 // The 'sparcel' architecture copies all the above cases except for Solaris.
7157 case llvm::Triple::sparcel:
7158 switch (os) {
7159 case llvm::Triple::Linux:
7160 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7161 case llvm::Triple::NetBSD:
7162 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7163 case llvm::Triple::OpenBSD:
7164 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7165 case llvm::Triple::RTEMS:
7166 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7167 default:
7168 return new SparcV8elTargetInfo(Triple);
7169 }
7170
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007171 case llvm::Triple::sparcv9:
7172 switch (os) {
7173 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007174 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007175 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007176 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007177 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007178 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007179 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007180 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007181 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007182 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007183 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007184 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007185 }
7186
Ulrich Weigand47445072013-05-06 16:26:41 +00007187 case llvm::Triple::systemz:
7188 switch (os) {
7189 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007190 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007191 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007192 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007193 }
7194
Eli Friedmana9c3d712009-08-19 20:47:07 +00007195 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007196 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007197
Daniel Dunbar52322032009-08-18 05:47:58 +00007198 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007199 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007200 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007201
Daniel Dunbar52322032009-08-18 05:47:58 +00007202 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007203 case llvm::Triple::CloudABI:
7204 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007205 case llvm::Triple::Linux: {
7206 switch (Triple.getEnvironment()) {
7207 default:
7208 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7209 case llvm::Triple::Android:
7210 return new AndroidX86_32TargetInfo(Triple);
7211 }
7212 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007213 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007214 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007215 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007216 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007217 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007218 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007219 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007220 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007221 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007222 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007223 case llvm::Triple::KFreeBSD:
7224 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007225 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007226 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007227 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007228 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007229 case llvm::Triple::Win32: {
7230 switch (Triple.getEnvironment()) {
7231 default:
7232 return new X86_32TargetInfo(Triple);
7233 case llvm::Triple::Cygnus:
7234 return new CygwinX86_32TargetInfo(Triple);
7235 case llvm::Triple::GNU:
7236 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007237 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007238 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007239 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007240 }
7241 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007242 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007243 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007244 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007245 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007246 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007247 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007248 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007249 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007250 }
7251
7252 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007253 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007254 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007255
Daniel Dunbar52322032009-08-18 05:47:58 +00007256 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007257 case llvm::Triple::CloudABI:
7258 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007259 case llvm::Triple::Linux: {
7260 switch (Triple.getEnvironment()) {
7261 default:
7262 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7263 case llvm::Triple::Android:
7264 return new AndroidX86_64TargetInfo(Triple);
7265 }
7266 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007267 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007268 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007269 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007270 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007271 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007272 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007273 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007274 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007275 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007276 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007277 case llvm::Triple::KFreeBSD:
7278 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007279 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007280 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007281 case llvm::Triple::Win32: {
7282 switch (Triple.getEnvironment()) {
7283 default:
7284 return new X86_64TargetInfo(Triple);
7285 case llvm::Triple::GNU:
7286 return new MinGWX86_64TargetInfo(Triple);
7287 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007288 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007289 }
7290 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007291 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007292 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007293 case llvm::Triple::PS4:
7294 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007295 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007296 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007297 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007298
Douglas Katzman78d7c542015-05-12 21:18:10 +00007299 case llvm::Triple::spir: {
7300 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7301 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7302 return nullptr;
7303 return new SPIR32TargetInfo(Triple);
7304 }
7305 case llvm::Triple::spir64: {
7306 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7307 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7308 return nullptr;
7309 return new SPIR64TargetInfo(Triple);
7310 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007311 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007312}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007313
7314/// CreateTargetInfo - Return the target info object for the specified target
7315/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007316TargetInfo *
7317TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7318 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007319 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007320
7321 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007322 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007323 if (!Target) {
7324 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007325 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007326 }
Alp Toker80758082014-07-06 05:26:44 +00007327 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007328
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007329 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007330 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7331 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007332 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007333 }
7334
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007335 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007336 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7337 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007338 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007339 }
7340
Rafael Espindolaeb265472013-08-21 21:59:03 +00007341 // Set the fp math unit.
7342 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7343 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007344 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007345 }
7346
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007347 // Compute the default target features, we need the target to handle this
7348 // because features may have dependencies on one another.
7349 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007350 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007351
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007352 // Apply the user specified deltas.
7353 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7354 I < N; ++I) {
7355 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007356 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007357 bool Enabled = Name[0] == '+';
7358 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007359 }
7360
7361 // Add the features to the compile options.
7362 //
7363 // FIXME: If we are completely confident that we have the right set, we only
7364 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007365 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007366 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7367 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007368 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007369 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007370 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007371
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007372 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007373}