blob: 76b5f579508155c332281159839f600bf3b5763d [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
David Majnemerae1ed0e2015-05-28 04:36:18 +00003599static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3600 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003601 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3602 // macro anyway for pre-processor compatibility.
3603 if (Opts.MicrosoftExt)
3604 Builder.defineMacro("__declspec", "__declspec");
3605 else
3606 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3607
3608 if (!Opts.MicrosoftExt) {
3609 // Provide macros for all the calling convention keywords. Provide both
3610 // single and double underscore prefixed variants. These are available on
3611 // x64 as well as x86, even though they have no effect.
3612 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3613 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003614 std::string GCCSpelling = "__attribute__((__";
3615 GCCSpelling += CC;
3616 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003617 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3618 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3619 }
3620 }
3621}
3622
David Majnemerae1ed0e2015-05-28 04:36:18 +00003623static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3624 Builder.defineMacro("__MSVCRT__");
3625 Builder.defineMacro("__MINGW32__");
3626 addCygMingDefines(Opts, Builder);
3627}
3628
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003629namespace {
3630// x86-32 MinGW target
3631class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3632public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003633 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3634 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003635 void getTargetDefines(const LangOptions &Opts,
3636 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003637 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003638 DefineStd(Builder, "WIN32", Opts);
3639 DefineStd(Builder, "WINNT", Opts);
3640 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003641 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003642 }
3643};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003644
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003645// x86-32 Cygwin target
3646class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3647public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003648 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3649 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003650 TLSSupported = false;
3651 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003652 DoubleAlign = LongLongAlign = 64;
Reid Kleckneraf676022015-04-30 22:13:05 +00003653 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 +00003654 }
Craig Topper3164f332014-03-11 03:39:26 +00003655 void getTargetDefines(const LangOptions &Opts,
3656 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003657 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003658 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003659 Builder.defineMacro("__CYGWIN__");
3660 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003661 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003662 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003663 if (Opts.CPlusPlus)
3664 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003665 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003666};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003667
Chris Lattnerb986aba2010-04-11 19:29:39 +00003668// x86-32 Haiku target
3669class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3670public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003671 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003672 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003673 IntPtrType = SignedLong;
3674 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003675 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003676 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003677 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003678 }
Craig Topper3164f332014-03-11 03:39:26 +00003679 void getTargetDefines(const LangOptions &Opts,
3680 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003681 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3682 Builder.defineMacro("__INTEL__");
3683 Builder.defineMacro("__HAIKU__");
3684 }
3685};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003686
Douglas Gregor9fabd852011-07-01 22:41:14 +00003687// RTEMS Target
3688template<typename Target>
3689class RTEMSTargetInfo : public OSTargetInfo<Target> {
3690protected:
Craig Topper3164f332014-03-11 03:39:26 +00003691 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3692 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003693 // RTEMS defines; list based off of gcc output
3694
Douglas Gregor9fabd852011-07-01 22:41:14 +00003695 Builder.defineMacro("__rtems__");
3696 Builder.defineMacro("__ELF__");
3697 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003698
Douglas Gregor9fabd852011-07-01 22:41:14 +00003699public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003700 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3701 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003702
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003703 switch (Triple.getArch()) {
3704 default:
3705 case llvm::Triple::x86:
3706 // this->MCountName = ".mcount";
3707 break;
3708 case llvm::Triple::mips:
3709 case llvm::Triple::mipsel:
3710 case llvm::Triple::ppc:
3711 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003712 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003713 // this->MCountName = "_mcount";
3714 break;
3715 case llvm::Triple::arm:
3716 // this->MCountName = "__mcount";
3717 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003718 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003719 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003720};
3721
Douglas Gregor9fabd852011-07-01 22:41:14 +00003722// x86-32 RTEMS target
3723class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3724public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003725 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003726 SizeType = UnsignedLong;
3727 IntPtrType = SignedLong;
3728 PtrDiffType = SignedLong;
3729 this->UserLabelPrefix = "";
3730 }
Craig Topper3164f332014-03-11 03:39:26 +00003731 void getTargetDefines(const LangOptions &Opts,
3732 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003733 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3734 Builder.defineMacro("__INTEL__");
3735 Builder.defineMacro("__rtems__");
3736 }
3737};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003738
Eli Friedman3fd920a2008-08-20 02:34:37 +00003739// x86-64 generic target
3740class X86_64TargetInfo : public X86TargetInfo {
3741public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003742 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003743 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003744 bool IsWinCOFF =
3745 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003746 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003747 LongDoubleWidth = 128;
3748 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003749 LargeArrayMinWidth = 128;
3750 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003751 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003752 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3753 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3754 IntPtrType = IsX32 ? SignedInt : SignedLong;
3755 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003756 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003757 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003758
Eric Christopher917e9522014-11-18 22:36:15 +00003759 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003760 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3761 : IsWinCOFF
3762 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3763 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003764
3765 // Use fpret only for long double.
3766 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003767
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003768 // Use fp2ret for _Complex long double.
3769 ComplexLongDoubleUsesFP2Ret = true;
3770
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003771 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003772 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003773 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003774 }
Craig Topper3164f332014-03-11 03:39:26 +00003775 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003776 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003777 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003778
Craig Topper3164f332014-03-11 03:39:26 +00003779 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003780 if (RegNo == 0) return 0;
3781 if (RegNo == 1) return 1;
3782 return -1;
3783 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003784
Craig Topper3164f332014-03-11 03:39:26 +00003785 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003786 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003787 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003788 CC == CC_IntelOclBicc ||
3789 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003790 }
3791
Craig Topper3164f332014-03-11 03:39:26 +00003792 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003793 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003794 }
3795
Pavel Chupinfd223e12014-08-04 12:39:43 +00003796 // for x32 we need it here explicitly
3797 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003798};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003799
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003800// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003801class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003802public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003803 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3804 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003805 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003806 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003807 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003808 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003809 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003810 SizeType = UnsignedLongLong;
3811 PtrDiffType = SignedLongLong;
3812 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003813 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003814 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003815
Craig Topper3164f332014-03-11 03:39:26 +00003816 void getTargetDefines(const LangOptions &Opts,
3817 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003818 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003819 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003820 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003821
Craig Topper3164f332014-03-11 03:39:26 +00003822 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003823 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003824 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003825
Craig Topper3164f332014-03-11 03:39:26 +00003826 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003827 switch (CC) {
3828 case CC_X86StdCall:
3829 case CC_X86ThisCall:
3830 case CC_X86FastCall:
3831 return CCCR_Ignore;
3832 case CC_C:
3833 case CC_X86VectorCall:
3834 case CC_IntelOclBicc:
3835 case CC_X86_64SysV:
3836 return CCCR_OK;
3837 default:
3838 return CCCR_Warning;
3839 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003840 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003841};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003842
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003843// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003844class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003845public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003846 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003847 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003848 LongDoubleWidth = LongDoubleAlign = 64;
3849 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003850 }
Craig Topper3164f332014-03-11 03:39:26 +00003851 void getTargetDefines(const LangOptions &Opts,
3852 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003853 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3854 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003855 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003856 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003857 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003858};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003859
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003860// x86-64 MinGW target
3861class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3862public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003863 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3864 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003865 void getTargetDefines(const LangOptions &Opts,
3866 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003867 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003868 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003869 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003870 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003871
3872 // GCC defines this macro when it is using __gxx_personality_seh0.
3873 if (!Opts.SjLjExceptions)
3874 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003875 }
3876};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003877
Eli Friedman2857ccb2009-07-01 03:36:11 +00003878class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3879public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003880 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3881 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003882 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003883 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003884 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3885 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003886 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003887 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003888 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003889 }
3890};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003891
Eli Friedman245f2292009-07-05 22:31:18 +00003892class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3893public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003894 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3895 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003896 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003897 Int64Type = SignedLongLong;
3898 }
3899};
Eli Friedman245f2292009-07-05 22:31:18 +00003900
Eli Friedman9fa28852012-08-08 23:57:20 +00003901class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3902public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003903 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3904 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3905 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003906 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003907 }
3908};
Tim Northover9bb857a2013-01-31 12:13:10 +00003909
Eli Friedmanf05b7722008-08-20 07:44:10 +00003910class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003911 // Possible FPU choices.
3912 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003913 VFP2FPU = (1 << 0),
3914 VFP3FPU = (1 << 1),
3915 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003916 NeonFPU = (1 << 3),
3917 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003918 };
3919
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003920 // Possible HWDiv features.
3921 enum HWDivMode {
3922 HWDivThumb = (1 << 0),
3923 HWDivARM = (1 << 1)
3924 };
3925
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003926 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003927 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003928 }
3929
3930 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3931 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003932
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003933 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003934
Rafael Espindolaeb265472013-08-21 21:59:03 +00003935 enum {
3936 FP_Default,
3937 FP_VFP,
3938 FP_Neon
3939 } FPMath;
3940
Bernard Ogdenda13af32013-10-24 18:32:51 +00003941 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003942
Logan Chien57086ce2012-10-10 06:56:20 +00003943 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003944 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003945 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003946
3947 // Initialized via features.
3948 unsigned SoftFloat : 1;
3949 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003950
Bernard Ogden18b57012013-10-29 09:47:51 +00003951 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003952 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003953
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003954 // ACLE 6.5.1 Hardware floating point
3955 enum {
3956 HW_FP_HP = (1 << 1), /// half (16-bit)
3957 HW_FP_SP = (1 << 2), /// single (32-bit)
3958 HW_FP_DP = (1 << 3), /// double (64-bit)
3959 };
3960 uint32_t HW_FP;
3961
Chris Lattner5cc15e02010-03-03 19:03:45 +00003962 static const Builtin::Info BuiltinInfo[];
3963
Rafael Espindola101d5b92013-05-13 20:09:47 +00003964 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003965 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003966 if (T.getArch() == llvm::Triple::arm ||
3967 T.getArch() == llvm::Triple::armeb) {
3968 StringRef VersionStr;
3969 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003970 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003971 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003972 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003973 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003974 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003975 unsigned Version;
3976 if (VersionStr.getAsInteger(10, Version))
3977 return false;
3978 return Version >= 6;
3979 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003980 assert(T.getArch() == llvm::Triple::thumb ||
3981 T.getArch() == llvm::Triple::thumbeb);
3982 StringRef VersionStr;
3983 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003984 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003985 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003986 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003987 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003988 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003989 unsigned Version;
3990 if (VersionStr.getAsInteger(10, Version))
3991 return false;
3992 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003993 }
3994
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003995 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003996 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003997
3998 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003999 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004000
Renato Golin9ba39232015-02-27 16:35:48 +00004001 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4002 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4003 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004004 SizeType = UnsignedLong;
4005 else
4006 SizeType = UnsignedInt;
4007
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004008 switch (T.getOS()) {
4009 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004010 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004011 break;
4012 case llvm::Triple::Win32:
4013 WCharType = UnsignedShort;
4014 break;
4015 case llvm::Triple::Linux:
4016 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004017 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4018 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004019 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004020 }
4021
4022 UseBitFieldTypeAlignment = true;
4023
4024 ZeroLengthBitfieldBoundary = 0;
4025
Tim Northover147cd2f2014-10-14 22:12:21 +00004026 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4027 // so set preferred for small types to 32.
4028 if (T.isOSBinFormatMachO()) {
4029 DescriptionString =
4030 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4031 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4032 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004033 assert(!BigEndian && "Windows on ARM does not support big endian");
4034 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00004035 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00004036 "-p:32:32"
4037 "-i64:64"
4038 "-v128:64:128"
4039 "-a:0:32"
4040 "-n32"
4041 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004042 } else if (T.isOSNaCl()) {
4043 assert(!BigEndian && "NaCl on ARM does not support big endian");
4044 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004045 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00004046 DescriptionString =
4047 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4048 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004049 }
4050
4051 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004052 }
4053
4054 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004055 const llvm::Triple &T = getTriple();
4056
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004057 IsAAPCS = false;
4058
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004059 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004060
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004061 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004062 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004063 SizeType = UnsignedInt;
4064 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004065 SizeType = UnsignedLong;
4066
4067 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4068 WCharType = SignedInt;
4069
4070 // Do not respect the alignment of bit-field types when laying out
4071 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4072 UseBitFieldTypeAlignment = false;
4073
4074 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4075 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4076 /// gcc.
4077 ZeroLengthBitfieldBoundary = 32;
4078
Tim Northover147cd2f2014-10-14 22:12:21 +00004079 if (T.isOSBinFormatMachO())
4080 DescriptionString =
4081 BigEndian
4082 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4083 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4084 else
4085 DescriptionString =
4086 BigEndian
4087 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4088 : "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 +00004089
4090 // FIXME: Override "preferred align" for double and long long.
4091 }
4092
Chris Lattner17df24e2008-04-21 18:56:49 +00004093public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004094 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004095 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004096 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004097 BigEndian = IsBigEndian;
4098
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004099 switch (getTriple().getOS()) {
4100 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004101 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004102 break;
4103 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004104 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004105 break;
4106 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004107
Chris Lattner1a8f3942010-04-23 16:29:58 +00004108 // {} in inline assembly are neon specifiers, not assembly variant
4109 // specifiers.
4110 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004111
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004112 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004113 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004114
Eric Christopher0e261882014-12-05 01:06:59 +00004115 // FIXME: This duplicates code from the driver that sets the -target-abi
4116 // option - this code is used if -target-abi isn't passed and should
4117 // be unified in some way.
4118 if (Triple.isOSBinFormatMachO()) {
4119 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4120 // the frontend matches that.
4121 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4122 Triple.getOS() == llvm::Triple::UnknownOS ||
4123 StringRef(CPU).startswith("cortex-m")) {
4124 setABI("aapcs");
4125 } else {
4126 setABI("apcs-gnu");
4127 }
4128 } else if (Triple.isOSWindows()) {
4129 // FIXME: this is invalid for WindowsCE
4130 setABI("aapcs");
4131 } else {
4132 // Select the default based on the platform.
4133 switch (Triple.getEnvironment()) {
4134 case llvm::Triple::Android:
4135 case llvm::Triple::GNUEABI:
4136 case llvm::Triple::GNUEABIHF:
4137 setABI("aapcs-linux");
4138 break;
4139 case llvm::Triple::EABIHF:
4140 case llvm::Triple::EABI:
4141 setABI("aapcs");
4142 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004143 case llvm::Triple::GNU:
4144 setABI("apcs-gnu");
4145 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004146 default:
4147 if (Triple.getOS() == llvm::Triple::NetBSD)
4148 setABI("apcs-gnu");
4149 else
4150 setABI("aapcs");
4151 break;
4152 }
4153 }
John McCall86353412010-08-21 22:46:04 +00004154
4155 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004156 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004157
4158 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004159 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004160 if (shouldUseInlineAtomic(getTriple()))
4161 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004162
4163 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004164 // the alignment of the zero-length bitfield is greater than the member
4165 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004166 // zero length bitfield.
4167 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004168 }
Alp Toker4925ba72014-06-07 23:30:42 +00004169 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004170 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004171 ABI = Name;
4172
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004173 // The defaults (above) are for AAPCS, check if we need to change them.
4174 //
4175 // FIXME: We need support for -meabi... we could just mangle it into the
4176 // name.
4177 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004178 setABIAPCS();
4179 return true;
4180 }
4181 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4182 setABIAAPCS();
4183 return true;
4184 }
4185 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004186 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004187
Renato Golinf5c4dec2015-05-27 13:33:00 +00004188 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004189 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004190 StringRef ArchName = getTriple().getArchName();
Renato Golinf5c4dec2015-05-27 13:33:00 +00004191 unsigned ArchKind =
4192 llvm::ARMTargetParser::parseArch(
4193 llvm::ARMTargetParser::getCanonicalArchName(ArchName));
4194 bool IsV8 = (ArchKind == llvm::ARM::AK_ARMV8A ||
4195 ArchKind == llvm::ARM::AK_ARMV8_1A);
4196
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004197 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4198 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004199 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004200 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004201 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004202 }
4203 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004204 Features["vfp4"] = true;
4205 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004206 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4207 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004208 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004209 Features["vfp4"] = true;
4210 Features["neon"] = true;
4211 Features["hwdiv"] = true;
4212 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004213 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4214 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004215 Features["fp-armv8"] = true;
4216 Features["neon"] = true;
4217 Features["hwdiv"] = true;
4218 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004219 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004220 Features["crypto"] = true;
Renato Golinf5c4dec2015-05-27 13:33:00 +00004221 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || IsV8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004222 Features["hwdiv"] = true;
4223 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004224 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004225 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004226 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004227 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004228 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004229
Craig Topper3164f332014-03-11 03:39:26 +00004230 bool handleTargetFeatures(std::vector<std::string> &Features,
4231 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004232 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004233 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004234 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004235 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004236 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004237
4238 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004239 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004240 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004241 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004242 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004243 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004244 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004245 HW_FP = HW_FP_SP | HW_FP_DP;
4246 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004247 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004248 HW_FP = HW_FP_SP | HW_FP_DP;
4249 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004250 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004251 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4252 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004253 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004254 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4255 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004256 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004257 HW_FP = HW_FP_SP | HW_FP_DP;
4258 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004259 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004260 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004261 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004262 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004263 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004264 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004265 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004266 } else if (Feature == "+fp-only-sp") {
4267 HW_FP &= ~HW_FP_DP;
4268 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004269 }
4270
Rafael Espindolaeb265472013-08-21 21:59:03 +00004271 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4272 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4273 return false;
4274 }
4275
4276 if (FPMath == FP_Neon)
4277 Features.push_back("+neonfp");
4278 else if (FPMath == FP_VFP)
4279 Features.push_back("-neonfp");
4280
Daniel Dunbar893d4752009-12-19 04:15:38 +00004281 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004282 auto Feature =
4283 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4284 if (Feature != Features.end())
4285 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004286
Rafael Espindolaeb265472013-08-21 21:59:03 +00004287 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004288 }
4289
Craig Topper3164f332014-03-11 03:39:26 +00004290 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004291 return llvm::StringSwitch<bool>(Feature)
4292 .Case("arm", true)
4293 .Case("softfloat", SoftFloat)
4294 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004295 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004296 .Case("hwdiv", HWDiv & HWDivThumb)
4297 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004298 .Default(false);
4299 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004300 // FIXME: Should we actually have some table instead of these switches?
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004301 const char *getCPUDefineSuffix(StringRef Name) const {
4302 // FIXME: Use ARMTargetParser
4303 if(Name == "generic") {
4304 auto subarch = getTriple().getSubArch();
4305 switch (subarch) {
4306 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4307 return "8_1A";
4308 default:
4309 break;
4310 }
4311 }
4312
Eric Christopher917e9522014-11-18 22:36:15 +00004313 return llvm::StringSwitch<const char *>(Name)
4314 .Cases("arm8", "arm810", "4")
4315 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4316 "4")
4317 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4318 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4319 .Case("ep9312", "4T")
4320 .Cases("arm10tdmi", "arm1020t", "5T")
4321 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4322 .Case("arm926ej-s", "5TEJ")
4323 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4324 .Cases("xscale", "iwmmxt", "5TE")
4325 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004326 .Case("arm1136jf-s", "6")
4327 .Cases("mpcorenovfp", "mpcore", "6K")
4328 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004329 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4330 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4331 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4332 "7A")
Javed Absar879d18b82015-04-09 14:12:10 +00004333 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004334 .Case("swift", "7S")
4335 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004336 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004337 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004338 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004339 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004340 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004341 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004342 const char *getCPUProfile(StringRef Name) const {
4343 if(Name == "generic") {
4344 auto subarch = getTriple().getSubArch();
4345 switch (subarch) {
4346 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4347 return "A";
4348 default:
4349 break;
4350 }
4351 }
4352
Renato Golinf05bf002015-05-27 14:15:12 +00004353 unsigned CPUArch = llvm::ARMTargetParser::parseCPUArch(Name);
4354 if (CPUArch == llvm::ARM::AK_INVALID)
4355 return "";
4356
4357 StringRef ArchName = llvm::ARMTargetParser::getArchName(CPUArch);
4358 switch(llvm::ARMTargetParser::parseArchProfile(ArchName)) {
4359 case llvm::ARM::PK_A:
4360 return "A";
4361 case llvm::ARM::PK_R:
4362 return "R";
4363 case llvm::ARM::PK_M:
4364 return "M";
4365 default:
4366 return "";
4367 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004368 }
Craig Topper3164f332014-03-11 03:39:26 +00004369 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004370 if (!getCPUDefineSuffix(Name))
4371 return false;
4372
Tim Northovere8c37212014-07-09 09:24:43 +00004373 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4374 StringRef Profile = getCPUProfile(Name);
4375 if (Profile == "M" && MaxAtomicInlineWidth) {
4376 MaxAtomicPromoteWidth = 32;
4377 MaxAtomicInlineWidth = 32;
4378 }
4379
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004380 CPU = Name;
4381 return true;
4382 }
Craig Topper3164f332014-03-11 03:39:26 +00004383 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004384 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4385 unsigned CPUArchVer) const {
4386 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4387 (CPUArch.find('M') != StringRef::npos);
4388 }
4389 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4390 unsigned CPUArchVer) const {
4391 // We check both CPUArchVer and ArchName because when only triple is
4392 // specified, the default CPU is arm1136j-s.
4393 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004394 ArchName.endswith("v8.1a") ||
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004395 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4396 }
Craig Topper3164f332014-03-11 03:39:26 +00004397 void getTargetDefines(const LangOptions &Opts,
4398 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004399 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004400 Builder.defineMacro("__arm");
4401 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004402
Chris Lattnerecd49032009-03-02 22:27:17 +00004403 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004404 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004405
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004406 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004407 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004408 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004409 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004410 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004411
4412 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004413 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004414 StringRef ArchName = getTriple().getArchName();
4415
4416 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4417 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004418 if (CPUArch[0] >= '8') {
4419 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4420 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004421 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004422
4423 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4424 // is not defined for the M-profile.
4425 // NOTE that the deffault profile is assumed to be 'A'
4426 if (CPUProfile.empty() || CPUProfile != "M")
4427 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4428
4429 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4430 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4431 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4432 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4433 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4434 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4435 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4436
4437 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4438 // instruction set such as ARM or Thumb.
4439 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4440
4441 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4442
4443 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004444 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004445 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004446
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004447 // ACLE 6.5.1 Hardware Floating Point
4448 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004449 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004450
Yi Konga44c4d72014-06-27 21:25:42 +00004451 // ACLE predefines.
4452 Builder.defineMacro("__ARM_ACLE", "200");
4453
Mike Stump9d54bd72009-04-08 02:07:04 +00004454 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004455
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004456 // FIXME: It's more complicated than this and we don't really support
4457 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004458 // Windows on ARM does not "support" interworking
4459 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004460 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004461
David Tweed8f676532012-10-25 13:33:01 +00004462 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004463 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004464 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4465 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004466 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004467 Builder.defineMacro("__ARM_PCS", "1");
4468
David Tweed8f676532012-10-25 13:33:01 +00004469 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004470 Builder.defineMacro("__ARM_PCS_VFP", "1");
4471 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004472
Daniel Dunbar893d4752009-12-19 04:15:38 +00004473 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004474 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004475
4476 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004477 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004478
4479 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004480 Builder.defineMacro("__THUMBEL__");
4481 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004482 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004483 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004484 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004485 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4486 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004487
4488 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004489 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004490
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004491 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004492 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004493 if (FPU & VFP2FPU)
4494 Builder.defineMacro("__ARM_VFPV2__");
4495 if (FPU & VFP3FPU)
4496 Builder.defineMacro("__ARM_VFPV3__");
4497 if (FPU & VFP4FPU)
4498 Builder.defineMacro("__ARM_VFPV4__");
4499 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004500
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004501 // This only gets set when Neon instructions are actually available, unlike
4502 // the VFP define, hence the soft float and arch check. This is subtly
4503 // different from gcc, we follow the intent which was that it should be set
4504 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004505 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4506 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004507 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004508 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004509
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004510 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4511 Opts.ShortWChar ? "2" : "4");
4512
4513 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4514 Opts.ShortEnums ? "1" : "4");
4515
Bernard Ogden18b57012013-10-29 09:47:51 +00004516 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004517 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004518
Tim Northover02e38602014-02-03 17:28:04 +00004519 if (Crypto)
4520 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4521
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004522 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004523 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4524 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4525 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4526 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4527 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004528
4529 bool is5EOrAbove = (CPUArchVer >= 6 ||
4530 (CPUArchVer == 5 &&
4531 CPUArch.find('E') != StringRef::npos));
4532 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4533 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4534 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004535 }
Craig Topper3164f332014-03-11 03:39:26 +00004536 void getTargetBuiltins(const Builtin::Info *&Records,
4537 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004538 Records = BuiltinInfo;
4539 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004540 }
Craig Topper3164f332014-03-11 03:39:26 +00004541 bool isCLZForZeroUndef() const override { return false; }
4542 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004543 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004544 }
Craig Topper3164f332014-03-11 03:39:26 +00004545 void getGCCRegNames(const char * const *&Names,
4546 unsigned &NumNames) const override;
4547 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4548 unsigned &NumAliases) const override;
4549 bool validateAsmConstraint(const char *&Name,
4550 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004551 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004552 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004553 case 'l': // r0-r7
4554 case 'h': // r8-r15
4555 case 'w': // VFP Floating point register single precision
4556 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004557 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004558 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004559 case 'I':
4560 case 'J':
4561 case 'K':
4562 case 'L':
4563 case 'M':
4564 // FIXME
4565 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004566 case 'Q': // A memory address that is a single base register.
4567 Info.setAllowsMemory();
4568 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004569 case 'U': // a memory reference...
4570 switch (Name[1]) {
4571 case 'q': // ...ARMV4 ldrsb
4572 case 'v': // ...VFP load/store (reg+constant offset)
4573 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004574 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004575 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004576 case 'n': // valid address for Neon doubleword vector load/store
4577 case 'm': // valid address for Neon element and structure load/store
4578 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004579 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004580 Info.setAllowsMemory();
4581 Name++;
4582 return true;
4583 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004584 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004585 return false;
4586 }
Craig Topper3164f332014-03-11 03:39:26 +00004587 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004588 std::string R;
4589 switch (*Constraint) {
4590 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004591 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004592 Constraint++;
4593 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004594 case 'p': // 'p' should be translated to 'r' by default.
4595 R = std::string("r");
4596 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004597 default:
4598 return std::string(1, *Constraint);
4599 }
4600 return R;
4601 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004602 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004603 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004604 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004605 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004606 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004607
Bill Wendling9d1ee112012-10-25 23:28:48 +00004608 // Strip off constraint modifiers.
4609 while (Constraint[0] == '=' ||
4610 Constraint[0] == '+' ||
4611 Constraint[0] == '&')
4612 Constraint = Constraint.substr(1);
4613
4614 switch (Constraint[0]) {
4615 default: break;
4616 case 'r': {
4617 switch (Modifier) {
4618 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004619 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004620 case 'q':
4621 // A register of size 32 cannot fit a vector type.
4622 return false;
4623 }
4624 }
4625 }
4626
4627 return true;
4628 }
Craig Topper3164f332014-03-11 03:39:26 +00004629 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004630 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004631 return "";
4632 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004633
Craig Topper3164f332014-03-11 03:39:26 +00004634 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004635 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4636 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004637
Craig Topper3164f332014-03-11 03:39:26 +00004638 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004639 if (RegNo == 0) return 0;
4640 if (RegNo == 1) return 1;
4641 return -1;
4642 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004643};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004644
Rafael Espindolaeb265472013-08-21 21:59:03 +00004645bool ARMTargetInfo::setFPMath(StringRef Name) {
4646 if (Name == "neon") {
4647 FPMath = FP_Neon;
4648 return true;
4649 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4650 Name == "vfp4") {
4651 FPMath = FP_VFP;
4652 return true;
4653 }
4654 return false;
4655}
4656
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004657const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004658 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004659 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004660 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4661
4662 // Float registers
4663 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4664 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4665 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004666 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004667
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004668 // Double registers
4669 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4670 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004671 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4672 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004673
4674 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004675 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4676 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004677};
4678
4679void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004680 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004681 Names = GCCRegNames;
4682 NumNames = llvm::array_lengthof(GCCRegNames);
4683}
4684
4685const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004686 { { "a1" }, "r0" },
4687 { { "a2" }, "r1" },
4688 { { "a3" }, "r2" },
4689 { { "a4" }, "r3" },
4690 { { "v1" }, "r4" },
4691 { { "v2" }, "r5" },
4692 { { "v3" }, "r6" },
4693 { { "v4" }, "r7" },
4694 { { "v5" }, "r8" },
4695 { { "v6", "rfp" }, "r9" },
4696 { { "sl" }, "r10" },
4697 { { "fp" }, "r11" },
4698 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004699 { { "r13" }, "sp" },
4700 { { "r14" }, "lr" },
4701 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004702 // The S, D and Q registers overlap, but aren't really aliases; we
4703 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004704};
4705
4706void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4707 unsigned &NumAliases) const {
4708 Aliases = GCCRegAliases;
4709 NumAliases = llvm::array_lengthof(GCCRegAliases);
4710}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004711
4712const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004713#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004714#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004715 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004716#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004717
4718#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004719#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004720#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4721 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004722#include "clang/Basic/BuiltinsARM.def"
4723};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004724
4725class ARMleTargetInfo : public ARMTargetInfo {
4726public:
4727 ARMleTargetInfo(const llvm::Triple &Triple)
4728 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004729 void getTargetDefines(const LangOptions &Opts,
4730 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004731 Builder.defineMacro("__ARMEL__");
4732 ARMTargetInfo::getTargetDefines(Opts, Builder);
4733 }
4734};
4735
4736class ARMbeTargetInfo : public ARMTargetInfo {
4737public:
4738 ARMbeTargetInfo(const llvm::Triple &Triple)
4739 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004740 void getTargetDefines(const LangOptions &Opts,
4741 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004742 Builder.defineMacro("__ARMEB__");
4743 Builder.defineMacro("__ARM_BIG_ENDIAN");
4744 ARMTargetInfo::getTargetDefines(Opts, Builder);
4745 }
4746};
Chris Lattner17df24e2008-04-21 18:56:49 +00004747
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004748class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4749 const llvm::Triple Triple;
4750public:
4751 WindowsARMTargetInfo(const llvm::Triple &Triple)
4752 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4753 TLSSupported = false;
4754 WCharType = UnsignedShort;
4755 SizeType = UnsignedInt;
4756 UserLabelPrefix = "";
4757 }
4758 void getVisualStudioDefines(const LangOptions &Opts,
4759 MacroBuilder &Builder) const {
4760 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4761
4762 // FIXME: this is invalid for WindowsCE
4763 Builder.defineMacro("_M_ARM_NT", "1");
4764 Builder.defineMacro("_M_ARMT", "_M_ARM");
4765 Builder.defineMacro("_M_THUMB", "_M_ARM");
4766
4767 assert((Triple.getArch() == llvm::Triple::arm ||
4768 Triple.getArch() == llvm::Triple::thumb) &&
4769 "invalid architecture for Windows ARM target info");
4770 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4771 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4772
4773 // TODO map the complete set of values
4774 // 31: VFPv3 40: VFPv4
4775 Builder.defineMacro("_M_ARM_FP", "31");
4776 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004777 BuiltinVaListKind getBuiltinVaListKind() const override {
4778 return TargetInfo::CharPtrBuiltinVaList;
4779 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004780};
4781
4782// Windows ARM + Itanium C++ ABI Target
4783class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4784public:
4785 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4786 : WindowsARMTargetInfo(Triple) {
4787 TheCXXABI.set(TargetCXXABI::GenericARM);
4788 }
4789
4790 void getTargetDefines(const LangOptions &Opts,
4791 MacroBuilder &Builder) const override {
4792 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4793
4794 if (Opts.MSVCCompat)
4795 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4796 }
4797};
4798
4799// Windows ARM, MS (C++) ABI
4800class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4801public:
4802 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4803 : WindowsARMTargetInfo(Triple) {
4804 TheCXXABI.set(TargetCXXABI::Microsoft);
4805 }
4806
4807 void getTargetDefines(const LangOptions &Opts,
4808 MacroBuilder &Builder) const override {
4809 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4810 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4811 }
4812};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004813
Mike Stump11289f42009-09-09 15:08:12 +00004814class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004815 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004816protected:
Craig Topper3164f332014-03-11 03:39:26 +00004817 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4818 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004819 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004820 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004821
Torok Edwinb2b37c62009-06-30 17:10:35 +00004822public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004823 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004824 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004825 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004826 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004827 // FIXME: This should be based off of the target features in
4828 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004829 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004830
4831 // Darwin on iOS uses a variant of the ARM C++ ABI.
4832 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004833 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004834};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004835
Tim Northover573cbee2014-05-24 12:52:07 +00004836class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004837 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004838 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4839 static const char *const GCCRegNames[];
4840
James Molloy75f5f9e2014-04-16 15:33:48 +00004841 enum FPUModeEnum {
4842 FPUMode,
4843 NeonMode
4844 };
4845
4846 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004847 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004848 unsigned Crypto;
4849
Tim Northovera2ee4332014-03-29 15:09:45 +00004850 static const Builtin::Info BuiltinInfo[];
4851
4852 std::string ABI;
4853
4854public:
Tim Northover573cbee2014-05-24 12:52:07 +00004855 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004856 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004857
4858 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4859 WCharType = SignedInt;
4860
4861 // NetBSD apparently prefers consistency across ARM targets to consistency
4862 // across 64-bit targets.
4863 Int64Type = SignedLongLong;
4864 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004865 } else {
4866 WCharType = UnsignedInt;
4867 Int64Type = SignedLong;
4868 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004869 }
4870
Tim Northovera2ee4332014-03-29 15:09:45 +00004871 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004872 MaxVectorAlign = 128;
4873 RegParmMax = 8;
4874 MaxAtomicInlineWidth = 128;
4875 MaxAtomicPromoteWidth = 128;
4876
Tim Northovera6a19f12015-02-06 01:25:07 +00004877 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004878 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4879
Tim Northovera2ee4332014-03-29 15:09:45 +00004880 // {} in inline assembly are neon specifiers, not assembly variant
4881 // specifiers.
4882 NoAsmVariants = true;
4883
Tim Northover7ad87af2015-01-16 18:44:04 +00004884 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4885 // contributes to the alignment of the containing aggregate in the same way
4886 // a plain (non bit-field) member of that type would, without exception for
4887 // zero-sized or anonymous bit-fields."
4888 UseBitFieldTypeAlignment = true;
4889 UseZeroLengthBitfieldAlignment = true;
4890
Tim Northover573cbee2014-05-24 12:52:07 +00004891 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004892 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4893 }
4894
Alp Toker4925ba72014-06-07 23:30:42 +00004895 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004896 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004897 if (Name != "aapcs" && Name != "darwinpcs")
4898 return false;
4899
4900 ABI = Name;
4901 return true;
4902 }
4903
David Blaikie1cbb9712014-11-14 19:09:44 +00004904 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004905 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004906 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004907 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004908 .Case("cyclone", true)
4909 .Default(false);
4910 return CPUKnown;
4911 }
4912
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004913 void getTargetDefines(const LangOptions &Opts,
4914 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004915 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004916 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004917
4918 // Target properties.
4919 Builder.defineMacro("_LP64");
4920 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004921
4922 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4923 Builder.defineMacro("__ARM_ACLE", "200");
4924 Builder.defineMacro("__ARM_ARCH", "8");
4925 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4926
4927 Builder.defineMacro("__ARM_64BIT_STATE");
4928 Builder.defineMacro("__ARM_PCS_AAPCS64");
4929 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4930
4931 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4932 Builder.defineMacro("__ARM_FEATURE_CLZ");
4933 Builder.defineMacro("__ARM_FEATURE_FMA");
4934 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004935 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4936 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4937 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4938 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004939
4940 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4941
4942 // 0xe implies support for half, single and double precision operations.
4943 Builder.defineMacro("__ARM_FP", "0xe");
4944
4945 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4946 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4947 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4948
4949 if (Opts.FastMath || Opts.FiniteMathOnly)
4950 Builder.defineMacro("__ARM_FP_FAST");
4951
Richard Smithab506ad2014-10-20 23:26:58 +00004952 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004953 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4954
4955 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4956
4957 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4958 Opts.ShortEnums ? "1" : "4");
4959
James Molloy75f5f9e2014-04-16 15:33:48 +00004960 if (FPU == NeonMode) {
4961 Builder.defineMacro("__ARM_NEON");
4962 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004963 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004964 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004965
Bradley Smith418c5932014-05-02 15:17:51 +00004966 if (CRC)
4967 Builder.defineMacro("__ARM_FEATURE_CRC32");
4968
James Molloy75f5f9e2014-04-16 15:33:48 +00004969 if (Crypto)
4970 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00004971
4972 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
4973 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4974 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4975 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4976 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00004977 }
4978
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004979 void getTargetBuiltins(const Builtin::Info *&Records,
4980 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004981 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004982 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004983 }
4984
David Blaikie1cbb9712014-11-14 19:09:44 +00004985 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004986 return Feature == "aarch64" ||
4987 Feature == "arm64" ||
4988 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004989 }
4990
James Molloy5e73df52014-04-16 15:06:20 +00004991 bool handleTargetFeatures(std::vector<std::string> &Features,
4992 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004993 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004994 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004995 Crypto = 0;
4996 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4997 if (Features[i] == "+neon")
4998 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004999 if (Features[i] == "+crc")
5000 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005001 if (Features[i] == "+crypto")
5002 Crypto = 1;
5003 }
5004
James Molloy5e73df52014-04-16 15:06:20 +00005005 setDescriptionString();
5006
5007 return true;
5008 }
5009
David Blaikie1cbb9712014-11-14 19:09:44 +00005010 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005011
David Blaikie1cbb9712014-11-14 19:09:44 +00005012 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005013 return TargetInfo::AArch64ABIBuiltinVaList;
5014 }
5015
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005016 void getGCCRegNames(const char *const *&Names,
5017 unsigned &NumNames) const override;
5018 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5019 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005020
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005021 bool validateAsmConstraint(const char *&Name,
5022 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005023 switch (*Name) {
5024 default:
5025 return false;
5026 case 'w': // Floating point and SIMD registers (V0-V31)
5027 Info.setAllowsRegister();
5028 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005029 case 'I': // Constant that can be used with an ADD instruction
5030 case 'J': // Constant that can be used with a SUB instruction
5031 case 'K': // Constant that can be used with a 32-bit logical instruction
5032 case 'L': // Constant that can be used with a 64-bit logical instruction
5033 case 'M': // Constant that can be used as a 32-bit MOV immediate
5034 case 'N': // Constant that can be used as a 64-bit MOV immediate
5035 case 'Y': // Floating point constant zero
5036 case 'Z': // Integer constant zero
5037 return true;
5038 case 'Q': // A memory reference with base register and no offset
5039 Info.setAllowsMemory();
5040 return true;
5041 case 'S': // A symbolic address
5042 Info.setAllowsRegister();
5043 return true;
5044 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005045 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5046 // Utf: A memory address suitable for ldp/stp in TF mode.
5047 // Usa: An absolute symbolic address.
5048 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5049 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005050 case 'z': // Zero register, wzr or xzr
5051 Info.setAllowsRegister();
5052 return true;
5053 case 'x': // Floating point and SIMD registers (V0-V15)
5054 Info.setAllowsRegister();
5055 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005056 }
5057 return false;
5058 }
5059
Akira Hatanaka987f1862014-08-22 06:05:21 +00005060 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005061 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005062 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005063 // Strip off constraint modifiers.
5064 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5065 Constraint = Constraint.substr(1);
5066
5067 switch (Constraint[0]) {
5068 default:
5069 return true;
5070 case 'z':
5071 case 'r': {
5072 switch (Modifier) {
5073 case 'x':
5074 case 'w':
5075 // For now assume that the person knows what they're
5076 // doing with the modifier.
5077 return true;
5078 default:
5079 // By default an 'r' constraint will be in the 'x'
5080 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005081 if (Size == 64)
5082 return true;
5083
5084 SuggestedModifier = "w";
5085 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005086 }
5087 }
5088 }
5089 }
5090
David Blaikie1cbb9712014-11-14 19:09:44 +00005091 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005092
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005093 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005094 if (RegNo == 0)
5095 return 0;
5096 if (RegNo == 1)
5097 return 1;
5098 return -1;
5099 }
5100};
5101
Tim Northover573cbee2014-05-24 12:52:07 +00005102const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005103 // 32-bit Integer registers
5104 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5105 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5106 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5107
5108 // 64-bit Integer registers
5109 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5110 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5111 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5112
5113 // 32-bit floating point regsisters
5114 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5115 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5116 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5117
5118 // 64-bit floating point regsisters
5119 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5120 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5121 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5122
5123 // Vector registers
5124 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5125 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5126 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5127};
5128
Tim Northover573cbee2014-05-24 12:52:07 +00005129void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005130 unsigned &NumNames) const {
5131 Names = GCCRegNames;
5132 NumNames = llvm::array_lengthof(GCCRegNames);
5133}
5134
Tim Northover573cbee2014-05-24 12:52:07 +00005135const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005136 { { "w31" }, "wsp" },
5137 { { "x29" }, "fp" },
5138 { { "x30" }, "lr" },
5139 { { "x31" }, "sp" },
5140 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5141 // don't want to substitute one of these for a different-sized one.
5142};
5143
Tim Northover573cbee2014-05-24 12:52:07 +00005144void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005145 unsigned &NumAliases) const {
5146 Aliases = GCCRegAliases;
5147 NumAliases = llvm::array_lengthof(GCCRegAliases);
5148}
5149
Tim Northover573cbee2014-05-24 12:52:07 +00005150const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005151#define BUILTIN(ID, TYPE, ATTRS) \
5152 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5153#include "clang/Basic/BuiltinsNEON.def"
5154
5155#define BUILTIN(ID, TYPE, ATTRS) \
5156 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005157#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005158};
James Molloy5e73df52014-04-16 15:06:20 +00005159
Tim Northover573cbee2014-05-24 12:52:07 +00005160class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005161 void setDescriptionString() override {
5162 if (getTriple().isOSBinFormatMachO())
5163 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5164 else
5165 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5166 }
5167
5168public:
Tim Northover573cbee2014-05-24 12:52:07 +00005169 AArch64leTargetInfo(const llvm::Triple &Triple)
5170 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005171 BigEndian = false;
5172 }
5173 void getTargetDefines(const LangOptions &Opts,
5174 MacroBuilder &Builder) const override {
5175 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005176 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005177 }
5178};
5179
Tim Northover573cbee2014-05-24 12:52:07 +00005180class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005181 void setDescriptionString() override {
5182 assert(!getTriple().isOSBinFormatMachO());
5183 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5184 }
5185
5186public:
Tim Northover573cbee2014-05-24 12:52:07 +00005187 AArch64beTargetInfo(const llvm::Triple &Triple)
5188 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005189 void getTargetDefines(const LangOptions &Opts,
5190 MacroBuilder &Builder) const override {
5191 Builder.defineMacro("__AARCH64EB__");
5192 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5193 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005194 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005195 }
5196};
Tim Northovera2ee4332014-03-29 15:09:45 +00005197
Tim Northover573cbee2014-05-24 12:52:07 +00005198class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005199protected:
5200 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5201 MacroBuilder &Builder) const override {
5202 Builder.defineMacro("__AARCH64_SIMD__");
5203 Builder.defineMacro("__ARM64_ARCH_8__");
5204 Builder.defineMacro("__ARM_NEON__");
5205 Builder.defineMacro("__LITTLE_ENDIAN__");
5206 Builder.defineMacro("__REGISTER_PREFIX__", "");
5207 Builder.defineMacro("__arm64", "1");
5208 Builder.defineMacro("__arm64__", "1");
5209
5210 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5211 }
5212
Tim Northovera2ee4332014-03-29 15:09:45 +00005213public:
Tim Northover573cbee2014-05-24 12:52:07 +00005214 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5215 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005216 Int64Type = SignedLongLong;
5217 WCharType = SignedInt;
5218 UseSignedCharForObjCBool = false;
5219
Tim Northovera6a19f12015-02-06 01:25:07 +00005220 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005221 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5222
5223 TheCXXABI.set(TargetCXXABI::iOS64);
5224 }
5225
David Blaikie1cbb9712014-11-14 19:09:44 +00005226 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005227 return TargetInfo::CharPtrBuiltinVaList;
5228 }
5229};
Tim Northovera2ee4332014-03-29 15:09:45 +00005230
Tony Linthicum76329bf2011-12-12 21:14:55 +00005231// Hexagon abstract base class
5232class HexagonTargetInfo : public TargetInfo {
5233 static const Builtin::Info BuiltinInfo[];
5234 static const char * const GCCRegNames[];
5235 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5236 std::string CPU;
5237public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005238 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005239 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005240 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005241
5242 // {} in inline assembly are packet specifiers, not assembly variant
5243 // specifiers.
5244 NoAsmVariants = true;
5245 }
5246
Craig Topper3164f332014-03-11 03:39:26 +00005247 void getTargetBuiltins(const Builtin::Info *&Records,
5248 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005249 Records = BuiltinInfo;
5250 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5251 }
5252
Craig Topper3164f332014-03-11 03:39:26 +00005253 bool validateAsmConstraint(const char *&Name,
5254 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005255 return true;
5256 }
5257
Craig Topper3164f332014-03-11 03:39:26 +00005258 void getTargetDefines(const LangOptions &Opts,
5259 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005260
Craig Topper3164f332014-03-11 03:39:26 +00005261 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005262 return Feature == "hexagon";
5263 }
Craig Topper3164f332014-03-11 03:39:26 +00005264
5265 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005266 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005267 }
Craig Topper3164f332014-03-11 03:39:26 +00005268 void getGCCRegNames(const char * const *&Names,
5269 unsigned &NumNames) const override;
5270 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5271 unsigned &NumAliases) const override;
5272 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005273 return "";
5274 }
Sebastian Pop86500282012-01-13 20:37:10 +00005275
5276 static const char *getHexagonCPUSuffix(StringRef Name) {
5277 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005278 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005279 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005280 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005281 }
5282
Craig Topper3164f332014-03-11 03:39:26 +00005283 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005284 if (!getHexagonCPUSuffix(Name))
5285 return false;
5286
Tony Linthicum76329bf2011-12-12 21:14:55 +00005287 CPU = Name;
5288 return true;
5289 }
5290};
5291
5292void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5293 MacroBuilder &Builder) const {
5294 Builder.defineMacro("qdsp6");
5295 Builder.defineMacro("__qdsp6", "1");
5296 Builder.defineMacro("__qdsp6__", "1");
5297
5298 Builder.defineMacro("hexagon");
5299 Builder.defineMacro("__hexagon", "1");
5300 Builder.defineMacro("__hexagon__", "1");
5301
5302 if(CPU == "hexagonv1") {
5303 Builder.defineMacro("__HEXAGON_V1__");
5304 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5305 if(Opts.HexagonQdsp6Compat) {
5306 Builder.defineMacro("__QDSP6_V1__");
5307 Builder.defineMacro("__QDSP6_ARCH__", "1");
5308 }
5309 }
5310 else if(CPU == "hexagonv2") {
5311 Builder.defineMacro("__HEXAGON_V2__");
5312 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5313 if(Opts.HexagonQdsp6Compat) {
5314 Builder.defineMacro("__QDSP6_V2__");
5315 Builder.defineMacro("__QDSP6_ARCH__", "2");
5316 }
5317 }
5318 else if(CPU == "hexagonv3") {
5319 Builder.defineMacro("__HEXAGON_V3__");
5320 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5321 if(Opts.HexagonQdsp6Compat) {
5322 Builder.defineMacro("__QDSP6_V3__");
5323 Builder.defineMacro("__QDSP6_ARCH__", "3");
5324 }
5325 }
5326 else if(CPU == "hexagonv4") {
5327 Builder.defineMacro("__HEXAGON_V4__");
5328 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5329 if(Opts.HexagonQdsp6Compat) {
5330 Builder.defineMacro("__QDSP6_V4__");
5331 Builder.defineMacro("__QDSP6_ARCH__", "4");
5332 }
5333 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005334 else if(CPU == "hexagonv5") {
5335 Builder.defineMacro("__HEXAGON_V5__");
5336 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5337 if(Opts.HexagonQdsp6Compat) {
5338 Builder.defineMacro("__QDSP6_V5__");
5339 Builder.defineMacro("__QDSP6_ARCH__", "5");
5340 }
5341 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005342}
5343
5344const char * const HexagonTargetInfo::GCCRegNames[] = {
5345 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5346 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5347 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5348 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5349 "p0", "p1", "p2", "p3",
5350 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5351};
5352
5353void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5354 unsigned &NumNames) const {
5355 Names = GCCRegNames;
5356 NumNames = llvm::array_lengthof(GCCRegNames);
5357}
5358
5359
5360const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5361 { { "sp" }, "r29" },
5362 { { "fp" }, "r30" },
5363 { { "lr" }, "r31" },
5364 };
5365
5366void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5367 unsigned &NumAliases) const {
5368 Aliases = GCCRegAliases;
5369 NumAliases = llvm::array_lengthof(GCCRegAliases);
5370}
5371
5372
5373const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5374#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5375#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5376 ALL_LANGUAGES },
5377#include "clang/Basic/BuiltinsHexagon.def"
5378};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005379
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005380// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5381class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005382 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5383 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005384 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005385public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005386 SparcTargetInfo(const llvm::Triple &Triple)
5387 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005388
Craig Topper3164f332014-03-11 03:39:26 +00005389 bool handleTargetFeatures(std::vector<std::string> &Features,
5390 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005391 // The backend doesn't actually handle soft float yet, but in case someone
5392 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005393 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5394 if (Feature != Features.end()) {
5395 SoftFloat = true;
5396 Features.erase(Feature);
5397 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005398 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005399 }
Craig Topper3164f332014-03-11 03:39:26 +00005400 void getTargetDefines(const LangOptions &Opts,
5401 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005402 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005403 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005404
5405 if (SoftFloat)
5406 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005407 }
Craig Topper3164f332014-03-11 03:39:26 +00005408
5409 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005410 return llvm::StringSwitch<bool>(Feature)
5411 .Case("softfloat", SoftFloat)
5412 .Case("sparc", true)
5413 .Default(false);
5414 }
Craig Topper3164f332014-03-11 03:39:26 +00005415
5416 void getTargetBuiltins(const Builtin::Info *&Records,
5417 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005418 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005419 }
Craig Topper3164f332014-03-11 03:39:26 +00005420 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005421 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005422 }
Craig Topper3164f332014-03-11 03:39:26 +00005423 void getGCCRegNames(const char * const *&Names,
5424 unsigned &NumNames) const override;
5425 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5426 unsigned &NumAliases) const override;
5427 bool validateAsmConstraint(const char *&Name,
5428 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005429 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005430 switch (*Name) {
5431 case 'I': // Signed 13-bit constant
5432 case 'J': // Zero
5433 case 'K': // 32-bit constant with the low 12 bits clear
5434 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5435 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5436 case 'N': // Same as 'K' but zext (required for SIMode)
5437 case 'O': // The constant 4096
5438 return true;
5439 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005440 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005441 }
Craig Topper3164f332014-03-11 03:39:26 +00005442 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005443 // FIXME: Implement!
5444 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005445 }
5446};
5447
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005448const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005449 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5450 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5451 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5452 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5453};
5454
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005455void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5456 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005457 Names = GCCRegNames;
5458 NumNames = llvm::array_lengthof(GCCRegNames);
5459}
5460
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005461const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005462 { { "g0" }, "r0" },
5463 { { "g1" }, "r1" },
5464 { { "g2" }, "r2" },
5465 { { "g3" }, "r3" },
5466 { { "g4" }, "r4" },
5467 { { "g5" }, "r5" },
5468 { { "g6" }, "r6" },
5469 { { "g7" }, "r7" },
5470 { { "o0" }, "r8" },
5471 { { "o1" }, "r9" },
5472 { { "o2" }, "r10" },
5473 { { "o3" }, "r11" },
5474 { { "o4" }, "r12" },
5475 { { "o5" }, "r13" },
5476 { { "o6", "sp" }, "r14" },
5477 { { "o7" }, "r15" },
5478 { { "l0" }, "r16" },
5479 { { "l1" }, "r17" },
5480 { { "l2" }, "r18" },
5481 { { "l3" }, "r19" },
5482 { { "l4" }, "r20" },
5483 { { "l5" }, "r21" },
5484 { { "l6" }, "r22" },
5485 { { "l7" }, "r23" },
5486 { { "i0" }, "r24" },
5487 { { "i1" }, "r25" },
5488 { { "i2" }, "r26" },
5489 { { "i3" }, "r27" },
5490 { { "i4" }, "r28" },
5491 { { "i5" }, "r29" },
5492 { { "i6", "fp" }, "r30" },
5493 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005494};
5495
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005496void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5497 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005498 Aliases = GCCRegAliases;
5499 NumAliases = llvm::array_lengthof(GCCRegAliases);
5500}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005501
5502// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5503class SparcV8TargetInfo : public SparcTargetInfo {
5504public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005505 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005506 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005507 }
5508
Craig Topper3164f332014-03-11 03:39:26 +00005509 void getTargetDefines(const LangOptions &Opts,
5510 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005511 SparcTargetInfo::getTargetDefines(Opts, Builder);
5512 Builder.defineMacro("__sparcv8");
5513 }
5514};
5515
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005516// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5517class SparcV8elTargetInfo : public SparcV8TargetInfo {
5518 public:
5519 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
5520 DescriptionString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
5521 BigEndian = false;
5522 }
5523};
5524
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005525// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5526class SparcV9TargetInfo : public SparcTargetInfo {
5527public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005528 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005529 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005530 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005531 // This is an LP64 platform.
5532 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005533
5534 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005535 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005536 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005537 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005538 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005539 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005540
5541 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5542 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5543 LongDoubleWidth = 128;
5544 LongDoubleAlign = 128;
5545 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005546 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005547 }
5548
Craig Topper3164f332014-03-11 03:39:26 +00005549 void getTargetDefines(const LangOptions &Opts,
5550 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005551 SparcTargetInfo::getTargetDefines(Opts, Builder);
5552 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005553 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005554 // Solaris doesn't need these variants, but the BSDs do.
5555 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005556 Builder.defineMacro("__sparc64__");
5557 Builder.defineMacro("__sparc_v9__");
5558 Builder.defineMacro("__sparcv9__");
5559 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005560 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005561
Craig Topper3164f332014-03-11 03:39:26 +00005562 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005563 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5564 .Case("v9", true)
5565 .Case("ultrasparc", true)
5566 .Case("ultrasparc3", true)
5567 .Case("niagara", true)
5568 .Case("niagara2", true)
5569 .Case("niagara3", true)
5570 .Case("niagara4", true)
5571 .Default(false);
5572
5573 // No need to store the CPU yet. There aren't any CPU-specific
5574 // macros to define.
5575 return CPUKnown;
5576 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005577};
5578
Torok Edwinb2b37c62009-06-30 17:10:35 +00005579class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005580public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005581 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5582 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005583 SizeType = UnsignedInt;
5584 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005585 }
5586};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005587
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005588class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005589 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005590 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005591 std::string CPU;
5592 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005593 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005594
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005595public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005596 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005597 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005598 IntMaxType = SignedLong;
5599 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005600 TLSSupported = true;
5601 IntWidth = IntAlign = 32;
5602 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5603 PointerWidth = PointerAlign = 64;
5604 LongDoubleWidth = 128;
5605 LongDoubleAlign = 64;
5606 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005607 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005608 MinGlobalAlign = 16;
5609 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5610 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5611 }
5612 void getTargetDefines(const LangOptions &Opts,
5613 MacroBuilder &Builder) const override {
5614 Builder.defineMacro("__s390__");
5615 Builder.defineMacro("__s390x__");
5616 Builder.defineMacro("__zarch__");
5617 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005618 if (HasTransactionalExecution)
5619 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005620 }
5621 void getTargetBuiltins(const Builtin::Info *&Records,
5622 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005623 Records = BuiltinInfo;
5624 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005625 }
5626
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005627 void getGCCRegNames(const char *const *&Names,
5628 unsigned &NumNames) const override;
5629 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5630 unsigned &NumAliases) const override {
5631 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005632 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005633 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005634 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005635 bool validateAsmConstraint(const char *&Name,
5636 TargetInfo::ConstraintInfo &info) const override;
5637 const char *getClobbers() const override {
5638 // FIXME: Is this really right?
5639 return "";
5640 }
5641 BuiltinVaListKind getBuiltinVaListKind() const override {
5642 return TargetInfo::SystemZBuiltinVaList;
5643 }
5644 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005645 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005646 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5647 .Case("z10", true)
5648 .Case("z196", true)
5649 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005650 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005651 .Default(false);
5652
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005653 return CPUKnown;
5654 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005655 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5656 if (CPU == "zEC12")
5657 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005658 if (CPU == "z13") {
5659 Features["transactional-execution"] = true;
5660 Features["vector"] = true;
5661 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005662 }
5663
5664 bool handleTargetFeatures(std::vector<std::string> &Features,
5665 DiagnosticsEngine &Diags) override {
5666 HasTransactionalExecution = false;
5667 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5668 if (Features[i] == "+transactional-execution")
5669 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005670 if (Features[i] == "+vector")
5671 HasVector = true;
5672 }
5673 // If we use the vector ABI, vector types are 64-bit aligned.
5674 if (HasVector) {
5675 MaxVectorAlign = 64;
5676 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5677 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005678 }
5679 return true;
5680 }
5681
5682 bool hasFeature(StringRef Feature) const override {
5683 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005684 .Case("systemz", true)
5685 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005686 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005687 .Default(false);
5688 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005689
5690 StringRef getABI() const override {
5691 if (HasVector)
5692 return "vector";
5693 return "";
5694 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005695};
5696
5697const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5698#define BUILTIN(ID, TYPE, ATTRS) \
5699 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5700#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005701};
5702
5703const char *const SystemZTargetInfo::GCCRegNames[] = {
5704 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5705 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5706 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5707 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5708};
5709
5710void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5711 unsigned &NumNames) const {
5712 Names = GCCRegNames;
5713 NumNames = llvm::array_lengthof(GCCRegNames);
5714}
5715
5716bool SystemZTargetInfo::
5717validateAsmConstraint(const char *&Name,
5718 TargetInfo::ConstraintInfo &Info) const {
5719 switch (*Name) {
5720 default:
5721 return false;
5722
5723 case 'a': // Address register
5724 case 'd': // Data register (equivalent to 'r')
5725 case 'f': // Floating-point register
5726 Info.setAllowsRegister();
5727 return true;
5728
5729 case 'I': // Unsigned 8-bit constant
5730 case 'J': // Unsigned 12-bit constant
5731 case 'K': // Signed 16-bit constant
5732 case 'L': // Signed 20-bit displacement (on all targets we support)
5733 case 'M': // 0x7fffffff
5734 return true;
5735
5736 case 'Q': // Memory with base and unsigned 12-bit displacement
5737 case 'R': // Likewise, plus an index
5738 case 'S': // Memory with base and signed 20-bit displacement
5739 case 'T': // Likewise, plus an index
5740 Info.setAllowsMemory();
5741 return true;
5742 }
5743}
Ulrich Weigand47445072013-05-06 16:26:41 +00005744
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005745 class MSP430TargetInfo : public TargetInfo {
5746 static const char * const GCCRegNames[];
5747 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005749 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005750 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005751 IntWidth = 16; IntAlign = 16;
5752 LongWidth = 32; LongLongWidth = 64;
5753 LongAlign = LongLongAlign = 16;
5754 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005755 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005756 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005757 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005758 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005759 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005760 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005761 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005762 }
5763 void getTargetDefines(const LangOptions &Opts,
5764 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005765 Builder.defineMacro("MSP430");
5766 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005767 // FIXME: defines for different 'flavours' of MCU
5768 }
Craig Topper3164f332014-03-11 03:39:26 +00005769 void getTargetBuiltins(const Builtin::Info *&Records,
5770 unsigned &NumRecords) const override {
5771 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005772 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005773 NumRecords = 0;
5774 }
Craig Topper3164f332014-03-11 03:39:26 +00005775 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005776 return Feature == "msp430";
5777 }
Craig Topper3164f332014-03-11 03:39:26 +00005778 void getGCCRegNames(const char * const *&Names,
5779 unsigned &NumNames) const override;
5780 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5781 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005782 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005783 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005784 NumAliases = 0;
5785 }
Eric Christopher917e9522014-11-18 22:36:15 +00005786 bool
5787 validateAsmConstraint(const char *&Name,
5788 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005789 // FIXME: implement
5790 switch (*Name) {
5791 case 'K': // the constant 1
5792 case 'L': // constant -1^20 .. 1^19
5793 case 'M': // constant 1-4:
5794 return true;
5795 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005796 // No target constraints for now.
5797 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005798 }
Craig Topper3164f332014-03-11 03:39:26 +00005799 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005800 // FIXME: Is this really right?
5801 return "";
5802 }
Craig Topper3164f332014-03-11 03:39:26 +00005803 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005804 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005805 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005806 }
5807 };
5808
5809 const char * const MSP430TargetInfo::GCCRegNames[] = {
5810 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5811 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5812 };
5813
5814 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5815 unsigned &NumNames) const {
5816 Names = GCCRegNames;
5817 NumNames = llvm::array_lengthof(GCCRegNames);
5818 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005819
Mike Stump11289f42009-09-09 15:08:12 +00005820 // LLVM and Clang cannot be used directly to output native binaries for
5821 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005822 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005823 //
5824 // TCE uses the llvm bitcode as input and uses it for generating customized
5825 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005826 // publicly available in http://tce.cs.tut.fi
5827
Eli Friedman1f191002011-10-07 19:51:42 +00005828 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5829 3, // opencl_global
5830 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005831 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005832 // FIXME: generic has to be added to the target
5833 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005834 0, // cuda_device
5835 0, // cuda_constant
5836 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005837 };
5838
Eli Friedmana9c3d712009-08-19 20:47:07 +00005839 class TCETargetInfo : public TargetInfo{
5840 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005841 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005842 TLSSupported = false;
5843 IntWidth = 32;
5844 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005845 PointerWidth = 32;
5846 IntAlign = 32;
5847 LongAlign = LongLongAlign = 32;
5848 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005849 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005850 SizeType = UnsignedInt;
5851 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005852 IntPtrType = SignedInt;
5853 PtrDiffType = SignedInt;
5854 FloatWidth = 32;
5855 FloatAlign = 32;
5856 DoubleWidth = 32;
5857 DoubleAlign = 32;
5858 LongDoubleWidth = 32;
5859 LongDoubleAlign = 32;
5860 FloatFormat = &llvm::APFloat::IEEEsingle;
5861 DoubleFormat = &llvm::APFloat::IEEEsingle;
5862 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005863 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5864 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005865 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005866 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005867 }
5868
Craig Topper3164f332014-03-11 03:39:26 +00005869 void getTargetDefines(const LangOptions &Opts,
5870 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005871 DefineStd(Builder, "tce", Opts);
5872 Builder.defineMacro("__TCE__");
5873 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005874 }
Craig Topper3164f332014-03-11 03:39:26 +00005875 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005876 return Feature == "tce";
5877 }
Craig Topper3164f332014-03-11 03:39:26 +00005878
5879 void getTargetBuiltins(const Builtin::Info *&Records,
5880 unsigned &NumRecords) const override {}
5881 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005882 return "";
5883 }
Craig Topper3164f332014-03-11 03:39:26 +00005884 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005885 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005886 }
Craig Topper3164f332014-03-11 03:39:26 +00005887 void getGCCRegNames(const char * const *&Names,
5888 unsigned &NumNames) const override {}
5889 bool validateAsmConstraint(const char *&Name,
5890 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005891 return true;
5892 }
Craig Topper3164f332014-03-11 03:39:26 +00005893 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5894 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005895 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005896
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005897class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005898 virtual void setDescriptionString() = 0;
5899
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005900 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005901 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005902 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005903 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005904 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005905 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005906 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005907 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005908 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005909 enum DspRevEnum {
5910 NoDSP, DSP1, DSP2
5911 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005912 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005913
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005914protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005915 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005916 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005917
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005918public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005919 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5920 const std::string &CPUStr)
5921 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005922 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005923 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5924 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5925 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005926
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005927 bool isNaN2008Default() const {
5928 return CPU == "mips32r6" || CPU == "mips64r6";
5929 }
5930
5931 bool isFP64Default() const {
5932 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5933 }
5934
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005935 bool isNan2008() const override {
5936 return IsNan2008;
5937 }
5938
Alp Toker4925ba72014-06-07 23:30:42 +00005939 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005940 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005941 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5942 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005943 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005944 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005945 .Case("mips1", IsMips32)
5946 .Case("mips2", IsMips32)
5947 .Case("mips3", true)
5948 .Case("mips4", true)
5949 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005950 .Case("mips32", IsMips32)
5951 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005952 .Case("mips32r3", IsMips32)
5953 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005954 .Case("mips32r6", IsMips32)
5955 .Case("mips64", true)
5956 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005957 .Case("mips64r3", true)
5958 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005959 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005960 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005961 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005962 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005963 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005964 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005965 if (CPU == "octeon")
5966 Features["mips64r2"] = Features["cnmips"] = true;
5967 else
5968 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005969 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005970
Craig Topper3164f332014-03-11 03:39:26 +00005971 void getTargetDefines(const LangOptions &Opts,
5972 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005973 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005974 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005975 if (Opts.GNUMode)
5976 Builder.defineMacro("mips");
5977
Simon Atanasyan683535b2012-08-29 19:14:58 +00005978 Builder.defineMacro("__REGISTER_PREFIX__", "");
5979
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005980 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005981 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005982 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005983 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005984 case SoftFloat:
5985 Builder.defineMacro("__mips_soft_float", Twine(1));
5986 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005987 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005988
Simon Atanasyan16071912013-04-14 14:07:30 +00005989 if (IsSingleFloat)
5990 Builder.defineMacro("__mips_single_float", Twine(1));
5991
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005992 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5993 Builder.defineMacro("_MIPS_FPSET",
5994 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5995
Simon Atanasyan72244b62012-07-05 16:06:06 +00005996 if (IsMips16)
5997 Builder.defineMacro("__mips16", Twine(1));
5998
Simon Atanasyan60777612013-04-14 14:07:51 +00005999 if (IsMicromips)
6000 Builder.defineMacro("__mips_micromips", Twine(1));
6001
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006002 if (IsNan2008)
6003 Builder.defineMacro("__mips_nan2008", Twine(1));
6004
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006005 switch (DspRev) {
6006 default:
6007 break;
6008 case DSP1:
6009 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6010 Builder.defineMacro("__mips_dsp", Twine(1));
6011 break;
6012 case DSP2:
6013 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6014 Builder.defineMacro("__mips_dspr2", Twine(1));
6015 Builder.defineMacro("__mips_dsp", Twine(1));
6016 break;
6017 }
6018
Jack Carter44ff1e52013-08-12 17:20:29 +00006019 if (HasMSA)
6020 Builder.defineMacro("__mips_msa", Twine(1));
6021
Simon Atanasyan26f19672012-04-05 19:28:31 +00006022 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6023 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6024 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006025
6026 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6027 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006028 }
6029
Craig Topper3164f332014-03-11 03:39:26 +00006030 void getTargetBuiltins(const Builtin::Info *&Records,
6031 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006032 Records = BuiltinInfo;
6033 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006034 }
Craig Topper3164f332014-03-11 03:39:26 +00006035 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006036 return llvm::StringSwitch<bool>(Feature)
6037 .Case("mips", true)
6038 .Case("fp64", HasFP64)
6039 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006040 }
Craig Topper3164f332014-03-11 03:39:26 +00006041 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006042 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006043 }
Craig Topper3164f332014-03-11 03:39:26 +00006044 void getGCCRegNames(const char * const *&Names,
6045 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006046 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006047 // CPU register names
6048 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006049 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6050 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6051 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006052 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6053 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006054 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6055 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6056 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6057 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006058 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006059 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006060 "$fcc5","$fcc6","$fcc7",
6061 // MSA register names
6062 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6063 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6064 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6065 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6066 // MSA control register names
6067 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6068 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006069 };
6070 Names = GCCRegNames;
6071 NumNames = llvm::array_lengthof(GCCRegNames);
6072 }
Craig Topper3164f332014-03-11 03:39:26 +00006073 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6074 unsigned &NumAliases) const override = 0;
6075 bool validateAsmConstraint(const char *&Name,
6076 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006077 switch (*Name) {
6078 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006079 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006080 case 'r': // CPU registers.
6081 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006082 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006083 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006084 case 'c': // $25 for indirect jumps
6085 case 'l': // lo register
6086 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006087 Info.setAllowsRegister();
6088 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006089 case 'I': // Signed 16-bit constant
6090 case 'J': // Integer 0
6091 case 'K': // Unsigned 16-bit constant
6092 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6093 case 'M': // Constants not loadable via lui, addiu, or ori
6094 case 'N': // Constant -1 to -65535
6095 case 'O': // A signed 15-bit constant
6096 case 'P': // A constant between 1 go 65535
6097 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006098 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006099 Info.setAllowsMemory();
6100 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006101 case 'Z':
6102 if (Name[1] == 'C') { // An address usable by ll, and sc.
6103 Info.setAllowsMemory();
6104 Name++; // Skip over 'Z'.
6105 return true;
6106 }
6107 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006108 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006109 }
6110
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006111 std::string convertConstraint(const char *&Constraint) const override {
6112 std::string R;
6113 switch (*Constraint) {
6114 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6115 if (Constraint[1] == 'C') {
6116 R = std::string("^") + std::string(Constraint, 2);
6117 Constraint++;
6118 return R;
6119 }
6120 break;
6121 }
6122 return TargetInfo::convertConstraint(Constraint);
6123 }
6124
Craig Topper3164f332014-03-11 03:39:26 +00006125 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006126 // In GCC, $1 is not widely used in generated code (it's used only in a few
6127 // specific situations), so there is no real need for users to add it to
6128 // the clobbers list if they want to use it in their inline assembly code.
6129 //
6130 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6131 // code generation, so using it in inline assembly without adding it to the
6132 // clobbers list can cause conflicts between the inline assembly code and
6133 // the surrounding generated code.
6134 //
6135 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6136 // operands, which will conflict with the ".set at" assembler option (which
6137 // we use only for inline assembly, in order to maintain compatibility with
6138 // GCC) and will also conflict with the user's usage of $1.
6139 //
6140 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6141 // register for generated code is to automatically clobber $1 for all inline
6142 // assembly code.
6143 //
6144 // FIXME: We should automatically clobber $1 only for inline assembly code
6145 // which actually uses it. This would allow LLVM to use $1 for inline
6146 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006147 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006148 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006149
Craig Topper3164f332014-03-11 03:39:26 +00006150 bool handleTargetFeatures(std::vector<std::string> &Features,
6151 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006152 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006153 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006154 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006155 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006156 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006157 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006158 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006159
6160 for (std::vector<std::string>::iterator it = Features.begin(),
6161 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006162 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006163 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006164 else if (*it == "+soft-float")
6165 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006166 else if (*it == "+mips16")
6167 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006168 else if (*it == "+micromips")
6169 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006170 else if (*it == "+dsp")
6171 DspRev = std::max(DspRev, DSP1);
6172 else if (*it == "+dspr2")
6173 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006174 else if (*it == "+msa")
6175 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006176 else if (*it == "+fp64")
6177 HasFP64 = true;
6178 else if (*it == "-fp64")
6179 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006180 else if (*it == "+nan2008")
6181 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006182 else if (*it == "-nan2008")
6183 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006184 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006185
Akira Hatanaka9064e362013-10-29 18:30:33 +00006186 setDescriptionString();
6187
Rafael Espindolaeb265472013-08-21 21:59:03 +00006188 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006189 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006190
Craig Topper3164f332014-03-11 03:39:26 +00006191 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006192 if (RegNo == 0) return 4;
6193 if (RegNo == 1) return 5;
6194 return -1;
6195 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006196
6197 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006198};
6199
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006200const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6201#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6202#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6203 ALL_LANGUAGES },
6204#include "clang/Basic/BuiltinsMips.def"
6205};
6206
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006207class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006208public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006209 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006210 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006211 SizeType = UnsignedInt;
6212 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006213 Int64Type = SignedLongLong;
6214 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006215 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006216 }
Craig Topper3164f332014-03-11 03:39:26 +00006217 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006218 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006219 ABI = Name;
6220 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006221 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006222 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006223 }
Craig Topper3164f332014-03-11 03:39:26 +00006224 void getTargetDefines(const LangOptions &Opts,
6225 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006226 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006227
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006228 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006229 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6230
6231 const std::string& CPUStr = getCPU();
6232 if (CPUStr == "mips32")
6233 Builder.defineMacro("__mips_isa_rev", "1");
6234 else if (CPUStr == "mips32r2")
6235 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006236 else if (CPUStr == "mips32r3")
6237 Builder.defineMacro("__mips_isa_rev", "3");
6238 else if (CPUStr == "mips32r5")
6239 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006240 else if (CPUStr == "mips32r6")
6241 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006242
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006243 if (ABI == "o32") {
6244 Builder.defineMacro("__mips_o32");
6245 Builder.defineMacro("_ABIO32", "1");
6246 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6247 }
6248 else if (ABI == "eabi")
6249 Builder.defineMacro("__mips_eabi");
6250 else
David Blaikie83d382b2011-09-23 05:06:16 +00006251 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006252 }
Craig Topper3164f332014-03-11 03:39:26 +00006253 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6254 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006255 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6256 { { "at" }, "$1" },
6257 { { "v0" }, "$2" },
6258 { { "v1" }, "$3" },
6259 { { "a0" }, "$4" },
6260 { { "a1" }, "$5" },
6261 { { "a2" }, "$6" },
6262 { { "a3" }, "$7" },
6263 { { "t0" }, "$8" },
6264 { { "t1" }, "$9" },
6265 { { "t2" }, "$10" },
6266 { { "t3" }, "$11" },
6267 { { "t4" }, "$12" },
6268 { { "t5" }, "$13" },
6269 { { "t6" }, "$14" },
6270 { { "t7" }, "$15" },
6271 { { "s0" }, "$16" },
6272 { { "s1" }, "$17" },
6273 { { "s2" }, "$18" },
6274 { { "s3" }, "$19" },
6275 { { "s4" }, "$20" },
6276 { { "s5" }, "$21" },
6277 { { "s6" }, "$22" },
6278 { { "s7" }, "$23" },
6279 { { "t8" }, "$24" },
6280 { { "t9" }, "$25" },
6281 { { "k0" }, "$26" },
6282 { { "k1" }, "$27" },
6283 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006284 { { "sp","$sp" }, "$29" },
6285 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006286 { { "ra" }, "$31" }
6287 };
6288 Aliases = GCCRegAliases;
6289 NumAliases = llvm::array_lengthof(GCCRegAliases);
6290 }
6291};
6292
6293class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006294 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006295 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006296 }
6297
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006298public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006299 Mips32EBTargetInfo(const llvm::Triple &Triple)
6300 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006301 }
Craig Topper3164f332014-03-11 03:39:26 +00006302 void getTargetDefines(const LangOptions &Opts,
6303 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006304 DefineStd(Builder, "MIPSEB", Opts);
6305 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006306 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006307 }
6308};
6309
6310class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006311 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006312 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006313 }
6314
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006315public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006316 Mips32ELTargetInfo(const llvm::Triple &Triple)
6317 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006318 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006319 }
Craig Topper3164f332014-03-11 03:39:26 +00006320 void getTargetDefines(const LangOptions &Opts,
6321 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006322 DefineStd(Builder, "MIPSEL", Opts);
6323 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006324 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006325 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006326};
Akira Hatanakabef17452011-09-20 19:21:49 +00006327
6328class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006329public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006330 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006331 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006332 LongDoubleWidth = LongDoubleAlign = 128;
6333 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006334 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6335 LongDoubleWidth = LongDoubleAlign = 64;
6336 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6337 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006338 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006339 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006340 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006341 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006342
6343 void setN64ABITypes() {
6344 LongWidth = LongAlign = 64;
6345 PointerWidth = PointerAlign = 64;
6346 SizeType = UnsignedLong;
6347 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006348 Int64Type = SignedLong;
6349 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006350 }
6351
6352 void setN32ABITypes() {
6353 LongWidth = LongAlign = 32;
6354 PointerWidth = PointerAlign = 32;
6355 SizeType = UnsignedInt;
6356 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006357 Int64Type = SignedLongLong;
6358 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006359 }
6360
Craig Topper3164f332014-03-11 03:39:26 +00006361 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006362 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006363 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006364 ABI = Name;
6365 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006366 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006367 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006368 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006369 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006370 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006371 }
6372 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006373 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006374
Craig Topper3164f332014-03-11 03:39:26 +00006375 void getTargetDefines(const LangOptions &Opts,
6376 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006377 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006378
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006379 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006380 Builder.defineMacro("__mips64");
6381 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006382 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6383
6384 const std::string& CPUStr = getCPU();
6385 if (CPUStr == "mips64")
6386 Builder.defineMacro("__mips_isa_rev", "1");
6387 else if (CPUStr == "mips64r2")
6388 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006389 else if (CPUStr == "mips64r3")
6390 Builder.defineMacro("__mips_isa_rev", "3");
6391 else if (CPUStr == "mips64r5")
6392 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006393 else if (CPUStr == "mips64r6")
6394 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006395
Akira Hatanakabef17452011-09-20 19:21:49 +00006396 if (ABI == "n32") {
6397 Builder.defineMacro("__mips_n32");
6398 Builder.defineMacro("_ABIN32", "2");
6399 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6400 }
6401 else if (ABI == "n64") {
6402 Builder.defineMacro("__mips_n64");
6403 Builder.defineMacro("_ABI64", "3");
6404 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6405 }
6406 else
David Blaikie83d382b2011-09-23 05:06:16 +00006407 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006408 }
Craig Topper3164f332014-03-11 03:39:26 +00006409 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6410 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006411 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6412 { { "at" }, "$1" },
6413 { { "v0" }, "$2" },
6414 { { "v1" }, "$3" },
6415 { { "a0" }, "$4" },
6416 { { "a1" }, "$5" },
6417 { { "a2" }, "$6" },
6418 { { "a3" }, "$7" },
6419 { { "a4" }, "$8" },
6420 { { "a5" }, "$9" },
6421 { { "a6" }, "$10" },
6422 { { "a7" }, "$11" },
6423 { { "t0" }, "$12" },
6424 { { "t1" }, "$13" },
6425 { { "t2" }, "$14" },
6426 { { "t3" }, "$15" },
6427 { { "s0" }, "$16" },
6428 { { "s1" }, "$17" },
6429 { { "s2" }, "$18" },
6430 { { "s3" }, "$19" },
6431 { { "s4" }, "$20" },
6432 { { "s5" }, "$21" },
6433 { { "s6" }, "$22" },
6434 { { "s7" }, "$23" },
6435 { { "t8" }, "$24" },
6436 { { "t9" }, "$25" },
6437 { { "k0" }, "$26" },
6438 { { "k1" }, "$27" },
6439 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006440 { { "sp","$sp" }, "$29" },
6441 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006442 { { "ra" }, "$31" }
6443 };
6444 Aliases = GCCRegAliases;
6445 NumAliases = llvm::array_lengthof(GCCRegAliases);
6446 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006447
6448 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006449};
6450
6451class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006452 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006453 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006454 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 +00006455 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006456 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006457
Akira Hatanakabef17452011-09-20 19:21:49 +00006458 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006459
Akira Hatanakabef17452011-09-20 19:21:49 +00006460public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006461 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006462 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006463 void getTargetDefines(const LangOptions &Opts,
6464 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006465 DefineStd(Builder, "MIPSEB", Opts);
6466 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006467 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006468 }
6469};
6470
6471class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006472 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006473 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006474 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 +00006475 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006476 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006477 }
6478public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006479 Mips64ELTargetInfo(const llvm::Triple &Triple)
6480 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006481 // Default ABI is n64.
6482 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006483 }
Craig Topper3164f332014-03-11 03:39:26 +00006484 void getTargetDefines(const LangOptions &Opts,
6485 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006486 DefineStd(Builder, "MIPSEL", Opts);
6487 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006488 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006489 }
6490};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006491
Ivan Krasindd7403e2011-08-24 20:22:22 +00006492class PNaClTargetInfo : public TargetInfo {
6493public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006494 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006495 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006496 this->UserLabelPrefix = "";
6497 this->LongAlign = 32;
6498 this->LongWidth = 32;
6499 this->PointerAlign = 32;
6500 this->PointerWidth = 32;
6501 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006502 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006503 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006504 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006505 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006506 this->SizeType = TargetInfo::UnsignedInt;
6507 this->PtrDiffType = TargetInfo::SignedInt;
6508 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006509 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006510 }
6511
Craig Topper3164f332014-03-11 03:39:26 +00006512 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006513 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006514 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006515 Builder.defineMacro("__le32__");
6516 Builder.defineMacro("__pnacl__");
6517 }
Craig Topper3164f332014-03-11 03:39:26 +00006518 void getTargetDefines(const LangOptions &Opts,
6519 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006520 getArchDefines(Opts, Builder);
6521 }
Craig Topper3164f332014-03-11 03:39:26 +00006522 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006523 return Feature == "pnacl";
6524 }
Craig Topper3164f332014-03-11 03:39:26 +00006525 void getTargetBuiltins(const Builtin::Info *&Records,
6526 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006527 }
Craig Topper3164f332014-03-11 03:39:26 +00006528 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006529 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006530 }
Craig Topper3164f332014-03-11 03:39:26 +00006531 void getGCCRegNames(const char * const *&Names,
6532 unsigned &NumNames) const override;
6533 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6534 unsigned &NumAliases) const override;
6535 bool validateAsmConstraint(const char *&Name,
6536 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006537 return false;
6538 }
6539
Craig Topper3164f332014-03-11 03:39:26 +00006540 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006541 return "";
6542 }
6543};
6544
6545void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6546 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006547 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006548 NumNames = 0;
6549}
6550
6551void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6552 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006553 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006554 NumAliases = 0;
6555}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006556
JF Bastien643817d2014-09-12 17:52:47 +00006557class Le64TargetInfo : public TargetInfo {
6558 static const Builtin::Info BuiltinInfo[];
6559
6560public:
6561 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6562 BigEndian = false;
6563 NoAsmVariants = true;
6564 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6565 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6566 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006567 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006568 }
6569
6570 void getTargetDefines(const LangOptions &Opts,
6571 MacroBuilder &Builder) const override {
6572 DefineStd(Builder, "unix", Opts);
6573 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6574 Builder.defineMacro("__ELF__");
6575 }
6576 void getTargetBuiltins(const Builtin::Info *&Records,
6577 unsigned &NumRecords) const override {
6578 Records = BuiltinInfo;
6579 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6580 }
6581 BuiltinVaListKind getBuiltinVaListKind() const override {
6582 return TargetInfo::PNaClABIBuiltinVaList;
6583 }
6584 const char *getClobbers() const override { return ""; }
6585 void getGCCRegNames(const char *const *&Names,
6586 unsigned &NumNames) const override {
6587 Names = nullptr;
6588 NumNames = 0;
6589 }
6590 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6591 unsigned &NumAliases) const override {
6592 Aliases = nullptr;
6593 NumAliases = 0;
6594 }
6595 bool validateAsmConstraint(const char *&Name,
6596 TargetInfo::ConstraintInfo &Info) const override {
6597 return false;
6598 }
6599
6600 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006601};
6602} // end anonymous namespace.
6603
6604const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6605#define BUILTIN(ID, TYPE, ATTRS) \
6606 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6607#include "clang/Basic/BuiltinsLe64.def"
6608};
6609
6610namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006611 static const unsigned SPIRAddrSpaceMap[] = {
6612 1, // opencl_global
6613 3, // opencl_local
6614 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006615 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006616 0, // cuda_device
6617 0, // cuda_constant
6618 0 // cuda_shared
6619 };
6620 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006621 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006622 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006623 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6624 "SPIR target must use unknown OS");
6625 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6626 "SPIR target must use unknown environment type");
6627 BigEndian = false;
6628 TLSSupported = false;
6629 LongWidth = LongAlign = 64;
6630 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006631 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006632 // Define available target features
6633 // These must be defined in sorted order!
6634 NoAsmVariants = true;
6635 }
Craig Topper3164f332014-03-11 03:39:26 +00006636 void getTargetDefines(const LangOptions &Opts,
6637 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006638 DefineStd(Builder, "SPIR", Opts);
6639 }
Craig Topper3164f332014-03-11 03:39:26 +00006640 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006641 return Feature == "spir";
6642 }
Craig Topper3164f332014-03-11 03:39:26 +00006643
6644 void getTargetBuiltins(const Builtin::Info *&Records,
6645 unsigned &NumRecords) const override {}
6646 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006647 return "";
6648 }
Craig Topper3164f332014-03-11 03:39:26 +00006649 void getGCCRegNames(const char * const *&Names,
6650 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006651 bool
6652 validateAsmConstraint(const char *&Name,
6653 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006654 return true;
6655 }
Craig Topper3164f332014-03-11 03:39:26 +00006656 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6657 unsigned &NumAliases) const override {}
6658 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006659 return TargetInfo::VoidPtrBuiltinVaList;
6660 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006661
6662 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6663 return (CC == CC_SpirFunction ||
6664 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6665 }
6666
6667 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6668 return CC_SpirFunction;
6669 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006670 };
6671
6672
6673 class SPIR32TargetInfo : public SPIRTargetInfo {
6674 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006675 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006676 PointerWidth = PointerAlign = 32;
6677 SizeType = TargetInfo::UnsignedInt;
6678 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6679 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006680 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6681 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006682 }
Craig Topper3164f332014-03-11 03:39:26 +00006683 void getTargetDefines(const LangOptions &Opts,
6684 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006685 DefineStd(Builder, "SPIR32", Opts);
6686 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006687 };
6688
6689 class SPIR64TargetInfo : public SPIRTargetInfo {
6690 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006691 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006692 PointerWidth = PointerAlign = 64;
6693 SizeType = TargetInfo::UnsignedLong;
6694 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006695 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6696 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006697 }
Craig Topper3164f332014-03-11 03:39:26 +00006698 void getTargetDefines(const LangOptions &Opts,
6699 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006700 DefineStd(Builder, "SPIR64", Opts);
6701 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006702 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006703
Robert Lytton0e076492013-08-13 09:43:10 +00006704class XCoreTargetInfo : public TargetInfo {
6705 static const Builtin::Info BuiltinInfo[];
6706public:
6707 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6708 BigEndian = false;
6709 NoAsmVariants = true;
6710 LongLongAlign = 32;
6711 SuitableAlign = 32;
6712 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006713 SizeType = UnsignedInt;
6714 PtrDiffType = SignedInt;
6715 IntPtrType = SignedInt;
6716 WCharType = UnsignedChar;
6717 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006718 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006719 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 +00006720 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006721 }
Craig Topper3164f332014-03-11 03:39:26 +00006722 void getTargetDefines(const LangOptions &Opts,
6723 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006724 Builder.defineMacro("__XS1B__");
6725 }
Craig Topper3164f332014-03-11 03:39:26 +00006726 void getTargetBuiltins(const Builtin::Info *&Records,
6727 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006728 Records = BuiltinInfo;
6729 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6730 }
Craig Topper3164f332014-03-11 03:39:26 +00006731 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006732 return TargetInfo::VoidPtrBuiltinVaList;
6733 }
Craig Topper3164f332014-03-11 03:39:26 +00006734 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006735 return "";
6736 }
Craig Topper3164f332014-03-11 03:39:26 +00006737 void getGCCRegNames(const char * const *&Names,
6738 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006739 static const char * const GCCRegNames[] = {
6740 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6741 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6742 };
6743 Names = GCCRegNames;
6744 NumNames = llvm::array_lengthof(GCCRegNames);
6745 }
Craig Topper3164f332014-03-11 03:39:26 +00006746 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6747 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006748 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006749 NumAliases = 0;
6750 }
Craig Topper3164f332014-03-11 03:39:26 +00006751 bool validateAsmConstraint(const char *&Name,
6752 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006753 return false;
6754 }
Craig Topper3164f332014-03-11 03:39:26 +00006755 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006756 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6757 return (RegNo < 2)? RegNo : -1;
6758 }
Robert Lytton0e076492013-08-13 09:43:10 +00006759};
6760
6761const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6762#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6763#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6764 ALL_LANGUAGES },
6765#include "clang/Basic/BuiltinsXCore.def"
6766};
6767} // end anonymous namespace.
6768
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006769namespace {
6770// x86_32 Android target
6771class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6772public:
6773 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6774 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6775 SuitableAlign = 32;
6776 LongDoubleWidth = 64;
6777 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6778 }
6779};
6780} // end anonymous namespace
6781
6782namespace {
6783// x86_64 Android target
6784class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6785public:
6786 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6787 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6788 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6789 }
6790};
6791} // end anonymous namespace
6792
Ivan Krasindd7403e2011-08-24 20:22:22 +00006793
Chris Lattner5ba61f02006-10-14 07:39:34 +00006794//===----------------------------------------------------------------------===//
6795// Driver code
6796//===----------------------------------------------------------------------===//
6797
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006798static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006799 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006800
Daniel Dunbar52322032009-08-18 05:47:58 +00006801 switch (Triple.getArch()) {
6802 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006803 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006804
Tim Northover2a0783d2014-05-30 14:14:07 +00006805 case llvm::Triple::xcore:
6806 return new XCoreTargetInfo(Triple);
6807
6808 case llvm::Triple::hexagon:
6809 return new HexagonTargetInfo(Triple);
6810
6811 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006812 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006813 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006814
6815 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006816 case llvm::Triple::FreeBSD:
6817 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006818 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006819 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006820 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006821 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006822 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006823 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006824 }
6825
Christian Pirker9b019ae2014-02-25 13:51:00 +00006826 case llvm::Triple::aarch64_be:
6827 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006828 case llvm::Triple::FreeBSD:
6829 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006830 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006831 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006832 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006833 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006834 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006835 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006836 }
6837
Daniel Dunbar52322032009-08-18 05:47:58 +00006838 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006839 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006840 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006841 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006842
Daniel Dunbar52322032009-08-18 05:47:58 +00006843 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006844 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006845 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006846 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006847 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006848 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006849 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006850 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006851 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006852 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006853 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006854 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006855 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006856 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006857 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006858 case llvm::Triple::Win32:
6859 switch (Triple.getEnvironment()) {
6860 default:
6861 return new ARMleTargetInfo(Triple);
6862 case llvm::Triple::Itanium:
6863 return new ItaniumWindowsARMleTargetInfo(Triple);
6864 case llvm::Triple::MSVC:
6865 return new MicrosoftARMleTargetInfo(Triple);
6866 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006867 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006868 return new ARMleTargetInfo(Triple);
6869 }
6870
6871 case llvm::Triple::armeb:
6872 case llvm::Triple::thumbeb:
6873 if (Triple.isOSDarwin())
6874 return new DarwinARMTargetInfo(Triple);
6875
6876 switch (os) {
6877 case llvm::Triple::Linux:
6878 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6879 case llvm::Triple::FreeBSD:
6880 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6881 case llvm::Triple::NetBSD:
6882 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6883 case llvm::Triple::OpenBSD:
6884 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6885 case llvm::Triple::Bitrig:
6886 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6887 case llvm::Triple::RTEMS:
6888 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6889 case llvm::Triple::NaCl:
6890 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6891 default:
6892 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006893 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006894
Daniel Dunbar52322032009-08-18 05:47:58 +00006895 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006896 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006897
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006898 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006899 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006900 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006901 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006902 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006903 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006904 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006905 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006906 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006907 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006908 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006909 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006910 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006911
6912 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006913 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006914 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006915 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006916 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006917 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006918 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006919 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006920 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006921 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006922 case llvm::Triple::NaCl:
6923 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006924 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006925 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006926 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006927
Akira Hatanakabef17452011-09-20 19:21:49 +00006928 case llvm::Triple::mips64:
6929 switch (os) {
6930 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006931 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006932 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006933 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006934 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006935 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006936 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006937 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006938 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006939 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006940 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006941 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006942 }
6943
6944 case llvm::Triple::mips64el:
6945 switch (os) {
6946 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006947 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006948 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006949 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006950 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006951 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006952 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006953 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006954 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006955 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006956 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006957 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006958 }
6959
Ivan Krasindd7403e2011-08-24 20:22:22 +00006960 case llvm::Triple::le32:
6961 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00006962 case llvm::Triple::NaCl:
6963 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
6964 default:
6965 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006966 }
6967
JF Bastien643817d2014-09-12 17:52:47 +00006968 case llvm::Triple::le64:
6969 return new Le64TargetInfo(Triple);
6970
Daniel Dunbar52322032009-08-18 05:47:58 +00006971 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006972 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006973 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006974 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006975 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006976 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006977 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006978 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006979 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006980 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006981 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006982 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006983 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006984 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006985 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006986 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006987 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006988
6989 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006990 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006991 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006992 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006993 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006994 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006995 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006996 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006997 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006998 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006999 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007000 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007001 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007002 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007003 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007004
Bill Schmidt778d3872013-07-26 01:36:11 +00007005 case llvm::Triple::ppc64le:
7006 switch (os) {
7007 case llvm::Triple::Linux:
7008 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007009 case llvm::Triple::NetBSD:
7010 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007011 default:
7012 return new PPC64TargetInfo(Triple);
7013 }
7014
Peter Collingbournec947aae2012-05-20 23:28:41 +00007015 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007016 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007017 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007018 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007019
Tom Stellardd8e38a32015-01-06 20:34:47 +00007020 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007021 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007022 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007023
Daniel Dunbar52322032009-08-18 05:47:58 +00007024 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007025 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007026 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007027 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007028 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007029 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007030 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007031 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007032 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007033 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007034 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007035 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007036 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007037 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007038 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007039
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007040 // The 'sparcel' architecture copies all the above cases except for Solaris.
7041 case llvm::Triple::sparcel:
7042 switch (os) {
7043 case llvm::Triple::Linux:
7044 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7045 case llvm::Triple::NetBSD:
7046 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7047 case llvm::Triple::OpenBSD:
7048 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7049 case llvm::Triple::RTEMS:
7050 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7051 default:
7052 return new SparcV8elTargetInfo(Triple);
7053 }
7054
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007055 case llvm::Triple::sparcv9:
7056 switch (os) {
7057 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007058 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007059 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007060 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007061 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007062 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007063 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007064 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007065 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007066 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007067 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007068 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007069 }
7070
Ulrich Weigand47445072013-05-06 16:26:41 +00007071 case llvm::Triple::systemz:
7072 switch (os) {
7073 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007074 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007075 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007076 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007077 }
7078
Eli Friedmana9c3d712009-08-19 20:47:07 +00007079 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007080 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007081
Daniel Dunbar52322032009-08-18 05:47:58 +00007082 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007083 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007084 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007085
Daniel Dunbar52322032009-08-18 05:47:58 +00007086 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007087 case llvm::Triple::Linux: {
7088 switch (Triple.getEnvironment()) {
7089 default:
7090 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7091 case llvm::Triple::Android:
7092 return new AndroidX86_32TargetInfo(Triple);
7093 }
7094 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007095 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007096 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007097 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007098 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007099 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007100 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007101 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007102 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007103 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007104 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007105 case llvm::Triple::KFreeBSD:
7106 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007107 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007108 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007109 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007110 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007111 case llvm::Triple::Win32: {
7112 switch (Triple.getEnvironment()) {
7113 default:
7114 return new X86_32TargetInfo(Triple);
7115 case llvm::Triple::Cygnus:
7116 return new CygwinX86_32TargetInfo(Triple);
7117 case llvm::Triple::GNU:
7118 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007119 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007120 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007121 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007122 }
7123 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007124 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007125 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007126 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007127 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007128 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007129 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007130 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007131 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007132 }
7133
7134 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007135 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007136 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007137
Daniel Dunbar52322032009-08-18 05:47:58 +00007138 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007139 case llvm::Triple::CloudABI:
7140 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007141 case llvm::Triple::Linux: {
7142 switch (Triple.getEnvironment()) {
7143 default:
7144 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7145 case llvm::Triple::Android:
7146 return new AndroidX86_64TargetInfo(Triple);
7147 }
7148 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007149 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007150 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007151 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007152 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007153 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007154 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007155 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007156 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007157 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007158 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007159 case llvm::Triple::KFreeBSD:
7160 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007161 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007162 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007163 case llvm::Triple::Win32: {
7164 switch (Triple.getEnvironment()) {
7165 default:
7166 return new X86_64TargetInfo(Triple);
7167 case llvm::Triple::GNU:
7168 return new MinGWX86_64TargetInfo(Triple);
7169 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007170 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007171 }
7172 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007173 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007174 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007175 case llvm::Triple::PS4:
7176 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007177 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007178 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007179 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007180
Douglas Katzman78d7c542015-05-12 21:18:10 +00007181 case llvm::Triple::spir: {
7182 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7183 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7184 return nullptr;
7185 return new SPIR32TargetInfo(Triple);
7186 }
7187 case llvm::Triple::spir64: {
7188 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7189 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7190 return nullptr;
7191 return new SPIR64TargetInfo(Triple);
7192 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007193 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007194}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007195
7196/// CreateTargetInfo - Return the target info object for the specified target
7197/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007198TargetInfo *
7199TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7200 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007201 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007202
7203 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007204 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007205 if (!Target) {
7206 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007207 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007208 }
Alp Toker80758082014-07-06 05:26:44 +00007209 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007210
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007211 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007212 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7213 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007214 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007215 }
7216
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007217 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007218 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7219 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007220 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007221 }
7222
Rafael Espindolaeb265472013-08-21 21:59:03 +00007223 // Set the fp math unit.
7224 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7225 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007226 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007227 }
7228
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007229 // Compute the default target features, we need the target to handle this
7230 // because features may have dependencies on one another.
7231 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007232 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007233
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007234 // Apply the user specified deltas.
7235 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7236 I < N; ++I) {
7237 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007238 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007239 bool Enabled = Name[0] == '+';
7240 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007241 }
7242
7243 // Add the features to the compile options.
7244 //
7245 // FIXME: If we are completely confident that we have the right set, we only
7246 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007247 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007248 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7249 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007250 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007251 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007252 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007253
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007254 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007255}