blob: a768081e70e0d4636e545defe1e9f52fbd9c5682 [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;
392 Triple.getOSVersion(Maj, Min, Rev);
393 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 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000995};
Anders Carlssonf511f642007-11-27 04:11:28 +0000996
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000997const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000998#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000999#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001000 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001001#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001002};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001003
Eric Christopher917e9522014-11-18 22:36:15 +00001004/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001005/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001006bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001007 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001008 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1009 // Ignore disabled features.
1010 if (Features[i][0] == '-')
1011 continue;
1012
1013 StringRef Feature = StringRef(Features[i]).substr(1);
1014
1015 if (Feature == "vsx") {
1016 HasVSX = true;
1017 continue;
1018 }
1019
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001020 if (Feature == "bpermd") {
1021 HasBPERMD = true;
1022 continue;
1023 }
1024
1025 if (Feature == "extdiv") {
1026 HasExtDiv = true;
1027 continue;
1028 }
1029
Bill Schmidt59eb7672014-10-10 15:09:43 +00001030 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001031 HasP8Vector = true;
Bill Schmidt41e14c42015-05-16 01:02:25 +00001032 HasVSX = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001033 continue;
1034 }
1035
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001036 if (Feature == "crypto") {
1037 HasP8Crypto = true;
1038 continue;
1039 }
1040
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001041 if (Feature == "direct-move") {
1042 HasDirectMove = true;
Bill Schmidt41e14c42015-05-16 01:02:25 +00001043 HasVSX = true;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001044 continue;
1045 }
1046
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001047 if (Feature == "qpx") {
1048 HasQPX = true;
1049 continue;
1050 }
1051
Kit Barton8246f282015-03-25 19:41:41 +00001052 if (Feature == "htm") {
1053 HasHTM = true;
1054 continue;
1055 }
1056
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 // TODO: Finish this list and add an assert that we've handled them
1058 // all.
1059 }
1060
1061 return true;
1062}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001063
Chris Lattnerecd49032009-03-02 22:27:17 +00001064/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1065/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001066void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001067 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001068 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001069 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001070 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001071 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001072 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001073 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001074 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001075 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001076 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001078 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001079 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001080
Chris Lattnerecd49032009-03-02 22:27:17 +00001081 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001082 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1083 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001084 } else {
1085 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1086 getTriple().getOS() != llvm::Triple::OpenBSD)
1087 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001088 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001089
Ulrich Weigand8afad612014-07-28 13:17:52 +00001090 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001091 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001092 Builder.defineMacro("_CALL_ELF", "1");
1093 if (ABI == "elfv2")
1094 Builder.defineMacro("_CALL_ELF", "2");
1095
Chris Lattnerecd49032009-03-02 22:27:17 +00001096 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001097 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1098 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001099
Chris Lattnerecd49032009-03-02 22:27:17 +00001100 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001101 if (LongDoubleWidth == 128)
1102 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103
John Thompsone467e192009-11-19 17:18:50 +00001104 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001105 Builder.defineMacro("__VEC__", "10206");
1106 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001107 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001108
1109 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001110 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1111 .Case("440", ArchDefineName)
1112 .Case("450", ArchDefineName | ArchDefine440)
1113 .Case("601", ArchDefineName)
1114 .Case("602", ArchDefineName | ArchDefinePpcgr)
1115 .Case("603", ArchDefineName | ArchDefinePpcgr)
1116 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1117 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1118 .Case("604", ArchDefineName | ArchDefinePpcgr)
1119 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1120 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001121 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001122 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1123 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1124 .Case("750", ArchDefineName | ArchDefinePpcgr)
1125 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1126 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001127 .Case("a2", ArchDefineA2)
1128 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001129 .Case("pwr3", ArchDefinePpcgr)
1130 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1131 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1132 | ArchDefinePpcsq)
1133 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1134 | ArchDefinePpcgr | ArchDefinePpcsq)
1135 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1136 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1137 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1138 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1139 | ArchDefinePpcsq)
1140 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1141 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001142 | ArchDefinePpcgr | ArchDefinePpcsq)
1143 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1144 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1145 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001146 .Case("power3", ArchDefinePpcgr)
1147 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1148 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1149 | ArchDefinePpcsq)
1150 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1151 | ArchDefinePpcgr | ArchDefinePpcsq)
1152 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1153 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1155 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1156 | ArchDefinePpcsq)
1157 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1158 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001159 | ArchDefinePpcgr | ArchDefinePpcsq)
1160 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1161 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1162 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001163 .Default(ArchDefineNone);
1164
1165 if (defs & ArchDefineName)
1166 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1167 if (defs & ArchDefinePpcgr)
1168 Builder.defineMacro("_ARCH_PPCGR");
1169 if (defs & ArchDefinePpcsq)
1170 Builder.defineMacro("_ARCH_PPCSQ");
1171 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001172 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001173 if (defs & ArchDefine603)
1174 Builder.defineMacro("_ARCH_603");
1175 if (defs & ArchDefine604)
1176 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001177 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001178 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001179 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001180 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001181 if (defs & ArchDefinePwr5x)
1182 Builder.defineMacro("_ARCH_PWR5X");
1183 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001184 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001185 if (defs & ArchDefinePwr6x)
1186 Builder.defineMacro("_ARCH_PWR6X");
1187 if (defs & ArchDefinePwr7)
1188 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001189 if (defs & ArchDefinePwr8)
1190 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001191 if (defs & ArchDefineA2)
1192 Builder.defineMacro("_ARCH_A2");
1193 if (defs & ArchDefineA2q) {
1194 Builder.defineMacro("_ARCH_A2Q");
1195 Builder.defineMacro("_ARCH_QP");
1196 }
1197
1198 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1199 Builder.defineMacro("__bg__");
1200 Builder.defineMacro("__THW_BLUEGENE__");
1201 Builder.defineMacro("__bgq__");
1202 Builder.defineMacro("__TOS_BGQ__");
1203 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001204
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001205 if (HasVSX)
1206 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001207 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001208 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001209 if (HasP8Crypto)
1210 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001211 if (HasHTM)
1212 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001213 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001214 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001215 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1216 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1217 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1218 if (PointerWidth == 64)
1219 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1220 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001221
Bill Schmidt38378a02013-02-01 20:23:10 +00001222 // FIXME: The following are not yet generated here by Clang, but are
1223 // generated by GCC:
1224 //
1225 // _SOFT_FLOAT_
1226 // __RECIP_PRECISION__
1227 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 // __RECIP__
1229 // __RECIPF__
1230 // __RSQRTE__
1231 // __RSQRTEF__
1232 // _SOFT_DOUBLE_
1233 // __NO_LWSYNC__
1234 // __HAVE_BSWAP__
1235 // __LONGDOUBLE128
1236 // __CMODEL_MEDIUM__
1237 // __CMODEL_LARGE__
1238 // _CALL_SYSV
1239 // _CALL_DARWIN
1240 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001241}
1242
1243void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1244 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1245 .Case("7400", true)
1246 .Case("g4", true)
1247 .Case("7450", true)
1248 .Case("g4+", true)
1249 .Case("970", true)
1250 .Case("g5", true)
1251 .Case("pwr6", true)
1252 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001253 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001254 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001255 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001256 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001257
1258 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001259 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1260 .Case("ppc64le", true)
1261 .Case("pwr8", true)
1262 .Default(false);
1263 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1264 .Case("ppc64le", true)
1265 .Case("pwr8", true)
1266 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001267 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1268 .Case("ppc64le", true)
1269 .Case("pwr8", true)
1270 .Case("pwr7", true)
1271 .Default(false);
1272 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1273 .Case("ppc64le", true)
1274 .Case("pwr8", true)
1275 .Case("pwr7", true)
1276 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001277 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1278 .Case("ppc64le", true)
1279 .Case("pwr8", true)
1280 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001281}
1282
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001283bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001284 return llvm::StringSwitch<bool>(Feature)
1285 .Case("powerpc", true)
1286 .Case("vsx", HasVSX)
1287 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001288 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001289 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001290 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001291 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001292 .Case("bpermd", HasBPERMD)
1293 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001294 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001295}
Chris Lattner17df24e2008-04-21 18:56:49 +00001296
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001297const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001298 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1299 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1300 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1301 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1302 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1303 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1304 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1305 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001306 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001307 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001308 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001309 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1310 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1311 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1312 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001313 "vrsave", "vscr",
1314 "spe_acc", "spefscr",
1315 "sfp"
1316};
Chris Lattner10a5b382007-01-29 05:24:35 +00001317
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001318void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001319 unsigned &NumNames) const {
1320 Names = GCCRegNames;
1321 NumNames = llvm::array_lengthof(GCCRegNames);
1322}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001323
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001324const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1325 // While some of these aliases do map to different registers
1326 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001327 { { "0" }, "r0" },
1328 { { "1"}, "r1" },
1329 { { "2" }, "r2" },
1330 { { "3" }, "r3" },
1331 { { "4" }, "r4" },
1332 { { "5" }, "r5" },
1333 { { "6" }, "r6" },
1334 { { "7" }, "r7" },
1335 { { "8" }, "r8" },
1336 { { "9" }, "r9" },
1337 { { "10" }, "r10" },
1338 { { "11" }, "r11" },
1339 { { "12" }, "r12" },
1340 { { "13" }, "r13" },
1341 { { "14" }, "r14" },
1342 { { "15" }, "r15" },
1343 { { "16" }, "r16" },
1344 { { "17" }, "r17" },
1345 { { "18" }, "r18" },
1346 { { "19" }, "r19" },
1347 { { "20" }, "r20" },
1348 { { "21" }, "r21" },
1349 { { "22" }, "r22" },
1350 { { "23" }, "r23" },
1351 { { "24" }, "r24" },
1352 { { "25" }, "r25" },
1353 { { "26" }, "r26" },
1354 { { "27" }, "r27" },
1355 { { "28" }, "r28" },
1356 { { "29" }, "r29" },
1357 { { "30" }, "r30" },
1358 { { "31" }, "r31" },
1359 { { "fr0" }, "f0" },
1360 { { "fr1" }, "f1" },
1361 { { "fr2" }, "f2" },
1362 { { "fr3" }, "f3" },
1363 { { "fr4" }, "f4" },
1364 { { "fr5" }, "f5" },
1365 { { "fr6" }, "f6" },
1366 { { "fr7" }, "f7" },
1367 { { "fr8" }, "f8" },
1368 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001369 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001370 { { "fr11" }, "f11" },
1371 { { "fr12" }, "f12" },
1372 { { "fr13" }, "f13" },
1373 { { "fr14" }, "f14" },
1374 { { "fr15" }, "f15" },
1375 { { "fr16" }, "f16" },
1376 { { "fr17" }, "f17" },
1377 { { "fr18" }, "f18" },
1378 { { "fr19" }, "f19" },
1379 { { "fr20" }, "f20" },
1380 { { "fr21" }, "f21" },
1381 { { "fr22" }, "f22" },
1382 { { "fr23" }, "f23" },
1383 { { "fr24" }, "f24" },
1384 { { "fr25" }, "f25" },
1385 { { "fr26" }, "f26" },
1386 { { "fr27" }, "f27" },
1387 { { "fr28" }, "f28" },
1388 { { "fr29" }, "f29" },
1389 { { "fr30" }, "f30" },
1390 { { "fr31" }, "f31" },
1391 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001392};
1393
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001394void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001395 unsigned &NumAliases) const {
1396 Aliases = GCCRegAliases;
1397 NumAliases = llvm::array_lengthof(GCCRegAliases);
1398}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001399
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001400class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001402 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001403 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001404
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001405 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001406 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001407 case llvm::Triple::FreeBSD:
1408 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001409 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001410 PtrDiffType = SignedInt;
1411 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001412 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001413 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001414 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001415 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001416
Roman Divacky3ffe7462012-03-13 19:20:17 +00001417 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1418 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001419 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001420 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001421
1422 // PPC32 supports atomics up to 4 bytes.
1423 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001424 }
1425
Craig Topper3164f332014-03-11 03:39:26 +00001426 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001427 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001428 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001429 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001430};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001431
Bill Schmidt778d3872013-07-26 01:36:11 +00001432// Note: ABI differences may eventually require us to have a separate
1433// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001434class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001435public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001436 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001437 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001438 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001439 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001440
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001441 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1442 DescriptionString = "e-m:e-i64:64-n32:64";
1443 ABI = "elfv2";
1444 } else {
1445 DescriptionString = "E-m:e-i64:64-n32:64";
1446 ABI = "elfv1";
1447 }
1448
1449 switch (getTriple().getOS()) {
1450 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001451 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001452 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001453 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001454 case llvm::Triple::NetBSD:
1455 IntMaxType = SignedLongLong;
1456 Int64Type = SignedLongLong;
1457 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001458 default:
1459 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001460 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001461
1462 // PPC64 supports atomics up to 8 bytes.
1463 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001464 }
Craig Topper3164f332014-03-11 03:39:26 +00001465 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001466 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001467 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001468 // PPC64 Linux-specifc ABI options.
1469 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001470 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001471 ABI = Name;
1472 return true;
1473 }
1474 return false;
1475 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001476};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001477
Roman Divacky965b0b72011-01-06 08:27:10 +00001478class DarwinPPC32TargetInfo :
1479 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001480public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001481 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1482 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001483 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001484 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001485 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001486 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001487 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001488 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001489 }
Craig Topper3164f332014-03-11 03:39:26 +00001490 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001491 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001492 }
1493};
1494
1495class DarwinPPC64TargetInfo :
1496 public DarwinTargetInfo<PPC64TargetInfo> {
1497public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001498 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1499 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001500 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001501 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001502 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001503 }
1504};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001505
Peter Collingbournec947aae2012-05-20 23:28:41 +00001506 static const unsigned NVPTXAddrSpaceMap[] = {
1507 1, // opencl_global
1508 3, // opencl_local
1509 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001510 // FIXME: generic has to be added to the target
1511 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001512 1, // cuda_device
1513 4, // cuda_constant
1514 3, // cuda_shared
1515 };
1516 class NVPTXTargetInfo : public TargetInfo {
1517 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001518 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001519
1520 // The GPU profiles supported by the NVPTX backend
1521 enum GPUKind {
1522 GK_NONE,
1523 GK_SM20,
1524 GK_SM21,
1525 GK_SM30,
1526 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001527 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001528 } GPU;
1529
Peter Collingbournec947aae2012-05-20 23:28:41 +00001530 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001531 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001532 BigEndian = false;
1533 TLSSupported = false;
1534 LongWidth = LongAlign = 64;
1535 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001536 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001537 // Define available target features
1538 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001539 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001540 // Set the default GPU to sm20
1541 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001542 }
Craig Topper3164f332014-03-11 03:39:26 +00001543 void getTargetDefines(const LangOptions &Opts,
1544 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001545 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001546 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001547 if (Opts.CUDAIsDevice) {
1548 // Set __CUDA_ARCH__ for the GPU specified.
1549 std::string CUDAArchCode;
1550 switch (GPU) {
1551 case GK_SM20:
1552 CUDAArchCode = "200";
1553 break;
1554 case GK_SM21:
1555 CUDAArchCode = "210";
1556 break;
1557 case GK_SM30:
1558 CUDAArchCode = "300";
1559 break;
1560 case GK_SM35:
1561 CUDAArchCode = "350";
1562 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001563 case GK_SM37:
1564 CUDAArchCode = "370";
1565 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001566 default:
1567 llvm_unreachable("Unhandled target CPU");
1568 }
1569 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1570 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001571 }
Craig Topper3164f332014-03-11 03:39:26 +00001572 void getTargetBuiltins(const Builtin::Info *&Records,
1573 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001574 Records = BuiltinInfo;
1575 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001576 }
Craig Topper3164f332014-03-11 03:39:26 +00001577 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001578 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001579 }
Craig Topper3164f332014-03-11 03:39:26 +00001580
1581 void getGCCRegNames(const char * const *&Names,
1582 unsigned &NumNames) const override;
1583 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1584 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001585 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001586 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001587 NumAliases = 0;
1588 }
Eric Christopher917e9522014-11-18 22:36:15 +00001589 bool
1590 validateAsmConstraint(const char *&Name,
1591 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001592 switch (*Name) {
1593 default: return false;
1594 case 'c':
1595 case 'h':
1596 case 'r':
1597 case 'l':
1598 case 'f':
1599 case 'd':
1600 Info.setAllowsRegister();
1601 return true;
1602 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001603 }
Craig Topper3164f332014-03-11 03:39:26 +00001604 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001605 // FIXME: Is this really right?
1606 return "";
1607 }
Craig Topper3164f332014-03-11 03:39:26 +00001608 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001609 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001610 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001611 }
Craig Topper3164f332014-03-11 03:39:26 +00001612 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001613 GPU = llvm::StringSwitch<GPUKind>(Name)
1614 .Case("sm_20", GK_SM20)
1615 .Case("sm_21", GK_SM21)
1616 .Case("sm_30", GK_SM30)
1617 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001618 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001619 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001620
Reid Klecknerbbc01782014-12-03 21:53:36 +00001621 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001622 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001623 };
1624
1625 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1626#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1627#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1628 ALL_LANGUAGES },
1629#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001630 };
1631
1632 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1633 "r0"
1634 };
1635
1636 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1637 unsigned &NumNames) const {
1638 Names = GCCRegNames;
1639 NumNames = llvm::array_lengthof(GCCRegNames);
1640 }
1641
1642 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1643 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001644 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001646 SizeType = TargetInfo::UnsignedInt;
1647 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001648 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001649 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001650 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001651 };
1652
1653 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1654 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001655 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001656 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001657 SizeType = TargetInfo::UnsignedLong;
1658 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001659 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001660 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001661 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001662 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001663
1664static const unsigned R600AddrSpaceMap[] = {
1665 1, // opencl_global
1666 3, // opencl_local
1667 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001668 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001669 1, // cuda_device
1670 2, // cuda_constant
1671 3 // cuda_shared
1672};
1673
Tom Stellarda96344b2014-08-21 13:58:40 +00001674// If you edit the description strings, make sure you update
1675// getPointerWidthV().
1676
Tom Stellardc74b1e02013-03-04 17:40:53 +00001677static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001678 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1679 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001680
1681static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001682 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1683 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001684
1685static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001686 "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 +00001687 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1688 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001689
Eli Friedmand13b41e2012-10-12 23:32:00 +00001690class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001691 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001692 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001693
Tom Stellardc74b1e02013-03-04 17:40:53 +00001694 /// \brief The GPU profiles supported by the R600 target.
1695 enum GPUKind {
1696 GK_NONE,
1697 GK_R600,
1698 GK_R600_DOUBLE_OPS,
1699 GK_R700,
1700 GK_R700_DOUBLE_OPS,
1701 GK_EVERGREEN,
1702 GK_EVERGREEN_DOUBLE_OPS,
1703 GK_NORTHERN_ISLANDS,
1704 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001705 GK_SOUTHERN_ISLANDS,
1706 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001707 } GPU;
1708
Jan Veselyeebeaea2015-05-04 19:53:36 +00001709 bool hasFP64:1;
1710 bool hasFMAF:1;
1711 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001712
Eli Friedmand13b41e2012-10-12 23:32:00 +00001713public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001714 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001715 : TargetInfo(Triple) {
1716
1717 if (Triple.getArch() == llvm::Triple::amdgcn) {
1718 DescriptionString = DescriptionStringSI;
1719 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001720 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001721 hasFMAF = true;
1722 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001723 } else {
1724 DescriptionString = DescriptionStringR600;
1725 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001726 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001727 hasFMAF = false;
1728 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001729 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001730 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001731 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732 }
1733
Tom Stellarda96344b2014-08-21 13:58:40 +00001734 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1735 if (GPU <= GK_CAYMAN)
1736 return 32;
1737
1738 switch(AddrSpace) {
1739 default:
1740 return 64;
1741 case 0:
1742 case 3:
1743 case 5:
1744 return 32;
1745 }
1746 }
1747
Craig Topper3164f332014-03-11 03:39:26 +00001748 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001749 return "";
1750 }
1751
Craig Topper3164f332014-03-11 03:39:26 +00001752 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001753 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001754
Craig Topper3164f332014-03-11 03:39:26 +00001755 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1756 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001757 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001758 NumAliases = 0;
1759 }
1760
Craig Topper3164f332014-03-11 03:39:26 +00001761 bool validateAsmConstraint(const char *&Name,
1762 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001763 return true;
1764 }
1765
Craig Topper3164f332014-03-11 03:39:26 +00001766 void getTargetBuiltins(const Builtin::Info *&Records,
1767 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001768 Records = BuiltinInfo;
1769 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001770 }
1771
Craig Topper3164f332014-03-11 03:39:26 +00001772 void getTargetDefines(const LangOptions &Opts,
1773 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001774 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001775 if (hasFMAF)
1776 Builder.defineMacro("__HAS_FMAF__");
1777 if (hasLDEXPF)
1778 Builder.defineMacro("__HAS_LDEXPF__");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001779 if (hasFP64 && Opts.OpenCL) {
Tom Stellardfded50f2015-02-27 15:10:19 +00001780 Builder.defineMacro("cl_khr_fp64");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001781 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001782 }
1783
Craig Topper3164f332014-03-11 03:39:26 +00001784 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001785 return TargetInfo::CharPtrBuiltinVaList;
1786 }
1787
Craig Topper3164f332014-03-11 03:39:26 +00001788 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001789 GPU = llvm::StringSwitch<GPUKind>(Name)
1790 .Case("r600" , GK_R600)
1791 .Case("rv610", GK_R600)
1792 .Case("rv620", GK_R600)
1793 .Case("rv630", GK_R600)
1794 .Case("rv635", GK_R600)
1795 .Case("rs780", GK_R600)
1796 .Case("rs880", GK_R600)
1797 .Case("rv670", GK_R600_DOUBLE_OPS)
1798 .Case("rv710", GK_R700)
1799 .Case("rv730", GK_R700)
1800 .Case("rv740", GK_R700_DOUBLE_OPS)
1801 .Case("rv770", GK_R700_DOUBLE_OPS)
1802 .Case("palm", GK_EVERGREEN)
1803 .Case("cedar", GK_EVERGREEN)
1804 .Case("sumo", GK_EVERGREEN)
1805 .Case("sumo2", GK_EVERGREEN)
1806 .Case("redwood", GK_EVERGREEN)
1807 .Case("juniper", GK_EVERGREEN)
1808 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1809 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1810 .Case("barts", GK_NORTHERN_ISLANDS)
1811 .Case("turks", GK_NORTHERN_ISLANDS)
1812 .Case("caicos", GK_NORTHERN_ISLANDS)
1813 .Case("cayman", GK_CAYMAN)
1814 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001815 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001816 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1817 .Case("verde", GK_SOUTHERN_ISLANDS)
1818 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001819 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001820 .Case("bonaire", GK_SEA_ISLANDS)
1821 .Case("kabini", GK_SEA_ISLANDS)
1822 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001823 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001824 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001825 .Default(GK_NONE);
1826
1827 if (GPU == GK_NONE) {
1828 return false;
1829 }
1830
1831 // Set the correct data layout
1832 switch (GPU) {
1833 case GK_NONE:
1834 case GK_R600:
1835 case GK_R700:
1836 case GK_EVERGREEN:
1837 case GK_NORTHERN_ISLANDS:
1838 DescriptionString = DescriptionStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001839 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001840 hasFMAF = false;
1841 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001842 break;
1843 case GK_R600_DOUBLE_OPS:
1844 case GK_R700_DOUBLE_OPS:
1845 case GK_EVERGREEN_DOUBLE_OPS:
1846 case GK_CAYMAN:
1847 DescriptionString = DescriptionStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001848 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001849 hasFMAF = true;
1850 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001851 break;
1852 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001853 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001854 DescriptionString = DescriptionStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001855 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001856 hasFMAF = true;
1857 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001858 break;
1859 }
1860
1861 return true;
1862 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001863};
1864
Matt Arsenault56f008d2014-06-24 20:45:01 +00001865const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1866#define BUILTIN(ID, TYPE, ATTRS) \
1867 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1868#include "clang/Basic/BuiltinsR600.def"
1869};
Tom Stellard7b1059b2015-04-14 14:36:56 +00001870const char * const R600TargetInfo::GCCRegNames[] = {
1871 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1872 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1873 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1874 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1875 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1876 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1877 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1878 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1879 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1880 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1881 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1882 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1883 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1884 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1885 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1886 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1887 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1888 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1889 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1890 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1891 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1892 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1893 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1894 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1895 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1896 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1897 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1898 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1899 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1900 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1901 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1902 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1903 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1904 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1905 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1906 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1907 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1908 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1909 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1910 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1911 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1912 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1913 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1914 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1915 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1916 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1917 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1918 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1919 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1920 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1921};
1922
1923void R600TargetInfo::getGCCRegNames(const char * const *&Names,
1924 unsigned &NumNames) const {
1925 Names = GCCRegNames;
1926 NumNames = llvm::array_lengthof(GCCRegNames);
1927}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001928
Eli Friedman3fd920a2008-08-20 02:34:37 +00001929// Namespace for x86 abstract base class
1930const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001931#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001932#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001933 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001934#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001935};
Eli Friedmanb5366062008-05-20 14:21:01 +00001936
Nuno Lopescfca1f02009-12-23 17:49:57 +00001937static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001938 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1939 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001940 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001941 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1942 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1943 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001944 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001945 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1946 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001947};
1948
Eric Christophercdd36352011-06-21 00:05:20 +00001949const TargetInfo::AddlRegName AddlRegNames[] = {
1950 { { "al", "ah", "eax", "rax" }, 0 },
1951 { { "bl", "bh", "ebx", "rbx" }, 3 },
1952 { { "cl", "ch", "ecx", "rcx" }, 2 },
1953 { { "dl", "dh", "edx", "rdx" }, 1 },
1954 { { "esi", "rsi" }, 4 },
1955 { { "edi", "rdi" }, 5 },
1956 { { "esp", "rsp" }, 7 },
1957 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001958};
1959
1960// X86 target abstract base class; x86-32 and x86-64 are very close, so
1961// most of the implementation can be shared.
1962class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001963 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001964 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001965 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001966 enum MMX3DNowEnum {
1967 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1968 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001969 enum XOPEnum {
1970 NoXOP,
1971 SSE4A,
1972 FMA4,
1973 XOP
1974 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001975
Eric Christophere1ddaf92010-04-02 23:50:19 +00001976 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001977 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001978 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001979 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001980 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001981 bool HasBMI;
1982 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001983 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001984 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001985 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001986 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001987 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001988 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001989 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001990 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001991 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1992 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001993 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001994 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001995
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001996 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1997 ///
1998 /// Each enumeration represents a particular CPU supported by Clang. These
1999 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2000 enum CPUKind {
2001 CK_Generic,
2002
2003 /// \name i386
2004 /// i386-generation processors.
2005 //@{
2006 CK_i386,
2007 //@}
2008
2009 /// \name i486
2010 /// i486-generation processors.
2011 //@{
2012 CK_i486,
2013 CK_WinChipC6,
2014 CK_WinChip2,
2015 CK_C3,
2016 //@}
2017
2018 /// \name i586
2019 /// i586-generation processors, P5 microarchitecture based.
2020 //@{
2021 CK_i586,
2022 CK_Pentium,
2023 CK_PentiumMMX,
2024 //@}
2025
2026 /// \name i686
2027 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2028 //@{
2029 CK_i686,
2030 CK_PentiumPro,
2031 CK_Pentium2,
2032 CK_Pentium3,
2033 CK_Pentium3M,
2034 CK_PentiumM,
2035 CK_C3_2,
2036
2037 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2038 /// Clang however has some logic to suport this.
2039 // FIXME: Warn, deprecate, and potentially remove this.
2040 CK_Yonah,
2041 //@}
2042
2043 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002044 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002045 //@{
2046 CK_Pentium4,
2047 CK_Pentium4M,
2048 CK_Prescott,
2049 CK_Nocona,
2050 //@}
2051
2052 /// \name Core
2053 /// Core microarchitecture based processors.
2054 //@{
2055 CK_Core2,
2056
2057 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2058 /// codename which GCC no longer accepts as an option to -march, but Clang
2059 /// has some logic for recognizing it.
2060 // FIXME: Warn, deprecate, and potentially remove this.
2061 CK_Penryn,
2062 //@}
2063
2064 /// \name Atom
2065 /// Atom processors
2066 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002067 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002068 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002069 //@}
2070
2071 /// \name Nehalem
2072 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002073 CK_Nehalem,
2074
2075 /// \name Westmere
2076 /// Westmere microarchitecture based processors.
2077 CK_Westmere,
2078
2079 /// \name Sandy Bridge
2080 /// Sandy Bridge microarchitecture based processors.
2081 CK_SandyBridge,
2082
2083 /// \name Ivy Bridge
2084 /// Ivy Bridge microarchitecture based processors.
2085 CK_IvyBridge,
2086
2087 /// \name Haswell
2088 /// Haswell microarchitecture based processors.
2089 CK_Haswell,
2090
2091 /// \name Broadwell
2092 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002093 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002094
2095 /// \name Skylake
2096 /// Skylake microarchitecture based processors.
2097 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002098
Craig Topper449314e2013-08-20 07:09:39 +00002099 /// \name Knights Landing
2100 /// Knights Landing processor.
2101 CK_KNL,
2102
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002103 /// \name K6
2104 /// K6 architecture processors.
2105 //@{
2106 CK_K6,
2107 CK_K6_2,
2108 CK_K6_3,
2109 //@}
2110
2111 /// \name K7
2112 /// K7 architecture processors.
2113 //@{
2114 CK_Athlon,
2115 CK_AthlonThunderbird,
2116 CK_Athlon4,
2117 CK_AthlonXP,
2118 CK_AthlonMP,
2119 //@}
2120
2121 /// \name K8
2122 /// K8 architecture processors.
2123 //@{
2124 CK_Athlon64,
2125 CK_Athlon64SSE3,
2126 CK_AthlonFX,
2127 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002128 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002129 CK_Opteron,
2130 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002131 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002132 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002133
Benjamin Kramer569f2152012-01-10 11:50:18 +00002134 /// \name Bobcat
2135 /// Bobcat architecture processors.
2136 //@{
2137 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002138 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002139 //@}
2140
2141 /// \name Bulldozer
2142 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002143 //@{
2144 CK_BDVER1,
2145 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002146 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002147 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002148 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002149
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002150 /// This specification is deprecated and will be removed in the future.
2151 /// Users should prefer \see CK_K8.
2152 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002153 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002154 CK_x86_64,
2155 //@}
2156
2157 /// \name Geode
2158 /// Geode processors.
2159 //@{
2160 CK_Geode
2161 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002162 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002163
Rafael Espindolaeb265472013-08-21 21:59:03 +00002164 enum FPMathKind {
2165 FP_Default,
2166 FP_SSE,
2167 FP_387
2168 } FPMath;
2169
Eli Friedman3fd920a2008-08-20 02:34:37 +00002170public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002171 X86TargetInfo(const llvm::Triple &Triple)
2172 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002173 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002174 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2175 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2176 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2177 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2178 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2179 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002180 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002181 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002182 }
Craig Topper3164f332014-03-11 03:39:26 +00002183 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002184 // X87 evaluates with 80 bits "long double" precision.
2185 return SSELevel == NoSSE ? 2 : 0;
2186 }
Craig Topper3164f332014-03-11 03:39:26 +00002187 void getTargetBuiltins(const Builtin::Info *&Records,
2188 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002189 Records = BuiltinInfo;
2190 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002191 }
Craig Topper3164f332014-03-11 03:39:26 +00002192 void getGCCRegNames(const char * const *&Names,
2193 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002194 Names = GCCRegNames;
2195 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002196 }
Craig Topper3164f332014-03-11 03:39:26 +00002197 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2198 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002199 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002200 NumAliases = 0;
2201 }
Craig Topper3164f332014-03-11 03:39:26 +00002202 void getGCCAddlRegNames(const AddlRegName *&Names,
2203 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002204 Names = AddlRegNames;
2205 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002206 }
Craig Topper3164f332014-03-11 03:39:26 +00002207 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002208 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002209
Akira Hatanaka974131e2014-09-18 18:17:18 +00002210 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2211
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002212 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2213
Akira Hatanaka974131e2014-09-18 18:17:18 +00002214 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2215
Craig Topper3164f332014-03-11 03:39:26 +00002216 std::string convertConstraint(const char *&Constraint) const override;
2217 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002218 return "~{dirflag},~{fpsr},~{flags}";
2219 }
Craig Topper3164f332014-03-11 03:39:26 +00002220 void getTargetDefines(const LangOptions &Opts,
2221 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002222 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2223 bool Enabled);
2224 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2225 bool Enabled);
2226 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2227 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002228 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2229 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002230 setFeatureEnabledImpl(Features, Name, Enabled);
2231 }
2232 // This exists purely to cut down on the number of virtual calls in
2233 // getDefaultFeatures which calls this repeatedly.
2234 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2235 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002236 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2237 bool hasFeature(StringRef Feature) const override;
2238 bool handleTargetFeatures(std::vector<std::string> &Features,
2239 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002240 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002241 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002242 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002243 else if (getTriple().getArch() == llvm::Triple::x86 &&
2244 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002245 return "no-mmx";
2246 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002247 }
Craig Topper3164f332014-03-11 03:39:26 +00002248 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002249 CPU = llvm::StringSwitch<CPUKind>(Name)
2250 .Case("i386", CK_i386)
2251 .Case("i486", CK_i486)
2252 .Case("winchip-c6", CK_WinChipC6)
2253 .Case("winchip2", CK_WinChip2)
2254 .Case("c3", CK_C3)
2255 .Case("i586", CK_i586)
2256 .Case("pentium", CK_Pentium)
2257 .Case("pentium-mmx", CK_PentiumMMX)
2258 .Case("i686", CK_i686)
2259 .Case("pentiumpro", CK_PentiumPro)
2260 .Case("pentium2", CK_Pentium2)
2261 .Case("pentium3", CK_Pentium3)
2262 .Case("pentium3m", CK_Pentium3M)
2263 .Case("pentium-m", CK_PentiumM)
2264 .Case("c3-2", CK_C3_2)
2265 .Case("yonah", CK_Yonah)
2266 .Case("pentium4", CK_Pentium4)
2267 .Case("pentium4m", CK_Pentium4M)
2268 .Case("prescott", CK_Prescott)
2269 .Case("nocona", CK_Nocona)
2270 .Case("core2", CK_Core2)
2271 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002272 .Case("bonnell", CK_Bonnell)
2273 .Case("atom", CK_Bonnell) // Legacy name.
2274 .Case("silvermont", CK_Silvermont)
2275 .Case("slm", CK_Silvermont) // Legacy name.
2276 .Case("nehalem", CK_Nehalem)
2277 .Case("corei7", CK_Nehalem) // Legacy name.
2278 .Case("westmere", CK_Westmere)
2279 .Case("sandybridge", CK_SandyBridge)
2280 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2281 .Case("ivybridge", CK_IvyBridge)
2282 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2283 .Case("haswell", CK_Haswell)
2284 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002285 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002286 .Case("skylake", CK_Skylake)
2287 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002288 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002289 .Case("k6", CK_K6)
2290 .Case("k6-2", CK_K6_2)
2291 .Case("k6-3", CK_K6_3)
2292 .Case("athlon", CK_Athlon)
2293 .Case("athlon-tbird", CK_AthlonThunderbird)
2294 .Case("athlon-4", CK_Athlon4)
2295 .Case("athlon-xp", CK_AthlonXP)
2296 .Case("athlon-mp", CK_AthlonMP)
2297 .Case("athlon64", CK_Athlon64)
2298 .Case("athlon64-sse3", CK_Athlon64SSE3)
2299 .Case("athlon-fx", CK_AthlonFX)
2300 .Case("k8", CK_K8)
2301 .Case("k8-sse3", CK_K8SSE3)
2302 .Case("opteron", CK_Opteron)
2303 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002304 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002305 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002306 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002307 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002308 .Case("bdver1", CK_BDVER1)
2309 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002310 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002311 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002312 .Case("x86-64", CK_x86_64)
2313 .Case("geode", CK_Geode)
2314 .Default(CK_Generic);
2315
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002316 // Perform any per-CPU checks necessary to determine if this CPU is
2317 // acceptable.
2318 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2319 // invalid without explaining *why*.
2320 switch (CPU) {
2321 case CK_Generic:
2322 // No processor selected!
2323 return false;
2324
2325 case CK_i386:
2326 case CK_i486:
2327 case CK_WinChipC6:
2328 case CK_WinChip2:
2329 case CK_C3:
2330 case CK_i586:
2331 case CK_Pentium:
2332 case CK_PentiumMMX:
2333 case CK_i686:
2334 case CK_PentiumPro:
2335 case CK_Pentium2:
2336 case CK_Pentium3:
2337 case CK_Pentium3M:
2338 case CK_PentiumM:
2339 case CK_Yonah:
2340 case CK_C3_2:
2341 case CK_Pentium4:
2342 case CK_Pentium4M:
2343 case CK_Prescott:
2344 case CK_K6:
2345 case CK_K6_2:
2346 case CK_K6_3:
2347 case CK_Athlon:
2348 case CK_AthlonThunderbird:
2349 case CK_Athlon4:
2350 case CK_AthlonXP:
2351 case CK_AthlonMP:
2352 case CK_Geode:
2353 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002354 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002355 return false;
2356
2357 // Fallthrough
2358 case CK_Nocona:
2359 case CK_Core2:
2360 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002361 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002362 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002363 case CK_Nehalem:
2364 case CK_Westmere:
2365 case CK_SandyBridge:
2366 case CK_IvyBridge:
2367 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002368 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002369 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002370 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002371 case CK_Athlon64:
2372 case CK_Athlon64SSE3:
2373 case CK_AthlonFX:
2374 case CK_K8:
2375 case CK_K8SSE3:
2376 case CK_Opteron:
2377 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002378 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002379 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002380 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002381 case CK_BDVER1:
2382 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002383 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002384 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002385 case CK_x86_64:
2386 return true;
2387 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002388 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002389 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002390
Craig Topper3164f332014-03-11 03:39:26 +00002391 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002392
Craig Topper3164f332014-03-11 03:39:26 +00002393 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002394 // We accept all non-ARM calling conventions
2395 return (CC == CC_X86ThisCall ||
2396 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002397 CC == CC_X86StdCall ||
2398 CC == CC_X86VectorCall ||
2399 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002400 CC == CC_X86Pascal ||
2401 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002402 }
2403
Craig Topper3164f332014-03-11 03:39:26 +00002404 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002405 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002406 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002407
2408 bool hasSjLjLowering() const override {
2409 return true;
2410 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002411};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002412
Rafael Espindolaeb265472013-08-21 21:59:03 +00002413bool X86TargetInfo::setFPMath(StringRef Name) {
2414 if (Name == "387") {
2415 FPMath = FP_387;
2416 return true;
2417 }
2418 if (Name == "sse") {
2419 FPMath = FP_SSE;
2420 return true;
2421 }
2422 return false;
2423}
2424
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002425void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002426 // FIXME: This *really* should not be here.
2427
2428 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002429 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002430 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002431
Chandler Carruth212334f2011-09-28 08:55:37 +00002432 switch (CPU) {
2433 case CK_Generic:
2434 case CK_i386:
2435 case CK_i486:
2436 case CK_i586:
2437 case CK_Pentium:
2438 case CK_i686:
2439 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002440 break;
2441 case CK_PentiumMMX:
2442 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002443 case CK_K6:
2444 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002445 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002446 break;
2447 case CK_Pentium3:
2448 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002449 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002450 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002451 break;
2452 case CK_PentiumM:
2453 case CK_Pentium4:
2454 case CK_Pentium4M:
2455 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002456 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002457 break;
2458 case CK_Yonah:
2459 case CK_Prescott:
2460 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002461 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002462 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002463 break;
2464 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002465 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002466 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002467 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002468 break;
2469 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002470 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002471 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002472 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002473 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002474 setFeatureEnabledImpl(Features, "avx512f", true);
2475 setFeatureEnabledImpl(Features, "avx512cd", true);
2476 setFeatureEnabledImpl(Features, "avx512dq", true);
2477 setFeatureEnabledImpl(Features, "avx512bw", true);
2478 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002479 // FALLTHROUGH
2480 case CK_Broadwell:
2481 setFeatureEnabledImpl(Features, "rdseed", true);
2482 setFeatureEnabledImpl(Features, "adx", true);
2483 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002484 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002485 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002486 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002487 setFeatureEnabledImpl(Features, "bmi", true);
2488 setFeatureEnabledImpl(Features, "bmi2", true);
2489 setFeatureEnabledImpl(Features, "rtm", true);
2490 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002491 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002492 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002493 setFeatureEnabledImpl(Features, "rdrnd", true);
2494 setFeatureEnabledImpl(Features, "f16c", true);
2495 setFeatureEnabledImpl(Features, "fsgsbase", true);
2496 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002497 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002498 setFeatureEnabledImpl(Features, "avx", true);
2499 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002500 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002501 case CK_Silvermont:
2502 setFeatureEnabledImpl(Features, "aes", true);
2503 setFeatureEnabledImpl(Features, "pclmul", true);
2504 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002505 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002506 setFeatureEnabledImpl(Features, "sse4.2", true);
2507 setFeatureEnabledImpl(Features, "cx16", true);
2508 break;
2509 case CK_KNL:
2510 setFeatureEnabledImpl(Features, "avx512f", true);
2511 setFeatureEnabledImpl(Features, "avx512cd", true);
2512 setFeatureEnabledImpl(Features, "avx512er", true);
2513 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002514 setFeatureEnabledImpl(Features, "rdseed", true);
2515 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002516 setFeatureEnabledImpl(Features, "lzcnt", true);
2517 setFeatureEnabledImpl(Features, "bmi", true);
2518 setFeatureEnabledImpl(Features, "bmi2", true);
2519 setFeatureEnabledImpl(Features, "rtm", true);
2520 setFeatureEnabledImpl(Features, "fma", true);
2521 setFeatureEnabledImpl(Features, "rdrnd", true);
2522 setFeatureEnabledImpl(Features, "f16c", true);
2523 setFeatureEnabledImpl(Features, "fsgsbase", true);
2524 setFeatureEnabledImpl(Features, "aes", true);
2525 setFeatureEnabledImpl(Features, "pclmul", true);
2526 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002527 break;
2528 case CK_K6_2:
2529 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002530 case CK_WinChip2:
2531 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002532 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002533 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002534 case CK_Athlon:
2535 case CK_AthlonThunderbird:
2536 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002537 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002538 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002539 case CK_Athlon4:
2540 case CK_AthlonXP:
2541 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002542 setFeatureEnabledImpl(Features, "sse", true);
2543 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002544 break;
2545 case CK_K8:
2546 case CK_Opteron:
2547 case CK_Athlon64:
2548 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002549 setFeatureEnabledImpl(Features, "sse2", true);
2550 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002551 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002552 case CK_AMDFAM10:
2553 setFeatureEnabledImpl(Features, "sse4a", true);
2554 setFeatureEnabledImpl(Features, "lzcnt", true);
2555 setFeatureEnabledImpl(Features, "popcnt", true);
2556 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002557 case CK_K8SSE3:
2558 case CK_OpteronSSE3:
2559 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002560 setFeatureEnabledImpl(Features, "sse3", true);
2561 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002562 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002563 case CK_BTVER2:
2564 setFeatureEnabledImpl(Features, "avx", true);
2565 setFeatureEnabledImpl(Features, "aes", true);
2566 setFeatureEnabledImpl(Features, "pclmul", true);
2567 setFeatureEnabledImpl(Features, "bmi", true);
2568 setFeatureEnabledImpl(Features, "f16c", true);
2569 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002570 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002571 setFeatureEnabledImpl(Features, "ssse3", true);
2572 setFeatureEnabledImpl(Features, "sse4a", true);
2573 setFeatureEnabledImpl(Features, "lzcnt", true);
2574 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002575 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002576 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002577 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002578 case CK_BDVER4:
2579 setFeatureEnabledImpl(Features, "avx2", true);
2580 setFeatureEnabledImpl(Features, "bmi2", true);
2581 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002582 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002583 setFeatureEnabledImpl(Features, "fsgsbase", true);
2584 // FALLTHROUGH
2585 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002586 setFeatureEnabledImpl(Features, "bmi", true);
2587 setFeatureEnabledImpl(Features, "fma", true);
2588 setFeatureEnabledImpl(Features, "f16c", true);
2589 setFeatureEnabledImpl(Features, "tbm", true);
2590 // FALLTHROUGH
2591 case CK_BDVER1:
2592 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002593 setFeatureEnabledImpl(Features, "xop", true);
2594 setFeatureEnabledImpl(Features, "lzcnt", true);
2595 setFeatureEnabledImpl(Features, "aes", true);
2596 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002597 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002598 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002599 break;
Eli Friedman33465822011-07-08 23:31:17 +00002600 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002601}
2602
Rafael Espindolae62e2792013-08-20 13:44:29 +00002603void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002604 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002605 if (Enabled) {
2606 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002607 case AVX512F:
2608 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002609 case AVX2:
2610 Features["avx2"] = true;
2611 case AVX:
2612 Features["avx"] = true;
2613 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002614 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002615 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002616 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002617 case SSSE3:
2618 Features["ssse3"] = true;
2619 case SSE3:
2620 Features["sse3"] = true;
2621 case SSE2:
2622 Features["sse2"] = true;
2623 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002624 Features["sse"] = true;
2625 case NoSSE:
2626 break;
2627 }
2628 return;
2629 }
2630
2631 switch (Level) {
2632 case NoSSE:
2633 case SSE1:
2634 Features["sse"] = false;
2635 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002636 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2637 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002638 case SSE3:
2639 Features["sse3"] = false;
2640 setXOPLevel(Features, NoXOP, false);
2641 case SSSE3:
2642 Features["ssse3"] = false;
2643 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002644 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002645 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002646 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002647 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002648 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002649 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002650 case AVX2:
2651 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002652 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002653 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002654 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2655 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002656 }
2657}
2658
2659void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002660 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002661 if (Enabled) {
2662 switch (Level) {
2663 case AMD3DNowAthlon:
2664 Features["3dnowa"] = true;
2665 case AMD3DNow:
2666 Features["3dnow"] = true;
2667 case MMX:
2668 Features["mmx"] = true;
2669 case NoMMX3DNow:
2670 break;
2671 }
2672 return;
2673 }
2674
2675 switch (Level) {
2676 case NoMMX3DNow:
2677 case MMX:
2678 Features["mmx"] = false;
2679 case AMD3DNow:
2680 Features["3dnow"] = false;
2681 case AMD3DNowAthlon:
2682 Features["3dnowa"] = false;
2683 }
2684}
2685
2686void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002687 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002688 if (Enabled) {
2689 switch (Level) {
2690 case XOP:
2691 Features["xop"] = true;
2692 case FMA4:
2693 Features["fma4"] = true;
2694 setSSELevel(Features, AVX, true);
2695 case SSE4A:
2696 Features["sse4a"] = true;
2697 setSSELevel(Features, SSE3, true);
2698 case NoXOP:
2699 break;
2700 }
2701 return;
2702 }
2703
2704 switch (Level) {
2705 case NoXOP:
2706 case SSE4A:
2707 Features["sse4a"] = false;
2708 case FMA4:
2709 Features["fma4"] = false;
2710 case XOP:
2711 Features["xop"] = false;
2712 }
2713}
2714
Craig Topper86d79ef2013-09-17 04:51:29 +00002715void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2716 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002717 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002718
Craig Topper29561122013-09-19 01:13:07 +00002719 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002720 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002721 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002722 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002723 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002724 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002725 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002726 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002727 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002728 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002729 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002730 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002731 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002732 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002733 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002734 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002735 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002736 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002737 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002738 if (Enabled)
2739 setSSELevel(Features, SSE2, Enabled);
2740 } else if (Name == "pclmul") {
2741 if (Enabled)
2742 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002743 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002744 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002745 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002746 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002747 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002748 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002749 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2750 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002751 if (Enabled)
2752 setSSELevel(Features, AVX512F, Enabled);
2753 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002754 if (Enabled)
2755 setSSELevel(Features, AVX, Enabled);
2756 } else if (Name == "fma4") {
2757 setXOPLevel(Features, FMA4, Enabled);
2758 } else if (Name == "xop") {
2759 setXOPLevel(Features, XOP, Enabled);
2760 } else if (Name == "sse4a") {
2761 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002762 } else if (Name == "f16c") {
2763 if (Enabled)
2764 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002765 } else if (Name == "sha") {
2766 if (Enabled)
2767 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002768 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002769}
2770
Eric Christopher3ff21b32013-10-16 21:26:26 +00002771/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002772/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002773bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002774 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002775 // Remember the maximum enabled sselevel.
2776 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2777 // Ignore disabled features.
2778 if (Features[i][0] == '-')
2779 continue;
2780
Benjamin Kramer27402c62012-03-05 15:10:44 +00002781 StringRef Feature = StringRef(Features[i]).substr(1);
2782
2783 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002784 HasAES = true;
2785 continue;
2786 }
2787
Craig Topper3f122a72012-05-31 05:18:48 +00002788 if (Feature == "pclmul") {
2789 HasPCLMUL = true;
2790 continue;
2791 }
2792
Benjamin Kramer27402c62012-03-05 15:10:44 +00002793 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002794 HasLZCNT = true;
2795 continue;
2796 }
2797
Rafael Espindola89049822013-08-23 20:21:37 +00002798 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002799 HasRDRND = true;
2800 continue;
2801 }
2802
Craig Topper8c7f2512014-11-03 06:51:41 +00002803 if (Feature == "fsgsbase") {
2804 HasFSGSBASE = true;
2805 continue;
2806 }
2807
Benjamin Kramer27402c62012-03-05 15:10:44 +00002808 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002809 HasBMI = true;
2810 continue;
2811 }
2812
Benjamin Kramer27402c62012-03-05 15:10:44 +00002813 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002814 HasBMI2 = true;
2815 continue;
2816 }
2817
Benjamin Kramer27402c62012-03-05 15:10:44 +00002818 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002819 HasPOPCNT = true;
2820 continue;
2821 }
2822
Michael Liao625a8752012-11-10 05:17:46 +00002823 if (Feature == "rtm") {
2824 HasRTM = true;
2825 continue;
2826 }
2827
Michael Liao74f4eaf2013-03-26 17:52:08 +00002828 if (Feature == "prfchw") {
2829 HasPRFCHW = true;
2830 continue;
2831 }
2832
Michael Liaoffaae352013-03-29 05:17:55 +00002833 if (Feature == "rdseed") {
2834 HasRDSEED = true;
2835 continue;
2836 }
2837
Robert Khasanov50e6f582014-09-19 09:53:48 +00002838 if (Feature == "adx") {
2839 HasADX = true;
2840 continue;
2841 }
2842
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002843 if (Feature == "tbm") {
2844 HasTBM = true;
2845 continue;
2846 }
2847
Craig Topperbba778b2012-06-03 21:46:30 +00002848 if (Feature == "fma") {
2849 HasFMA = true;
2850 continue;
2851 }
2852
Manman Rena45358c2012-10-11 00:59:55 +00002853 if (Feature == "f16c") {
2854 HasF16C = true;
2855 continue;
2856 }
2857
Craig Topper679b53a2013-08-21 05:29:10 +00002858 if (Feature == "avx512cd") {
2859 HasAVX512CD = true;
2860 continue;
2861 }
2862
2863 if (Feature == "avx512er") {
2864 HasAVX512ER = true;
2865 continue;
2866 }
2867
2868 if (Feature == "avx512pf") {
2869 HasAVX512PF = true;
2870 continue;
2871 }
2872
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002873 if (Feature == "avx512dq") {
2874 HasAVX512DQ = true;
2875 continue;
2876 }
2877
2878 if (Feature == "avx512bw") {
2879 HasAVX512BW = true;
2880 continue;
2881 }
2882
2883 if (Feature == "avx512vl") {
2884 HasAVX512VL = true;
2885 continue;
2886 }
2887
Ben Langmuir58078d02013-09-19 13:22:04 +00002888 if (Feature == "sha") {
2889 HasSHA = true;
2890 continue;
2891 }
2892
Nick Lewycky50e8f482013-10-05 20:14:27 +00002893 if (Feature == "cx16") {
2894 HasCX16 = true;
2895 continue;
2896 }
2897
Daniel Dunbar979586e2009-11-11 09:38:56 +00002898 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002899 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002900 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002901 .Case("avx2", AVX2)
2902 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002903 .Case("sse4.2", SSE42)
2904 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002905 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002906 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002907 .Case("sse2", SSE2)
2908 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002909 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002910 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002911
Eli Friedman33465822011-07-08 23:31:17 +00002912 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002913 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002914 .Case("3dnowa", AMD3DNowAthlon)
2915 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002916 .Case("mmx", MMX)
2917 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002918 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002919
2920 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2921 .Case("xop", XOP)
2922 .Case("fma4", FMA4)
2923 .Case("sse4a", SSE4A)
2924 .Default(NoXOP);
2925 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002926 }
Eli Friedman33465822011-07-08 23:31:17 +00002927
Craig Topper7481d8a2013-09-10 06:55:47 +00002928 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2929 // Can't do this earlier because we need to be able to explicitly enable
2930 // popcnt and still disable sse4.2.
2931 if (!HasPOPCNT && SSELevel >= SSE42 &&
2932 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2933 HasPOPCNT = true;
2934 Features.push_back("+popcnt");
2935 }
2936
Yunzhong Gao61089362013-10-16 19:07:02 +00002937 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2938 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2939 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2940 HasPRFCHW = true;
2941 Features.push_back("+prfchw");
2942 }
2943
Rafael Espindolaeb265472013-08-21 21:59:03 +00002944 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2945 // matches the selected sse level.
2946 if (FPMath == FP_SSE && SSELevel < SSE1) {
2947 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2948 return false;
2949 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2950 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2951 return false;
2952 }
2953
Eli Friedman33465822011-07-08 23:31:17 +00002954 // Don't tell the backend if we're turning off mmx; it will end up disabling
2955 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002956 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2957 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002958 std::vector<std::string>::iterator it;
2959 it = std::find(Features.begin(), Features.end(), "-mmx");
2960 if (it != Features.end())
2961 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002962 else if (SSELevel > NoSSE)
2963 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002964 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002965}
Chris Lattnerecd49032009-03-02 22:27:17 +00002966
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002967/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2968/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002969void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002970 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002971 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002972 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002973 Builder.defineMacro("__amd64__");
2974 Builder.defineMacro("__amd64");
2975 Builder.defineMacro("__x86_64");
2976 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002977 if (getTriple().getArchName() == "x86_64h") {
2978 Builder.defineMacro("__x86_64h");
2979 Builder.defineMacro("__x86_64h__");
2980 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002981 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002982 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002983 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002984
Chris Lattnerecd49032009-03-02 22:27:17 +00002985 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002986 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2987 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002988 switch (CPU) {
2989 case CK_Generic:
2990 break;
2991 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002992 // The rest are coming from the i386 define above.
2993 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002994 break;
2995 case CK_i486:
2996 case CK_WinChipC6:
2997 case CK_WinChip2:
2998 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002999 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003000 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003001 case CK_PentiumMMX:
3002 Builder.defineMacro("__pentium_mmx__");
3003 Builder.defineMacro("__tune_pentium_mmx__");
3004 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003005 case CK_i586:
3006 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003007 defineCPUMacros(Builder, "i586");
3008 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003009 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003010 case CK_Pentium3:
3011 case CK_Pentium3M:
3012 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003013 Builder.defineMacro("__tune_pentium3__");
3014 // Fallthrough
3015 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003016 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003017 Builder.defineMacro("__tune_pentium2__");
3018 // Fallthrough
3019 case CK_PentiumPro:
3020 Builder.defineMacro("__tune_i686__");
3021 Builder.defineMacro("__tune_pentiumpro__");
3022 // Fallthrough
3023 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003024 Builder.defineMacro("__i686");
3025 Builder.defineMacro("__i686__");
3026 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3027 Builder.defineMacro("__pentiumpro");
3028 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003029 break;
3030 case CK_Pentium4:
3031 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003032 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003033 break;
3034 case CK_Yonah:
3035 case CK_Prescott:
3036 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003037 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003038 break;
3039 case CK_Core2:
3040 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003041 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003042 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003043 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003044 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003045 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003046 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003047 defineCPUMacros(Builder, "slm");
3048 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003049 case CK_Nehalem:
3050 case CK_Westmere:
3051 case CK_SandyBridge:
3052 case CK_IvyBridge:
3053 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003054 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003055 // FIXME: Historically, we defined this legacy name, it would be nice to
3056 // remove it at some point. We've never exposed fine-grained names for
3057 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003058 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003060 case CK_Skylake:
3061 // FIXME: Historically, we defined this legacy name, it would be nice to
3062 // remove it at some point. This is the only fine-grained CPU macro in the
3063 // main intel CPU line, and it would be better to not have these and force
3064 // people to use ISA macros.
3065 defineCPUMacros(Builder, "skx");
3066 break;
Craig Topper449314e2013-08-20 07:09:39 +00003067 case CK_KNL:
3068 defineCPUMacros(Builder, "knl");
3069 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003070 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003071 Builder.defineMacro("__k6_2__");
3072 Builder.defineMacro("__tune_k6_2__");
3073 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003074 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003075 if (CPU != CK_K6_2) { // In case of fallthrough
3076 // FIXME: GCC may be enabling these in cases where some other k6
3077 // architecture is specified but -m3dnow is explicitly provided. The
3078 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003079 Builder.defineMacro("__k6_3__");
3080 Builder.defineMacro("__tune_k6_3__");
3081 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003082 // Fallthrough
3083 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003084 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003085 break;
3086 case CK_Athlon:
3087 case CK_AthlonThunderbird:
3088 case CK_Athlon4:
3089 case CK_AthlonXP:
3090 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003091 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003092 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003093 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003094 Builder.defineMacro("__tune_athlon_sse__");
3095 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003096 break;
3097 case CK_K8:
3098 case CK_K8SSE3:
3099 case CK_x86_64:
3100 case CK_Opteron:
3101 case CK_OpteronSSE3:
3102 case CK_Athlon64:
3103 case CK_Athlon64SSE3:
3104 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003105 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003106 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003107 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003108 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003109 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003110 case CK_BTVER1:
3111 defineCPUMacros(Builder, "btver1");
3112 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003113 case CK_BTVER2:
3114 defineCPUMacros(Builder, "btver2");
3115 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003116 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003117 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003118 break;
3119 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003120 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003121 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003122 case CK_BDVER3:
3123 defineCPUMacros(Builder, "bdver3");
3124 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003125 case CK_BDVER4:
3126 defineCPUMacros(Builder, "bdver4");
3127 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003128 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003129 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003130 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003131 }
Chris Lattner96e43572009-03-02 22:40:39 +00003132
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003133 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003134 Builder.defineMacro("__REGISTER_PREFIX__", "");
3135
Chris Lattner6df41af2009-04-19 17:32:33 +00003136 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3137 // functions in glibc header files that use FP Stack inline asm which the
3138 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003139 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003140
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003141 if (HasAES)
3142 Builder.defineMacro("__AES__");
3143
Craig Topper3f122a72012-05-31 05:18:48 +00003144 if (HasPCLMUL)
3145 Builder.defineMacro("__PCLMUL__");
3146
Craig Topper22967d42011-12-25 05:06:45 +00003147 if (HasLZCNT)
3148 Builder.defineMacro("__LZCNT__");
3149
Benjamin Kramer1e250392012-07-07 09:39:18 +00003150 if (HasRDRND)
3151 Builder.defineMacro("__RDRND__");
3152
Craig Topper8c7f2512014-11-03 06:51:41 +00003153 if (HasFSGSBASE)
3154 Builder.defineMacro("__FSGSBASE__");
3155
Craig Topper22967d42011-12-25 05:06:45 +00003156 if (HasBMI)
3157 Builder.defineMacro("__BMI__");
3158
3159 if (HasBMI2)
3160 Builder.defineMacro("__BMI2__");
3161
Craig Topper1de83482011-12-29 16:10:46 +00003162 if (HasPOPCNT)
3163 Builder.defineMacro("__POPCNT__");
3164
Michael Liao625a8752012-11-10 05:17:46 +00003165 if (HasRTM)
3166 Builder.defineMacro("__RTM__");
3167
Michael Liao74f4eaf2013-03-26 17:52:08 +00003168 if (HasPRFCHW)
3169 Builder.defineMacro("__PRFCHW__");
3170
Michael Liaoffaae352013-03-29 05:17:55 +00003171 if (HasRDSEED)
3172 Builder.defineMacro("__RDSEED__");
3173
Robert Khasanov50e6f582014-09-19 09:53:48 +00003174 if (HasADX)
3175 Builder.defineMacro("__ADX__");
3176
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003177 if (HasTBM)
3178 Builder.defineMacro("__TBM__");
3179
Rafael Espindolae62e2792013-08-20 13:44:29 +00003180 switch (XOPLevel) {
3181 case XOP:
3182 Builder.defineMacro("__XOP__");
3183 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003184 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003185 case SSE4A:
3186 Builder.defineMacro("__SSE4A__");
3187 case NoXOP:
3188 break;
3189 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003190
Craig Topperbba778b2012-06-03 21:46:30 +00003191 if (HasFMA)
3192 Builder.defineMacro("__FMA__");
3193
Manman Rena45358c2012-10-11 00:59:55 +00003194 if (HasF16C)
3195 Builder.defineMacro("__F16C__");
3196
Craig Topper679b53a2013-08-21 05:29:10 +00003197 if (HasAVX512CD)
3198 Builder.defineMacro("__AVX512CD__");
3199 if (HasAVX512ER)
3200 Builder.defineMacro("__AVX512ER__");
3201 if (HasAVX512PF)
3202 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003203 if (HasAVX512DQ)
3204 Builder.defineMacro("__AVX512DQ__");
3205 if (HasAVX512BW)
3206 Builder.defineMacro("__AVX512BW__");
3207 if (HasAVX512VL)
3208 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003209
Ben Langmuir58078d02013-09-19 13:22:04 +00003210 if (HasSHA)
3211 Builder.defineMacro("__SHA__");
3212
Nick Lewycky50e8f482013-10-05 20:14:27 +00003213 if (HasCX16)
3214 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3215
Chris Lattner96e43572009-03-02 22:40:39 +00003216 // Each case falls through to the previous one here.
3217 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003218 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003219 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003220 case AVX2:
3221 Builder.defineMacro("__AVX2__");
3222 case AVX:
3223 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003224 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003225 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003226 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003227 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003228 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003229 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003230 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003231 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003232 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003233 Builder.defineMacro("__SSE2__");
3234 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003235 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003236 Builder.defineMacro("__SSE__");
3237 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003238 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003239 break;
3240 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003241
Derek Schuffc7dd7222012-10-11 15:52:22 +00003242 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003243 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003244 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003245 case AVX2:
3246 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003247 case SSE42:
3248 case SSE41:
3249 case SSSE3:
3250 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003251 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003252 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003253 break;
3254 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003255 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003256 break;
3257 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003258 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003259 }
3260 }
3261
Anders Carlssone437c682010-01-27 03:47:49 +00003262 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003263 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003264 case AMD3DNowAthlon:
3265 Builder.defineMacro("__3dNOW_A__");
3266 case AMD3DNow:
3267 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003268 case MMX:
3269 Builder.defineMacro("__MMX__");
3270 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003271 break;
3272 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003273
3274 if (CPU >= CK_i486) {
3275 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3276 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3277 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3278 }
3279 if (CPU >= CK_i586)
3280 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003281}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003282
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003283bool X86TargetInfo::hasFeature(StringRef Feature) const {
3284 return llvm::StringSwitch<bool>(Feature)
3285 .Case("aes", HasAES)
3286 .Case("avx", SSELevel >= AVX)
3287 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003288 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003289 .Case("avx512cd", HasAVX512CD)
3290 .Case("avx512er", HasAVX512ER)
3291 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003292 .Case("avx512dq", HasAVX512DQ)
3293 .Case("avx512bw", HasAVX512BW)
3294 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003295 .Case("bmi", HasBMI)
3296 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003297 .Case("cx16", HasCX16)
3298 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003299 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003300 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003301 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003302 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003303 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3304 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3305 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003306 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003307 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003308 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003309 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003310 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003311 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003312 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003313 .Case("sse", SSELevel >= SSE1)
3314 .Case("sse2", SSELevel >= SSE2)
3315 .Case("sse3", SSELevel >= SSE3)
3316 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003317 .Case("sse4.1", SSELevel >= SSE41)
3318 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003319 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003320 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003321 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003322 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3323 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003324 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003325 .Default(false);
3326}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003327
Eli Friedman3fd920a2008-08-20 02:34:37 +00003328bool
Anders Carlsson58436352009-02-28 17:11:49 +00003329X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003330 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003331 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003332 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003333 case 'I':
3334 Info.setRequiresImmediate(0, 31);
3335 return true;
3336 case 'J':
3337 Info.setRequiresImmediate(0, 63);
3338 return true;
3339 case 'K':
3340 Info.setRequiresImmediate(-128, 127);
3341 return true;
3342 case 'L':
3343 // FIXME: properly analyze this constraint:
3344 // must be one of 0xff, 0xffff, or 0xffffffff
3345 return true;
3346 case 'M':
3347 Info.setRequiresImmediate(0, 3);
3348 return true;
3349 case 'N':
3350 Info.setRequiresImmediate(0, 255);
3351 return true;
3352 case 'O':
3353 Info.setRequiresImmediate(0, 127);
3354 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003355 case 'Y': // first letter of a pair:
3356 switch (*(Name+1)) {
3357 default: return false;
3358 case '0': // First SSE register.
3359 case 't': // Any SSE register, when SSE2 is enabled.
3360 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3361 case 'm': // any MMX register, when inter-unit moves enabled.
3362 break; // falls through to setAllowsRegister.
3363 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003364 case 'f': // any x87 floating point stack register.
3365 // Constraint 'f' cannot be used for output operands.
3366 if (Info.ConstraintStr[0] == '=')
3367 return false;
3368
3369 Info.setAllowsRegister();
3370 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003371 case 'a': // eax.
3372 case 'b': // ebx.
3373 case 'c': // ecx.
3374 case 'd': // edx.
3375 case 'S': // esi.
3376 case 'D': // edi.
3377 case 'A': // edx:eax.
3378 case 't': // top of floating point stack.
3379 case 'u': // second from top of floating point stack.
3380 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003381 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003382 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003383 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003384 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3385 case 'l': // "Index" registers: any general register that can be used as an
3386 // index in a base+index memory access.
3387 Info.setAllowsRegister();
3388 return true;
3389 case 'C': // SSE floating point constant.
3390 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003391 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003392 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003393 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003394 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003395 return true;
3396 }
3397}
3398
Akira Hatanaka974131e2014-09-18 18:17:18 +00003399bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3400 unsigned Size) const {
3401 // Strip off constraint modifiers.
3402 while (Constraint[0] == '=' ||
3403 Constraint[0] == '+' ||
3404 Constraint[0] == '&')
3405 Constraint = Constraint.substr(1);
3406
3407 return validateOperandSize(Constraint, Size);
3408}
3409
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003410bool X86TargetInfo::validateInputSize(StringRef Constraint,
3411 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003412 return validateOperandSize(Constraint, Size);
3413}
3414
3415bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3416 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003417 switch (Constraint[0]) {
3418 default: break;
3419 case 'y':
3420 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003421 case 'f':
3422 case 't':
3423 case 'u':
3424 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003425 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003426 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003427 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003428 }
3429
3430 return true;
3431}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003432
Eli Friedman3fd920a2008-08-20 02:34:37 +00003433std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003434X86TargetInfo::convertConstraint(const char *&Constraint) const {
3435 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003436 case 'a': return std::string("{ax}");
3437 case 'b': return std::string("{bx}");
3438 case 'c': return std::string("{cx}");
3439 case 'd': return std::string("{dx}");
3440 case 'S': return std::string("{si}");
3441 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003442 case 'p': // address
3443 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003444 case 't': // top of floating point stack.
3445 return std::string("{st}");
3446 case 'u': // second from top of floating point stack.
3447 return std::string("{st(1)}"); // second from top of floating point stack.
3448 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003449 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003450 }
3451}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003452
Eli Friedman3fd920a2008-08-20 02:34:37 +00003453// X86-32 generic target
3454class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003455public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003456 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003457 DoubleAlign = LongLongAlign = 32;
3458 LongDoubleWidth = 96;
3459 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003460 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003461 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003462 SizeType = UnsignedInt;
3463 PtrDiffType = SignedInt;
3464 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003465 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003466
3467 // Use fpret for all types.
3468 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3469 (1 << TargetInfo::Double) |
3470 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003471
3472 // x86-32 has atomics up to 8 bytes
3473 // FIXME: Check that we actually have cmpxchg8b before setting
3474 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3475 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003476 }
Craig Topper3164f332014-03-11 03:39:26 +00003477 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003478 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003479 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003480
Craig Topper3164f332014-03-11 03:39:26 +00003481 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003482 if (RegNo == 0) return 0;
3483 if (RegNo == 1) return 2;
3484 return -1;
3485 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003486 bool validateOperandSize(StringRef Constraint,
3487 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003488 switch (Constraint[0]) {
3489 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003490 case 'R':
3491 case 'q':
3492 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003493 case 'a':
3494 case 'b':
3495 case 'c':
3496 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003497 case 'S':
3498 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003499 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003500 case 'A':
3501 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003502 }
3503
Akira Hatanaka974131e2014-09-18 18:17:18 +00003504 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003505 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003506};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003507
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003508class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003510 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3511 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003512
Craig Topper3164f332014-03-11 03:39:26 +00003513 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003514 unsigned Major, Minor, Micro;
3515 getTriple().getOSVersion(Major, Minor, Micro);
3516 // New NetBSD uses the default rounding mode.
3517 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3518 return X86_32TargetInfo::getFloatEvalMethod();
3519 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003520 return 1;
3521 }
3522};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003523
Eli Friedmane3aa4542009-07-05 18:47:56 +00003524class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3525public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003526 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3527 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003528 SizeType = UnsignedLong;
3529 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003530 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003531 }
3532};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003533
Eli Friedman9fa28852012-08-08 23:57:20 +00003534class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3535public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003536 BitrigI386TargetInfo(const llvm::Triple &Triple)
3537 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003538 SizeType = UnsignedLong;
3539 IntPtrType = SignedLong;
3540 PtrDiffType = SignedLong;
3541 }
3542};
Eli Friedman9fa28852012-08-08 23:57:20 +00003543
Torok Edwinb2b37c62009-06-30 17:10:35 +00003544class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003545public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003546 DarwinI386TargetInfo(const llvm::Triple &Triple)
3547 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003548 LongDoubleWidth = 128;
3549 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003550 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003551 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003552 SizeType = UnsignedLong;
3553 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003554 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003555 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003556 }
3557
Eli Friedman3fd920a2008-08-20 02:34:37 +00003558};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003559
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003560// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003561class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003562public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003563 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3564 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003565 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003566 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003567 bool IsWinCOFF =
3568 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Reid Kleckneraf676022015-04-30 22:13:05 +00003569 DescriptionString = IsWinCOFF
3570 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3571 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003572 }
Craig Topper3164f332014-03-11 03:39:26 +00003573 void getTargetDefines(const LangOptions &Opts,
3574 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003575 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3576 }
3577};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003578
3579// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003580class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003581public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003582 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003583 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003584 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003585 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3586 }
Craig Topper3164f332014-03-11 03:39:26 +00003587 void getTargetDefines(const LangOptions &Opts,
3588 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003589 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3590 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3591 // The value of the following reflects processor type.
3592 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3593 // We lost the original triple, so we use the default.
3594 Builder.defineMacro("_M_IX86", "600");
3595 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003596};
3597} // end anonymous namespace
3598
Reid Kleckner47606832014-04-21 20:58:00 +00003599static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3600 Builder.defineMacro("__MSVCRT__");
3601 Builder.defineMacro("__MINGW32__");
3602
3603 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3604 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3605 // macro anyway for pre-processor compatibility.
3606 if (Opts.MicrosoftExt)
3607 Builder.defineMacro("__declspec", "__declspec");
3608 else
3609 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3610
3611 if (!Opts.MicrosoftExt) {
3612 // Provide macros for all the calling convention keywords. Provide both
3613 // single and double underscore prefixed variants. These are available on
3614 // x64 as well as x86, even though they have no effect.
3615 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3616 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003617 std::string GCCSpelling = "__attribute__((__";
3618 GCCSpelling += CC;
3619 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003620 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3621 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3622 }
3623 }
3624}
3625
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003626namespace {
3627// x86-32 MinGW target
3628class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3629public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003630 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3631 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003632 void getTargetDefines(const LangOptions &Opts,
3633 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003634 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003635 DefineStd(Builder, "WIN32", Opts);
3636 DefineStd(Builder, "WINNT", Opts);
3637 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003638 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003639 }
3640};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003641
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003642// x86-32 Cygwin target
3643class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3644public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003645 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3646 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003647 TLSSupported = false;
3648 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003649 DoubleAlign = LongLongAlign = 64;
Reid Kleckneraf676022015-04-30 22:13:05 +00003650 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 +00003651 }
Craig Topper3164f332014-03-11 03:39:26 +00003652 void getTargetDefines(const LangOptions &Opts,
3653 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003654 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003655 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003656 Builder.defineMacro("__CYGWIN__");
3657 Builder.defineMacro("__CYGWIN32__");
3658 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003659 if (Opts.CPlusPlus)
3660 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003661 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003662};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003663
Chris Lattnerb986aba2010-04-11 19:29:39 +00003664// x86-32 Haiku target
3665class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3666public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003667 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003668 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003669 IntPtrType = SignedLong;
3670 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003671 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003672 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003673 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003674 }
Craig Topper3164f332014-03-11 03:39:26 +00003675 void getTargetDefines(const LangOptions &Opts,
3676 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003677 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3678 Builder.defineMacro("__INTEL__");
3679 Builder.defineMacro("__HAIKU__");
3680 }
3681};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003682
Douglas Gregor9fabd852011-07-01 22:41:14 +00003683// RTEMS Target
3684template<typename Target>
3685class RTEMSTargetInfo : public OSTargetInfo<Target> {
3686protected:
Craig Topper3164f332014-03-11 03:39:26 +00003687 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3688 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003689 // RTEMS defines; list based off of gcc output
3690
Douglas Gregor9fabd852011-07-01 22:41:14 +00003691 Builder.defineMacro("__rtems__");
3692 Builder.defineMacro("__ELF__");
3693 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003694
Douglas Gregor9fabd852011-07-01 22:41:14 +00003695public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003696 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3697 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003698
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003699 switch (Triple.getArch()) {
3700 default:
3701 case llvm::Triple::x86:
3702 // this->MCountName = ".mcount";
3703 break;
3704 case llvm::Triple::mips:
3705 case llvm::Triple::mipsel:
3706 case llvm::Triple::ppc:
3707 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003708 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003709 // this->MCountName = "_mcount";
3710 break;
3711 case llvm::Triple::arm:
3712 // this->MCountName = "__mcount";
3713 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003714 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003715 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003716};
3717
Douglas Gregor9fabd852011-07-01 22:41:14 +00003718// x86-32 RTEMS target
3719class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3720public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003721 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003722 SizeType = UnsignedLong;
3723 IntPtrType = SignedLong;
3724 PtrDiffType = SignedLong;
3725 this->UserLabelPrefix = "";
3726 }
Craig Topper3164f332014-03-11 03:39:26 +00003727 void getTargetDefines(const LangOptions &Opts,
3728 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003729 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3730 Builder.defineMacro("__INTEL__");
3731 Builder.defineMacro("__rtems__");
3732 }
3733};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003734
Eli Friedman3fd920a2008-08-20 02:34:37 +00003735// x86-64 generic target
3736class X86_64TargetInfo : public X86TargetInfo {
3737public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003738 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003739 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003740 bool IsWinCOFF =
3741 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003742 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003743 LongDoubleWidth = 128;
3744 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003745 LargeArrayMinWidth = 128;
3746 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003747 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003748 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3749 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3750 IntPtrType = IsX32 ? SignedInt : SignedLong;
3751 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003752 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003753 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003754
Eric Christopher917e9522014-11-18 22:36:15 +00003755 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003756 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3757 : IsWinCOFF
3758 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3759 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003760
3761 // Use fpret only for long double.
3762 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003763
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003764 // Use fp2ret for _Complex long double.
3765 ComplexLongDoubleUsesFP2Ret = true;
3766
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003767 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003768 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003769 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003770 }
Craig Topper3164f332014-03-11 03:39:26 +00003771 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003772 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003773 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003774
Craig Topper3164f332014-03-11 03:39:26 +00003775 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003776 if (RegNo == 0) return 0;
3777 if (RegNo == 1) return 1;
3778 return -1;
3779 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003780
Craig Topper3164f332014-03-11 03:39:26 +00003781 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003782 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003783 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003784 CC == CC_IntelOclBicc ||
3785 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003786 }
3787
Craig Topper3164f332014-03-11 03:39:26 +00003788 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003789 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003790 }
3791
Pavel Chupinfd223e12014-08-04 12:39:43 +00003792 // for x32 we need it here explicitly
3793 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003794};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003795
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003796// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003797class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003798public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003799 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3800 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003801 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003802 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003803 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003804 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003805 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003806 SizeType = UnsignedLongLong;
3807 PtrDiffType = SignedLongLong;
3808 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003809 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003810 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003811
Craig Topper3164f332014-03-11 03:39:26 +00003812 void getTargetDefines(const LangOptions &Opts,
3813 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003814 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003815 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003816 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003817
Craig Topper3164f332014-03-11 03:39:26 +00003818 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003819 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003820 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003821
Craig Topper3164f332014-03-11 03:39:26 +00003822 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003823 switch (CC) {
3824 case CC_X86StdCall:
3825 case CC_X86ThisCall:
3826 case CC_X86FastCall:
3827 return CCCR_Ignore;
3828 case CC_C:
3829 case CC_X86VectorCall:
3830 case CC_IntelOclBicc:
3831 case CC_X86_64SysV:
3832 return CCCR_OK;
3833 default:
3834 return CCCR_Warning;
3835 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003836 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003837};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003838
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003839// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003840class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003841public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003842 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003843 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003844 LongDoubleWidth = LongDoubleAlign = 64;
3845 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003846 }
Craig Topper3164f332014-03-11 03:39:26 +00003847 void getTargetDefines(const LangOptions &Opts,
3848 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003849 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3850 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003851 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003852 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003853 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003854};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003855
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003856// x86-64 MinGW target
3857class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3858public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003859 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3860 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003861 void getTargetDefines(const LangOptions &Opts,
3862 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003863 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003864 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003865 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003866 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003867
3868 // GCC defines this macro when it is using __gxx_personality_seh0.
3869 if (!Opts.SjLjExceptions)
3870 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003871 }
3872};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003873
Eli Friedman2857ccb2009-07-01 03:36:11 +00003874class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3875public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003876 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3877 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003878 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003879 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003880 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3881 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003882 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003883 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003884 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003885 }
3886};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003887
Eli Friedman245f2292009-07-05 22:31:18 +00003888class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3889public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003890 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3891 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003892 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003893 Int64Type = SignedLongLong;
3894 }
3895};
Eli Friedman245f2292009-07-05 22:31:18 +00003896
Eli Friedman9fa28852012-08-08 23:57:20 +00003897class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3898public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003899 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3900 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3901 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003902 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003903 }
3904};
Tim Northover9bb857a2013-01-31 12:13:10 +00003905
Eli Friedmanf05b7722008-08-20 07:44:10 +00003906class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003907 // Possible FPU choices.
3908 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003909 VFP2FPU = (1 << 0),
3910 VFP3FPU = (1 << 1),
3911 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003912 NeonFPU = (1 << 3),
3913 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003914 };
3915
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003916 // Possible HWDiv features.
3917 enum HWDivMode {
3918 HWDivThumb = (1 << 0),
3919 HWDivARM = (1 << 1)
3920 };
3921
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003922 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003923 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003924 }
3925
3926 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3927 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003928
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003929 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003930
Rafael Espindolaeb265472013-08-21 21:59:03 +00003931 enum {
3932 FP_Default,
3933 FP_VFP,
3934 FP_Neon
3935 } FPMath;
3936
Bernard Ogdenda13af32013-10-24 18:32:51 +00003937 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003938
Logan Chien57086ce2012-10-10 06:56:20 +00003939 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003940 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003941 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003942
3943 // Initialized via features.
3944 unsigned SoftFloat : 1;
3945 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003946
Bernard Ogden18b57012013-10-29 09:47:51 +00003947 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003948 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003949
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003950 // ACLE 6.5.1 Hardware floating point
3951 enum {
3952 HW_FP_HP = (1 << 1), /// half (16-bit)
3953 HW_FP_SP = (1 << 2), /// single (32-bit)
3954 HW_FP_DP = (1 << 3), /// double (64-bit)
3955 };
3956 uint32_t HW_FP;
3957
Chris Lattner5cc15e02010-03-03 19:03:45 +00003958 static const Builtin::Info BuiltinInfo[];
3959
Rafael Espindola101d5b92013-05-13 20:09:47 +00003960 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003961 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003962 if (T.getArch() == llvm::Triple::arm ||
3963 T.getArch() == llvm::Triple::armeb) {
3964 StringRef VersionStr;
3965 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003966 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003967 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003968 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003969 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003970 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003971 unsigned Version;
3972 if (VersionStr.getAsInteger(10, Version))
3973 return false;
3974 return Version >= 6;
3975 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003976 assert(T.getArch() == llvm::Triple::thumb ||
3977 T.getArch() == llvm::Triple::thumbeb);
3978 StringRef VersionStr;
3979 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003980 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003981 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003982 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003983 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003984 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003985 unsigned Version;
3986 if (VersionStr.getAsInteger(10, Version))
3987 return false;
3988 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003989 }
3990
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003991 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003992 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003993
3994 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003995 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003996
Renato Golin9ba39232015-02-27 16:35:48 +00003997 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3998 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3999 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004000 SizeType = UnsignedLong;
4001 else
4002 SizeType = UnsignedInt;
4003
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004004 switch (T.getOS()) {
4005 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004006 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004007 break;
4008 case llvm::Triple::Win32:
4009 WCharType = UnsignedShort;
4010 break;
4011 case llvm::Triple::Linux:
4012 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004013 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4014 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004015 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004016 }
4017
4018 UseBitFieldTypeAlignment = true;
4019
4020 ZeroLengthBitfieldBoundary = 0;
4021
Tim Northover147cd2f2014-10-14 22:12:21 +00004022 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4023 // so set preferred for small types to 32.
4024 if (T.isOSBinFormatMachO()) {
4025 DescriptionString =
4026 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4027 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4028 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004029 assert(!BigEndian && "Windows on ARM does not support big endian");
4030 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00004031 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00004032 "-p:32:32"
4033 "-i64:64"
4034 "-v128:64:128"
4035 "-a:0:32"
4036 "-n32"
4037 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004038 } else if (T.isOSNaCl()) {
4039 assert(!BigEndian && "NaCl on ARM does not support big endian");
4040 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004041 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00004042 DescriptionString =
4043 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4044 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004045 }
4046
4047 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004048 }
4049
4050 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004051 const llvm::Triple &T = getTriple();
4052
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004053 IsAAPCS = false;
4054
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004055 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004056
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004057 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004058 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004059 SizeType = UnsignedInt;
4060 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004061 SizeType = UnsignedLong;
4062
4063 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4064 WCharType = SignedInt;
4065
4066 // Do not respect the alignment of bit-field types when laying out
4067 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4068 UseBitFieldTypeAlignment = false;
4069
4070 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4071 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4072 /// gcc.
4073 ZeroLengthBitfieldBoundary = 32;
4074
Tim Northover147cd2f2014-10-14 22:12:21 +00004075 if (T.isOSBinFormatMachO())
4076 DescriptionString =
4077 BigEndian
4078 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4079 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4080 else
4081 DescriptionString =
4082 BigEndian
4083 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4084 : "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 +00004085
4086 // FIXME: Override "preferred align" for double and long long.
4087 }
4088
Chris Lattner17df24e2008-04-21 18:56:49 +00004089public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004090 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004091 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004092 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004093 BigEndian = IsBigEndian;
4094
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004095 switch (getTriple().getOS()) {
4096 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004097 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004098 break;
4099 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004100 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004101 break;
4102 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004103
Chris Lattner1a8f3942010-04-23 16:29:58 +00004104 // {} in inline assembly are neon specifiers, not assembly variant
4105 // specifiers.
4106 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004107
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004108 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004109 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004110
Eric Christopher0e261882014-12-05 01:06:59 +00004111 // FIXME: This duplicates code from the driver that sets the -target-abi
4112 // option - this code is used if -target-abi isn't passed and should
4113 // be unified in some way.
4114 if (Triple.isOSBinFormatMachO()) {
4115 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4116 // the frontend matches that.
4117 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4118 Triple.getOS() == llvm::Triple::UnknownOS ||
4119 StringRef(CPU).startswith("cortex-m")) {
4120 setABI("aapcs");
4121 } else {
4122 setABI("apcs-gnu");
4123 }
4124 } else if (Triple.isOSWindows()) {
4125 // FIXME: this is invalid for WindowsCE
4126 setABI("aapcs");
4127 } else {
4128 // Select the default based on the platform.
4129 switch (Triple.getEnvironment()) {
4130 case llvm::Triple::Android:
4131 case llvm::Triple::GNUEABI:
4132 case llvm::Triple::GNUEABIHF:
4133 setABI("aapcs-linux");
4134 break;
4135 case llvm::Triple::EABIHF:
4136 case llvm::Triple::EABI:
4137 setABI("aapcs");
4138 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004139 case llvm::Triple::GNU:
4140 setABI("apcs-gnu");
4141 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004142 default:
4143 if (Triple.getOS() == llvm::Triple::NetBSD)
4144 setABI("apcs-gnu");
4145 else
4146 setABI("aapcs");
4147 break;
4148 }
4149 }
John McCall86353412010-08-21 22:46:04 +00004150
4151 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004152 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004153
4154 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004155 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004156 if (shouldUseInlineAtomic(getTriple()))
4157 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004158
4159 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004160 // the alignment of the zero-length bitfield is greater than the member
4161 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004162 // zero length bitfield.
4163 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004164 }
Alp Toker4925ba72014-06-07 23:30:42 +00004165 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004166 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004167 ABI = Name;
4168
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004169 // The defaults (above) are for AAPCS, check if we need to change them.
4170 //
4171 // FIXME: We need support for -meabi... we could just mangle it into the
4172 // name.
4173 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004174 setABIAPCS();
4175 return true;
4176 }
4177 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4178 setABIAAPCS();
4179 return true;
4180 }
4181 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004182 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004183
Renato Golinf5c4dec2015-05-27 13:33:00 +00004184 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004185 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004186 StringRef ArchName = getTriple().getArchName();
Renato Golinf5c4dec2015-05-27 13:33:00 +00004187 unsigned ArchKind =
4188 llvm::ARMTargetParser::parseArch(
4189 llvm::ARMTargetParser::getCanonicalArchName(ArchName));
4190 bool IsV8 = (ArchKind == llvm::ARM::AK_ARMV8A ||
4191 ArchKind == llvm::ARM::AK_ARMV8_1A);
4192
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004193 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4194 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004195 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004196 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004197 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004198 }
4199 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004200 Features["vfp4"] = true;
4201 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004202 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4203 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004204 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004205 Features["vfp4"] = true;
4206 Features["neon"] = true;
4207 Features["hwdiv"] = true;
4208 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004209 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4210 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004211 Features["fp-armv8"] = true;
4212 Features["neon"] = true;
4213 Features["hwdiv"] = true;
4214 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004215 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004216 Features["crypto"] = true;
Renato Golinf5c4dec2015-05-27 13:33:00 +00004217 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || IsV8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004218 Features["hwdiv"] = true;
4219 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004220 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004221 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004222 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004223 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004224 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004225
Craig Topper3164f332014-03-11 03:39:26 +00004226 bool handleTargetFeatures(std::vector<std::string> &Features,
4227 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004228 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004229 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004230 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004231 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004232 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004233
4234 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004235 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004236 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004237 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004238 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004239 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004240 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004241 HW_FP = HW_FP_SP | HW_FP_DP;
4242 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004243 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004244 HW_FP = HW_FP_SP | HW_FP_DP;
4245 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004246 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004247 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4248 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004249 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004250 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4251 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004252 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004253 HW_FP = HW_FP_SP | HW_FP_DP;
4254 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004255 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004256 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004257 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004258 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004259 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004260 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004261 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004262 } else if (Feature == "+fp-only-sp") {
4263 HW_FP &= ~HW_FP_DP;
4264 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004265 }
4266
Rafael Espindolaeb265472013-08-21 21:59:03 +00004267 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4268 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4269 return false;
4270 }
4271
4272 if (FPMath == FP_Neon)
4273 Features.push_back("+neonfp");
4274 else if (FPMath == FP_VFP)
4275 Features.push_back("-neonfp");
4276
Daniel Dunbar893d4752009-12-19 04:15:38 +00004277 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004278 auto Feature =
4279 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4280 if (Feature != Features.end())
4281 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004282
Rafael Espindolaeb265472013-08-21 21:59:03 +00004283 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004284 }
4285
Craig Topper3164f332014-03-11 03:39:26 +00004286 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004287 return llvm::StringSwitch<bool>(Feature)
4288 .Case("arm", true)
4289 .Case("softfloat", SoftFloat)
4290 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004291 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004292 .Case("hwdiv", HWDiv & HWDivThumb)
4293 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004294 .Default(false);
4295 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004296 // FIXME: Should we actually have some table instead of these switches?
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004297 const char *getCPUDefineSuffix(StringRef Name) const {
4298 // FIXME: Use ARMTargetParser
4299 if(Name == "generic") {
4300 auto subarch = getTriple().getSubArch();
4301 switch (subarch) {
4302 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4303 return "8_1A";
4304 default:
4305 break;
4306 }
4307 }
4308
Eric Christopher917e9522014-11-18 22:36:15 +00004309 return llvm::StringSwitch<const char *>(Name)
4310 .Cases("arm8", "arm810", "4")
4311 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4312 "4")
4313 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4314 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4315 .Case("ep9312", "4T")
4316 .Cases("arm10tdmi", "arm1020t", "5T")
4317 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4318 .Case("arm926ej-s", "5TEJ")
4319 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4320 .Cases("xscale", "iwmmxt", "5TE")
4321 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004322 .Case("arm1136jf-s", "6")
4323 .Cases("mpcorenovfp", "mpcore", "6K")
4324 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004325 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4326 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4327 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4328 "7A")
Javed Absar879d18b82015-04-09 14:12:10 +00004329 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004330 .Case("swift", "7S")
4331 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004332 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004333 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004334 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004335 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004336 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004337 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004338 const char *getCPUProfile(StringRef Name) const {
4339 if(Name == "generic") {
4340 auto subarch = getTriple().getSubArch();
4341 switch (subarch) {
4342 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4343 return "A";
4344 default:
4345 break;
4346 }
4347 }
4348
Renato Golinf05bf002015-05-27 14:15:12 +00004349 unsigned CPUArch = llvm::ARMTargetParser::parseCPUArch(Name);
4350 if (CPUArch == llvm::ARM::AK_INVALID)
4351 return "";
4352
4353 StringRef ArchName = llvm::ARMTargetParser::getArchName(CPUArch);
4354 switch(llvm::ARMTargetParser::parseArchProfile(ArchName)) {
4355 case llvm::ARM::PK_A:
4356 return "A";
4357 case llvm::ARM::PK_R:
4358 return "R";
4359 case llvm::ARM::PK_M:
4360 return "M";
4361 default:
4362 return "";
4363 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004364 }
Craig Topper3164f332014-03-11 03:39:26 +00004365 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004366 if (!getCPUDefineSuffix(Name))
4367 return false;
4368
Tim Northovere8c37212014-07-09 09:24:43 +00004369 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4370 StringRef Profile = getCPUProfile(Name);
4371 if (Profile == "M" && MaxAtomicInlineWidth) {
4372 MaxAtomicPromoteWidth = 32;
4373 MaxAtomicInlineWidth = 32;
4374 }
4375
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004376 CPU = Name;
4377 return true;
4378 }
Craig Topper3164f332014-03-11 03:39:26 +00004379 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004380 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4381 unsigned CPUArchVer) const {
4382 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4383 (CPUArch.find('M') != StringRef::npos);
4384 }
4385 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4386 unsigned CPUArchVer) const {
4387 // We check both CPUArchVer and ArchName because when only triple is
4388 // specified, the default CPU is arm1136j-s.
4389 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004390 ArchName.endswith("v8.1a") ||
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004391 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4392 }
Craig Topper3164f332014-03-11 03:39:26 +00004393 void getTargetDefines(const LangOptions &Opts,
4394 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004395 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004396 Builder.defineMacro("__arm");
4397 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004398
Chris Lattnerecd49032009-03-02 22:27:17 +00004399 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004400 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004401
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004402 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004403 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004404 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004405 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004406 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004407
4408 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004409 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004410 StringRef ArchName = getTriple().getArchName();
4411
4412 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4413 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004414 if (CPUArch[0] >= '8') {
4415 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4416 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004417 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004418
4419 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4420 // is not defined for the M-profile.
4421 // NOTE that the deffault profile is assumed to be 'A'
4422 if (CPUProfile.empty() || CPUProfile != "M")
4423 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4424
4425 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4426 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4427 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4428 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4429 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4430 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4431 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4432
4433 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4434 // instruction set such as ARM or Thumb.
4435 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4436
4437 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4438
4439 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004440 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004441 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004442
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004443 // ACLE 6.5.1 Hardware Floating Point
4444 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004445 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004446
Yi Konga44c4d72014-06-27 21:25:42 +00004447 // ACLE predefines.
4448 Builder.defineMacro("__ARM_ACLE", "200");
4449
Mike Stump9d54bd72009-04-08 02:07:04 +00004450 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004451
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004452 // FIXME: It's more complicated than this and we don't really support
4453 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004454 // Windows on ARM does not "support" interworking
4455 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004456 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004457
David Tweed8f676532012-10-25 13:33:01 +00004458 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004459 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004460 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4461 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004462 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004463 Builder.defineMacro("__ARM_PCS", "1");
4464
David Tweed8f676532012-10-25 13:33:01 +00004465 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004466 Builder.defineMacro("__ARM_PCS_VFP", "1");
4467 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004468
Daniel Dunbar893d4752009-12-19 04:15:38 +00004469 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004470 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004471
4472 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004473 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004474
4475 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004476 Builder.defineMacro("__THUMBEL__");
4477 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004478 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004479 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004480 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004481 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4482 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004483
4484 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004485 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004486
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004487 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004488 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004489 if (FPU & VFP2FPU)
4490 Builder.defineMacro("__ARM_VFPV2__");
4491 if (FPU & VFP3FPU)
4492 Builder.defineMacro("__ARM_VFPV3__");
4493 if (FPU & VFP4FPU)
4494 Builder.defineMacro("__ARM_VFPV4__");
4495 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004496
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004497 // This only gets set when Neon instructions are actually available, unlike
4498 // the VFP define, hence the soft float and arch check. This is subtly
4499 // different from gcc, we follow the intent which was that it should be set
4500 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004501 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4502 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004503 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004504 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004505
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004506 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4507 Opts.ShortWChar ? "2" : "4");
4508
4509 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4510 Opts.ShortEnums ? "1" : "4");
4511
Bernard Ogden18b57012013-10-29 09:47:51 +00004512 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004513 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004514
Tim Northover02e38602014-02-03 17:28:04 +00004515 if (Crypto)
4516 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4517
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004518 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004519 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4520 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4521 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4522 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4523 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004524
4525 bool is5EOrAbove = (CPUArchVer >= 6 ||
4526 (CPUArchVer == 5 &&
4527 CPUArch.find('E') != StringRef::npos));
4528 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4529 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4530 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004531 }
Craig Topper3164f332014-03-11 03:39:26 +00004532 void getTargetBuiltins(const Builtin::Info *&Records,
4533 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004534 Records = BuiltinInfo;
4535 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004536 }
Craig Topper3164f332014-03-11 03:39:26 +00004537 bool isCLZForZeroUndef() const override { return false; }
4538 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004539 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004540 }
Craig Topper3164f332014-03-11 03:39:26 +00004541 void getGCCRegNames(const char * const *&Names,
4542 unsigned &NumNames) const override;
4543 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4544 unsigned &NumAliases) const override;
4545 bool validateAsmConstraint(const char *&Name,
4546 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004547 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004548 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004549 case 'l': // r0-r7
4550 case 'h': // r8-r15
4551 case 'w': // VFP Floating point register single precision
4552 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004553 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004554 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004555 case 'I':
4556 case 'J':
4557 case 'K':
4558 case 'L':
4559 case 'M':
4560 // FIXME
4561 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004562 case 'Q': // A memory address that is a single base register.
4563 Info.setAllowsMemory();
4564 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004565 case 'U': // a memory reference...
4566 switch (Name[1]) {
4567 case 'q': // ...ARMV4 ldrsb
4568 case 'v': // ...VFP load/store (reg+constant offset)
4569 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004570 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004571 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004572 case 'n': // valid address for Neon doubleword vector load/store
4573 case 'm': // valid address for Neon element and structure load/store
4574 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004575 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004576 Info.setAllowsMemory();
4577 Name++;
4578 return true;
4579 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004580 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004581 return false;
4582 }
Craig Topper3164f332014-03-11 03:39:26 +00004583 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004584 std::string R;
4585 switch (*Constraint) {
4586 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004587 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004588 Constraint++;
4589 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004590 case 'p': // 'p' should be translated to 'r' by default.
4591 R = std::string("r");
4592 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004593 default:
4594 return std::string(1, *Constraint);
4595 }
4596 return R;
4597 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004598 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004599 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004600 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004601 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004602 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004603
Bill Wendling9d1ee112012-10-25 23:28:48 +00004604 // Strip off constraint modifiers.
4605 while (Constraint[0] == '=' ||
4606 Constraint[0] == '+' ||
4607 Constraint[0] == '&')
4608 Constraint = Constraint.substr(1);
4609
4610 switch (Constraint[0]) {
4611 default: break;
4612 case 'r': {
4613 switch (Modifier) {
4614 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004615 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004616 case 'q':
4617 // A register of size 32 cannot fit a vector type.
4618 return false;
4619 }
4620 }
4621 }
4622
4623 return true;
4624 }
Craig Topper3164f332014-03-11 03:39:26 +00004625 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004626 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004627 return "";
4628 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004629
Craig Topper3164f332014-03-11 03:39:26 +00004630 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004631 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4632 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004633
Craig Topper3164f332014-03-11 03:39:26 +00004634 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004635 if (RegNo == 0) return 0;
4636 if (RegNo == 1) return 1;
4637 return -1;
4638 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004639};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004640
Rafael Espindolaeb265472013-08-21 21:59:03 +00004641bool ARMTargetInfo::setFPMath(StringRef Name) {
4642 if (Name == "neon") {
4643 FPMath = FP_Neon;
4644 return true;
4645 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4646 Name == "vfp4") {
4647 FPMath = FP_VFP;
4648 return true;
4649 }
4650 return false;
4651}
4652
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004653const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004654 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004655 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004656 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4657
4658 // Float registers
4659 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4660 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4661 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004662 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004663
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004664 // Double registers
4665 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4666 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004667 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4668 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004669
4670 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004671 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4672 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004673};
4674
4675void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004676 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004677 Names = GCCRegNames;
4678 NumNames = llvm::array_lengthof(GCCRegNames);
4679}
4680
4681const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004682 { { "a1" }, "r0" },
4683 { { "a2" }, "r1" },
4684 { { "a3" }, "r2" },
4685 { { "a4" }, "r3" },
4686 { { "v1" }, "r4" },
4687 { { "v2" }, "r5" },
4688 { { "v3" }, "r6" },
4689 { { "v4" }, "r7" },
4690 { { "v5" }, "r8" },
4691 { { "v6", "rfp" }, "r9" },
4692 { { "sl" }, "r10" },
4693 { { "fp" }, "r11" },
4694 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004695 { { "r13" }, "sp" },
4696 { { "r14" }, "lr" },
4697 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004698 // The S, D and Q registers overlap, but aren't really aliases; we
4699 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004700};
4701
4702void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4703 unsigned &NumAliases) const {
4704 Aliases = GCCRegAliases;
4705 NumAliases = llvm::array_lengthof(GCCRegAliases);
4706}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004707
4708const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004709#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004710#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004711 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004712#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004713
4714#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004715#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004716#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4717 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004718#include "clang/Basic/BuiltinsARM.def"
4719};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004720
4721class ARMleTargetInfo : public ARMTargetInfo {
4722public:
4723 ARMleTargetInfo(const llvm::Triple &Triple)
4724 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004725 void getTargetDefines(const LangOptions &Opts,
4726 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004727 Builder.defineMacro("__ARMEL__");
4728 ARMTargetInfo::getTargetDefines(Opts, Builder);
4729 }
4730};
4731
4732class ARMbeTargetInfo : public ARMTargetInfo {
4733public:
4734 ARMbeTargetInfo(const llvm::Triple &Triple)
4735 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004736 void getTargetDefines(const LangOptions &Opts,
4737 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004738 Builder.defineMacro("__ARMEB__");
4739 Builder.defineMacro("__ARM_BIG_ENDIAN");
4740 ARMTargetInfo::getTargetDefines(Opts, Builder);
4741 }
4742};
Chris Lattner17df24e2008-04-21 18:56:49 +00004743
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004744class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4745 const llvm::Triple Triple;
4746public:
4747 WindowsARMTargetInfo(const llvm::Triple &Triple)
4748 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4749 TLSSupported = false;
4750 WCharType = UnsignedShort;
4751 SizeType = UnsignedInt;
4752 UserLabelPrefix = "";
4753 }
4754 void getVisualStudioDefines(const LangOptions &Opts,
4755 MacroBuilder &Builder) const {
4756 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4757
4758 // FIXME: this is invalid for WindowsCE
4759 Builder.defineMacro("_M_ARM_NT", "1");
4760 Builder.defineMacro("_M_ARMT", "_M_ARM");
4761 Builder.defineMacro("_M_THUMB", "_M_ARM");
4762
4763 assert((Triple.getArch() == llvm::Triple::arm ||
4764 Triple.getArch() == llvm::Triple::thumb) &&
4765 "invalid architecture for Windows ARM target info");
4766 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4767 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4768
4769 // TODO map the complete set of values
4770 // 31: VFPv3 40: VFPv4
4771 Builder.defineMacro("_M_ARM_FP", "31");
4772 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004773 BuiltinVaListKind getBuiltinVaListKind() const override {
4774 return TargetInfo::CharPtrBuiltinVaList;
4775 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004776};
4777
4778// Windows ARM + Itanium C++ ABI Target
4779class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4780public:
4781 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4782 : WindowsARMTargetInfo(Triple) {
4783 TheCXXABI.set(TargetCXXABI::GenericARM);
4784 }
4785
4786 void getTargetDefines(const LangOptions &Opts,
4787 MacroBuilder &Builder) const override {
4788 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4789
4790 if (Opts.MSVCCompat)
4791 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4792 }
4793};
4794
4795// Windows ARM, MS (C++) ABI
4796class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4797public:
4798 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4799 : WindowsARMTargetInfo(Triple) {
4800 TheCXXABI.set(TargetCXXABI::Microsoft);
4801 }
4802
4803 void getTargetDefines(const LangOptions &Opts,
4804 MacroBuilder &Builder) const override {
4805 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4806 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4807 }
4808};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004809
Mike Stump11289f42009-09-09 15:08:12 +00004810class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004811 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004812protected:
Craig Topper3164f332014-03-11 03:39:26 +00004813 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4814 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004815 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004816 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004817
Torok Edwinb2b37c62009-06-30 17:10:35 +00004818public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004819 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004820 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004821 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004822 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004823 // FIXME: This should be based off of the target features in
4824 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004825 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004826
4827 // Darwin on iOS uses a variant of the ARM C++ ABI.
4828 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004829 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004830};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004831
Tim Northover573cbee2014-05-24 12:52:07 +00004832class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004833 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004834 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4835 static const char *const GCCRegNames[];
4836
James Molloy75f5f9e2014-04-16 15:33:48 +00004837 enum FPUModeEnum {
4838 FPUMode,
4839 NeonMode
4840 };
4841
4842 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004843 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004844 unsigned Crypto;
4845
Tim Northovera2ee4332014-03-29 15:09:45 +00004846 static const Builtin::Info BuiltinInfo[];
4847
4848 std::string ABI;
4849
4850public:
Tim Northover573cbee2014-05-24 12:52:07 +00004851 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004852 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004853
4854 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4855 WCharType = SignedInt;
4856
4857 // NetBSD apparently prefers consistency across ARM targets to consistency
4858 // across 64-bit targets.
4859 Int64Type = SignedLongLong;
4860 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004861 } else {
4862 WCharType = UnsignedInt;
4863 Int64Type = SignedLong;
4864 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004865 }
4866
Tim Northovera2ee4332014-03-29 15:09:45 +00004867 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004868 MaxVectorAlign = 128;
4869 RegParmMax = 8;
4870 MaxAtomicInlineWidth = 128;
4871 MaxAtomicPromoteWidth = 128;
4872
Tim Northovera6a19f12015-02-06 01:25:07 +00004873 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004874 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4875
Tim Northovera2ee4332014-03-29 15:09:45 +00004876 // {} in inline assembly are neon specifiers, not assembly variant
4877 // specifiers.
4878 NoAsmVariants = true;
4879
Tim Northover7ad87af2015-01-16 18:44:04 +00004880 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4881 // contributes to the alignment of the containing aggregate in the same way
4882 // a plain (non bit-field) member of that type would, without exception for
4883 // zero-sized or anonymous bit-fields."
4884 UseBitFieldTypeAlignment = true;
4885 UseZeroLengthBitfieldAlignment = true;
4886
Tim Northover573cbee2014-05-24 12:52:07 +00004887 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004888 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4889 }
4890
Alp Toker4925ba72014-06-07 23:30:42 +00004891 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004892 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004893 if (Name != "aapcs" && Name != "darwinpcs")
4894 return false;
4895
4896 ABI = Name;
4897 return true;
4898 }
4899
David Blaikie1cbb9712014-11-14 19:09:44 +00004900 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004901 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004902 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004903 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004904 .Case("cyclone", true)
4905 .Default(false);
4906 return CPUKnown;
4907 }
4908
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004909 void getTargetDefines(const LangOptions &Opts,
4910 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004911 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004912 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004913
4914 // Target properties.
4915 Builder.defineMacro("_LP64");
4916 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004917
4918 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4919 Builder.defineMacro("__ARM_ACLE", "200");
4920 Builder.defineMacro("__ARM_ARCH", "8");
4921 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4922
4923 Builder.defineMacro("__ARM_64BIT_STATE");
4924 Builder.defineMacro("__ARM_PCS_AAPCS64");
4925 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4926
4927 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4928 Builder.defineMacro("__ARM_FEATURE_CLZ");
4929 Builder.defineMacro("__ARM_FEATURE_FMA");
4930 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004931 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4932 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4933 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4934 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004935
4936 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4937
4938 // 0xe implies support for half, single and double precision operations.
4939 Builder.defineMacro("__ARM_FP", "0xe");
4940
4941 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4942 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4943 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4944
4945 if (Opts.FastMath || Opts.FiniteMathOnly)
4946 Builder.defineMacro("__ARM_FP_FAST");
4947
Richard Smithab506ad2014-10-20 23:26:58 +00004948 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004949 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4950
4951 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4952
4953 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4954 Opts.ShortEnums ? "1" : "4");
4955
James Molloy75f5f9e2014-04-16 15:33:48 +00004956 if (FPU == NeonMode) {
4957 Builder.defineMacro("__ARM_NEON");
4958 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004959 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004960 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004961
Bradley Smith418c5932014-05-02 15:17:51 +00004962 if (CRC)
4963 Builder.defineMacro("__ARM_FEATURE_CRC32");
4964
James Molloy75f5f9e2014-04-16 15:33:48 +00004965 if (Crypto)
4966 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00004967
4968 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
4969 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4970 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4971 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4972 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00004973 }
4974
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004975 void getTargetBuiltins(const Builtin::Info *&Records,
4976 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004977 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004978 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004979 }
4980
David Blaikie1cbb9712014-11-14 19:09:44 +00004981 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004982 return Feature == "aarch64" ||
4983 Feature == "arm64" ||
4984 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004985 }
4986
James Molloy5e73df52014-04-16 15:06:20 +00004987 bool handleTargetFeatures(std::vector<std::string> &Features,
4988 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004989 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004990 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004991 Crypto = 0;
4992 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4993 if (Features[i] == "+neon")
4994 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004995 if (Features[i] == "+crc")
4996 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004997 if (Features[i] == "+crypto")
4998 Crypto = 1;
4999 }
5000
James Molloy5e73df52014-04-16 15:06:20 +00005001 setDescriptionString();
5002
5003 return true;
5004 }
5005
David Blaikie1cbb9712014-11-14 19:09:44 +00005006 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005007
David Blaikie1cbb9712014-11-14 19:09:44 +00005008 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005009 return TargetInfo::AArch64ABIBuiltinVaList;
5010 }
5011
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005012 void getGCCRegNames(const char *const *&Names,
5013 unsigned &NumNames) const override;
5014 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5015 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005016
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005017 bool validateAsmConstraint(const char *&Name,
5018 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005019 switch (*Name) {
5020 default:
5021 return false;
5022 case 'w': // Floating point and SIMD registers (V0-V31)
5023 Info.setAllowsRegister();
5024 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005025 case 'I': // Constant that can be used with an ADD instruction
5026 case 'J': // Constant that can be used with a SUB instruction
5027 case 'K': // Constant that can be used with a 32-bit logical instruction
5028 case 'L': // Constant that can be used with a 64-bit logical instruction
5029 case 'M': // Constant that can be used as a 32-bit MOV immediate
5030 case 'N': // Constant that can be used as a 64-bit MOV immediate
5031 case 'Y': // Floating point constant zero
5032 case 'Z': // Integer constant zero
5033 return true;
5034 case 'Q': // A memory reference with base register and no offset
5035 Info.setAllowsMemory();
5036 return true;
5037 case 'S': // A symbolic address
5038 Info.setAllowsRegister();
5039 return true;
5040 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005041 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5042 // Utf: A memory address suitable for ldp/stp in TF mode.
5043 // Usa: An absolute symbolic address.
5044 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5045 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005046 case 'z': // Zero register, wzr or xzr
5047 Info.setAllowsRegister();
5048 return true;
5049 case 'x': // Floating point and SIMD registers (V0-V15)
5050 Info.setAllowsRegister();
5051 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005052 }
5053 return false;
5054 }
5055
Akira Hatanaka987f1862014-08-22 06:05:21 +00005056 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005057 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005058 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005059 // Strip off constraint modifiers.
5060 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5061 Constraint = Constraint.substr(1);
5062
5063 switch (Constraint[0]) {
5064 default:
5065 return true;
5066 case 'z':
5067 case 'r': {
5068 switch (Modifier) {
5069 case 'x':
5070 case 'w':
5071 // For now assume that the person knows what they're
5072 // doing with the modifier.
5073 return true;
5074 default:
5075 // By default an 'r' constraint will be in the 'x'
5076 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005077 if (Size == 64)
5078 return true;
5079
5080 SuggestedModifier = "w";
5081 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005082 }
5083 }
5084 }
5085 }
5086
David Blaikie1cbb9712014-11-14 19:09:44 +00005087 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005088
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005089 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005090 if (RegNo == 0)
5091 return 0;
5092 if (RegNo == 1)
5093 return 1;
5094 return -1;
5095 }
5096};
5097
Tim Northover573cbee2014-05-24 12:52:07 +00005098const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005099 // 32-bit Integer registers
5100 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5101 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5102 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5103
5104 // 64-bit Integer registers
5105 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5106 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5107 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5108
5109 // 32-bit floating point regsisters
5110 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5111 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5112 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5113
5114 // 64-bit floating point regsisters
5115 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5116 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5117 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5118
5119 // Vector registers
5120 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5121 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5122 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5123};
5124
Tim Northover573cbee2014-05-24 12:52:07 +00005125void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005126 unsigned &NumNames) const {
5127 Names = GCCRegNames;
5128 NumNames = llvm::array_lengthof(GCCRegNames);
5129}
5130
Tim Northover573cbee2014-05-24 12:52:07 +00005131const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005132 { { "w31" }, "wsp" },
5133 { { "x29" }, "fp" },
5134 { { "x30" }, "lr" },
5135 { { "x31" }, "sp" },
5136 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5137 // don't want to substitute one of these for a different-sized one.
5138};
5139
Tim Northover573cbee2014-05-24 12:52:07 +00005140void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005141 unsigned &NumAliases) const {
5142 Aliases = GCCRegAliases;
5143 NumAliases = llvm::array_lengthof(GCCRegAliases);
5144}
5145
Tim Northover573cbee2014-05-24 12:52:07 +00005146const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005147#define BUILTIN(ID, TYPE, ATTRS) \
5148 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5149#include "clang/Basic/BuiltinsNEON.def"
5150
5151#define BUILTIN(ID, TYPE, ATTRS) \
5152 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005153#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005154};
James Molloy5e73df52014-04-16 15:06:20 +00005155
Tim Northover573cbee2014-05-24 12:52:07 +00005156class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005157 void setDescriptionString() override {
5158 if (getTriple().isOSBinFormatMachO())
5159 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5160 else
5161 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5162 }
5163
5164public:
Tim Northover573cbee2014-05-24 12:52:07 +00005165 AArch64leTargetInfo(const llvm::Triple &Triple)
5166 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005167 BigEndian = false;
5168 }
5169 void getTargetDefines(const LangOptions &Opts,
5170 MacroBuilder &Builder) const override {
5171 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005172 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005173 }
5174};
5175
Tim Northover573cbee2014-05-24 12:52:07 +00005176class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005177 void setDescriptionString() override {
5178 assert(!getTriple().isOSBinFormatMachO());
5179 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5180 }
5181
5182public:
Tim Northover573cbee2014-05-24 12:52:07 +00005183 AArch64beTargetInfo(const llvm::Triple &Triple)
5184 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005185 void getTargetDefines(const LangOptions &Opts,
5186 MacroBuilder &Builder) const override {
5187 Builder.defineMacro("__AARCH64EB__");
5188 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5189 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005190 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005191 }
5192};
Tim Northovera2ee4332014-03-29 15:09:45 +00005193
Tim Northover573cbee2014-05-24 12:52:07 +00005194class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005195protected:
5196 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5197 MacroBuilder &Builder) const override {
5198 Builder.defineMacro("__AARCH64_SIMD__");
5199 Builder.defineMacro("__ARM64_ARCH_8__");
5200 Builder.defineMacro("__ARM_NEON__");
5201 Builder.defineMacro("__LITTLE_ENDIAN__");
5202 Builder.defineMacro("__REGISTER_PREFIX__", "");
5203 Builder.defineMacro("__arm64", "1");
5204 Builder.defineMacro("__arm64__", "1");
5205
5206 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5207 }
5208
Tim Northovera2ee4332014-03-29 15:09:45 +00005209public:
Tim Northover573cbee2014-05-24 12:52:07 +00005210 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5211 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005212 Int64Type = SignedLongLong;
5213 WCharType = SignedInt;
5214 UseSignedCharForObjCBool = false;
5215
Tim Northovera6a19f12015-02-06 01:25:07 +00005216 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005217 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5218
5219 TheCXXABI.set(TargetCXXABI::iOS64);
5220 }
5221
David Blaikie1cbb9712014-11-14 19:09:44 +00005222 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005223 return TargetInfo::CharPtrBuiltinVaList;
5224 }
5225};
Tim Northovera2ee4332014-03-29 15:09:45 +00005226
Tony Linthicum76329bf2011-12-12 21:14:55 +00005227// Hexagon abstract base class
5228class HexagonTargetInfo : public TargetInfo {
5229 static const Builtin::Info BuiltinInfo[];
5230 static const char * const GCCRegNames[];
5231 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5232 std::string CPU;
5233public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005234 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005235 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005236 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005237
5238 // {} in inline assembly are packet specifiers, not assembly variant
5239 // specifiers.
5240 NoAsmVariants = true;
5241 }
5242
Craig Topper3164f332014-03-11 03:39:26 +00005243 void getTargetBuiltins(const Builtin::Info *&Records,
5244 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005245 Records = BuiltinInfo;
5246 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5247 }
5248
Craig Topper3164f332014-03-11 03:39:26 +00005249 bool validateAsmConstraint(const char *&Name,
5250 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005251 return true;
5252 }
5253
Craig Topper3164f332014-03-11 03:39:26 +00005254 void getTargetDefines(const LangOptions &Opts,
5255 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005256
Craig Topper3164f332014-03-11 03:39:26 +00005257 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005258 return Feature == "hexagon";
5259 }
Craig Topper3164f332014-03-11 03:39:26 +00005260
5261 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005262 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005263 }
Craig Topper3164f332014-03-11 03:39:26 +00005264 void getGCCRegNames(const char * const *&Names,
5265 unsigned &NumNames) const override;
5266 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5267 unsigned &NumAliases) const override;
5268 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005269 return "";
5270 }
Sebastian Pop86500282012-01-13 20:37:10 +00005271
5272 static const char *getHexagonCPUSuffix(StringRef Name) {
5273 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005274 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005275 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005276 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005277 }
5278
Craig Topper3164f332014-03-11 03:39:26 +00005279 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005280 if (!getHexagonCPUSuffix(Name))
5281 return false;
5282
Tony Linthicum76329bf2011-12-12 21:14:55 +00005283 CPU = Name;
5284 return true;
5285 }
5286};
5287
5288void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5289 MacroBuilder &Builder) const {
5290 Builder.defineMacro("qdsp6");
5291 Builder.defineMacro("__qdsp6", "1");
5292 Builder.defineMacro("__qdsp6__", "1");
5293
5294 Builder.defineMacro("hexagon");
5295 Builder.defineMacro("__hexagon", "1");
5296 Builder.defineMacro("__hexagon__", "1");
5297
5298 if(CPU == "hexagonv1") {
5299 Builder.defineMacro("__HEXAGON_V1__");
5300 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5301 if(Opts.HexagonQdsp6Compat) {
5302 Builder.defineMacro("__QDSP6_V1__");
5303 Builder.defineMacro("__QDSP6_ARCH__", "1");
5304 }
5305 }
5306 else if(CPU == "hexagonv2") {
5307 Builder.defineMacro("__HEXAGON_V2__");
5308 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5309 if(Opts.HexagonQdsp6Compat) {
5310 Builder.defineMacro("__QDSP6_V2__");
5311 Builder.defineMacro("__QDSP6_ARCH__", "2");
5312 }
5313 }
5314 else if(CPU == "hexagonv3") {
5315 Builder.defineMacro("__HEXAGON_V3__");
5316 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5317 if(Opts.HexagonQdsp6Compat) {
5318 Builder.defineMacro("__QDSP6_V3__");
5319 Builder.defineMacro("__QDSP6_ARCH__", "3");
5320 }
5321 }
5322 else if(CPU == "hexagonv4") {
5323 Builder.defineMacro("__HEXAGON_V4__");
5324 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5325 if(Opts.HexagonQdsp6Compat) {
5326 Builder.defineMacro("__QDSP6_V4__");
5327 Builder.defineMacro("__QDSP6_ARCH__", "4");
5328 }
5329 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005330 else if(CPU == "hexagonv5") {
5331 Builder.defineMacro("__HEXAGON_V5__");
5332 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5333 if(Opts.HexagonQdsp6Compat) {
5334 Builder.defineMacro("__QDSP6_V5__");
5335 Builder.defineMacro("__QDSP6_ARCH__", "5");
5336 }
5337 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005338}
5339
5340const char * const HexagonTargetInfo::GCCRegNames[] = {
5341 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5342 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5343 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5344 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5345 "p0", "p1", "p2", "p3",
5346 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5347};
5348
5349void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5350 unsigned &NumNames) const {
5351 Names = GCCRegNames;
5352 NumNames = llvm::array_lengthof(GCCRegNames);
5353}
5354
5355
5356const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5357 { { "sp" }, "r29" },
5358 { { "fp" }, "r30" },
5359 { { "lr" }, "r31" },
5360 };
5361
5362void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5363 unsigned &NumAliases) const {
5364 Aliases = GCCRegAliases;
5365 NumAliases = llvm::array_lengthof(GCCRegAliases);
5366}
5367
5368
5369const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5370#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5371#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5372 ALL_LANGUAGES },
5373#include "clang/Basic/BuiltinsHexagon.def"
5374};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005375
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005376// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5377class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005378 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5379 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005380 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005381public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005382 SparcTargetInfo(const llvm::Triple &Triple)
5383 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005384
Craig Topper3164f332014-03-11 03:39:26 +00005385 bool handleTargetFeatures(std::vector<std::string> &Features,
5386 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005387 // The backend doesn't actually handle soft float yet, but in case someone
5388 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005389 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5390 if (Feature != Features.end()) {
5391 SoftFloat = true;
5392 Features.erase(Feature);
5393 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005394 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005395 }
Craig Topper3164f332014-03-11 03:39:26 +00005396 void getTargetDefines(const LangOptions &Opts,
5397 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005398 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005399 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005400
5401 if (SoftFloat)
5402 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005403 }
Craig Topper3164f332014-03-11 03:39:26 +00005404
5405 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005406 return llvm::StringSwitch<bool>(Feature)
5407 .Case("softfloat", SoftFloat)
5408 .Case("sparc", true)
5409 .Default(false);
5410 }
Craig Topper3164f332014-03-11 03:39:26 +00005411
5412 void getTargetBuiltins(const Builtin::Info *&Records,
5413 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005414 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005415 }
Craig Topper3164f332014-03-11 03:39:26 +00005416 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005417 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005418 }
Craig Topper3164f332014-03-11 03:39:26 +00005419 void getGCCRegNames(const char * const *&Names,
5420 unsigned &NumNames) const override;
5421 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5422 unsigned &NumAliases) const override;
5423 bool validateAsmConstraint(const char *&Name,
5424 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005425 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005426 switch (*Name) {
5427 case 'I': // Signed 13-bit constant
5428 case 'J': // Zero
5429 case 'K': // 32-bit constant with the low 12 bits clear
5430 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5431 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5432 case 'N': // Same as 'K' but zext (required for SIMode)
5433 case 'O': // The constant 4096
5434 return true;
5435 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005436 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005437 }
Craig Topper3164f332014-03-11 03:39:26 +00005438 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005439 // FIXME: Implement!
5440 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005441 }
5442};
5443
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005444const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005445 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5446 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5447 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5448 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5449};
5450
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005451void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5452 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005453 Names = GCCRegNames;
5454 NumNames = llvm::array_lengthof(GCCRegNames);
5455}
5456
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005457const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005458 { { "g0" }, "r0" },
5459 { { "g1" }, "r1" },
5460 { { "g2" }, "r2" },
5461 { { "g3" }, "r3" },
5462 { { "g4" }, "r4" },
5463 { { "g5" }, "r5" },
5464 { { "g6" }, "r6" },
5465 { { "g7" }, "r7" },
5466 { { "o0" }, "r8" },
5467 { { "o1" }, "r9" },
5468 { { "o2" }, "r10" },
5469 { { "o3" }, "r11" },
5470 { { "o4" }, "r12" },
5471 { { "o5" }, "r13" },
5472 { { "o6", "sp" }, "r14" },
5473 { { "o7" }, "r15" },
5474 { { "l0" }, "r16" },
5475 { { "l1" }, "r17" },
5476 { { "l2" }, "r18" },
5477 { { "l3" }, "r19" },
5478 { { "l4" }, "r20" },
5479 { { "l5" }, "r21" },
5480 { { "l6" }, "r22" },
5481 { { "l7" }, "r23" },
5482 { { "i0" }, "r24" },
5483 { { "i1" }, "r25" },
5484 { { "i2" }, "r26" },
5485 { { "i3" }, "r27" },
5486 { { "i4" }, "r28" },
5487 { { "i5" }, "r29" },
5488 { { "i6", "fp" }, "r30" },
5489 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005490};
5491
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005492void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5493 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005494 Aliases = GCCRegAliases;
5495 NumAliases = llvm::array_lengthof(GCCRegAliases);
5496}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005497
5498// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5499class SparcV8TargetInfo : public SparcTargetInfo {
5500public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005501 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005502 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005503 }
5504
Craig Topper3164f332014-03-11 03:39:26 +00005505 void getTargetDefines(const LangOptions &Opts,
5506 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005507 SparcTargetInfo::getTargetDefines(Opts, Builder);
5508 Builder.defineMacro("__sparcv8");
5509 }
5510};
5511
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005512// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5513class SparcV8elTargetInfo : public SparcV8TargetInfo {
5514 public:
5515 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
5516 DescriptionString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
5517 BigEndian = false;
5518 }
5519};
5520
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005521// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5522class SparcV9TargetInfo : public SparcTargetInfo {
5523public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005524 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005525 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005526 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005527 // This is an LP64 platform.
5528 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005529
5530 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005531 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005532 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005533 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005534 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005535 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005536
5537 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5538 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5539 LongDoubleWidth = 128;
5540 LongDoubleAlign = 128;
5541 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005542 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005543 }
5544
Craig Topper3164f332014-03-11 03:39:26 +00005545 void getTargetDefines(const LangOptions &Opts,
5546 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005547 SparcTargetInfo::getTargetDefines(Opts, Builder);
5548 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005549 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005550 // Solaris doesn't need these variants, but the BSDs do.
5551 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005552 Builder.defineMacro("__sparc64__");
5553 Builder.defineMacro("__sparc_v9__");
5554 Builder.defineMacro("__sparcv9__");
5555 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005556 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005557
Craig Topper3164f332014-03-11 03:39:26 +00005558 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005559 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5560 .Case("v9", true)
5561 .Case("ultrasparc", true)
5562 .Case("ultrasparc3", true)
5563 .Case("niagara", true)
5564 .Case("niagara2", true)
5565 .Case("niagara3", true)
5566 .Case("niagara4", true)
5567 .Default(false);
5568
5569 // No need to store the CPU yet. There aren't any CPU-specific
5570 // macros to define.
5571 return CPUKnown;
5572 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005573};
5574
Torok Edwinb2b37c62009-06-30 17:10:35 +00005575class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005576public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005577 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5578 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005579 SizeType = UnsignedInt;
5580 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005581 }
5582};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005583
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005584class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005585 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005586 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005587 std::string CPU;
5588 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005589 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005590
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005591public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005592 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005593 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005594 IntMaxType = SignedLong;
5595 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005596 TLSSupported = true;
5597 IntWidth = IntAlign = 32;
5598 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5599 PointerWidth = PointerAlign = 64;
5600 LongDoubleWidth = 128;
5601 LongDoubleAlign = 64;
5602 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005603 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005604 MinGlobalAlign = 16;
5605 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5606 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5607 }
5608 void getTargetDefines(const LangOptions &Opts,
5609 MacroBuilder &Builder) const override {
5610 Builder.defineMacro("__s390__");
5611 Builder.defineMacro("__s390x__");
5612 Builder.defineMacro("__zarch__");
5613 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005614 if (HasTransactionalExecution)
5615 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005616 }
5617 void getTargetBuiltins(const Builtin::Info *&Records,
5618 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005619 Records = BuiltinInfo;
5620 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005621 }
5622
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005623 void getGCCRegNames(const char *const *&Names,
5624 unsigned &NumNames) const override;
5625 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5626 unsigned &NumAliases) const override {
5627 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005628 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005629 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005630 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005631 bool validateAsmConstraint(const char *&Name,
5632 TargetInfo::ConstraintInfo &info) const override;
5633 const char *getClobbers() const override {
5634 // FIXME: Is this really right?
5635 return "";
5636 }
5637 BuiltinVaListKind getBuiltinVaListKind() const override {
5638 return TargetInfo::SystemZBuiltinVaList;
5639 }
5640 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005641 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005642 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5643 .Case("z10", true)
5644 .Case("z196", true)
5645 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005646 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005647 .Default(false);
5648
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005649 return CPUKnown;
5650 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005651 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5652 if (CPU == "zEC12")
5653 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005654 if (CPU == "z13") {
5655 Features["transactional-execution"] = true;
5656 Features["vector"] = true;
5657 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005658 }
5659
5660 bool handleTargetFeatures(std::vector<std::string> &Features,
5661 DiagnosticsEngine &Diags) override {
5662 HasTransactionalExecution = false;
5663 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5664 if (Features[i] == "+transactional-execution")
5665 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005666 if (Features[i] == "+vector")
5667 HasVector = true;
5668 }
5669 // If we use the vector ABI, vector types are 64-bit aligned.
5670 if (HasVector) {
5671 MaxVectorAlign = 64;
5672 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5673 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005674 }
5675 return true;
5676 }
5677
5678 bool hasFeature(StringRef Feature) const override {
5679 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005680 .Case("systemz", true)
5681 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005682 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005683 .Default(false);
5684 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005685
5686 StringRef getABI() const override {
5687 if (HasVector)
5688 return "vector";
5689 return "";
5690 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005691};
5692
5693const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5694#define BUILTIN(ID, TYPE, ATTRS) \
5695 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5696#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005697};
5698
5699const char *const SystemZTargetInfo::GCCRegNames[] = {
5700 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5701 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5702 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5703 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5704};
5705
5706void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5707 unsigned &NumNames) const {
5708 Names = GCCRegNames;
5709 NumNames = llvm::array_lengthof(GCCRegNames);
5710}
5711
5712bool SystemZTargetInfo::
5713validateAsmConstraint(const char *&Name,
5714 TargetInfo::ConstraintInfo &Info) const {
5715 switch (*Name) {
5716 default:
5717 return false;
5718
5719 case 'a': // Address register
5720 case 'd': // Data register (equivalent to 'r')
5721 case 'f': // Floating-point register
5722 Info.setAllowsRegister();
5723 return true;
5724
5725 case 'I': // Unsigned 8-bit constant
5726 case 'J': // Unsigned 12-bit constant
5727 case 'K': // Signed 16-bit constant
5728 case 'L': // Signed 20-bit displacement (on all targets we support)
5729 case 'M': // 0x7fffffff
5730 return true;
5731
5732 case 'Q': // Memory with base and unsigned 12-bit displacement
5733 case 'R': // Likewise, plus an index
5734 case 'S': // Memory with base and signed 20-bit displacement
5735 case 'T': // Likewise, plus an index
5736 Info.setAllowsMemory();
5737 return true;
5738 }
5739}
Ulrich Weigand47445072013-05-06 16:26:41 +00005740
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005741 class MSP430TargetInfo : public TargetInfo {
5742 static const char * const GCCRegNames[];
5743 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005744 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005745 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005746 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005747 IntWidth = 16; IntAlign = 16;
5748 LongWidth = 32; LongLongWidth = 64;
5749 LongAlign = LongLongAlign = 16;
5750 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005751 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005752 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005753 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005754 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005755 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005756 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005757 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005758 }
5759 void getTargetDefines(const LangOptions &Opts,
5760 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005761 Builder.defineMacro("MSP430");
5762 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005763 // FIXME: defines for different 'flavours' of MCU
5764 }
Craig Topper3164f332014-03-11 03:39:26 +00005765 void getTargetBuiltins(const Builtin::Info *&Records,
5766 unsigned &NumRecords) const override {
5767 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005768 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005769 NumRecords = 0;
5770 }
Craig Topper3164f332014-03-11 03:39:26 +00005771 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005772 return Feature == "msp430";
5773 }
Craig Topper3164f332014-03-11 03:39:26 +00005774 void getGCCRegNames(const char * const *&Names,
5775 unsigned &NumNames) const override;
5776 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5777 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005778 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005779 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005780 NumAliases = 0;
5781 }
Eric Christopher917e9522014-11-18 22:36:15 +00005782 bool
5783 validateAsmConstraint(const char *&Name,
5784 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005785 // FIXME: implement
5786 switch (*Name) {
5787 case 'K': // the constant 1
5788 case 'L': // constant -1^20 .. 1^19
5789 case 'M': // constant 1-4:
5790 return true;
5791 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005792 // No target constraints for now.
5793 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005794 }
Craig Topper3164f332014-03-11 03:39:26 +00005795 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005796 // FIXME: Is this really right?
5797 return "";
5798 }
Craig Topper3164f332014-03-11 03:39:26 +00005799 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005800 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005801 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005802 }
5803 };
5804
5805 const char * const MSP430TargetInfo::GCCRegNames[] = {
5806 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5807 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5808 };
5809
5810 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5811 unsigned &NumNames) const {
5812 Names = GCCRegNames;
5813 NumNames = llvm::array_lengthof(GCCRegNames);
5814 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005815
Mike Stump11289f42009-09-09 15:08:12 +00005816 // LLVM and Clang cannot be used directly to output native binaries for
5817 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005818 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005819 //
5820 // TCE uses the llvm bitcode as input and uses it for generating customized
5821 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005822 // publicly available in http://tce.cs.tut.fi
5823
Eli Friedman1f191002011-10-07 19:51:42 +00005824 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5825 3, // opencl_global
5826 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005827 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005828 // FIXME: generic has to be added to the target
5829 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005830 0, // cuda_device
5831 0, // cuda_constant
5832 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005833 };
5834
Eli Friedmana9c3d712009-08-19 20:47:07 +00005835 class TCETargetInfo : public TargetInfo{
5836 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005837 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005838 TLSSupported = false;
5839 IntWidth = 32;
5840 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005841 PointerWidth = 32;
5842 IntAlign = 32;
5843 LongAlign = LongLongAlign = 32;
5844 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005845 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005846 SizeType = UnsignedInt;
5847 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005848 IntPtrType = SignedInt;
5849 PtrDiffType = SignedInt;
5850 FloatWidth = 32;
5851 FloatAlign = 32;
5852 DoubleWidth = 32;
5853 DoubleAlign = 32;
5854 LongDoubleWidth = 32;
5855 LongDoubleAlign = 32;
5856 FloatFormat = &llvm::APFloat::IEEEsingle;
5857 DoubleFormat = &llvm::APFloat::IEEEsingle;
5858 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005859 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5860 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005861 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005862 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005863 }
5864
Craig Topper3164f332014-03-11 03:39:26 +00005865 void getTargetDefines(const LangOptions &Opts,
5866 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005867 DefineStd(Builder, "tce", Opts);
5868 Builder.defineMacro("__TCE__");
5869 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005870 }
Craig Topper3164f332014-03-11 03:39:26 +00005871 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005872 return Feature == "tce";
5873 }
Craig Topper3164f332014-03-11 03:39:26 +00005874
5875 void getTargetBuiltins(const Builtin::Info *&Records,
5876 unsigned &NumRecords) const override {}
5877 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005878 return "";
5879 }
Craig Topper3164f332014-03-11 03:39:26 +00005880 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005881 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005882 }
Craig Topper3164f332014-03-11 03:39:26 +00005883 void getGCCRegNames(const char * const *&Names,
5884 unsigned &NumNames) const override {}
5885 bool validateAsmConstraint(const char *&Name,
5886 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005887 return true;
5888 }
Craig Topper3164f332014-03-11 03:39:26 +00005889 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5890 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005891 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005892
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005893class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005894 virtual void setDescriptionString() = 0;
5895
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005896 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005897 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005898 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005899 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005900 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005901 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005902 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005903 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005904 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005905 enum DspRevEnum {
5906 NoDSP, DSP1, DSP2
5907 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005908 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005909
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005910protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005911 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005912 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005913
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005914public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005915 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5916 const std::string &CPUStr)
5917 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005918 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005919 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5920 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5921 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005922
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005923 bool isNaN2008Default() const {
5924 return CPU == "mips32r6" || CPU == "mips64r6";
5925 }
5926
5927 bool isFP64Default() const {
5928 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5929 }
5930
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005931 bool isNan2008() const override {
5932 return IsNan2008;
5933 }
5934
Alp Toker4925ba72014-06-07 23:30:42 +00005935 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005936 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005937 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5938 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005939 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005940 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005941 .Case("mips1", IsMips32)
5942 .Case("mips2", IsMips32)
5943 .Case("mips3", true)
5944 .Case("mips4", true)
5945 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005946 .Case("mips32", IsMips32)
5947 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005948 .Case("mips32r3", IsMips32)
5949 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005950 .Case("mips32r6", IsMips32)
5951 .Case("mips64", true)
5952 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005953 .Case("mips64r3", true)
5954 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005955 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005956 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005957 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005958 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005959 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005960 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005961 if (CPU == "octeon")
5962 Features["mips64r2"] = Features["cnmips"] = true;
5963 else
5964 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005965 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005966
Craig Topper3164f332014-03-11 03:39:26 +00005967 void getTargetDefines(const LangOptions &Opts,
5968 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005969 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005970 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005971 if (Opts.GNUMode)
5972 Builder.defineMacro("mips");
5973
Simon Atanasyan683535b2012-08-29 19:14:58 +00005974 Builder.defineMacro("__REGISTER_PREFIX__", "");
5975
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005976 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005977 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005978 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005979 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005980 case SoftFloat:
5981 Builder.defineMacro("__mips_soft_float", Twine(1));
5982 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005983 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005984
Simon Atanasyan16071912013-04-14 14:07:30 +00005985 if (IsSingleFloat)
5986 Builder.defineMacro("__mips_single_float", Twine(1));
5987
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005988 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5989 Builder.defineMacro("_MIPS_FPSET",
5990 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5991
Simon Atanasyan72244b62012-07-05 16:06:06 +00005992 if (IsMips16)
5993 Builder.defineMacro("__mips16", Twine(1));
5994
Simon Atanasyan60777612013-04-14 14:07:51 +00005995 if (IsMicromips)
5996 Builder.defineMacro("__mips_micromips", Twine(1));
5997
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005998 if (IsNan2008)
5999 Builder.defineMacro("__mips_nan2008", Twine(1));
6000
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006001 switch (DspRev) {
6002 default:
6003 break;
6004 case DSP1:
6005 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6006 Builder.defineMacro("__mips_dsp", Twine(1));
6007 break;
6008 case DSP2:
6009 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6010 Builder.defineMacro("__mips_dspr2", Twine(1));
6011 Builder.defineMacro("__mips_dsp", Twine(1));
6012 break;
6013 }
6014
Jack Carter44ff1e52013-08-12 17:20:29 +00006015 if (HasMSA)
6016 Builder.defineMacro("__mips_msa", Twine(1));
6017
Simon Atanasyan26f19672012-04-05 19:28:31 +00006018 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6019 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6020 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006021
6022 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6023 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006024 }
6025
Craig Topper3164f332014-03-11 03:39:26 +00006026 void getTargetBuiltins(const Builtin::Info *&Records,
6027 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006028 Records = BuiltinInfo;
6029 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006030 }
Craig Topper3164f332014-03-11 03:39:26 +00006031 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006032 return llvm::StringSwitch<bool>(Feature)
6033 .Case("mips", true)
6034 .Case("fp64", HasFP64)
6035 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006036 }
Craig Topper3164f332014-03-11 03:39:26 +00006037 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006038 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006039 }
Craig Topper3164f332014-03-11 03:39:26 +00006040 void getGCCRegNames(const char * const *&Names,
6041 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006042 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006043 // CPU register names
6044 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006045 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6046 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6047 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006048 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6049 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006050 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6051 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6052 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6053 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006054 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006055 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006056 "$fcc5","$fcc6","$fcc7",
6057 // MSA register names
6058 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6059 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6060 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6061 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6062 // MSA control register names
6063 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6064 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006065 };
6066 Names = GCCRegNames;
6067 NumNames = llvm::array_lengthof(GCCRegNames);
6068 }
Craig Topper3164f332014-03-11 03:39:26 +00006069 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6070 unsigned &NumAliases) const override = 0;
6071 bool validateAsmConstraint(const char *&Name,
6072 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006073 switch (*Name) {
6074 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006075 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006076 case 'r': // CPU registers.
6077 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006078 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006079 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006080 case 'c': // $25 for indirect jumps
6081 case 'l': // lo register
6082 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006083 Info.setAllowsRegister();
6084 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006085 case 'I': // Signed 16-bit constant
6086 case 'J': // Integer 0
6087 case 'K': // Unsigned 16-bit constant
6088 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6089 case 'M': // Constants not loadable via lui, addiu, or ori
6090 case 'N': // Constant -1 to -65535
6091 case 'O': // A signed 15-bit constant
6092 case 'P': // A constant between 1 go 65535
6093 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006094 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006095 Info.setAllowsMemory();
6096 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006097 case 'Z':
6098 if (Name[1] == 'C') { // An address usable by ll, and sc.
6099 Info.setAllowsMemory();
6100 Name++; // Skip over 'Z'.
6101 return true;
6102 }
6103 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006104 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006105 }
6106
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006107 std::string convertConstraint(const char *&Constraint) const override {
6108 std::string R;
6109 switch (*Constraint) {
6110 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6111 if (Constraint[1] == 'C') {
6112 R = std::string("^") + std::string(Constraint, 2);
6113 Constraint++;
6114 return R;
6115 }
6116 break;
6117 }
6118 return TargetInfo::convertConstraint(Constraint);
6119 }
6120
Craig Topper3164f332014-03-11 03:39:26 +00006121 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006122 // In GCC, $1 is not widely used in generated code (it's used only in a few
6123 // specific situations), so there is no real need for users to add it to
6124 // the clobbers list if they want to use it in their inline assembly code.
6125 //
6126 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6127 // code generation, so using it in inline assembly without adding it to the
6128 // clobbers list can cause conflicts between the inline assembly code and
6129 // the surrounding generated code.
6130 //
6131 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6132 // operands, which will conflict with the ".set at" assembler option (which
6133 // we use only for inline assembly, in order to maintain compatibility with
6134 // GCC) and will also conflict with the user's usage of $1.
6135 //
6136 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6137 // register for generated code is to automatically clobber $1 for all inline
6138 // assembly code.
6139 //
6140 // FIXME: We should automatically clobber $1 only for inline assembly code
6141 // which actually uses it. This would allow LLVM to use $1 for inline
6142 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006143 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006144 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006145
Craig Topper3164f332014-03-11 03:39:26 +00006146 bool handleTargetFeatures(std::vector<std::string> &Features,
6147 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006148 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006149 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006150 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006151 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006152 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006153 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006154 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006155
6156 for (std::vector<std::string>::iterator it = Features.begin(),
6157 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006158 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006159 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006160 else if (*it == "+soft-float")
6161 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006162 else if (*it == "+mips16")
6163 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006164 else if (*it == "+micromips")
6165 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006166 else if (*it == "+dsp")
6167 DspRev = std::max(DspRev, DSP1);
6168 else if (*it == "+dspr2")
6169 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006170 else if (*it == "+msa")
6171 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006172 else if (*it == "+fp64")
6173 HasFP64 = true;
6174 else if (*it == "-fp64")
6175 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006176 else if (*it == "+nan2008")
6177 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006178 else if (*it == "-nan2008")
6179 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006180 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006181
Akira Hatanaka9064e362013-10-29 18:30:33 +00006182 setDescriptionString();
6183
Rafael Espindolaeb265472013-08-21 21:59:03 +00006184 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006185 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006186
Craig Topper3164f332014-03-11 03:39:26 +00006187 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006188 if (RegNo == 0) return 4;
6189 if (RegNo == 1) return 5;
6190 return -1;
6191 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006192
6193 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006194};
6195
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006196const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6197#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6198#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6199 ALL_LANGUAGES },
6200#include "clang/Basic/BuiltinsMips.def"
6201};
6202
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006203class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006204public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006205 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006206 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006207 SizeType = UnsignedInt;
6208 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006209 Int64Type = SignedLongLong;
6210 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006211 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006212 }
Craig Topper3164f332014-03-11 03:39:26 +00006213 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006214 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006215 ABI = Name;
6216 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006217 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006218 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006219 }
Craig Topper3164f332014-03-11 03:39:26 +00006220 void getTargetDefines(const LangOptions &Opts,
6221 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006222 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006223
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006224 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006225 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6226
6227 const std::string& CPUStr = getCPU();
6228 if (CPUStr == "mips32")
6229 Builder.defineMacro("__mips_isa_rev", "1");
6230 else if (CPUStr == "mips32r2")
6231 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006232 else if (CPUStr == "mips32r3")
6233 Builder.defineMacro("__mips_isa_rev", "3");
6234 else if (CPUStr == "mips32r5")
6235 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006236 else if (CPUStr == "mips32r6")
6237 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006238
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006239 if (ABI == "o32") {
6240 Builder.defineMacro("__mips_o32");
6241 Builder.defineMacro("_ABIO32", "1");
6242 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6243 }
6244 else if (ABI == "eabi")
6245 Builder.defineMacro("__mips_eabi");
6246 else
David Blaikie83d382b2011-09-23 05:06:16 +00006247 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006248 }
Craig Topper3164f332014-03-11 03:39:26 +00006249 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6250 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006251 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6252 { { "at" }, "$1" },
6253 { { "v0" }, "$2" },
6254 { { "v1" }, "$3" },
6255 { { "a0" }, "$4" },
6256 { { "a1" }, "$5" },
6257 { { "a2" }, "$6" },
6258 { { "a3" }, "$7" },
6259 { { "t0" }, "$8" },
6260 { { "t1" }, "$9" },
6261 { { "t2" }, "$10" },
6262 { { "t3" }, "$11" },
6263 { { "t4" }, "$12" },
6264 { { "t5" }, "$13" },
6265 { { "t6" }, "$14" },
6266 { { "t7" }, "$15" },
6267 { { "s0" }, "$16" },
6268 { { "s1" }, "$17" },
6269 { { "s2" }, "$18" },
6270 { { "s3" }, "$19" },
6271 { { "s4" }, "$20" },
6272 { { "s5" }, "$21" },
6273 { { "s6" }, "$22" },
6274 { { "s7" }, "$23" },
6275 { { "t8" }, "$24" },
6276 { { "t9" }, "$25" },
6277 { { "k0" }, "$26" },
6278 { { "k1" }, "$27" },
6279 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006280 { { "sp","$sp" }, "$29" },
6281 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006282 { { "ra" }, "$31" }
6283 };
6284 Aliases = GCCRegAliases;
6285 NumAliases = llvm::array_lengthof(GCCRegAliases);
6286 }
6287};
6288
6289class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006290 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006291 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006292 }
6293
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006294public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006295 Mips32EBTargetInfo(const llvm::Triple &Triple)
6296 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006297 }
Craig Topper3164f332014-03-11 03:39:26 +00006298 void getTargetDefines(const LangOptions &Opts,
6299 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006300 DefineStd(Builder, "MIPSEB", Opts);
6301 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006302 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006303 }
6304};
6305
6306class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006307 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006308 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006309 }
6310
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006311public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006312 Mips32ELTargetInfo(const llvm::Triple &Triple)
6313 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006314 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006315 }
Craig Topper3164f332014-03-11 03:39:26 +00006316 void getTargetDefines(const LangOptions &Opts,
6317 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006318 DefineStd(Builder, "MIPSEL", Opts);
6319 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006320 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006321 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006322};
Akira Hatanakabef17452011-09-20 19:21:49 +00006323
6324class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006325public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006326 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006327 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006328 LongDoubleWidth = LongDoubleAlign = 128;
6329 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006330 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6331 LongDoubleWidth = LongDoubleAlign = 64;
6332 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6333 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006334 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006335 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006336 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006337 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006338
6339 void setN64ABITypes() {
6340 LongWidth = LongAlign = 64;
6341 PointerWidth = PointerAlign = 64;
6342 SizeType = UnsignedLong;
6343 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006344 Int64Type = SignedLong;
6345 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006346 }
6347
6348 void setN32ABITypes() {
6349 LongWidth = LongAlign = 32;
6350 PointerWidth = PointerAlign = 32;
6351 SizeType = UnsignedInt;
6352 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006353 Int64Type = SignedLongLong;
6354 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006355 }
6356
Craig Topper3164f332014-03-11 03:39:26 +00006357 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006358 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006359 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006360 ABI = Name;
6361 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006362 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006363 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006364 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006365 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006366 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006367 }
6368 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006369 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006370
Craig Topper3164f332014-03-11 03:39:26 +00006371 void getTargetDefines(const LangOptions &Opts,
6372 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006373 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006374
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006375 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006376 Builder.defineMacro("__mips64");
6377 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006378 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6379
6380 const std::string& CPUStr = getCPU();
6381 if (CPUStr == "mips64")
6382 Builder.defineMacro("__mips_isa_rev", "1");
6383 else if (CPUStr == "mips64r2")
6384 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006385 else if (CPUStr == "mips64r3")
6386 Builder.defineMacro("__mips_isa_rev", "3");
6387 else if (CPUStr == "mips64r5")
6388 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006389 else if (CPUStr == "mips64r6")
6390 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006391
Akira Hatanakabef17452011-09-20 19:21:49 +00006392 if (ABI == "n32") {
6393 Builder.defineMacro("__mips_n32");
6394 Builder.defineMacro("_ABIN32", "2");
6395 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6396 }
6397 else if (ABI == "n64") {
6398 Builder.defineMacro("__mips_n64");
6399 Builder.defineMacro("_ABI64", "3");
6400 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6401 }
6402 else
David Blaikie83d382b2011-09-23 05:06:16 +00006403 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006404 }
Craig Topper3164f332014-03-11 03:39:26 +00006405 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6406 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006407 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6408 { { "at" }, "$1" },
6409 { { "v0" }, "$2" },
6410 { { "v1" }, "$3" },
6411 { { "a0" }, "$4" },
6412 { { "a1" }, "$5" },
6413 { { "a2" }, "$6" },
6414 { { "a3" }, "$7" },
6415 { { "a4" }, "$8" },
6416 { { "a5" }, "$9" },
6417 { { "a6" }, "$10" },
6418 { { "a7" }, "$11" },
6419 { { "t0" }, "$12" },
6420 { { "t1" }, "$13" },
6421 { { "t2" }, "$14" },
6422 { { "t3" }, "$15" },
6423 { { "s0" }, "$16" },
6424 { { "s1" }, "$17" },
6425 { { "s2" }, "$18" },
6426 { { "s3" }, "$19" },
6427 { { "s4" }, "$20" },
6428 { { "s5" }, "$21" },
6429 { { "s6" }, "$22" },
6430 { { "s7" }, "$23" },
6431 { { "t8" }, "$24" },
6432 { { "t9" }, "$25" },
6433 { { "k0" }, "$26" },
6434 { { "k1" }, "$27" },
6435 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006436 { { "sp","$sp" }, "$29" },
6437 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006438 { { "ra" }, "$31" }
6439 };
6440 Aliases = GCCRegAliases;
6441 NumAliases = llvm::array_lengthof(GCCRegAliases);
6442 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006443
6444 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006445};
6446
6447class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006448 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006449 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006450 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 +00006451 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006452 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006453
Akira Hatanakabef17452011-09-20 19:21:49 +00006454 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006455
Akira Hatanakabef17452011-09-20 19:21:49 +00006456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006457 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006458 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006459 void getTargetDefines(const LangOptions &Opts,
6460 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006461 DefineStd(Builder, "MIPSEB", Opts);
6462 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006463 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006464 }
6465};
6466
6467class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006468 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006469 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006470 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 +00006471 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006472 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006473 }
6474public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006475 Mips64ELTargetInfo(const llvm::Triple &Triple)
6476 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006477 // Default ABI is n64.
6478 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006479 }
Craig Topper3164f332014-03-11 03:39:26 +00006480 void getTargetDefines(const LangOptions &Opts,
6481 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006482 DefineStd(Builder, "MIPSEL", Opts);
6483 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006484 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006485 }
6486};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006487
Ivan Krasindd7403e2011-08-24 20:22:22 +00006488class PNaClTargetInfo : public TargetInfo {
6489public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006490 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006491 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006492 this->UserLabelPrefix = "";
6493 this->LongAlign = 32;
6494 this->LongWidth = 32;
6495 this->PointerAlign = 32;
6496 this->PointerWidth = 32;
6497 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006498 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006499 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006500 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006501 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006502 this->SizeType = TargetInfo::UnsignedInt;
6503 this->PtrDiffType = TargetInfo::SignedInt;
6504 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006505 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006506 }
6507
Craig Topper3164f332014-03-11 03:39:26 +00006508 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006509 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006510 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006511 Builder.defineMacro("__le32__");
6512 Builder.defineMacro("__pnacl__");
6513 }
Craig Topper3164f332014-03-11 03:39:26 +00006514 void getTargetDefines(const LangOptions &Opts,
6515 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006516 getArchDefines(Opts, Builder);
6517 }
Craig Topper3164f332014-03-11 03:39:26 +00006518 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006519 return Feature == "pnacl";
6520 }
Craig Topper3164f332014-03-11 03:39:26 +00006521 void getTargetBuiltins(const Builtin::Info *&Records,
6522 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006523 }
Craig Topper3164f332014-03-11 03:39:26 +00006524 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006525 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006526 }
Craig Topper3164f332014-03-11 03:39:26 +00006527 void getGCCRegNames(const char * const *&Names,
6528 unsigned &NumNames) const override;
6529 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6530 unsigned &NumAliases) const override;
6531 bool validateAsmConstraint(const char *&Name,
6532 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006533 return false;
6534 }
6535
Craig Topper3164f332014-03-11 03:39:26 +00006536 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006537 return "";
6538 }
6539};
6540
6541void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6542 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006543 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006544 NumNames = 0;
6545}
6546
6547void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6548 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006549 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006550 NumAliases = 0;
6551}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006552
JF Bastien643817d2014-09-12 17:52:47 +00006553class Le64TargetInfo : public TargetInfo {
6554 static const Builtin::Info BuiltinInfo[];
6555
6556public:
6557 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6558 BigEndian = false;
6559 NoAsmVariants = true;
6560 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6561 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6562 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006563 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006564 }
6565
6566 void getTargetDefines(const LangOptions &Opts,
6567 MacroBuilder &Builder) const override {
6568 DefineStd(Builder, "unix", Opts);
6569 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6570 Builder.defineMacro("__ELF__");
6571 }
6572 void getTargetBuiltins(const Builtin::Info *&Records,
6573 unsigned &NumRecords) const override {
6574 Records = BuiltinInfo;
6575 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6576 }
6577 BuiltinVaListKind getBuiltinVaListKind() const override {
6578 return TargetInfo::PNaClABIBuiltinVaList;
6579 }
6580 const char *getClobbers() const override { return ""; }
6581 void getGCCRegNames(const char *const *&Names,
6582 unsigned &NumNames) const override {
6583 Names = nullptr;
6584 NumNames = 0;
6585 }
6586 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6587 unsigned &NumAliases) const override {
6588 Aliases = nullptr;
6589 NumAliases = 0;
6590 }
6591 bool validateAsmConstraint(const char *&Name,
6592 TargetInfo::ConstraintInfo &Info) const override {
6593 return false;
6594 }
6595
6596 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006597};
6598} // end anonymous namespace.
6599
6600const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6601#define BUILTIN(ID, TYPE, ATTRS) \
6602 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6603#include "clang/Basic/BuiltinsLe64.def"
6604};
6605
6606namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006607 static const unsigned SPIRAddrSpaceMap[] = {
6608 1, // opencl_global
6609 3, // opencl_local
6610 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006611 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006612 0, // cuda_device
6613 0, // cuda_constant
6614 0 // cuda_shared
6615 };
6616 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006617 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006618 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006619 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6620 "SPIR target must use unknown OS");
6621 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6622 "SPIR target must use unknown environment type");
6623 BigEndian = false;
6624 TLSSupported = false;
6625 LongWidth = LongAlign = 64;
6626 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006627 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006628 // Define available target features
6629 // These must be defined in sorted order!
6630 NoAsmVariants = true;
6631 }
Craig Topper3164f332014-03-11 03:39:26 +00006632 void getTargetDefines(const LangOptions &Opts,
6633 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006634 DefineStd(Builder, "SPIR", Opts);
6635 }
Craig Topper3164f332014-03-11 03:39:26 +00006636 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006637 return Feature == "spir";
6638 }
Craig Topper3164f332014-03-11 03:39:26 +00006639
6640 void getTargetBuiltins(const Builtin::Info *&Records,
6641 unsigned &NumRecords) const override {}
6642 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006643 return "";
6644 }
Craig Topper3164f332014-03-11 03:39:26 +00006645 void getGCCRegNames(const char * const *&Names,
6646 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006647 bool
6648 validateAsmConstraint(const char *&Name,
6649 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006650 return true;
6651 }
Craig Topper3164f332014-03-11 03:39:26 +00006652 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6653 unsigned &NumAliases) const override {}
6654 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006655 return TargetInfo::VoidPtrBuiltinVaList;
6656 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006657
6658 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6659 return (CC == CC_SpirFunction ||
6660 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6661 }
6662
6663 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6664 return CC_SpirFunction;
6665 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006666 };
6667
6668
6669 class SPIR32TargetInfo : public SPIRTargetInfo {
6670 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006671 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006672 PointerWidth = PointerAlign = 32;
6673 SizeType = TargetInfo::UnsignedInt;
6674 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6675 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006676 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6677 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006678 }
Craig Topper3164f332014-03-11 03:39:26 +00006679 void getTargetDefines(const LangOptions &Opts,
6680 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006681 DefineStd(Builder, "SPIR32", Opts);
6682 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006683 };
6684
6685 class SPIR64TargetInfo : public SPIRTargetInfo {
6686 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006687 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006688 PointerWidth = PointerAlign = 64;
6689 SizeType = TargetInfo::UnsignedLong;
6690 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006691 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6692 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006693 }
Craig Topper3164f332014-03-11 03:39:26 +00006694 void getTargetDefines(const LangOptions &Opts,
6695 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006696 DefineStd(Builder, "SPIR64", Opts);
6697 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006698 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006699
Robert Lytton0e076492013-08-13 09:43:10 +00006700class XCoreTargetInfo : public TargetInfo {
6701 static const Builtin::Info BuiltinInfo[];
6702public:
6703 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6704 BigEndian = false;
6705 NoAsmVariants = true;
6706 LongLongAlign = 32;
6707 SuitableAlign = 32;
6708 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006709 SizeType = UnsignedInt;
6710 PtrDiffType = SignedInt;
6711 IntPtrType = SignedInt;
6712 WCharType = UnsignedChar;
6713 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006714 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006715 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 +00006716 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006717 }
Craig Topper3164f332014-03-11 03:39:26 +00006718 void getTargetDefines(const LangOptions &Opts,
6719 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006720 Builder.defineMacro("__XS1B__");
6721 }
Craig Topper3164f332014-03-11 03:39:26 +00006722 void getTargetBuiltins(const Builtin::Info *&Records,
6723 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006724 Records = BuiltinInfo;
6725 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6726 }
Craig Topper3164f332014-03-11 03:39:26 +00006727 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006728 return TargetInfo::VoidPtrBuiltinVaList;
6729 }
Craig Topper3164f332014-03-11 03:39:26 +00006730 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006731 return "";
6732 }
Craig Topper3164f332014-03-11 03:39:26 +00006733 void getGCCRegNames(const char * const *&Names,
6734 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006735 static const char * const GCCRegNames[] = {
6736 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6737 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6738 };
6739 Names = GCCRegNames;
6740 NumNames = llvm::array_lengthof(GCCRegNames);
6741 }
Craig Topper3164f332014-03-11 03:39:26 +00006742 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6743 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006744 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006745 NumAliases = 0;
6746 }
Craig Topper3164f332014-03-11 03:39:26 +00006747 bool validateAsmConstraint(const char *&Name,
6748 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006749 return false;
6750 }
Craig Topper3164f332014-03-11 03:39:26 +00006751 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006752 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6753 return (RegNo < 2)? RegNo : -1;
6754 }
Robert Lytton0e076492013-08-13 09:43:10 +00006755};
6756
6757const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6758#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6759#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6760 ALL_LANGUAGES },
6761#include "clang/Basic/BuiltinsXCore.def"
6762};
6763} // end anonymous namespace.
6764
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006765namespace {
6766// x86_32 Android target
6767class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6768public:
6769 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6770 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6771 SuitableAlign = 32;
6772 LongDoubleWidth = 64;
6773 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6774 }
6775};
6776} // end anonymous namespace
6777
6778namespace {
6779// x86_64 Android target
6780class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6781public:
6782 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6783 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6784 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6785 }
6786};
6787} // end anonymous namespace
6788
Ivan Krasindd7403e2011-08-24 20:22:22 +00006789
Chris Lattner5ba61f02006-10-14 07:39:34 +00006790//===----------------------------------------------------------------------===//
6791// Driver code
6792//===----------------------------------------------------------------------===//
6793
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006794static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006795 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006796
Daniel Dunbar52322032009-08-18 05:47:58 +00006797 switch (Triple.getArch()) {
6798 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006799 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006800
Tim Northover2a0783d2014-05-30 14:14:07 +00006801 case llvm::Triple::xcore:
6802 return new XCoreTargetInfo(Triple);
6803
6804 case llvm::Triple::hexagon:
6805 return new HexagonTargetInfo(Triple);
6806
6807 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006808 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006809 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006810
6811 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006812 case llvm::Triple::FreeBSD:
6813 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006814 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006815 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006816 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006817 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006818 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006819 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006820 }
6821
Christian Pirker9b019ae2014-02-25 13:51:00 +00006822 case llvm::Triple::aarch64_be:
6823 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006824 case llvm::Triple::FreeBSD:
6825 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006826 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006827 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006828 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006829 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006830 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006831 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006832 }
6833
Daniel Dunbar52322032009-08-18 05:47:58 +00006834 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006835 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006836 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006838
Daniel Dunbar52322032009-08-18 05:47:58 +00006839 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006840 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006841 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006842 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006843 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006844 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006845 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006846 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006847 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006848 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006849 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006850 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006851 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006852 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006853 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006854 case llvm::Triple::Win32:
6855 switch (Triple.getEnvironment()) {
6856 default:
6857 return new ARMleTargetInfo(Triple);
6858 case llvm::Triple::Itanium:
6859 return new ItaniumWindowsARMleTargetInfo(Triple);
6860 case llvm::Triple::MSVC:
6861 return new MicrosoftARMleTargetInfo(Triple);
6862 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006863 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006864 return new ARMleTargetInfo(Triple);
6865 }
6866
6867 case llvm::Triple::armeb:
6868 case llvm::Triple::thumbeb:
6869 if (Triple.isOSDarwin())
6870 return new DarwinARMTargetInfo(Triple);
6871
6872 switch (os) {
6873 case llvm::Triple::Linux:
6874 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6875 case llvm::Triple::FreeBSD:
6876 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6877 case llvm::Triple::NetBSD:
6878 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6879 case llvm::Triple::OpenBSD:
6880 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6881 case llvm::Triple::Bitrig:
6882 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6883 case llvm::Triple::RTEMS:
6884 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6885 case llvm::Triple::NaCl:
6886 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6887 default:
6888 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006889 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006890
Daniel Dunbar52322032009-08-18 05:47:58 +00006891 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006892 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006893
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006894 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006895 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006896 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006897 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006898 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006899 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006900 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006901 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006902 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006903 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006904 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006905 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006906 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006907
6908 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006909 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006910 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006911 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006912 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006913 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006914 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006915 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006916 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006917 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006918 case llvm::Triple::NaCl:
6919 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006920 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006921 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006922 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006923
Akira Hatanakabef17452011-09-20 19:21:49 +00006924 case llvm::Triple::mips64:
6925 switch (os) {
6926 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006927 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006928 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006929 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006930 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006931 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006932 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006933 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006934 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006935 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006936 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006937 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006938 }
6939
6940 case llvm::Triple::mips64el:
6941 switch (os) {
6942 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006943 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006944 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006945 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006946 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006947 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006948 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006949 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006950 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006951 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006952 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006953 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006954 }
6955
Ivan Krasindd7403e2011-08-24 20:22:22 +00006956 case llvm::Triple::le32:
6957 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00006958 case llvm::Triple::NaCl:
6959 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
6960 default:
6961 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006962 }
6963
JF Bastien643817d2014-09-12 17:52:47 +00006964 case llvm::Triple::le64:
6965 return new Le64TargetInfo(Triple);
6966
Daniel Dunbar52322032009-08-18 05:47:58 +00006967 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006968 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006969 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006970 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006971 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006972 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006973 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006974 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006975 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006976 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006977 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006978 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006979 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006980 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006981 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006982 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006983 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006984
6985 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006986 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006987 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006988 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006989 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006990 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006991 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006992 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006993 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006994 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006995 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006996 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006997 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006998 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006999 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007000
Bill Schmidt778d3872013-07-26 01:36:11 +00007001 case llvm::Triple::ppc64le:
7002 switch (os) {
7003 case llvm::Triple::Linux:
7004 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007005 case llvm::Triple::NetBSD:
7006 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007007 default:
7008 return new PPC64TargetInfo(Triple);
7009 }
7010
Peter Collingbournec947aae2012-05-20 23:28:41 +00007011 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007012 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007013 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007014 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007015
Tom Stellardd8e38a32015-01-06 20:34:47 +00007016 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007017 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007018 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007019
Daniel Dunbar52322032009-08-18 05:47:58 +00007020 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007021 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007022 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007023 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007024 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007025 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007026 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007027 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007028 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007029 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007030 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007031 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007032 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007033 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007034 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007035
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007036 // The 'sparcel' architecture copies all the above cases except for Solaris.
7037 case llvm::Triple::sparcel:
7038 switch (os) {
7039 case llvm::Triple::Linux:
7040 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7041 case llvm::Triple::NetBSD:
7042 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7043 case llvm::Triple::OpenBSD:
7044 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7045 case llvm::Triple::RTEMS:
7046 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7047 default:
7048 return new SparcV8elTargetInfo(Triple);
7049 }
7050
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007051 case llvm::Triple::sparcv9:
7052 switch (os) {
7053 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007054 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007055 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007056 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007057 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007058 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007059 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007060 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007061 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007062 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007063 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007064 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007065 }
7066
Ulrich Weigand47445072013-05-06 16:26:41 +00007067 case llvm::Triple::systemz:
7068 switch (os) {
7069 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007070 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007071 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007072 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007073 }
7074
Eli Friedmana9c3d712009-08-19 20:47:07 +00007075 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007076 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007077
Daniel Dunbar52322032009-08-18 05:47:58 +00007078 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007079 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007080 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007081
Daniel Dunbar52322032009-08-18 05:47:58 +00007082 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007083 case llvm::Triple::Linux: {
7084 switch (Triple.getEnvironment()) {
7085 default:
7086 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7087 case llvm::Triple::Android:
7088 return new AndroidX86_32TargetInfo(Triple);
7089 }
7090 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007091 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007092 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007093 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007094 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007095 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007096 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007097 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007098 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007099 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007100 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007101 case llvm::Triple::KFreeBSD:
7102 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007103 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007104 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007105 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007106 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007107 case llvm::Triple::Win32: {
7108 switch (Triple.getEnvironment()) {
7109 default:
7110 return new X86_32TargetInfo(Triple);
7111 case llvm::Triple::Cygnus:
7112 return new CygwinX86_32TargetInfo(Triple);
7113 case llvm::Triple::GNU:
7114 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007115 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007116 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007117 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007118 }
7119 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007120 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007121 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007122 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007123 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007124 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007125 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007126 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007127 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007128 }
7129
7130 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007131 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007132 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007133
Daniel Dunbar52322032009-08-18 05:47:58 +00007134 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007135 case llvm::Triple::CloudABI:
7136 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007137 case llvm::Triple::Linux: {
7138 switch (Triple.getEnvironment()) {
7139 default:
7140 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7141 case llvm::Triple::Android:
7142 return new AndroidX86_64TargetInfo(Triple);
7143 }
7144 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007145 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007146 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007147 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007148 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007149 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007150 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007151 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007152 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007153 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007154 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007155 case llvm::Triple::KFreeBSD:
7156 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007157 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007158 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007159 case llvm::Triple::Win32: {
7160 switch (Triple.getEnvironment()) {
7161 default:
7162 return new X86_64TargetInfo(Triple);
7163 case llvm::Triple::GNU:
7164 return new MinGWX86_64TargetInfo(Triple);
7165 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007166 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007167 }
7168 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007169 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007170 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007171 case llvm::Triple::PS4:
7172 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007173 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007174 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007175 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007176
Douglas Katzman78d7c542015-05-12 21:18:10 +00007177 case llvm::Triple::spir: {
7178 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7179 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7180 return nullptr;
7181 return new SPIR32TargetInfo(Triple);
7182 }
7183 case llvm::Triple::spir64: {
7184 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7185 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7186 return nullptr;
7187 return new SPIR64TargetInfo(Triple);
7188 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007189 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007190}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007191
7192/// CreateTargetInfo - Return the target info object for the specified target
7193/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007194TargetInfo *
7195TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7196 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007197 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007198
7199 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007200 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007201 if (!Target) {
7202 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007203 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007204 }
Alp Toker80758082014-07-06 05:26:44 +00007205 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007206
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007207 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007208 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7209 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007210 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007211 }
7212
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007213 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007214 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7215 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007216 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007217 }
7218
Rafael Espindolaeb265472013-08-21 21:59:03 +00007219 // Set the fp math unit.
7220 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7221 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007222 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007223 }
7224
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007225 // Compute the default target features, we need the target to handle this
7226 // because features may have dependencies on one another.
7227 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007228 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007229
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007230 // Apply the user specified deltas.
7231 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7232 I < N; ++I) {
7233 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007234 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007235 bool Enabled = Name[0] == '+';
7236 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007237 }
7238
7239 // Add the features to the compile options.
7240 //
7241 // FIXME: If we are completely confident that we have the right set, we only
7242 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007243 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007244 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7245 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007246 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007247 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007248 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007249
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007250 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007251}