blob: af4104fef5330dc4945168a28810ecb7ba895025 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000030#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000187namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000188// CloudABI Target
189template <typename Target>
190class CloudABITargetInfo : public OSTargetInfo<Target> {
191protected:
192 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
193 MacroBuilder &Builder) const override {
194 Builder.defineMacro("__CloudABI__");
195 Builder.defineMacro("__ELF__");
196
197 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
198 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
199 Builder.defineMacro("__STDC_UTF_16__");
200 Builder.defineMacro("__STDC_UTF_32__");
201 }
202
203public:
204 CloudABITargetInfo(const llvm::Triple &Triple)
205 : OSTargetInfo<Target>(Triple) {
206 this->UserLabelPrefix = "";
207 }
208};
209
Torok Edwinb2b37c62009-06-30 17:10:35 +0000210template<typename Target>
211class DarwinTargetInfo : public OSTargetInfo<Target> {
212protected:
Craig Topper3164f332014-03-11 03:39:26 +0000213 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
214 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000215 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000216 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000217 }
Mike Stump11289f42009-09-09 15:08:12 +0000218
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000220 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
221 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
222 this->MCountName = "\01mcount";
223 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224
Craig Topper3164f332014-03-11 03:39:26 +0000225 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000226 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000227 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000228 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000229 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000230 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000231 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000232 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000233
Craig Topper3164f332014-03-11 03:39:26 +0000234 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000235 // FIXME: We should return 0 when building kexts.
236 return "__TEXT,__StaticInit,regular,pure_instructions";
237 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000238
John McCalleed64c72012-01-29 01:20:30 +0000239 /// Darwin does not support protected visibility. Darwin's "default"
240 /// is very similar to ELF's "protected"; Darwin requires a "weak"
241 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000242 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000243 return false;
244 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245};
246
Chris Lattner30ba6742009-08-10 19:03:04 +0000247
Torok Edwinb2b37c62009-06-30 17:10:35 +0000248// DragonFlyBSD Target
249template<typename Target>
250class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
251protected:
Craig Topper3164f332014-03-11 03:39:26 +0000252 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
253 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000254 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000255 Builder.defineMacro("__DragonFly__");
256 Builder.defineMacro("__DragonFly_cc_version", "100001");
257 Builder.defineMacro("__ELF__");
258 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
259 Builder.defineMacro("__tune_i386__");
260 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 }
262public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000263 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
264 : OSTargetInfo<Target>(Triple) {
265 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000266
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000267 switch (Triple.getArch()) {
268 default:
269 case llvm::Triple::x86:
270 case llvm::Triple::x86_64:
271 this->MCountName = ".mcount";
272 break;
273 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000274 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000275};
276
277// FreeBSD Target
278template<typename Target>
279class FreeBSDTargetInfo : public OSTargetInfo<Target> {
280protected:
Craig Topper3164f332014-03-11 03:39:26 +0000281 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
282 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 // FreeBSD defines; list based off of gcc output
284
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000285 unsigned Release = Triple.getOSMajorVersion();
286 if (Release == 0U)
287 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000288
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000289 Builder.defineMacro("__FreeBSD__", Twine(Release));
290 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
292 DefineStd(Builder, "unix", Opts);
293 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000294
295 // On FreeBSD, wchar_t contains the number of the code point as
296 // used by the character set of the locale. These character sets are
297 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000298 //
299 // FIXME: This is wrong; the macro refers to the numerical values
300 // of wchar_t *literals*, which are not locale-dependent. However,
301 // FreeBSD systems apparently depend on us getting this wrong, and
302 // setting this to 1 is conforming even if all the basic source
303 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000304 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000305 }
306public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000307 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
308 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000309
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000310 switch (Triple.getArch()) {
311 default:
312 case llvm::Triple::x86:
313 case llvm::Triple::x86_64:
314 this->MCountName = ".mcount";
315 break;
316 case llvm::Triple::mips:
317 case llvm::Triple::mipsel:
318 case llvm::Triple::ppc:
319 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000320 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000321 this->MCountName = "_mcount";
322 break;
323 case llvm::Triple::arm:
324 this->MCountName = "__mcount";
325 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000326 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000327 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328};
329
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000330// GNU/kFreeBSD Target
331template<typename Target>
332class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
333protected:
Craig Topper3164f332014-03-11 03:39:26 +0000334 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
335 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000336 // GNU/kFreeBSD defines; list based off of gcc output
337
338 DefineStd(Builder, "unix", Opts);
339 Builder.defineMacro("__FreeBSD_kernel__");
340 Builder.defineMacro("__GLIBC__");
341 Builder.defineMacro("__ELF__");
342 if (Opts.POSIXThreads)
343 Builder.defineMacro("_REENTRANT");
344 if (Opts.CPlusPlus)
345 Builder.defineMacro("_GNU_SOURCE");
346 }
347public:
Eric Christopher917e9522014-11-18 22:36:15 +0000348 KFreeBSDTargetInfo(const llvm::Triple &Triple)
349 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000350 this->UserLabelPrefix = "";
351 }
352};
353
Chris Lattner3e2ee142010-07-07 16:01:42 +0000354// Minix Target
355template<typename Target>
356class MinixTargetInfo : public OSTargetInfo<Target> {
357protected:
Craig Topper3164f332014-03-11 03:39:26 +0000358 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
359 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000360 // Minix defines
361
362 Builder.defineMacro("__minix", "3");
363 Builder.defineMacro("_EM_WSIZE", "4");
364 Builder.defineMacro("_EM_PSIZE", "4");
365 Builder.defineMacro("_EM_SSIZE", "2");
366 Builder.defineMacro("_EM_LSIZE", "4");
367 Builder.defineMacro("_EM_FSIZE", "4");
368 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000369 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000370 DefineStd(Builder, "unix", Opts);
371 }
372public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000373 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
374 this->UserLabelPrefix = "";
375 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000376};
377
Torok Edwinb2b37c62009-06-30 17:10:35 +0000378// Linux target
379template<typename Target>
380class LinuxTargetInfo : public OSTargetInfo<Target> {
381protected:
Craig Topper3164f332014-03-11 03:39:26 +0000382 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
383 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000384 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000385 DefineStd(Builder, "unix", Opts);
386 DefineStd(Builder, "linux", Opts);
387 Builder.defineMacro("__gnu_linux__");
388 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000389 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000390 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000391 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000392 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000393 this->PlatformName = "android";
394 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
395 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000396 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000397 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000398 if (Opts.CPlusPlus)
399 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 }
401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000402 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000403 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000404 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000405
406 switch (Triple.getArch()) {
407 default:
408 break;
409 case llvm::Triple::ppc:
410 case llvm::Triple::ppc64:
411 case llvm::Triple::ppc64le:
412 this->MCountName = "_mcount";
413 break;
414 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000415 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000416
Craig Topper3164f332014-03-11 03:39:26 +0000417 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000418 return ".text.startup";
419 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000420};
421
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000422// NetBSD Target
423template<typename Target>
424class NetBSDTargetInfo : public OSTargetInfo<Target> {
425protected:
Craig Topper3164f332014-03-11 03:39:26 +0000426 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
427 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000428 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000429 Builder.defineMacro("__NetBSD__");
430 Builder.defineMacro("__unix__");
431 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000432 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000433 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000434
435 switch (Triple.getArch()) {
436 default:
437 break;
438 case llvm::Triple::arm:
439 case llvm::Triple::armeb:
440 case llvm::Triple::thumb:
441 case llvm::Triple::thumbeb:
442 Builder.defineMacro("__ARM_DWARF_EH__");
443 break;
444 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000445 }
446public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000447 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
448 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000449 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000450 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000451};
452
Torok Edwinb2b37c62009-06-30 17:10:35 +0000453// OpenBSD Target
454template<typename Target>
455class OpenBSDTargetInfo : public OSTargetInfo<Target> {
456protected:
Craig Topper3164f332014-03-11 03:39:26 +0000457 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
458 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000459 // OpenBSD defines; list based off of gcc output
460
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000461 Builder.defineMacro("__OpenBSD__");
462 DefineStd(Builder, "unix", Opts);
463 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000464 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000465 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000466 }
467public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000468 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
469 this->UserLabelPrefix = "";
470 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000471
Eli Friedman3715d1f2011-12-15 02:15:56 +0000472 switch (Triple.getArch()) {
473 default:
474 case llvm::Triple::x86:
475 case llvm::Triple::x86_64:
476 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000477 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000478 this->MCountName = "__mcount";
479 break;
480 case llvm::Triple::mips64:
481 case llvm::Triple::mips64el:
482 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000483 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000484 this->MCountName = "_mcount";
485 break;
486 }
487 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000488};
489
Eli Friedman9fa28852012-08-08 23:57:20 +0000490// Bitrig Target
491template<typename Target>
492class BitrigTargetInfo : public OSTargetInfo<Target> {
493protected:
Craig Topper3164f332014-03-11 03:39:26 +0000494 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
495 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000496 // Bitrig defines; list based off of gcc output
497
498 Builder.defineMacro("__Bitrig__");
499 DefineStd(Builder, "unix", Opts);
500 Builder.defineMacro("__ELF__");
501 if (Opts.POSIXThreads)
502 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000503
504 switch (Triple.getArch()) {
505 default:
506 break;
507 case llvm::Triple::arm:
508 case llvm::Triple::armeb:
509 case llvm::Triple::thumb:
510 case llvm::Triple::thumbeb:
511 Builder.defineMacro("__ARM_DWARF_EH__");
512 break;
513 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000514 }
515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000516 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
517 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000518 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000519 }
520};
521
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000522// PSP Target
523template<typename Target>
524class PSPTargetInfo : public OSTargetInfo<Target> {
525protected:
Craig Topper3164f332014-03-11 03:39:26 +0000526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
527 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000528 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000529 Builder.defineMacro("PSP");
530 Builder.defineMacro("_PSP");
531 Builder.defineMacro("__psp__");
532 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 }
534public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000535 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000536 this->UserLabelPrefix = "";
537 }
538};
539
John Thompsone467e192009-11-19 17:18:50 +0000540// PS3 PPU Target
541template<typename Target>
542class PS3PPUTargetInfo : public OSTargetInfo<Target> {
543protected:
Craig Topper3164f332014-03-11 03:39:26 +0000544 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
545 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000546 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000547 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000548 Builder.defineMacro("__PPU__");
549 Builder.defineMacro("__CELLOS_LV2__");
550 Builder.defineMacro("__ELF__");
551 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000552 Builder.defineMacro("_ARCH_PPC64");
553 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000554 }
555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000556 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000557 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000558 this->LongWidth = this->LongAlign = 32;
559 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000560 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000561 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000562 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000563 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000564 }
565};
566
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000567template <typename Target>
568class PS4OSTargetInfo : public OSTargetInfo<Target> {
569protected:
570 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
571 MacroBuilder &Builder) const override {
572 Builder.defineMacro("__FreeBSD__", "9");
573 Builder.defineMacro("__FreeBSD_cc_version", "900001");
574 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
575 DefineStd(Builder, "unix", Opts);
576 Builder.defineMacro("__ELF__");
577 Builder.defineMacro("__PS4__");
578 }
579public:
580 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
581 this->WCharType = this->UnsignedShort;
582
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000583 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
584 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000585 this->UserLabelPrefix = "";
586
587 switch (Triple.getArch()) {
588 default:
589 case llvm::Triple::x86_64:
590 this->MCountName = ".mcount";
591 break;
592 }
593 }
594};
595
Torok Edwinb2b37c62009-06-30 17:10:35 +0000596// Solaris target
597template<typename Target>
598class SolarisTargetInfo : public OSTargetInfo<Target> {
599protected:
Craig Topper3164f332014-03-11 03:39:26 +0000600 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
601 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000602 DefineStd(Builder, "sun", Opts);
603 DefineStd(Builder, "unix", Opts);
604 Builder.defineMacro("__ELF__");
605 Builder.defineMacro("__svr4__");
606 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000607 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
608 // newer, but to 500 for everything else. feature_test.h has a check to
609 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000610 // with a new version.
611 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000612 Builder.defineMacro("_XOPEN_SOURCE", "600");
613 else
614 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000615 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000616 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000617 Builder.defineMacro("_LARGEFILE_SOURCE");
618 Builder.defineMacro("_LARGEFILE64_SOURCE");
619 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000620 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 }
622public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000623 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000624 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000625 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000626 // FIXME: WIntType should be SignedLong
627 }
628};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000629
630// Windows target
631template<typename Target>
632class WindowsTargetInfo : public OSTargetInfo<Target> {
633protected:
Craig Topper3164f332014-03-11 03:39:26 +0000634 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
635 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000636 Builder.defineMacro("_WIN32");
637 }
638 void getVisualStudioDefines(const LangOptions &Opts,
639 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000640 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000641 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPRTTI");
643
Reid Kleckner16514352015-01-30 21:42:55 +0000644 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000645 Builder.defineMacro("_CPPUNWIND");
David Majnemerc19475a2015-07-15 17:32:34 +0000646
647 Builder.defineMacro("__BOOL_DEFINED");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000648 }
649
650 if (!Opts.CharIsSigned)
651 Builder.defineMacro("_CHAR_UNSIGNED");
652
653 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
654 // but it works for now.
655 if (Opts.POSIXThreads)
656 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000657
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000658 if (Opts.MSCompatibilityVersion) {
659 Builder.defineMacro("_MSC_VER",
660 Twine(Opts.MSCompatibilityVersion / 100000));
661 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000662 // FIXME We cannot encode the revision information into 32-bits
663 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000664
David Majnemerb710a932015-05-11 03:57:49 +0000665 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000666 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000667 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000668
669 if (Opts.MicrosoftExt) {
670 Builder.defineMacro("_MSC_EXTENSIONS");
671
672 if (Opts.CPlusPlus11) {
673 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
674 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
675 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
676 }
677 }
678
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000679 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680 }
681
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000682public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000683 WindowsTargetInfo(const llvm::Triple &Triple)
684 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000685};
686
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000687template <typename Target>
688class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000689protected:
Craig Topper3164f332014-03-11 03:39:26 +0000690 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
691 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000692 if (Opts.POSIXThreads)
693 Builder.defineMacro("_REENTRANT");
694 if (Opts.CPlusPlus)
695 Builder.defineMacro("_GNU_SOURCE");
696
697 DefineStd(Builder, "unix", Opts);
698 Builder.defineMacro("__ELF__");
699 Builder.defineMacro("__native_client__");
700 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000701
702public:
703 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000704 this->UserLabelPrefix = "";
705 this->LongAlign = 32;
706 this->LongWidth = 32;
707 this->PointerAlign = 32;
708 this->PointerWidth = 32;
709 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000710 this->Int64Type = TargetInfo::SignedLongLong;
711 this->DoubleAlign = 64;
712 this->LongDoubleWidth = 64;
713 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000714 this->LongLongWidth = 64;
715 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000716 this->SizeType = TargetInfo::UnsignedInt;
717 this->PtrDiffType = TargetInfo::SignedInt;
718 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000719 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000720 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000722 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000724 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000725 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000726 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 } else if (Triple.getArch() == llvm::Triple::mipsel) {
728 // Handled on mips' setDescriptionString.
729 } else {
730 assert(Triple.getArch() == llvm::Triple::le32);
731 this->DescriptionString = "e-p:32:32-i64:64";
732 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000733 }
734};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000735
Chris Lattner09d98f52008-10-05 21:50:58 +0000736//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000737// Specific target implementations.
738//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000739
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000740// PPC abstract base class
741class PPCTargetInfo : public TargetInfo {
742 static const Builtin::Info BuiltinInfo[];
743 static const char * const GCCRegNames[];
744 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000745 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000746
747 // Target cpu features.
748 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000749 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000750 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000751 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000752 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000753 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000754 bool HasBPERMD;
755 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000756
Ulrich Weigand8afad612014-07-28 13:17:52 +0000757protected:
758 std::string ABI;
759
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000760public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000761 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000762 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000763 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000764 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000765 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000766 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000767 LongDoubleWidth = LongDoubleAlign = 128;
768 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
769 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000770
Hal Finkel6b984f02012-07-03 16:51:04 +0000771 /// \brief Flags for architecture specific defines.
772 typedef enum {
773 ArchDefineNone = 0,
774 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
775 ArchDefinePpcgr = 1 << 1,
776 ArchDefinePpcsq = 1 << 2,
777 ArchDefine440 = 1 << 3,
778 ArchDefine603 = 1 << 4,
779 ArchDefine604 = 1 << 5,
780 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000781 ArchDefinePwr5 = 1 << 7,
782 ArchDefinePwr5x = 1 << 8,
783 ArchDefinePwr6 = 1 << 9,
784 ArchDefinePwr6x = 1 << 10,
785 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000786 ArchDefinePwr8 = 1 << 12,
787 ArchDefineA2 = 1 << 13,
788 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000789 } ArchDefineTypes;
790
Bill Schmidt38378a02013-02-01 20:23:10 +0000791 // Note: GCC recognizes the following additional cpus:
792 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
793 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
794 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000795 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000796 bool CPUKnown = llvm::StringSwitch<bool>(Name)
797 .Case("generic", true)
798 .Case("440", true)
799 .Case("450", true)
800 .Case("601", true)
801 .Case("602", true)
802 .Case("603", true)
803 .Case("603e", true)
804 .Case("603ev", true)
805 .Case("604", true)
806 .Case("604e", true)
807 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000808 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000809 .Case("g3", true)
810 .Case("7400", true)
811 .Case("g4", true)
812 .Case("7450", true)
813 .Case("g4+", true)
814 .Case("750", true)
815 .Case("970", true)
816 .Case("g5", true)
817 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000818 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000819 .Case("e500mc", true)
820 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000821 .Case("power3", true)
822 .Case("pwr3", true)
823 .Case("power4", true)
824 .Case("pwr4", true)
825 .Case("power5", true)
826 .Case("pwr5", true)
827 .Case("power5x", true)
828 .Case("pwr5x", true)
829 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000830 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000831 .Case("power6x", true)
832 .Case("pwr6x", true)
833 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000835 .Case("power8", true)
836 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000837 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000838 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000839 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000840 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000841 .Case("powerpc64le", true)
842 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000843 .Default(false);
844
845 if (CPUKnown)
846 CPU = Name;
847
848 return CPUKnown;
849 }
850
Ulrich Weigand8afad612014-07-28 13:17:52 +0000851
852 StringRef getABI() const override { return ABI; }
853
Craig Topper3164f332014-03-11 03:39:26 +0000854 void getTargetBuiltins(const Builtin::Info *&Records,
855 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000856 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000858 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000859
Craig Topper3164f332014-03-11 03:39:26 +0000860 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000861
Craig Topper3164f332014-03-11 03:39:26 +0000862 void getTargetDefines(const LangOptions &Opts,
863 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000864
Craig Topper3164f332014-03-11 03:39:26 +0000865 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000866
Craig Topper3164f332014-03-11 03:39:26 +0000867 bool handleTargetFeatures(std::vector<std::string> &Features,
868 DiagnosticsEngine &Diags) override;
869 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000870 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
871 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000872
873 void getGCCRegNames(const char * const *&Names,
874 unsigned &NumNames) const override;
875 void getGCCRegAliases(const GCCRegAlias *&Aliases,
876 unsigned &NumAliases) const override;
877 bool validateAsmConstraint(const char *&Name,
878 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000879 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000880 default: return false;
881 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000882 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000883 case 'b': // Base register
884 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000885 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000886 break;
887 // FIXME: The following are added to allow parsing.
888 // I just took a guess at what the actions should be.
889 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000890 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000891 case 'v': // Altivec vector register
892 Info.setAllowsRegister();
893 break;
894 case 'w':
895 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000896 case 'd':// VSX vector register to hold vector double data
897 case 'f':// VSX vector register to hold vector float data
898 case 's':// VSX vector register to hold scalar float data
899 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000900 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000901 break;
902 default:
903 return false;
904 }
905 Info.setAllowsRegister();
906 Name++; // Skip over 'w'.
907 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000908 case 'h': // `MQ', `CTR', or `LINK' register
909 case 'q': // `MQ' register
910 case 'c': // `CTR' register
911 case 'l': // `LINK' register
912 case 'x': // `CR' register (condition register) number 0
913 case 'y': // `CR' register (condition register)
914 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000915 Info.setAllowsRegister();
916 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000917 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000919 // (use `L' instead for SImode constants)
920 case 'K': // Unsigned 16-bit constant
921 case 'L': // Signed 16-bit constant shifted left 16 bits
922 case 'M': // Constant larger than 31
923 case 'N': // Exact power of 2
924 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000925 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000926 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000927 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000928 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000929 break;
930 case 'm': // Memory operand. Note that on PowerPC targets, m can
931 // include addresses that update the base register. It
932 // is therefore only safe to use `m' in an asm statement
933 // if that asm statement accesses the operand exactly once.
934 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000935 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000936 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000937 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000938 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000939 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
940 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 // register to be updated.
942 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000943 if (Name[1] != 's')
944 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000945 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000946 // include any automodification of the base register. Unlike
947 // `m', this constraint can be used in asm statements that
948 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000949 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000950 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000951 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000952 break;
953 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000955 case 'Z': // Memory operand that is an indexed or indirect from a
956 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000957 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000958 Info.setAllowsMemory();
959 Info.setAllowsRegister();
960 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000962 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000963 // register (`p' is preferable for asm statements)
964 case 'S': // Constant suitable as a 64-bit mask operand
965 case 'T': // Constant suitable as a 32-bit mask operand
966 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000967 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000968 // instructions
969 case 'W': // Vector constant that does not require memory
970 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000971 break;
972 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000973 }
John Thompson07a61a42010-06-24 22:44:13 +0000974 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000975 }
Craig Topper3164f332014-03-11 03:39:26 +0000976 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000977 std::string R;
978 switch (*Constraint) {
979 case 'e':
980 case 'w':
981 // Two-character constraint; add "^" hint for later parsing.
982 R = std::string("^") + std::string(Constraint, 2);
983 Constraint++;
984 break;
985 default:
986 return TargetInfo::convertConstraint(Constraint);
987 }
988 return R;
989 }
Craig Topper3164f332014-03-11 03:39:26 +0000990 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000991 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000992 }
Craig Topper3164f332014-03-11 03:39:26 +0000993 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000994 if (RegNo == 0) return 3;
995 if (RegNo == 1) return 4;
996 return -1;
997 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000998
999 bool hasSjLjLowering() const override {
1000 return true;
1001 }
David Majnemer2617ea62015-06-09 18:05:33 +00001002
1003 bool useFloat128ManglingForLongDouble() const override {
1004 return LongDoubleWidth == 128 &&
1005 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1006 getTriple().isOSBinFormatELF();
1007 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001008};
Anders Carlssonf511f642007-11-27 04:11:28 +00001009
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001010const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001011#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001012#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001013 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001014#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001015};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001016
Eric Christopher917e9522014-11-18 22:36:15 +00001017/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001018/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001019bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001020 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001021 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1022 // Ignore disabled features.
1023 if (Features[i][0] == '-')
1024 continue;
1025
1026 StringRef Feature = StringRef(Features[i]).substr(1);
1027
1028 if (Feature == "vsx") {
1029 HasVSX = true;
1030 continue;
1031 }
1032
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001033 if (Feature == "bpermd") {
1034 HasBPERMD = true;
1035 continue;
1036 }
1037
1038 if (Feature == "extdiv") {
1039 HasExtDiv = true;
1040 continue;
1041 }
1042
Bill Schmidt59eb7672014-10-10 15:09:43 +00001043 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001044 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001045 continue;
1046 }
1047
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001048 if (Feature == "crypto") {
1049 HasP8Crypto = true;
1050 continue;
1051 }
1052
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001053 if (Feature == "direct-move") {
1054 HasDirectMove = true;
1055 continue;
1056 }
1057
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001058 if (Feature == "qpx") {
1059 HasQPX = true;
1060 continue;
1061 }
1062
Kit Barton8246f282015-03-25 19:41:41 +00001063 if (Feature == "htm") {
1064 HasHTM = true;
1065 continue;
1066 }
1067
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001068 // TODO: Finish this list and add an assert that we've handled them
1069 // all.
1070 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001071 if (!HasVSX && (HasP8Vector || HasDirectMove)) {
1072 if (HasP8Vector)
1073 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector" <<
1074 "-mno-vsx";
1075 else if (HasDirectMove)
1076 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move" <<
1077 "-mno-vsx";
1078 return false;
1079 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001080
1081 return true;
1082}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001083
Chris Lattnerecd49032009-03-02 22:27:17 +00001084/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1085/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001086void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001088 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001089 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001090 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001091 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001092 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001093 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001094 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001095 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001096 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001097 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001098 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001099 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001100
Chris Lattnerecd49032009-03-02 22:27:17 +00001101 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001102 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1103 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001104 } else {
1105 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1106 getTriple().getOS() != llvm::Triple::OpenBSD)
1107 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001108 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001109
Ulrich Weigand8afad612014-07-28 13:17:52 +00001110 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001111 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001112 Builder.defineMacro("_CALL_ELF", "1");
1113 if (ABI == "elfv2")
1114 Builder.defineMacro("_CALL_ELF", "2");
1115
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001117 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1118 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001119
Chris Lattnerecd49032009-03-02 22:27:17 +00001120 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001121 if (LongDoubleWidth == 128)
1122 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001123
John Thompsone467e192009-11-19 17:18:50 +00001124 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001125 Builder.defineMacro("__VEC__", "10206");
1126 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001127 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001128
1129 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001130 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1131 .Case("440", ArchDefineName)
1132 .Case("450", ArchDefineName | ArchDefine440)
1133 .Case("601", ArchDefineName)
1134 .Case("602", ArchDefineName | ArchDefinePpcgr)
1135 .Case("603", ArchDefineName | ArchDefinePpcgr)
1136 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1137 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1138 .Case("604", ArchDefineName | ArchDefinePpcgr)
1139 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1140 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001141 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001142 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1143 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1144 .Case("750", ArchDefineName | ArchDefinePpcgr)
1145 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1146 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001147 .Case("a2", ArchDefineA2)
1148 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001149 .Case("pwr3", ArchDefinePpcgr)
1150 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1152 | ArchDefinePpcsq)
1153 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1154 | ArchDefinePpcgr | ArchDefinePpcsq)
1155 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1156 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1157 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1158 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1159 | ArchDefinePpcsq)
1160 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1161 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001162 | ArchDefinePpcgr | ArchDefinePpcsq)
1163 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1164 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1165 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001166 .Case("power3", ArchDefinePpcgr)
1167 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1169 | ArchDefinePpcsq)
1170 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1171 | ArchDefinePpcgr | ArchDefinePpcsq)
1172 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1173 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1174 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1175 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1176 | ArchDefinePpcsq)
1177 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1178 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001179 | ArchDefinePpcgr | ArchDefinePpcsq)
1180 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1181 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1182 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001183 .Default(ArchDefineNone);
1184
1185 if (defs & ArchDefineName)
1186 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1187 if (defs & ArchDefinePpcgr)
1188 Builder.defineMacro("_ARCH_PPCGR");
1189 if (defs & ArchDefinePpcsq)
1190 Builder.defineMacro("_ARCH_PPCSQ");
1191 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001192 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001193 if (defs & ArchDefine603)
1194 Builder.defineMacro("_ARCH_603");
1195 if (defs & ArchDefine604)
1196 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001198 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001199 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001200 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001201 if (defs & ArchDefinePwr5x)
1202 Builder.defineMacro("_ARCH_PWR5X");
1203 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001204 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001205 if (defs & ArchDefinePwr6x)
1206 Builder.defineMacro("_ARCH_PWR6X");
1207 if (defs & ArchDefinePwr7)
1208 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001209 if (defs & ArchDefinePwr8)
1210 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001211 if (defs & ArchDefineA2)
1212 Builder.defineMacro("_ARCH_A2");
1213 if (defs & ArchDefineA2q) {
1214 Builder.defineMacro("_ARCH_A2Q");
1215 Builder.defineMacro("_ARCH_QP");
1216 }
1217
1218 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1219 Builder.defineMacro("__bg__");
1220 Builder.defineMacro("__THW_BLUEGENE__");
1221 Builder.defineMacro("__bgq__");
1222 Builder.defineMacro("__TOS_BGQ__");
1223 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001224
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001225 if (HasVSX)
1226 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001227 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001228 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001229 if (HasP8Crypto)
1230 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001231 if (HasHTM)
1232 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001233 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001234 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001235 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1236 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1237 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1238 if (PointerWidth == 64)
1239 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1240 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001241
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 // FIXME: The following are not yet generated here by Clang, but are
1243 // generated by GCC:
1244 //
1245 // _SOFT_FLOAT_
1246 // __RECIP_PRECISION__
1247 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001248 // __RECIP__
1249 // __RECIPF__
1250 // __RSQRTE__
1251 // __RSQRTEF__
1252 // _SOFT_DOUBLE_
1253 // __NO_LWSYNC__
1254 // __HAVE_BSWAP__
1255 // __LONGDOUBLE128
1256 // __CMODEL_MEDIUM__
1257 // __CMODEL_LARGE__
1258 // _CALL_SYSV
1259 // _CALL_DARWIN
1260 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001261}
1262
1263void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1264 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1265 .Case("7400", true)
1266 .Case("g4", true)
1267 .Case("7450", true)
1268 .Case("g4+", true)
1269 .Case("970", true)
1270 .Case("g5", true)
1271 .Case("pwr6", true)
1272 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001273 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001274 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001275 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001276 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001277
1278 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001279 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1280 .Case("ppc64le", true)
1281 .Case("pwr8", true)
1282 .Default(false);
1283 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1284 .Case("ppc64le", true)
1285 .Case("pwr8", true)
1286 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001287 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1288 .Case("ppc64le", true)
1289 .Case("pwr8", true)
1290 .Case("pwr7", true)
1291 .Default(false);
1292 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1293 .Case("ppc64le", true)
1294 .Case("pwr8", true)
1295 .Case("pwr7", true)
1296 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001297 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1298 .Case("ppc64le", true)
1299 .Case("pwr8", true)
1300 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001301 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1302 .Case("ppc64le", true)
1303 .Case("pwr8", true)
1304 .Case("pwr7", true)
1305 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001306}
1307
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001308bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001309 return llvm::StringSwitch<bool>(Feature)
1310 .Case("powerpc", true)
1311 .Case("vsx", HasVSX)
1312 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001313 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001314 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001315 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001316 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001317 .Case("bpermd", HasBPERMD)
1318 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001319 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001320}
Chris Lattner17df24e2008-04-21 18:56:49 +00001321
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001322/* There is no clear way for the target to know which of the features in the
1323 final feature vector came from defaults and which are actually specified by
1324 the user. To that end, we use the fact that this function is not called on
1325 default features - only user specified ones. By the first time this
1326 function is called, the default features are populated.
1327 We then keep track of the features that the user specified so that we
1328 can ensure we do not override a user's request (only defaults).
1329 For example:
1330 -mcpu=pwr8 -mno-vsx (should disable vsx and everything that depends on it)
1331 -mcpu=pwr8 -mdirect-move -mno-vsx (should actually be diagnosed)
1332
1333NOTE: Do not call this from PPCTargetInfo::getDefaultFeatures
1334*/
1335void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1336 StringRef Name, bool Enabled) const {
1337 static llvm::StringMap<bool> ExplicitFeatures;
1338 ExplicitFeatures[Name] = Enabled;
1339
1340 // At this point, -mno-vsx turns off the dependent features but we respect
1341 // the user's requests.
1342 if (!Enabled && Name == "vsx") {
1343 Features["direct-move"] = ExplicitFeatures["direct-move"];
1344 Features["power8-vector"] = ExplicitFeatures["power8-vector"];
1345 }
1346 if ((Enabled && Name == "power8-vector") ||
1347 (Enabled && Name == "direct-move")) {
1348 if (ExplicitFeatures.find("vsx") == ExplicitFeatures.end()) {
1349 Features["vsx"] = true;
1350 }
1351 }
1352 Features[Name] = Enabled;
1353}
1354
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001355const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001356 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1357 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1358 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1359 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1360 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1361 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1362 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1363 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001364 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001365 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001366 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001367 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1368 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1369 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1370 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001371 "vrsave", "vscr",
1372 "spe_acc", "spefscr",
1373 "sfp"
1374};
Chris Lattner10a5b382007-01-29 05:24:35 +00001375
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001376void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001377 unsigned &NumNames) const {
1378 Names = GCCRegNames;
1379 NumNames = llvm::array_lengthof(GCCRegNames);
1380}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001381
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001382const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1383 // While some of these aliases do map to different registers
1384 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001385 { { "0" }, "r0" },
1386 { { "1"}, "r1" },
1387 { { "2" }, "r2" },
1388 { { "3" }, "r3" },
1389 { { "4" }, "r4" },
1390 { { "5" }, "r5" },
1391 { { "6" }, "r6" },
1392 { { "7" }, "r7" },
1393 { { "8" }, "r8" },
1394 { { "9" }, "r9" },
1395 { { "10" }, "r10" },
1396 { { "11" }, "r11" },
1397 { { "12" }, "r12" },
1398 { { "13" }, "r13" },
1399 { { "14" }, "r14" },
1400 { { "15" }, "r15" },
1401 { { "16" }, "r16" },
1402 { { "17" }, "r17" },
1403 { { "18" }, "r18" },
1404 { { "19" }, "r19" },
1405 { { "20" }, "r20" },
1406 { { "21" }, "r21" },
1407 { { "22" }, "r22" },
1408 { { "23" }, "r23" },
1409 { { "24" }, "r24" },
1410 { { "25" }, "r25" },
1411 { { "26" }, "r26" },
1412 { { "27" }, "r27" },
1413 { { "28" }, "r28" },
1414 { { "29" }, "r29" },
1415 { { "30" }, "r30" },
1416 { { "31" }, "r31" },
1417 { { "fr0" }, "f0" },
1418 { { "fr1" }, "f1" },
1419 { { "fr2" }, "f2" },
1420 { { "fr3" }, "f3" },
1421 { { "fr4" }, "f4" },
1422 { { "fr5" }, "f5" },
1423 { { "fr6" }, "f6" },
1424 { { "fr7" }, "f7" },
1425 { { "fr8" }, "f8" },
1426 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001427 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001428 { { "fr11" }, "f11" },
1429 { { "fr12" }, "f12" },
1430 { { "fr13" }, "f13" },
1431 { { "fr14" }, "f14" },
1432 { { "fr15" }, "f15" },
1433 { { "fr16" }, "f16" },
1434 { { "fr17" }, "f17" },
1435 { { "fr18" }, "f18" },
1436 { { "fr19" }, "f19" },
1437 { { "fr20" }, "f20" },
1438 { { "fr21" }, "f21" },
1439 { { "fr22" }, "f22" },
1440 { { "fr23" }, "f23" },
1441 { { "fr24" }, "f24" },
1442 { { "fr25" }, "f25" },
1443 { { "fr26" }, "f26" },
1444 { { "fr27" }, "f27" },
1445 { { "fr28" }, "f28" },
1446 { { "fr29" }, "f29" },
1447 { { "fr30" }, "f30" },
1448 { { "fr31" }, "f31" },
1449 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001450};
1451
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001452void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001453 unsigned &NumAliases) const {
1454 Aliases = GCCRegAliases;
1455 NumAliases = llvm::array_lengthof(GCCRegAliases);
1456}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001457
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001458class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001459public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001460 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001461 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001462
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001463 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001464 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001465 case llvm::Triple::FreeBSD:
1466 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001467 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001468 PtrDiffType = SignedInt;
1469 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001470 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001471 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001472 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001473 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001474
Roman Divacky3ffe7462012-03-13 19:20:17 +00001475 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1476 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001477 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001478 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001479
1480 // PPC32 supports atomics up to 4 bytes.
1481 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001482 }
1483
Craig Topper3164f332014-03-11 03:39:26 +00001484 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001485 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001486 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001487 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001488};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001489
Bill Schmidt778d3872013-07-26 01:36:11 +00001490// Note: ABI differences may eventually require us to have a separate
1491// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001492class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001493public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001494 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001495 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001496 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001497 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001498
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001499 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1500 DescriptionString = "e-m:e-i64:64-n32:64";
1501 ABI = "elfv2";
1502 } else {
1503 DescriptionString = "E-m:e-i64:64-n32:64";
1504 ABI = "elfv1";
1505 }
1506
1507 switch (getTriple().getOS()) {
1508 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001509 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001510 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001511 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001512 case llvm::Triple::NetBSD:
1513 IntMaxType = SignedLongLong;
1514 Int64Type = SignedLongLong;
1515 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001516 default:
1517 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001518 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001519
1520 // PPC64 supports atomics up to 8 bytes.
1521 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001522 }
Craig Topper3164f332014-03-11 03:39:26 +00001523 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001524 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001525 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001526 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001527 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001528 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 ABI = Name;
1530 return true;
1531 }
1532 return false;
1533 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001535
Roman Divacky965b0b72011-01-06 08:27:10 +00001536class DarwinPPC32TargetInfo :
1537 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001538public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001539 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1540 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001541 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001542 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001543 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001544 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001545 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001546 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001547 }
Craig Topper3164f332014-03-11 03:39:26 +00001548 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001549 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001550 }
1551};
1552
1553class DarwinPPC64TargetInfo :
1554 public DarwinTargetInfo<PPC64TargetInfo> {
1555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001556 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1557 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001558 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001559 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001560 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001561 }
1562};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001563
Peter Collingbournec947aae2012-05-20 23:28:41 +00001564 static const unsigned NVPTXAddrSpaceMap[] = {
1565 1, // opencl_global
1566 3, // opencl_local
1567 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001568 // FIXME: generic has to be added to the target
1569 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001570 1, // cuda_device
1571 4, // cuda_constant
1572 3, // cuda_shared
1573 };
1574 class NVPTXTargetInfo : public TargetInfo {
1575 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001576 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001577
1578 // The GPU profiles supported by the NVPTX backend
1579 enum GPUKind {
1580 GK_NONE,
1581 GK_SM20,
1582 GK_SM21,
1583 GK_SM30,
1584 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001585 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001586 } GPU;
1587
Peter Collingbournec947aae2012-05-20 23:28:41 +00001588 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001589 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001590 BigEndian = false;
1591 TLSSupported = false;
1592 LongWidth = LongAlign = 64;
1593 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001594 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001595 // Define available target features
1596 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001597 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001598 // Set the default GPU to sm20
1599 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001600 }
Craig Topper3164f332014-03-11 03:39:26 +00001601 void getTargetDefines(const LangOptions &Opts,
1602 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001603 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001604 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001605 if (Opts.CUDAIsDevice) {
1606 // Set __CUDA_ARCH__ for the GPU specified.
1607 std::string CUDAArchCode;
1608 switch (GPU) {
1609 case GK_SM20:
1610 CUDAArchCode = "200";
1611 break;
1612 case GK_SM21:
1613 CUDAArchCode = "210";
1614 break;
1615 case GK_SM30:
1616 CUDAArchCode = "300";
1617 break;
1618 case GK_SM35:
1619 CUDAArchCode = "350";
1620 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001621 case GK_SM37:
1622 CUDAArchCode = "370";
1623 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001624 default:
1625 llvm_unreachable("Unhandled target CPU");
1626 }
1627 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1628 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001629 }
Craig Topper3164f332014-03-11 03:39:26 +00001630 void getTargetBuiltins(const Builtin::Info *&Records,
1631 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001632 Records = BuiltinInfo;
1633 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001634 }
Craig Topper3164f332014-03-11 03:39:26 +00001635 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001636 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001637 }
Craig Topper3164f332014-03-11 03:39:26 +00001638
1639 void getGCCRegNames(const char * const *&Names,
1640 unsigned &NumNames) const override;
1641 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1642 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001643 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001644 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 NumAliases = 0;
1646 }
Eric Christopher917e9522014-11-18 22:36:15 +00001647 bool
1648 validateAsmConstraint(const char *&Name,
1649 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001650 switch (*Name) {
1651 default: return false;
1652 case 'c':
1653 case 'h':
1654 case 'r':
1655 case 'l':
1656 case 'f':
1657 case 'd':
1658 Info.setAllowsRegister();
1659 return true;
1660 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001661 }
Craig Topper3164f332014-03-11 03:39:26 +00001662 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001663 // FIXME: Is this really right?
1664 return "";
1665 }
Craig Topper3164f332014-03-11 03:39:26 +00001666 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001667 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001668 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001669 }
Craig Topper3164f332014-03-11 03:39:26 +00001670 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001671 GPU = llvm::StringSwitch<GPUKind>(Name)
1672 .Case("sm_20", GK_SM20)
1673 .Case("sm_21", GK_SM21)
1674 .Case("sm_30", GK_SM30)
1675 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001676 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001677 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001678
Reid Klecknerbbc01782014-12-03 21:53:36 +00001679 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001680 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001681 };
1682
1683 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1684#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1685#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1686 ALL_LANGUAGES },
1687#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001688 };
1689
1690 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1691 "r0"
1692 };
1693
1694 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1695 unsigned &NumNames) const {
1696 Names = GCCRegNames;
1697 NumNames = llvm::array_lengthof(GCCRegNames);
1698 }
1699
1700 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1701 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001702 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001703 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001704 SizeType = TargetInfo::UnsignedInt;
1705 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001706 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001707 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001708 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001709 };
1710
1711 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1712 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001713 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001714 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001715 SizeType = TargetInfo::UnsignedLong;
1716 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001717 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001718 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001719 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001720 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001721
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001722static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001723 1, // opencl_global
1724 3, // opencl_local
1725 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001726 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001727 1, // cuda_device
1728 2, // cuda_constant
1729 3 // cuda_shared
1730};
1731
Tom Stellarda96344b2014-08-21 13:58:40 +00001732// If you edit the description strings, make sure you update
1733// getPointerWidthV().
1734
Tom Stellardc74b1e02013-03-04 17:40:53 +00001735static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001736 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1737 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001738
1739static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001740 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1741 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001742
1743static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001744 "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 +00001745 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1746 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001747
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001748class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001749 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001750 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001751
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001752 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001753 enum GPUKind {
1754 GK_NONE,
1755 GK_R600,
1756 GK_R600_DOUBLE_OPS,
1757 GK_R700,
1758 GK_R700_DOUBLE_OPS,
1759 GK_EVERGREEN,
1760 GK_EVERGREEN_DOUBLE_OPS,
1761 GK_NORTHERN_ISLANDS,
1762 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001763 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001764 GK_SEA_ISLANDS,
1765 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001766 } GPU;
1767
Jan Veselyeebeaea2015-05-04 19:53:36 +00001768 bool hasFP64:1;
1769 bool hasFMAF:1;
1770 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001771
Eli Friedmand13b41e2012-10-12 23:32:00 +00001772public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001773 AMDGPUTargetInfo(const llvm::Triple &Triple)
1774 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001775
1776 if (Triple.getArch() == llvm::Triple::amdgcn) {
1777 DescriptionString = DescriptionStringSI;
1778 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001779 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001780 hasFMAF = true;
1781 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001782 } else {
1783 DescriptionString = DescriptionStringR600;
1784 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001785 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001786 hasFMAF = false;
1787 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001788 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001789 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001790 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001791 }
1792
Tom Stellarda96344b2014-08-21 13:58:40 +00001793 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1794 if (GPU <= GK_CAYMAN)
1795 return 32;
1796
1797 switch(AddrSpace) {
1798 default:
1799 return 64;
1800 case 0:
1801 case 3:
1802 case 5:
1803 return 32;
1804 }
1805 }
1806
Craig Topper3164f332014-03-11 03:39:26 +00001807 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001808 return "";
1809 }
1810
Craig Topper3164f332014-03-11 03:39:26 +00001811 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001812 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001813
Craig Topper3164f332014-03-11 03:39:26 +00001814 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1815 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001816 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001817 NumAliases = 0;
1818 }
1819
Craig Topper3164f332014-03-11 03:39:26 +00001820 bool validateAsmConstraint(const char *&Name,
1821 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001822 return true;
1823 }
1824
Craig Topper3164f332014-03-11 03:39:26 +00001825 void getTargetBuiltins(const Builtin::Info *&Records,
1826 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001827 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001828 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001829 }
1830
Craig Topper3164f332014-03-11 03:39:26 +00001831 void getTargetDefines(const LangOptions &Opts,
1832 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001833 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001834 if (hasFMAF)
1835 Builder.defineMacro("__HAS_FMAF__");
1836 if (hasLDEXPF)
1837 Builder.defineMacro("__HAS_LDEXPF__");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001838 if (hasFP64 && Opts.OpenCL) {
Tom Stellardfded50f2015-02-27 15:10:19 +00001839 Builder.defineMacro("cl_khr_fp64");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001840 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001841 }
1842
Craig Topper3164f332014-03-11 03:39:26 +00001843 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001844 return TargetInfo::CharPtrBuiltinVaList;
1845 }
1846
Craig Topper3164f332014-03-11 03:39:26 +00001847 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001848 GPU = llvm::StringSwitch<GPUKind>(Name)
1849 .Case("r600" , GK_R600)
1850 .Case("rv610", GK_R600)
1851 .Case("rv620", GK_R600)
1852 .Case("rv630", GK_R600)
1853 .Case("rv635", GK_R600)
1854 .Case("rs780", GK_R600)
1855 .Case("rs880", GK_R600)
1856 .Case("rv670", GK_R600_DOUBLE_OPS)
1857 .Case("rv710", GK_R700)
1858 .Case("rv730", GK_R700)
1859 .Case("rv740", GK_R700_DOUBLE_OPS)
1860 .Case("rv770", GK_R700_DOUBLE_OPS)
1861 .Case("palm", GK_EVERGREEN)
1862 .Case("cedar", GK_EVERGREEN)
1863 .Case("sumo", GK_EVERGREEN)
1864 .Case("sumo2", GK_EVERGREEN)
1865 .Case("redwood", GK_EVERGREEN)
1866 .Case("juniper", GK_EVERGREEN)
1867 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1868 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1869 .Case("barts", GK_NORTHERN_ISLANDS)
1870 .Case("turks", GK_NORTHERN_ISLANDS)
1871 .Case("caicos", GK_NORTHERN_ISLANDS)
1872 .Case("cayman", GK_CAYMAN)
1873 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001874 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001875 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1876 .Case("verde", GK_SOUTHERN_ISLANDS)
1877 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001878 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001879 .Case("bonaire", GK_SEA_ISLANDS)
1880 .Case("kabini", GK_SEA_ISLANDS)
1881 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001882 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001883 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001884 .Case("tonga", GK_VOLCANIC_ISLANDS)
1885 .Case("iceland", GK_VOLCANIC_ISLANDS)
1886 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001887 .Default(GK_NONE);
1888
1889 if (GPU == GK_NONE) {
1890 return false;
1891 }
1892
1893 // Set the correct data layout
1894 switch (GPU) {
1895 case GK_NONE:
1896 case GK_R600:
1897 case GK_R700:
1898 case GK_EVERGREEN:
1899 case GK_NORTHERN_ISLANDS:
1900 DescriptionString = DescriptionStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001901 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001902 hasFMAF = false;
1903 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001904 break;
1905 case GK_R600_DOUBLE_OPS:
1906 case GK_R700_DOUBLE_OPS:
1907 case GK_EVERGREEN_DOUBLE_OPS:
1908 case GK_CAYMAN:
1909 DescriptionString = DescriptionStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001910 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001911 hasFMAF = true;
1912 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001913 break;
1914 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001915 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001916 case GK_VOLCANIC_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001917 DescriptionString = DescriptionStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001918 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001919 hasFMAF = true;
1920 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001921 break;
1922 }
1923
1924 return true;
1925 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001926};
1927
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001928const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001929#define BUILTIN(ID, TYPE, ATTRS) \
1930 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001931#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001932};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001933const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001934 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1935 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1936 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1937 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1938 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1939 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1940 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1941 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1942 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1943 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1944 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1945 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1946 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1947 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1948 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1949 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1950 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1951 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1952 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1953 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1954 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1955 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1956 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1957 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1958 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1959 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1960 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1961 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1962 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1963 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1964 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1965 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1966 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1967 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1968 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1969 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1970 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1971 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1972 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1973 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1974 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1975 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1976 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1977 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1978 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1979 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1980 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1981 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1982 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1983 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1984};
1985
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001986void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
1987 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001988 Names = GCCRegNames;
1989 NumNames = llvm::array_lengthof(GCCRegNames);
1990}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001991
Eli Friedman3fd920a2008-08-20 02:34:37 +00001992// Namespace for x86 abstract base class
1993const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001994#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001995#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001996 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001997#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001998};
Eli Friedmanb5366062008-05-20 14:21:01 +00001999
Nuno Lopescfca1f02009-12-23 17:49:57 +00002000static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002001 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2002 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002003 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002004 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2005 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2006 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002007 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002008 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2009 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002010};
2011
Eric Christophercdd36352011-06-21 00:05:20 +00002012const TargetInfo::AddlRegName AddlRegNames[] = {
2013 { { "al", "ah", "eax", "rax" }, 0 },
2014 { { "bl", "bh", "ebx", "rbx" }, 3 },
2015 { { "cl", "ch", "ecx", "rcx" }, 2 },
2016 { { "dl", "dh", "edx", "rdx" }, 1 },
2017 { { "esi", "rsi" }, 4 },
2018 { { "edi", "rdi" }, 5 },
2019 { { "esp", "rsp" }, 7 },
2020 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002021};
2022
2023// X86 target abstract base class; x86-32 and x86-64 are very close, so
2024// most of the implementation can be shared.
2025class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002026 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002027 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00002028 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002029 enum MMX3DNowEnum {
2030 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2031 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002032 enum XOPEnum {
2033 NoXOP,
2034 SSE4A,
2035 FMA4,
2036 XOP
2037 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002038
Eric Christophere1ddaf92010-04-02 23:50:19 +00002039 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002040 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002041 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002042 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002043 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002044 bool HasBMI;
2045 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002046 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002047 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002048 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002049 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002050 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002051 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002052 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002053 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002054 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2055 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002056 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002057 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002058
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002059 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2060 ///
2061 /// Each enumeration represents a particular CPU supported by Clang. These
2062 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2063 enum CPUKind {
2064 CK_Generic,
2065
2066 /// \name i386
2067 /// i386-generation processors.
2068 //@{
2069 CK_i386,
2070 //@}
2071
2072 /// \name i486
2073 /// i486-generation processors.
2074 //@{
2075 CK_i486,
2076 CK_WinChipC6,
2077 CK_WinChip2,
2078 CK_C3,
2079 //@}
2080
2081 /// \name i586
2082 /// i586-generation processors, P5 microarchitecture based.
2083 //@{
2084 CK_i586,
2085 CK_Pentium,
2086 CK_PentiumMMX,
2087 //@}
2088
2089 /// \name i686
2090 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2091 //@{
2092 CK_i686,
2093 CK_PentiumPro,
2094 CK_Pentium2,
2095 CK_Pentium3,
2096 CK_Pentium3M,
2097 CK_PentiumM,
2098 CK_C3_2,
2099
2100 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2101 /// Clang however has some logic to suport this.
2102 // FIXME: Warn, deprecate, and potentially remove this.
2103 CK_Yonah,
2104 //@}
2105
2106 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002107 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002108 //@{
2109 CK_Pentium4,
2110 CK_Pentium4M,
2111 CK_Prescott,
2112 CK_Nocona,
2113 //@}
2114
2115 /// \name Core
2116 /// Core microarchitecture based processors.
2117 //@{
2118 CK_Core2,
2119
2120 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2121 /// codename which GCC no longer accepts as an option to -march, but Clang
2122 /// has some logic for recognizing it.
2123 // FIXME: Warn, deprecate, and potentially remove this.
2124 CK_Penryn,
2125 //@}
2126
2127 /// \name Atom
2128 /// Atom processors
2129 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002130 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002131 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002132 //@}
2133
2134 /// \name Nehalem
2135 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002136 CK_Nehalem,
2137
2138 /// \name Westmere
2139 /// Westmere microarchitecture based processors.
2140 CK_Westmere,
2141
2142 /// \name Sandy Bridge
2143 /// Sandy Bridge microarchitecture based processors.
2144 CK_SandyBridge,
2145
2146 /// \name Ivy Bridge
2147 /// Ivy Bridge microarchitecture based processors.
2148 CK_IvyBridge,
2149
2150 /// \name Haswell
2151 /// Haswell microarchitecture based processors.
2152 CK_Haswell,
2153
2154 /// \name Broadwell
2155 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002156 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002157
2158 /// \name Skylake
2159 /// Skylake microarchitecture based processors.
2160 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002161
Craig Topper449314e2013-08-20 07:09:39 +00002162 /// \name Knights Landing
2163 /// Knights Landing processor.
2164 CK_KNL,
2165
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002166 /// \name K6
2167 /// K6 architecture processors.
2168 //@{
2169 CK_K6,
2170 CK_K6_2,
2171 CK_K6_3,
2172 //@}
2173
2174 /// \name K7
2175 /// K7 architecture processors.
2176 //@{
2177 CK_Athlon,
2178 CK_AthlonThunderbird,
2179 CK_Athlon4,
2180 CK_AthlonXP,
2181 CK_AthlonMP,
2182 //@}
2183
2184 /// \name K8
2185 /// K8 architecture processors.
2186 //@{
2187 CK_Athlon64,
2188 CK_Athlon64SSE3,
2189 CK_AthlonFX,
2190 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002191 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002192 CK_Opteron,
2193 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002194 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002195 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002196
Benjamin Kramer569f2152012-01-10 11:50:18 +00002197 /// \name Bobcat
2198 /// Bobcat architecture processors.
2199 //@{
2200 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002201 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002202 //@}
2203
2204 /// \name Bulldozer
2205 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002206 //@{
2207 CK_BDVER1,
2208 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002209 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002210 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002211 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002212
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002213 /// This specification is deprecated and will be removed in the future.
2214 /// Users should prefer \see CK_K8.
2215 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002216 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002217 CK_x86_64,
2218 //@}
2219
2220 /// \name Geode
2221 /// Geode processors.
2222 //@{
2223 CK_Geode
2224 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002225 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002226
Rafael Espindolaeb265472013-08-21 21:59:03 +00002227 enum FPMathKind {
2228 FP_Default,
2229 FP_SSE,
2230 FP_387
2231 } FPMath;
2232
Eli Friedman3fd920a2008-08-20 02:34:37 +00002233public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002234 X86TargetInfo(const llvm::Triple &Triple)
2235 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002236 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002237 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2238 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2239 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2240 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2241 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2242 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002243 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002244 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002245 }
Craig Topper3164f332014-03-11 03:39:26 +00002246 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002247 // X87 evaluates with 80 bits "long double" precision.
2248 return SSELevel == NoSSE ? 2 : 0;
2249 }
Craig Topper3164f332014-03-11 03:39:26 +00002250 void getTargetBuiltins(const Builtin::Info *&Records,
2251 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002252 Records = BuiltinInfo;
2253 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002254 }
Craig Topper3164f332014-03-11 03:39:26 +00002255 void getGCCRegNames(const char * const *&Names,
2256 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002257 Names = GCCRegNames;
2258 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002259 }
Craig Topper3164f332014-03-11 03:39:26 +00002260 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2261 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002262 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002263 NumAliases = 0;
2264 }
Craig Topper3164f332014-03-11 03:39:26 +00002265 void getGCCAddlRegNames(const AddlRegName *&Names,
2266 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002267 Names = AddlRegNames;
2268 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002269 }
Eric Christopherd9832702015-06-29 21:00:05 +00002270 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002271 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002272 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002273
Akira Hatanaka974131e2014-09-18 18:17:18 +00002274 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2275
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002276 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2277
Akira Hatanaka974131e2014-09-18 18:17:18 +00002278 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2279
Craig Topper3164f332014-03-11 03:39:26 +00002280 std::string convertConstraint(const char *&Constraint) const override;
2281 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002282 return "~{dirflag},~{fpsr},~{flags}";
2283 }
Craig Topper3164f332014-03-11 03:39:26 +00002284 void getTargetDefines(const LangOptions &Opts,
2285 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002286 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2287 bool Enabled);
2288 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2289 bool Enabled);
2290 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2291 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002292 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2293 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002294 setFeatureEnabledImpl(Features, Name, Enabled);
2295 }
2296 // This exists purely to cut down on the number of virtual calls in
2297 // getDefaultFeatures which calls this repeatedly.
2298 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2299 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002300 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2301 bool hasFeature(StringRef Feature) const override;
2302 bool handleTargetFeatures(std::vector<std::string> &Features,
2303 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002304 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002305 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2306 return "avx512";
2307 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002308 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002309 else if (getTriple().getArch() == llvm::Triple::x86 &&
2310 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002311 return "no-mmx";
2312 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002313 }
Craig Topper3164f332014-03-11 03:39:26 +00002314 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002315 CPU = llvm::StringSwitch<CPUKind>(Name)
2316 .Case("i386", CK_i386)
2317 .Case("i486", CK_i486)
2318 .Case("winchip-c6", CK_WinChipC6)
2319 .Case("winchip2", CK_WinChip2)
2320 .Case("c3", CK_C3)
2321 .Case("i586", CK_i586)
2322 .Case("pentium", CK_Pentium)
2323 .Case("pentium-mmx", CK_PentiumMMX)
2324 .Case("i686", CK_i686)
2325 .Case("pentiumpro", CK_PentiumPro)
2326 .Case("pentium2", CK_Pentium2)
2327 .Case("pentium3", CK_Pentium3)
2328 .Case("pentium3m", CK_Pentium3M)
2329 .Case("pentium-m", CK_PentiumM)
2330 .Case("c3-2", CK_C3_2)
2331 .Case("yonah", CK_Yonah)
2332 .Case("pentium4", CK_Pentium4)
2333 .Case("pentium4m", CK_Pentium4M)
2334 .Case("prescott", CK_Prescott)
2335 .Case("nocona", CK_Nocona)
2336 .Case("core2", CK_Core2)
2337 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002338 .Case("bonnell", CK_Bonnell)
2339 .Case("atom", CK_Bonnell) // Legacy name.
2340 .Case("silvermont", CK_Silvermont)
2341 .Case("slm", CK_Silvermont) // Legacy name.
2342 .Case("nehalem", CK_Nehalem)
2343 .Case("corei7", CK_Nehalem) // Legacy name.
2344 .Case("westmere", CK_Westmere)
2345 .Case("sandybridge", CK_SandyBridge)
2346 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2347 .Case("ivybridge", CK_IvyBridge)
2348 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2349 .Case("haswell", CK_Haswell)
2350 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002351 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002352 .Case("skylake", CK_Skylake)
2353 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002354 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002355 .Case("k6", CK_K6)
2356 .Case("k6-2", CK_K6_2)
2357 .Case("k6-3", CK_K6_3)
2358 .Case("athlon", CK_Athlon)
2359 .Case("athlon-tbird", CK_AthlonThunderbird)
2360 .Case("athlon-4", CK_Athlon4)
2361 .Case("athlon-xp", CK_AthlonXP)
2362 .Case("athlon-mp", CK_AthlonMP)
2363 .Case("athlon64", CK_Athlon64)
2364 .Case("athlon64-sse3", CK_Athlon64SSE3)
2365 .Case("athlon-fx", CK_AthlonFX)
2366 .Case("k8", CK_K8)
2367 .Case("k8-sse3", CK_K8SSE3)
2368 .Case("opteron", CK_Opteron)
2369 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002370 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002371 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002372 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002373 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002374 .Case("bdver1", CK_BDVER1)
2375 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002376 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002377 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002378 .Case("x86-64", CK_x86_64)
2379 .Case("geode", CK_Geode)
2380 .Default(CK_Generic);
2381
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002382 // Perform any per-CPU checks necessary to determine if this CPU is
2383 // acceptable.
2384 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2385 // invalid without explaining *why*.
2386 switch (CPU) {
2387 case CK_Generic:
2388 // No processor selected!
2389 return false;
2390
2391 case CK_i386:
2392 case CK_i486:
2393 case CK_WinChipC6:
2394 case CK_WinChip2:
2395 case CK_C3:
2396 case CK_i586:
2397 case CK_Pentium:
2398 case CK_PentiumMMX:
2399 case CK_i686:
2400 case CK_PentiumPro:
2401 case CK_Pentium2:
2402 case CK_Pentium3:
2403 case CK_Pentium3M:
2404 case CK_PentiumM:
2405 case CK_Yonah:
2406 case CK_C3_2:
2407 case CK_Pentium4:
2408 case CK_Pentium4M:
2409 case CK_Prescott:
2410 case CK_K6:
2411 case CK_K6_2:
2412 case CK_K6_3:
2413 case CK_Athlon:
2414 case CK_AthlonThunderbird:
2415 case CK_Athlon4:
2416 case CK_AthlonXP:
2417 case CK_AthlonMP:
2418 case CK_Geode:
2419 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002420 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002421 return false;
2422
2423 // Fallthrough
2424 case CK_Nocona:
2425 case CK_Core2:
2426 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002427 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002428 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002429 case CK_Nehalem:
2430 case CK_Westmere:
2431 case CK_SandyBridge:
2432 case CK_IvyBridge:
2433 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002434 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002435 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002436 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002437 case CK_Athlon64:
2438 case CK_Athlon64SSE3:
2439 case CK_AthlonFX:
2440 case CK_K8:
2441 case CK_K8SSE3:
2442 case CK_Opteron:
2443 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002444 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002445 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002446 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002447 case CK_BDVER1:
2448 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002449 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002450 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002451 case CK_x86_64:
2452 return true;
2453 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002454 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002455 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002456
Craig Topper3164f332014-03-11 03:39:26 +00002457 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002458
Craig Topper3164f332014-03-11 03:39:26 +00002459 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002460 // We accept all non-ARM calling conventions
2461 return (CC == CC_X86ThisCall ||
2462 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002463 CC == CC_X86StdCall ||
2464 CC == CC_X86VectorCall ||
2465 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002466 CC == CC_X86Pascal ||
2467 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002468 }
2469
Craig Topper3164f332014-03-11 03:39:26 +00002470 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002471 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002472 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002473
2474 bool hasSjLjLowering() const override {
2475 return true;
2476 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002477};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002478
Rafael Espindolaeb265472013-08-21 21:59:03 +00002479bool X86TargetInfo::setFPMath(StringRef Name) {
2480 if (Name == "387") {
2481 FPMath = FP_387;
2482 return true;
2483 }
2484 if (Name == "sse") {
2485 FPMath = FP_SSE;
2486 return true;
2487 }
2488 return false;
2489}
2490
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002491void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002492 // FIXME: This *really* should not be here.
2493
2494 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002495 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002496 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002497
Chandler Carruth212334f2011-09-28 08:55:37 +00002498 switch (CPU) {
2499 case CK_Generic:
2500 case CK_i386:
2501 case CK_i486:
2502 case CK_i586:
2503 case CK_Pentium:
2504 case CK_i686:
2505 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002506 break;
2507 case CK_PentiumMMX:
2508 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002509 case CK_K6:
2510 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002511 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002512 break;
2513 case CK_Pentium3:
2514 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002515 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002516 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002517 break;
2518 case CK_PentiumM:
2519 case CK_Pentium4:
2520 case CK_Pentium4M:
2521 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002522 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002523 break;
2524 case CK_Yonah:
2525 case CK_Prescott:
2526 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002527 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002528 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002529 break;
2530 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002531 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002532 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002533 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002534 break;
2535 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002536 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002537 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002538 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002539 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002540 setFeatureEnabledImpl(Features, "avx512f", true);
2541 setFeatureEnabledImpl(Features, "avx512cd", true);
2542 setFeatureEnabledImpl(Features, "avx512dq", true);
2543 setFeatureEnabledImpl(Features, "avx512bw", true);
2544 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002545 // FALLTHROUGH
2546 case CK_Broadwell:
2547 setFeatureEnabledImpl(Features, "rdseed", true);
2548 setFeatureEnabledImpl(Features, "adx", true);
2549 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002550 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002551 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002552 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002553 setFeatureEnabledImpl(Features, "bmi", true);
2554 setFeatureEnabledImpl(Features, "bmi2", true);
2555 setFeatureEnabledImpl(Features, "rtm", true);
2556 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002557 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002558 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002559 setFeatureEnabledImpl(Features, "rdrnd", true);
2560 setFeatureEnabledImpl(Features, "f16c", true);
2561 setFeatureEnabledImpl(Features, "fsgsbase", true);
2562 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002563 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002564 setFeatureEnabledImpl(Features, "avx", true);
2565 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002566 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002567 case CK_Silvermont:
2568 setFeatureEnabledImpl(Features, "aes", true);
2569 setFeatureEnabledImpl(Features, "pclmul", true);
2570 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002571 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002572 setFeatureEnabledImpl(Features, "sse4.2", true);
2573 setFeatureEnabledImpl(Features, "cx16", true);
2574 break;
2575 case CK_KNL:
2576 setFeatureEnabledImpl(Features, "avx512f", true);
2577 setFeatureEnabledImpl(Features, "avx512cd", true);
2578 setFeatureEnabledImpl(Features, "avx512er", true);
2579 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002580 setFeatureEnabledImpl(Features, "rdseed", true);
2581 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002582 setFeatureEnabledImpl(Features, "lzcnt", true);
2583 setFeatureEnabledImpl(Features, "bmi", true);
2584 setFeatureEnabledImpl(Features, "bmi2", true);
2585 setFeatureEnabledImpl(Features, "rtm", true);
2586 setFeatureEnabledImpl(Features, "fma", true);
2587 setFeatureEnabledImpl(Features, "rdrnd", true);
2588 setFeatureEnabledImpl(Features, "f16c", true);
2589 setFeatureEnabledImpl(Features, "fsgsbase", true);
2590 setFeatureEnabledImpl(Features, "aes", true);
2591 setFeatureEnabledImpl(Features, "pclmul", true);
2592 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002593 break;
2594 case CK_K6_2:
2595 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002596 case CK_WinChip2:
2597 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002598 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002599 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002600 case CK_Athlon:
2601 case CK_AthlonThunderbird:
2602 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002603 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002604 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002605 case CK_Athlon4:
2606 case CK_AthlonXP:
2607 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002608 setFeatureEnabledImpl(Features, "sse", true);
2609 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002610 break;
2611 case CK_K8:
2612 case CK_Opteron:
2613 case CK_Athlon64:
2614 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002615 setFeatureEnabledImpl(Features, "sse2", true);
2616 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002617 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002618 case CK_AMDFAM10:
2619 setFeatureEnabledImpl(Features, "sse4a", true);
2620 setFeatureEnabledImpl(Features, "lzcnt", true);
2621 setFeatureEnabledImpl(Features, "popcnt", true);
2622 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002623 case CK_K8SSE3:
2624 case CK_OpteronSSE3:
2625 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002626 setFeatureEnabledImpl(Features, "sse3", true);
2627 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002628 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002629 case CK_BTVER2:
2630 setFeatureEnabledImpl(Features, "avx", true);
2631 setFeatureEnabledImpl(Features, "aes", true);
2632 setFeatureEnabledImpl(Features, "pclmul", true);
2633 setFeatureEnabledImpl(Features, "bmi", true);
2634 setFeatureEnabledImpl(Features, "f16c", true);
2635 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002636 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002637 setFeatureEnabledImpl(Features, "ssse3", true);
2638 setFeatureEnabledImpl(Features, "sse4a", true);
2639 setFeatureEnabledImpl(Features, "lzcnt", true);
2640 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002641 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002642 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002643 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002644 case CK_BDVER4:
2645 setFeatureEnabledImpl(Features, "avx2", true);
2646 setFeatureEnabledImpl(Features, "bmi2", true);
2647 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002648 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002649 setFeatureEnabledImpl(Features, "fsgsbase", true);
2650 // FALLTHROUGH
2651 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002652 setFeatureEnabledImpl(Features, "bmi", true);
2653 setFeatureEnabledImpl(Features, "fma", true);
2654 setFeatureEnabledImpl(Features, "f16c", true);
2655 setFeatureEnabledImpl(Features, "tbm", true);
2656 // FALLTHROUGH
2657 case CK_BDVER1:
2658 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002659 setFeatureEnabledImpl(Features, "xop", true);
2660 setFeatureEnabledImpl(Features, "lzcnt", true);
2661 setFeatureEnabledImpl(Features, "aes", true);
2662 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002663 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002664 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002665 break;
Eli Friedman33465822011-07-08 23:31:17 +00002666 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002667}
2668
Rafael Espindolae62e2792013-08-20 13:44:29 +00002669void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002670 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002671 if (Enabled) {
2672 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002673 case AVX512F:
2674 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002675 case AVX2:
2676 Features["avx2"] = true;
2677 case AVX:
2678 Features["avx"] = true;
2679 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002680 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002681 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002682 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002683 case SSSE3:
2684 Features["ssse3"] = true;
2685 case SSE3:
2686 Features["sse3"] = true;
2687 case SSE2:
2688 Features["sse2"] = true;
2689 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002690 Features["sse"] = true;
2691 case NoSSE:
2692 break;
2693 }
2694 return;
2695 }
2696
2697 switch (Level) {
2698 case NoSSE:
2699 case SSE1:
2700 Features["sse"] = false;
2701 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002702 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2703 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002704 case SSE3:
2705 Features["sse3"] = false;
2706 setXOPLevel(Features, NoXOP, false);
2707 case SSSE3:
2708 Features["ssse3"] = false;
2709 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002710 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002711 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002712 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002713 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002714 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002715 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002716 case AVX2:
2717 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002718 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002719 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002720 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2721 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002722 }
2723}
2724
2725void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002726 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002727 if (Enabled) {
2728 switch (Level) {
2729 case AMD3DNowAthlon:
2730 Features["3dnowa"] = true;
2731 case AMD3DNow:
2732 Features["3dnow"] = true;
2733 case MMX:
2734 Features["mmx"] = true;
2735 case NoMMX3DNow:
2736 break;
2737 }
2738 return;
2739 }
2740
2741 switch (Level) {
2742 case NoMMX3DNow:
2743 case MMX:
2744 Features["mmx"] = false;
2745 case AMD3DNow:
2746 Features["3dnow"] = false;
2747 case AMD3DNowAthlon:
2748 Features["3dnowa"] = false;
2749 }
2750}
2751
2752void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002753 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002754 if (Enabled) {
2755 switch (Level) {
2756 case XOP:
2757 Features["xop"] = true;
2758 case FMA4:
2759 Features["fma4"] = true;
2760 setSSELevel(Features, AVX, true);
2761 case SSE4A:
2762 Features["sse4a"] = true;
2763 setSSELevel(Features, SSE3, true);
2764 case NoXOP:
2765 break;
2766 }
2767 return;
2768 }
2769
2770 switch (Level) {
2771 case NoXOP:
2772 case SSE4A:
2773 Features["sse4a"] = false;
2774 case FMA4:
2775 Features["fma4"] = false;
2776 case XOP:
2777 Features["xop"] = false;
2778 }
2779}
2780
Craig Topper86d79ef2013-09-17 04:51:29 +00002781void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2782 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002783 // This is a bit of a hack to deal with the sse4 target feature when used
2784 // as part of the target attribute. We handle sse4 correctly everywhere
2785 // else. See below for more information on how we handle the sse4 options.
2786 if (Name != "sse4")
2787 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002788
Craig Topper29561122013-09-19 01:13:07 +00002789 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002790 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002791 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002792 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002793 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002794 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002795 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002796 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002797 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002798 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002799 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002800 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002801 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002802 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002803 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002804 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002805 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002806 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002807 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002808 if (Enabled)
2809 setSSELevel(Features, SSE2, Enabled);
2810 } else if (Name == "pclmul") {
2811 if (Enabled)
2812 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002813 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002814 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002815 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002816 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002817 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002818 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002819 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2820 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002821 if (Enabled)
2822 setSSELevel(Features, AVX512F, Enabled);
2823 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002824 if (Enabled)
2825 setSSELevel(Features, AVX, Enabled);
2826 } else if (Name == "fma4") {
2827 setXOPLevel(Features, FMA4, Enabled);
2828 } else if (Name == "xop") {
2829 setXOPLevel(Features, XOP, Enabled);
2830 } else if (Name == "sse4a") {
2831 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002832 } else if (Name == "f16c") {
2833 if (Enabled)
2834 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002835 } else if (Name == "sha") {
2836 if (Enabled)
2837 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002838 } else if (Name == "sse4") {
2839 // We can get here via the __target__ attribute since that's not controlled
2840 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2841 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2842 // disabled.
2843 if (Enabled)
2844 setSSELevel(Features, SSE42, Enabled);
2845 else
2846 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002847 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002848}
2849
Eric Christopher3ff21b32013-10-16 21:26:26 +00002850/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002851/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002852bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002853 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002854 // Remember the maximum enabled sselevel.
2855 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2856 // Ignore disabled features.
2857 if (Features[i][0] == '-')
2858 continue;
2859
Benjamin Kramer27402c62012-03-05 15:10:44 +00002860 StringRef Feature = StringRef(Features[i]).substr(1);
2861
2862 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002863 HasAES = true;
2864 continue;
2865 }
2866
Craig Topper3f122a72012-05-31 05:18:48 +00002867 if (Feature == "pclmul") {
2868 HasPCLMUL = true;
2869 continue;
2870 }
2871
Benjamin Kramer27402c62012-03-05 15:10:44 +00002872 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002873 HasLZCNT = true;
2874 continue;
2875 }
2876
Rafael Espindola89049822013-08-23 20:21:37 +00002877 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002878 HasRDRND = true;
2879 continue;
2880 }
2881
Craig Topper8c7f2512014-11-03 06:51:41 +00002882 if (Feature == "fsgsbase") {
2883 HasFSGSBASE = true;
2884 continue;
2885 }
2886
Benjamin Kramer27402c62012-03-05 15:10:44 +00002887 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002888 HasBMI = true;
2889 continue;
2890 }
2891
Benjamin Kramer27402c62012-03-05 15:10:44 +00002892 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002893 HasBMI2 = true;
2894 continue;
2895 }
2896
Benjamin Kramer27402c62012-03-05 15:10:44 +00002897 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002898 HasPOPCNT = true;
2899 continue;
2900 }
2901
Michael Liao625a8752012-11-10 05:17:46 +00002902 if (Feature == "rtm") {
2903 HasRTM = true;
2904 continue;
2905 }
2906
Michael Liao74f4eaf2013-03-26 17:52:08 +00002907 if (Feature == "prfchw") {
2908 HasPRFCHW = true;
2909 continue;
2910 }
2911
Michael Liaoffaae352013-03-29 05:17:55 +00002912 if (Feature == "rdseed") {
2913 HasRDSEED = true;
2914 continue;
2915 }
2916
Robert Khasanov50e6f582014-09-19 09:53:48 +00002917 if (Feature == "adx") {
2918 HasADX = true;
2919 continue;
2920 }
2921
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002922 if (Feature == "tbm") {
2923 HasTBM = true;
2924 continue;
2925 }
2926
Craig Topperbba778b2012-06-03 21:46:30 +00002927 if (Feature == "fma") {
2928 HasFMA = true;
2929 continue;
2930 }
2931
Manman Rena45358c2012-10-11 00:59:55 +00002932 if (Feature == "f16c") {
2933 HasF16C = true;
2934 continue;
2935 }
2936
Craig Topper679b53a2013-08-21 05:29:10 +00002937 if (Feature == "avx512cd") {
2938 HasAVX512CD = true;
2939 continue;
2940 }
2941
2942 if (Feature == "avx512er") {
2943 HasAVX512ER = true;
2944 continue;
2945 }
2946
2947 if (Feature == "avx512pf") {
2948 HasAVX512PF = true;
2949 continue;
2950 }
2951
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002952 if (Feature == "avx512dq") {
2953 HasAVX512DQ = true;
2954 continue;
2955 }
2956
2957 if (Feature == "avx512bw") {
2958 HasAVX512BW = true;
2959 continue;
2960 }
2961
2962 if (Feature == "avx512vl") {
2963 HasAVX512VL = true;
2964 continue;
2965 }
2966
Ben Langmuir58078d02013-09-19 13:22:04 +00002967 if (Feature == "sha") {
2968 HasSHA = true;
2969 continue;
2970 }
2971
Nick Lewycky50e8f482013-10-05 20:14:27 +00002972 if (Feature == "cx16") {
2973 HasCX16 = true;
2974 continue;
2975 }
2976
Daniel Dunbar979586e2009-11-11 09:38:56 +00002977 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002978 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002979 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002980 .Case("avx2", AVX2)
2981 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002982 .Case("sse4.2", SSE42)
2983 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002984 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002985 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002986 .Case("sse2", SSE2)
2987 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002988 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002989 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002990
Eli Friedman33465822011-07-08 23:31:17 +00002991 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002992 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002993 .Case("3dnowa", AMD3DNowAthlon)
2994 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002995 .Case("mmx", MMX)
2996 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002997 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002998
2999 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
3000 .Case("xop", XOP)
3001 .Case("fma4", FMA4)
3002 .Case("sse4a", SSE4A)
3003 .Default(NoXOP);
3004 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003005 }
Eli Friedman33465822011-07-08 23:31:17 +00003006
Craig Topper7481d8a2013-09-10 06:55:47 +00003007 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3008 // Can't do this earlier because we need to be able to explicitly enable
3009 // popcnt and still disable sse4.2.
3010 if (!HasPOPCNT && SSELevel >= SSE42 &&
3011 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
3012 HasPOPCNT = true;
3013 Features.push_back("+popcnt");
3014 }
3015
Yunzhong Gao61089362013-10-16 19:07:02 +00003016 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3017 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
3018 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
3019 HasPRFCHW = true;
3020 Features.push_back("+prfchw");
3021 }
3022
Rafael Espindolaeb265472013-08-21 21:59:03 +00003023 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3024 // matches the selected sse level.
3025 if (FPMath == FP_SSE && SSELevel < SSE1) {
3026 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3027 return false;
3028 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3029 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3030 return false;
3031 }
3032
Eli Friedman33465822011-07-08 23:31:17 +00003033 // Don't tell the backend if we're turning off mmx; it will end up disabling
3034 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003035 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3036 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003037 std::vector<std::string>::iterator it;
3038 it = std::find(Features.begin(), Features.end(), "-mmx");
3039 if (it != Features.end())
3040 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003041 else if (SSELevel > NoSSE)
3042 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003043
3044 SimdDefaultAlign =
3045 (getABI() == "avx512") ? 512 : (getABI() == "avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003046 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003047}
Chris Lattnerecd49032009-03-02 22:27:17 +00003048
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003049/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3050/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003051void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003052 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003053 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003054 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003055 Builder.defineMacro("__amd64__");
3056 Builder.defineMacro("__amd64");
3057 Builder.defineMacro("__x86_64");
3058 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003059 if (getTriple().getArchName() == "x86_64h") {
3060 Builder.defineMacro("__x86_64h");
3061 Builder.defineMacro("__x86_64h__");
3062 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003063 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003064 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003065 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003066
Chris Lattnerecd49032009-03-02 22:27:17 +00003067 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003068 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3069 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003070 switch (CPU) {
3071 case CK_Generic:
3072 break;
3073 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003074 // The rest are coming from the i386 define above.
3075 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003076 break;
3077 case CK_i486:
3078 case CK_WinChipC6:
3079 case CK_WinChip2:
3080 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003081 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003082 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003083 case CK_PentiumMMX:
3084 Builder.defineMacro("__pentium_mmx__");
3085 Builder.defineMacro("__tune_pentium_mmx__");
3086 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003087 case CK_i586:
3088 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003089 defineCPUMacros(Builder, "i586");
3090 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003091 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003092 case CK_Pentium3:
3093 case CK_Pentium3M:
3094 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003095 Builder.defineMacro("__tune_pentium3__");
3096 // Fallthrough
3097 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003099 Builder.defineMacro("__tune_pentium2__");
3100 // Fallthrough
3101 case CK_PentiumPro:
3102 Builder.defineMacro("__tune_i686__");
3103 Builder.defineMacro("__tune_pentiumpro__");
3104 // Fallthrough
3105 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003106 Builder.defineMacro("__i686");
3107 Builder.defineMacro("__i686__");
3108 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3109 Builder.defineMacro("__pentiumpro");
3110 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003111 break;
3112 case CK_Pentium4:
3113 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003114 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003115 break;
3116 case CK_Yonah:
3117 case CK_Prescott:
3118 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003119 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003120 break;
3121 case CK_Core2:
3122 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003123 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003124 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003125 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003126 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003127 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003128 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003129 defineCPUMacros(Builder, "slm");
3130 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003131 case CK_Nehalem:
3132 case CK_Westmere:
3133 case CK_SandyBridge:
3134 case CK_IvyBridge:
3135 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003136 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003137 // FIXME: Historically, we defined this legacy name, it would be nice to
3138 // remove it at some point. We've never exposed fine-grained names for
3139 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003140 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003141 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003142 case CK_Skylake:
3143 // FIXME: Historically, we defined this legacy name, it would be nice to
3144 // remove it at some point. This is the only fine-grained CPU macro in the
3145 // main intel CPU line, and it would be better to not have these and force
3146 // people to use ISA macros.
3147 defineCPUMacros(Builder, "skx");
3148 break;
Craig Topper449314e2013-08-20 07:09:39 +00003149 case CK_KNL:
3150 defineCPUMacros(Builder, "knl");
3151 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003152 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003153 Builder.defineMacro("__k6_2__");
3154 Builder.defineMacro("__tune_k6_2__");
3155 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003156 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003157 if (CPU != CK_K6_2) { // In case of fallthrough
3158 // FIXME: GCC may be enabling these in cases where some other k6
3159 // architecture is specified but -m3dnow is explicitly provided. The
3160 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003161 Builder.defineMacro("__k6_3__");
3162 Builder.defineMacro("__tune_k6_3__");
3163 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003164 // Fallthrough
3165 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003166 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003167 break;
3168 case CK_Athlon:
3169 case CK_AthlonThunderbird:
3170 case CK_Athlon4:
3171 case CK_AthlonXP:
3172 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003173 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003174 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003175 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003176 Builder.defineMacro("__tune_athlon_sse__");
3177 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003178 break;
3179 case CK_K8:
3180 case CK_K8SSE3:
3181 case CK_x86_64:
3182 case CK_Opteron:
3183 case CK_OpteronSSE3:
3184 case CK_Athlon64:
3185 case CK_Athlon64SSE3:
3186 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003187 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003188 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003189 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003190 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003191 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003192 case CK_BTVER1:
3193 defineCPUMacros(Builder, "btver1");
3194 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003195 case CK_BTVER2:
3196 defineCPUMacros(Builder, "btver2");
3197 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003198 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003199 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003200 break;
3201 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003202 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003203 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003204 case CK_BDVER3:
3205 defineCPUMacros(Builder, "bdver3");
3206 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003207 case CK_BDVER4:
3208 defineCPUMacros(Builder, "bdver4");
3209 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003210 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003211 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003212 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003213 }
Chris Lattner96e43572009-03-02 22:40:39 +00003214
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003215 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003216 Builder.defineMacro("__REGISTER_PREFIX__", "");
3217
Chris Lattner6df41af2009-04-19 17:32:33 +00003218 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3219 // functions in glibc header files that use FP Stack inline asm which the
3220 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003221 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003222
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003223 if (HasAES)
3224 Builder.defineMacro("__AES__");
3225
Craig Topper3f122a72012-05-31 05:18:48 +00003226 if (HasPCLMUL)
3227 Builder.defineMacro("__PCLMUL__");
3228
Craig Topper22967d42011-12-25 05:06:45 +00003229 if (HasLZCNT)
3230 Builder.defineMacro("__LZCNT__");
3231
Benjamin Kramer1e250392012-07-07 09:39:18 +00003232 if (HasRDRND)
3233 Builder.defineMacro("__RDRND__");
3234
Craig Topper8c7f2512014-11-03 06:51:41 +00003235 if (HasFSGSBASE)
3236 Builder.defineMacro("__FSGSBASE__");
3237
Craig Topper22967d42011-12-25 05:06:45 +00003238 if (HasBMI)
3239 Builder.defineMacro("__BMI__");
3240
3241 if (HasBMI2)
3242 Builder.defineMacro("__BMI2__");
3243
Craig Topper1de83482011-12-29 16:10:46 +00003244 if (HasPOPCNT)
3245 Builder.defineMacro("__POPCNT__");
3246
Michael Liao625a8752012-11-10 05:17:46 +00003247 if (HasRTM)
3248 Builder.defineMacro("__RTM__");
3249
Michael Liao74f4eaf2013-03-26 17:52:08 +00003250 if (HasPRFCHW)
3251 Builder.defineMacro("__PRFCHW__");
3252
Michael Liaoffaae352013-03-29 05:17:55 +00003253 if (HasRDSEED)
3254 Builder.defineMacro("__RDSEED__");
3255
Robert Khasanov50e6f582014-09-19 09:53:48 +00003256 if (HasADX)
3257 Builder.defineMacro("__ADX__");
3258
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003259 if (HasTBM)
3260 Builder.defineMacro("__TBM__");
3261
Rafael Espindolae62e2792013-08-20 13:44:29 +00003262 switch (XOPLevel) {
3263 case XOP:
3264 Builder.defineMacro("__XOP__");
3265 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003266 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003267 case SSE4A:
3268 Builder.defineMacro("__SSE4A__");
3269 case NoXOP:
3270 break;
3271 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003272
Craig Topperbba778b2012-06-03 21:46:30 +00003273 if (HasFMA)
3274 Builder.defineMacro("__FMA__");
3275
Manman Rena45358c2012-10-11 00:59:55 +00003276 if (HasF16C)
3277 Builder.defineMacro("__F16C__");
3278
Craig Topper679b53a2013-08-21 05:29:10 +00003279 if (HasAVX512CD)
3280 Builder.defineMacro("__AVX512CD__");
3281 if (HasAVX512ER)
3282 Builder.defineMacro("__AVX512ER__");
3283 if (HasAVX512PF)
3284 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003285 if (HasAVX512DQ)
3286 Builder.defineMacro("__AVX512DQ__");
3287 if (HasAVX512BW)
3288 Builder.defineMacro("__AVX512BW__");
3289 if (HasAVX512VL)
3290 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003291
Ben Langmuir58078d02013-09-19 13:22:04 +00003292 if (HasSHA)
3293 Builder.defineMacro("__SHA__");
3294
Nick Lewycky50e8f482013-10-05 20:14:27 +00003295 if (HasCX16)
3296 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3297
Chris Lattner96e43572009-03-02 22:40:39 +00003298 // Each case falls through to the previous one here.
3299 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003300 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003301 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003302 case AVX2:
3303 Builder.defineMacro("__AVX2__");
3304 case AVX:
3305 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003306 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003307 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003308 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003309 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003310 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003311 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003312 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003313 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003314 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003315 Builder.defineMacro("__SSE2__");
3316 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003317 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003318 Builder.defineMacro("__SSE__");
3319 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003320 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003321 break;
3322 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003323
Derek Schuffc7dd7222012-10-11 15:52:22 +00003324 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003325 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003326 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003327 case AVX2:
3328 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003329 case SSE42:
3330 case SSE41:
3331 case SSSE3:
3332 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003333 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003334 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003335 break;
3336 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003337 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003338 break;
3339 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003340 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003341 }
3342 }
3343
Anders Carlssone437c682010-01-27 03:47:49 +00003344 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003345 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003346 case AMD3DNowAthlon:
3347 Builder.defineMacro("__3dNOW_A__");
3348 case AMD3DNow:
3349 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003350 case MMX:
3351 Builder.defineMacro("__MMX__");
3352 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003353 break;
3354 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003355
3356 if (CPU >= CK_i486) {
3357 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3358 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3360 }
3361 if (CPU >= CK_i586)
3362 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003363}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003364
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003365bool X86TargetInfo::hasFeature(StringRef Feature) const {
3366 return llvm::StringSwitch<bool>(Feature)
3367 .Case("aes", HasAES)
3368 .Case("avx", SSELevel >= AVX)
3369 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003370 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003371 .Case("avx512cd", HasAVX512CD)
3372 .Case("avx512er", HasAVX512ER)
3373 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003374 .Case("avx512dq", HasAVX512DQ)
3375 .Case("avx512bw", HasAVX512BW)
3376 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003377 .Case("bmi", HasBMI)
3378 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003379 .Case("cx16", HasCX16)
3380 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003381 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003382 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003383 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003384 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003385 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3386 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3387 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003388 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003389 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003390 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003391 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003392 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003393 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003394 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003395 .Case("sse", SSELevel >= SSE1)
3396 .Case("sse2", SSELevel >= SSE2)
3397 .Case("sse3", SSELevel >= SSE3)
3398 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003399 .Case("sse4.1", SSELevel >= SSE41)
3400 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003401 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003402 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003403 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003404 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3405 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003406 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003407 .Default(false);
3408}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003409
Eric Christopherd9832702015-06-29 21:00:05 +00003410// We can't use a generic validation scheme for the features accepted here
3411// versus subtarget features accepted in the target attribute because the
3412// bitfield structure that's initialized in the runtime only supports the
3413// below currently rather than the full range of subtarget features. (See
3414// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3415bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3416 return llvm::StringSwitch<bool>(FeatureStr)
3417 .Case("cmov", true)
3418 .Case("mmx", true)
3419 .Case("popcnt", true)
3420 .Case("sse", true)
3421 .Case("sse2", true)
3422 .Case("sse3", true)
3423 .Case("sse4.1", true)
3424 .Case("sse4.2", true)
3425 .Case("avx", true)
3426 .Case("avx2", true)
3427 .Case("sse4a", true)
3428 .Case("fma4", true)
3429 .Case("xop", true)
3430 .Case("fma", true)
3431 .Case("avx512f", true)
3432 .Case("bmi", true)
3433 .Case("bmi2", true)
3434 .Default(false);
3435}
3436
Eli Friedman3fd920a2008-08-20 02:34:37 +00003437bool
Anders Carlsson58436352009-02-28 17:11:49 +00003438X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003439 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003440 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003441 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003442 case 'I':
3443 Info.setRequiresImmediate(0, 31);
3444 return true;
3445 case 'J':
3446 Info.setRequiresImmediate(0, 63);
3447 return true;
3448 case 'K':
3449 Info.setRequiresImmediate(-128, 127);
3450 return true;
3451 case 'L':
3452 // FIXME: properly analyze this constraint:
3453 // must be one of 0xff, 0xffff, or 0xffffffff
3454 return true;
3455 case 'M':
3456 Info.setRequiresImmediate(0, 3);
3457 return true;
3458 case 'N':
3459 Info.setRequiresImmediate(0, 255);
3460 return true;
3461 case 'O':
3462 Info.setRequiresImmediate(0, 127);
3463 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003464 case 'Y': // first letter of a pair:
3465 switch (*(Name+1)) {
3466 default: return false;
3467 case '0': // First SSE register.
3468 case 't': // Any SSE register, when SSE2 is enabled.
3469 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3470 case 'm': // any MMX register, when inter-unit moves enabled.
3471 break; // falls through to setAllowsRegister.
3472 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003473 case 'f': // any x87 floating point stack register.
3474 // Constraint 'f' cannot be used for output operands.
3475 if (Info.ConstraintStr[0] == '=')
3476 return false;
3477
3478 Info.setAllowsRegister();
3479 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003480 case 'a': // eax.
3481 case 'b': // ebx.
3482 case 'c': // ecx.
3483 case 'd': // edx.
3484 case 'S': // esi.
3485 case 'D': // edi.
3486 case 'A': // edx:eax.
3487 case 't': // top of floating point stack.
3488 case 'u': // second from top of floating point stack.
3489 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003490 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003491 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003492 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003493 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3494 case 'l': // "Index" registers: any general register that can be used as an
3495 // index in a base+index memory access.
3496 Info.setAllowsRegister();
3497 return true;
3498 case 'C': // SSE floating point constant.
3499 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003500 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003501 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003502 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003503 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003504 return true;
3505 }
3506}
3507
Akira Hatanaka974131e2014-09-18 18:17:18 +00003508bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3509 unsigned Size) const {
3510 // Strip off constraint modifiers.
3511 while (Constraint[0] == '=' ||
3512 Constraint[0] == '+' ||
3513 Constraint[0] == '&')
3514 Constraint = Constraint.substr(1);
3515
3516 return validateOperandSize(Constraint, Size);
3517}
3518
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003519bool X86TargetInfo::validateInputSize(StringRef Constraint,
3520 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003521 return validateOperandSize(Constraint, Size);
3522}
3523
3524bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3525 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003526 switch (Constraint[0]) {
3527 default: break;
3528 case 'y':
3529 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003530 case 'f':
3531 case 't':
3532 case 'u':
3533 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003534 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003535 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003536 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003537 }
3538
3539 return true;
3540}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003541
Eli Friedman3fd920a2008-08-20 02:34:37 +00003542std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003543X86TargetInfo::convertConstraint(const char *&Constraint) const {
3544 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003545 case 'a': return std::string("{ax}");
3546 case 'b': return std::string("{bx}");
3547 case 'c': return std::string("{cx}");
3548 case 'd': return std::string("{dx}");
3549 case 'S': return std::string("{si}");
3550 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003551 case 'p': // address
3552 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003553 case 't': // top of floating point stack.
3554 return std::string("{st}");
3555 case 'u': // second from top of floating point stack.
3556 return std::string("{st(1)}"); // second from top of floating point stack.
3557 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003558 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003559 }
3560}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003561
Eli Friedman3fd920a2008-08-20 02:34:37 +00003562// X86-32 generic target
3563class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003564public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003565 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003566 DoubleAlign = LongLongAlign = 32;
3567 LongDoubleWidth = 96;
3568 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003569 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003570 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003571 SizeType = UnsignedInt;
3572 PtrDiffType = SignedInt;
3573 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003574 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003575
3576 // Use fpret for all types.
3577 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3578 (1 << TargetInfo::Double) |
3579 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003580
3581 // x86-32 has atomics up to 8 bytes
3582 // FIXME: Check that we actually have cmpxchg8b before setting
3583 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3584 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003585 }
Craig Topper3164f332014-03-11 03:39:26 +00003586 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003587 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003588 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003589
Craig Topper3164f332014-03-11 03:39:26 +00003590 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003591 if (RegNo == 0) return 0;
3592 if (RegNo == 1) return 2;
3593 return -1;
3594 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003595 bool validateOperandSize(StringRef Constraint,
3596 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003597 switch (Constraint[0]) {
3598 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003599 case 'R':
3600 case 'q':
3601 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003602 case 'a':
3603 case 'b':
3604 case 'c':
3605 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003606 case 'S':
3607 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003608 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003609 case 'A':
3610 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003611 }
3612
Akira Hatanaka974131e2014-09-18 18:17:18 +00003613 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003614 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003615};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003616
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003617class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3618public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003619 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3620 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003621
Craig Topper3164f332014-03-11 03:39:26 +00003622 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003623 unsigned Major, Minor, Micro;
3624 getTriple().getOSVersion(Major, Minor, Micro);
3625 // New NetBSD uses the default rounding mode.
3626 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3627 return X86_32TargetInfo::getFloatEvalMethod();
3628 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003629 return 1;
3630 }
3631};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003632
Eli Friedmane3aa4542009-07-05 18:47:56 +00003633class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3634public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003635 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3636 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003637 SizeType = UnsignedLong;
3638 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003639 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003640 }
3641};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003642
Eli Friedman9fa28852012-08-08 23:57:20 +00003643class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3644public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003645 BitrigI386TargetInfo(const llvm::Triple &Triple)
3646 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003647 SizeType = UnsignedLong;
3648 IntPtrType = SignedLong;
3649 PtrDiffType = SignedLong;
3650 }
3651};
Eli Friedman9fa28852012-08-08 23:57:20 +00003652
Torok Edwinb2b37c62009-06-30 17:10:35 +00003653class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003654public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003655 DarwinI386TargetInfo(const llvm::Triple &Triple)
3656 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003657 LongDoubleWidth = 128;
3658 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003659 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003660 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003661 SizeType = UnsignedLong;
3662 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003663 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003664 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003665 }
3666
Eli Friedman3fd920a2008-08-20 02:34:37 +00003667};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003668
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003669// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003670class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003671public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003672 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3673 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003674 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003675 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003676 bool IsWinCOFF =
3677 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Reid Kleckneraf676022015-04-30 22:13:05 +00003678 DescriptionString = IsWinCOFF
3679 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3680 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003681 }
Craig Topper3164f332014-03-11 03:39:26 +00003682 void getTargetDefines(const LangOptions &Opts,
3683 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003684 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3685 }
3686};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003687
3688// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003689class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003690public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003691 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003692 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003693 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003694 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3695 }
Craig Topper3164f332014-03-11 03:39:26 +00003696 void getTargetDefines(const LangOptions &Opts,
3697 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003698 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3699 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3700 // The value of the following reflects processor type.
3701 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3702 // We lost the original triple, so we use the default.
3703 Builder.defineMacro("_M_IX86", "600");
3704 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003705};
3706} // end anonymous namespace
3707
David Majnemerae1ed0e2015-05-28 04:36:18 +00003708static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3709 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003710 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3711 // macro anyway for pre-processor compatibility.
3712 if (Opts.MicrosoftExt)
3713 Builder.defineMacro("__declspec", "__declspec");
3714 else
3715 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3716
3717 if (!Opts.MicrosoftExt) {
3718 // Provide macros for all the calling convention keywords. Provide both
3719 // single and double underscore prefixed variants. These are available on
3720 // x64 as well as x86, even though they have no effect.
3721 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3722 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003723 std::string GCCSpelling = "__attribute__((__";
3724 GCCSpelling += CC;
3725 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003726 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3727 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3728 }
3729 }
3730}
3731
David Majnemerae1ed0e2015-05-28 04:36:18 +00003732static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3733 Builder.defineMacro("__MSVCRT__");
3734 Builder.defineMacro("__MINGW32__");
3735 addCygMingDefines(Opts, Builder);
3736}
3737
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003738namespace {
3739// x86-32 MinGW target
3740class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3741public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003742 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3743 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003744 void getTargetDefines(const LangOptions &Opts,
3745 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003746 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003747 DefineStd(Builder, "WIN32", Opts);
3748 DefineStd(Builder, "WINNT", Opts);
3749 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003750 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003751 }
3752};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003753
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003754// x86-32 Cygwin target
3755class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3756public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003757 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3758 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003759 TLSSupported = false;
3760 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003761 DoubleAlign = LongLongAlign = 64;
Reid Kleckneraf676022015-04-30 22:13:05 +00003762 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 +00003763 }
Craig Topper3164f332014-03-11 03:39:26 +00003764 void getTargetDefines(const LangOptions &Opts,
3765 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003766 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003767 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003768 Builder.defineMacro("__CYGWIN__");
3769 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003770 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003771 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003772 if (Opts.CPlusPlus)
3773 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003774 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003775};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003776
Chris Lattnerb986aba2010-04-11 19:29:39 +00003777// x86-32 Haiku target
3778class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3779public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003780 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003781 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003782 IntPtrType = SignedLong;
3783 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003784 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003785 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003786 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003787 }
Craig Topper3164f332014-03-11 03:39:26 +00003788 void getTargetDefines(const LangOptions &Opts,
3789 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003790 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3791 Builder.defineMacro("__INTEL__");
3792 Builder.defineMacro("__HAIKU__");
3793 }
3794};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003795
Douglas Gregor9fabd852011-07-01 22:41:14 +00003796// RTEMS Target
3797template<typename Target>
3798class RTEMSTargetInfo : public OSTargetInfo<Target> {
3799protected:
Craig Topper3164f332014-03-11 03:39:26 +00003800 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3801 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003802 // RTEMS defines; list based off of gcc output
3803
Douglas Gregor9fabd852011-07-01 22:41:14 +00003804 Builder.defineMacro("__rtems__");
3805 Builder.defineMacro("__ELF__");
3806 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003807
Douglas Gregor9fabd852011-07-01 22:41:14 +00003808public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003809 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3810 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003811
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003812 switch (Triple.getArch()) {
3813 default:
3814 case llvm::Triple::x86:
3815 // this->MCountName = ".mcount";
3816 break;
3817 case llvm::Triple::mips:
3818 case llvm::Triple::mipsel:
3819 case llvm::Triple::ppc:
3820 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003821 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003822 // this->MCountName = "_mcount";
3823 break;
3824 case llvm::Triple::arm:
3825 // this->MCountName = "__mcount";
3826 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003827 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003828 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003829};
3830
Douglas Gregor9fabd852011-07-01 22:41:14 +00003831// x86-32 RTEMS target
3832class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3833public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003834 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003835 SizeType = UnsignedLong;
3836 IntPtrType = SignedLong;
3837 PtrDiffType = SignedLong;
3838 this->UserLabelPrefix = "";
3839 }
Craig Topper3164f332014-03-11 03:39:26 +00003840 void getTargetDefines(const LangOptions &Opts,
3841 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003842 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3843 Builder.defineMacro("__INTEL__");
3844 Builder.defineMacro("__rtems__");
3845 }
3846};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003847
Eli Friedman3fd920a2008-08-20 02:34:37 +00003848// x86-64 generic target
3849class X86_64TargetInfo : public X86TargetInfo {
3850public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003851 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003852 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003853 bool IsWinCOFF =
3854 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003855 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003856 LongDoubleWidth = 128;
3857 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003858 LargeArrayMinWidth = 128;
3859 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003860 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003861 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3862 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3863 IntPtrType = IsX32 ? SignedInt : SignedLong;
3864 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003865 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003866 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003867
Eric Christopher917e9522014-11-18 22:36:15 +00003868 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003869 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3870 : IsWinCOFF
3871 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3872 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003873
3874 // Use fpret only for long double.
3875 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003876
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003877 // Use fp2ret for _Complex long double.
3878 ComplexLongDoubleUsesFP2Ret = true;
3879
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003880 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003881 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003882 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003883 }
Craig Topper3164f332014-03-11 03:39:26 +00003884 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003885 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003886 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003887
Craig Topper3164f332014-03-11 03:39:26 +00003888 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003889 if (RegNo == 0) return 0;
3890 if (RegNo == 1) return 1;
3891 return -1;
3892 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003893
Craig Topper3164f332014-03-11 03:39:26 +00003894 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003895 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003896 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003897 CC == CC_IntelOclBicc ||
3898 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003899 }
3900
Craig Topper3164f332014-03-11 03:39:26 +00003901 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003902 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003903 }
3904
Pavel Chupinfd223e12014-08-04 12:39:43 +00003905 // for x32 we need it here explicitly
3906 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003907};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003908
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003909// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003910class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003911public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003912 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3913 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003914 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003915 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003916 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003917 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003918 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003919 SizeType = UnsignedLongLong;
3920 PtrDiffType = SignedLongLong;
3921 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003922 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003923 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003924
Craig Topper3164f332014-03-11 03:39:26 +00003925 void getTargetDefines(const LangOptions &Opts,
3926 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003927 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003928 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003929 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003930
Craig Topper3164f332014-03-11 03:39:26 +00003931 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003932 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003933 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003934
Craig Topper3164f332014-03-11 03:39:26 +00003935 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003936 switch (CC) {
3937 case CC_X86StdCall:
3938 case CC_X86ThisCall:
3939 case CC_X86FastCall:
3940 return CCCR_Ignore;
3941 case CC_C:
3942 case CC_X86VectorCall:
3943 case CC_IntelOclBicc:
3944 case CC_X86_64SysV:
3945 return CCCR_OK;
3946 default:
3947 return CCCR_Warning;
3948 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003949 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003950};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003951
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003952// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003953class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003954public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003955 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003956 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003957 LongDoubleWidth = LongDoubleAlign = 64;
3958 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003959 }
Craig Topper3164f332014-03-11 03:39:26 +00003960 void getTargetDefines(const LangOptions &Opts,
3961 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003962 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3963 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003964 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003965 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003966 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003967};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003968
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003969// x86-64 MinGW target
3970class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3971public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003972 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3973 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003974 void getTargetDefines(const LangOptions &Opts,
3975 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003976 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003977 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003978 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003979 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003980
3981 // GCC defines this macro when it is using __gxx_personality_seh0.
3982 if (!Opts.SjLjExceptions)
3983 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003984 }
3985};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003986
Eli Friedman2857ccb2009-07-01 03:36:11 +00003987class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3988public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003989 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3990 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003991 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003992 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003993 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3994 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003995 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003996 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003997 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003998 }
3999};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004000
Eli Friedman245f2292009-07-05 22:31:18 +00004001class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4002public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004003 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4004 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004005 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004006 Int64Type = SignedLongLong;
4007 }
4008};
Eli Friedman245f2292009-07-05 22:31:18 +00004009
Eli Friedman9fa28852012-08-08 23:57:20 +00004010class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4011public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004012 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4013 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4014 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004015 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004016 }
4017};
Tim Northover9bb857a2013-01-31 12:13:10 +00004018
Eli Friedmanf05b7722008-08-20 07:44:10 +00004019class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004020 // Possible FPU choices.
4021 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004022 VFP2FPU = (1 << 0),
4023 VFP3FPU = (1 << 1),
4024 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004025 NeonFPU = (1 << 3),
4026 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004027 };
4028
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004029 // Possible HWDiv features.
4030 enum HWDivMode {
4031 HWDivThumb = (1 << 0),
4032 HWDivARM = (1 << 1)
4033 };
4034
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004035 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004036 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004037 }
4038
4039 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4040 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004041
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004042 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004043
Rafael Espindolaeb265472013-08-21 21:59:03 +00004044 enum {
4045 FP_Default,
4046 FP_VFP,
4047 FP_Neon
4048 } FPMath;
4049
Bernard Ogdenda13af32013-10-24 18:32:51 +00004050 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004051
Logan Chien57086ce2012-10-10 06:56:20 +00004052 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004053 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004054 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004055
4056 // Initialized via features.
4057 unsigned SoftFloat : 1;
4058 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004059
Bernard Ogden18b57012013-10-29 09:47:51 +00004060 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004061 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00004062
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004063 // ACLE 6.5.1 Hardware floating point
4064 enum {
4065 HW_FP_HP = (1 << 1), /// half (16-bit)
4066 HW_FP_SP = (1 << 2), /// single (32-bit)
4067 HW_FP_DP = (1 << 3), /// double (64-bit)
4068 };
4069 uint32_t HW_FP;
4070
Chris Lattner5cc15e02010-03-03 19:03:45 +00004071 static const Builtin::Info BuiltinInfo[];
4072
Renato Golin15b86152015-07-03 16:41:13 +00004073 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
4074 StringRef ArchName = T.getArchName();
4075 if (T.getArch() == llvm::Triple::arm ||
4076 T.getArch() == llvm::Triple::armeb) {
4077 StringRef VersionStr;
4078 if (ArchName.startswith("armv"))
4079 VersionStr = ArchName.substr(4, 1);
4080 else if (ArchName.startswith("armebv"))
4081 VersionStr = ArchName.substr(6, 1);
4082 else
4083 return false;
4084 unsigned Version;
4085 if (VersionStr.getAsInteger(10, Version))
4086 return false;
4087 return Version >= 6;
4088 }
4089 assert(T.getArch() == llvm::Triple::thumb ||
4090 T.getArch() == llvm::Triple::thumbeb);
4091 StringRef VersionStr;
4092 if (ArchName.startswith("thumbv"))
4093 VersionStr = ArchName.substr(6, 1);
4094 else if (ArchName.startswith("thumbebv"))
4095 VersionStr = ArchName.substr(8, 1);
4096 else
4097 return false;
4098 unsigned Version;
4099 if (VersionStr.getAsInteger(10, Version))
4100 return false;
4101 return Version >= 7;
4102 }
4103
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004104 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004105 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004106
4107 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004108 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004109
Renato Golin9ba39232015-02-27 16:35:48 +00004110 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4111 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4112 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004113 SizeType = UnsignedLong;
4114 else
4115 SizeType = UnsignedInt;
4116
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004117 switch (T.getOS()) {
4118 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004119 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004120 break;
4121 case llvm::Triple::Win32:
4122 WCharType = UnsignedShort;
4123 break;
4124 case llvm::Triple::Linux:
4125 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004126 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4127 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004128 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004129 }
4130
4131 UseBitFieldTypeAlignment = true;
4132
4133 ZeroLengthBitfieldBoundary = 0;
4134
Tim Northover147cd2f2014-10-14 22:12:21 +00004135 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4136 // so set preferred for small types to 32.
4137 if (T.isOSBinFormatMachO()) {
4138 DescriptionString =
4139 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4140 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4141 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004142 assert(!BigEndian && "Windows on ARM does not support big endian");
4143 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00004144 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00004145 "-p:32:32"
4146 "-i64:64"
4147 "-v128:64:128"
4148 "-a:0:32"
4149 "-n32"
4150 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004151 } else if (T.isOSNaCl()) {
4152 assert(!BigEndian && "NaCl on ARM does not support big endian");
4153 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004154 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00004155 DescriptionString =
4156 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4157 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004158 }
4159
4160 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004161 }
4162
4163 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004164 const llvm::Triple &T = getTriple();
4165
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004166 IsAAPCS = false;
4167
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004168 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004169
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004170 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004171 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004172 SizeType = UnsignedInt;
4173 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004174 SizeType = UnsignedLong;
4175
4176 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4177 WCharType = SignedInt;
4178
4179 // Do not respect the alignment of bit-field types when laying out
4180 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4181 UseBitFieldTypeAlignment = false;
4182
4183 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4184 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4185 /// gcc.
4186 ZeroLengthBitfieldBoundary = 32;
4187
Tim Northover147cd2f2014-10-14 22:12:21 +00004188 if (T.isOSBinFormatMachO())
4189 DescriptionString =
4190 BigEndian
4191 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4192 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4193 else
4194 DescriptionString =
4195 BigEndian
4196 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4197 : "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 +00004198
4199 // FIXME: Override "preferred align" for double and long long.
4200 }
4201
Chris Lattner17df24e2008-04-21 18:56:49 +00004202public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004203 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004204 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004205 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004206 BigEndian = IsBigEndian;
4207
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004208 switch (getTriple().getOS()) {
4209 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004210 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004211 break;
4212 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004213 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004214 break;
4215 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004216
Chris Lattner1a8f3942010-04-23 16:29:58 +00004217 // {} in inline assembly are neon specifiers, not assembly variant
4218 // specifiers.
4219 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004220
Renato Golin15b86152015-07-03 16:41:13 +00004221 // FIXME: Should we just treat this as a feature?
4222 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004223
Eric Christopher0e261882014-12-05 01:06:59 +00004224 // FIXME: This duplicates code from the driver that sets the -target-abi
4225 // option - this code is used if -target-abi isn't passed and should
4226 // be unified in some way.
4227 if (Triple.isOSBinFormatMachO()) {
4228 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4229 // the frontend matches that.
4230 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4231 Triple.getOS() == llvm::Triple::UnknownOS ||
4232 StringRef(CPU).startswith("cortex-m")) {
4233 setABI("aapcs");
4234 } else {
4235 setABI("apcs-gnu");
4236 }
4237 } else if (Triple.isOSWindows()) {
4238 // FIXME: this is invalid for WindowsCE
4239 setABI("aapcs");
4240 } else {
4241 // Select the default based on the platform.
4242 switch (Triple.getEnvironment()) {
4243 case llvm::Triple::Android:
4244 case llvm::Triple::GNUEABI:
4245 case llvm::Triple::GNUEABIHF:
4246 setABI("aapcs-linux");
4247 break;
4248 case llvm::Triple::EABIHF:
4249 case llvm::Triple::EABI:
4250 setABI("aapcs");
4251 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004252 case llvm::Triple::GNU:
4253 setABI("apcs-gnu");
4254 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004255 default:
4256 if (Triple.getOS() == llvm::Triple::NetBSD)
4257 setABI("apcs-gnu");
4258 else
4259 setABI("aapcs");
4260 break;
4261 }
4262 }
John McCall86353412010-08-21 22:46:04 +00004263
4264 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004265 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004266
Renato Golin15b86152015-07-03 16:41:13 +00004267 // ARM has atomics up to 8 bytes
4268 MaxAtomicPromoteWidth = 64;
4269 if (shouldUseInlineAtomic(getTriple()))
4270 MaxAtomicInlineWidth = 64;
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004271
James Molloya7139222012-03-12 09:14:10 +00004272 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004273 // the alignment of the zero-length bitfield is greater than the member
4274 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004275 // zero length bitfield.
4276 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004277 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004278
Alp Toker4925ba72014-06-07 23:30:42 +00004279 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004280
Craig Topper3164f332014-03-11 03:39:26 +00004281 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004282 ABI = Name;
4283
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004284 // The defaults (above) are for AAPCS, check if we need to change them.
4285 //
4286 // FIXME: We need support for -meabi... we could just mangle it into the
4287 // name.
4288 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004289 setABIAPCS();
4290 return true;
4291 }
4292 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4293 setABIAAPCS();
4294 return true;
4295 }
4296 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004297 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004298
Renato Golinf5c4dec2015-05-27 13:33:00 +00004299 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004300 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Renato Golin15b86152015-07-03 16:41:13 +00004301 StringRef ArchName = getTriple().getArchName();
4302 unsigned ArchKind = llvm::ARMTargetParser::parseArch(ArchName);
4303 bool IsV8 = (ArchKind == llvm::ARM::AK_ARMV8A ||
4304 ArchKind == llvm::ARM::AK_ARMV8_1A);
4305
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004306 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4307 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004308 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004309 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004310 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004311 }
4312 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004313 Features["vfp4"] = true;
4314 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004315 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4316 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004317 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004318 Features["vfp4"] = true;
4319 Features["neon"] = true;
4320 Features["hwdiv"] = true;
4321 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004322 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4323 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004324 Features["fp-armv8"] = true;
4325 Features["neon"] = true;
4326 Features["hwdiv"] = true;
4327 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004328 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004329 Features["crypto"] = true;
Renato Golin15b86152015-07-03 16:41:13 +00004330 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || IsV8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004331 Features["hwdiv"] = true;
4332 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004333 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004334 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004335 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004336 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004337 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004338
Craig Topper3164f332014-03-11 03:39:26 +00004339 bool handleTargetFeatures(std::vector<std::string> &Features,
4340 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004341 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004342 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004343 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004344 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004345 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004346
Ranjeet Singhac08e532015-06-24 23:39:25 +00004347 // This does not diagnose illegal cases like having both
4348 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4349 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004350 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004351 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004352 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004353 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004354 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004355 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004356 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004357 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004358 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004359 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004360 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004361 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004362 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004363 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004364 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004365 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004366 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004367 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004368 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004369 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004370 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004371 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004372 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004373 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004374 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004375 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004376 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004377 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004378 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004379 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004380 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004381 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004382 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004383
Rafael Espindolaeb265472013-08-21 21:59:03 +00004384 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4385 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4386 return false;
4387 }
4388
4389 if (FPMath == FP_Neon)
4390 Features.push_back("+neonfp");
4391 else if (FPMath == FP_VFP)
4392 Features.push_back("-neonfp");
4393
Daniel Dunbar893d4752009-12-19 04:15:38 +00004394 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004395 auto Feature =
4396 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4397 if (Feature != Features.end())
4398 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004399
Rafael Espindolaeb265472013-08-21 21:59:03 +00004400 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004401 }
4402
Craig Topper3164f332014-03-11 03:39:26 +00004403 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004404 return llvm::StringSwitch<bool>(Feature)
4405 .Case("arm", true)
4406 .Case("softfloat", SoftFloat)
4407 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004408 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004409 .Case("hwdiv", HWDiv & HWDivThumb)
4410 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004411 .Default(false);
4412 }
Renato Golin15b86152015-07-03 16:41:13 +00004413 const char *getCPUDefineSuffix(StringRef Name) const {
4414 if(Name == "generic") {
4415 auto subarch = getTriple().getSubArch();
4416 switch (subarch) {
4417 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4418 return "8_1A";
4419 default:
4420 break;
4421 }
4422 }
4423
4424 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
4425 if (ArchKind == llvm::ARM::AK_INVALID)
4426 return "";
4427
Renato Golin391544c2015-05-28 12:11:11 +00004428 // For most sub-arches, the build attribute CPU name is enough.
4429 // For Cortex variants, it's slightly different.
4430 switch(ArchKind) {
4431 default:
Renato Golin15b86152015-07-03 16:41:13 +00004432 return llvm::ARMTargetParser::getCPUAttr(ArchKind);
Renato Golin391544c2015-05-28 12:11:11 +00004433 case llvm::ARM::AK_ARMV6M:
4434 case llvm::ARM::AK_ARMV6SM:
4435 return "6M";
4436 case llvm::ARM::AK_ARMV7:
4437 case llvm::ARM::AK_ARMV7A:
Tim Northovera8c168d2015-05-29 21:28:25 +00004438 case llvm::ARM::AK_ARMV7S:
Renato Golin391544c2015-05-28 12:11:11 +00004439 return "7A";
4440 case llvm::ARM::AK_ARMV7R:
4441 return "7R";
4442 case llvm::ARM::AK_ARMV7M:
4443 return "7M";
4444 case llvm::ARM::AK_ARMV7EM:
4445 return "7EM";
4446 case llvm::ARM::AK_ARMV8A:
4447 return "8A";
4448 case llvm::ARM::AK_ARMV8_1A:
4449 return "8_1A";
4450 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004451 }
Renato Golin15b86152015-07-03 16:41:13 +00004452 const char *getCPUProfile(StringRef Name) const {
4453 if(Name == "generic") {
4454 auto subarch = getTriple().getSubArch();
4455 switch (subarch) {
4456 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4457 return "A";
4458 default:
4459 break;
4460 }
4461 }
4462
4463 unsigned CPUArch = llvm::ARMTargetParser::parseCPUArch(Name);
4464 if (CPUArch == llvm::ARM::AK_INVALID)
4465 return "";
4466
4467 StringRef ArchName = llvm::ARMTargetParser::getArchName(CPUArch);
4468 switch(llvm::ARMTargetParser::parseArchProfile(ArchName)) {
Renato Golinf05bf002015-05-27 14:15:12 +00004469 case llvm::ARM::PK_A:
4470 return "A";
4471 case llvm::ARM::PK_R:
4472 return "R";
4473 case llvm::ARM::PK_M:
4474 return "M";
4475 default:
4476 return "";
4477 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004478 }
Craig Topper3164f332014-03-11 03:39:26 +00004479 bool setCPU(const std::string &Name) override {
Renato Golin15b86152015-07-03 16:41:13 +00004480 if (!getCPUDefineSuffix(Name))
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004481 return false;
Renato Golin15b86152015-07-03 16:41:13 +00004482
4483 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4484 StringRef Profile = getCPUProfile(Name);
4485 if (Profile == "M" && MaxAtomicInlineWidth) {
4486 MaxAtomicPromoteWidth = 32;
4487 MaxAtomicInlineWidth = 32;
4488 }
4489
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004490 CPU = Name;
4491 return true;
4492 }
Craig Topper3164f332014-03-11 03:39:26 +00004493 bool setFPMath(StringRef Name) override;
Renato Golin15b86152015-07-03 16:41:13 +00004494 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4495 unsigned CPUArchVer) const {
4496 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4497 (CPUArch.find('M') != StringRef::npos);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004498 }
Renato Golin15b86152015-07-03 16:41:13 +00004499 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4500 unsigned CPUArchVer) const {
4501 // We check both CPUArchVer and ArchName because when only triple is
4502 // specified, the default CPU is arm1136j-s.
4503 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4504 ArchName.endswith("v8.1a") ||
4505 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004506 }
Craig Topper3164f332014-03-11 03:39:26 +00004507 void getTargetDefines(const LangOptions &Opts,
4508 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004509 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004510 Builder.defineMacro("__arm");
4511 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004512
Chris Lattnerecd49032009-03-02 22:27:17 +00004513 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004514 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004515
Renato Golin15b86152015-07-03 16:41:13 +00004516 StringRef CPUArch = getCPUDefineSuffix(CPU);
4517 unsigned int CPUArchVer;
4518 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
4519 llvm_unreachable("Invalid char for architecture version number");
4520 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004521
4522 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Renato Golin15b86152015-07-03 16:41:13 +00004523 StringRef CPUProfile = getCPUProfile(CPU);
4524 StringRef ArchName = getTriple().getArchName();
4525
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004526 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Renato Golin15b86152015-07-03 16:41:13 +00004527 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4528 if (CPUArch[0] >= '8') {
Eric Christopher917e9522014-11-18 22:36:15 +00004529 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4530 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004531 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004532
4533 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4534 // is not defined for the M-profile.
4535 // NOTE that the deffault profile is assumed to be 'A'
4536 if (CPUProfile.empty() || CPUProfile != "M")
4537 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4538
4539 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4540 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4541 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Renato Golin15b86152015-07-03 16:41:13 +00004542 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004543 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Renato Golin15b86152015-07-03 16:41:13 +00004544 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004545 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4546
4547 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4548 // instruction set such as ARM or Thumb.
4549 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4550
4551 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4552
4553 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004554 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004555 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004556
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004557 // ACLE 6.5.1 Hardware Floating Point
4558 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004559 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004560
Yi Konga44c4d72014-06-27 21:25:42 +00004561 // ACLE predefines.
4562 Builder.defineMacro("__ARM_ACLE", "200");
4563
Mike Stump9d54bd72009-04-08 02:07:04 +00004564 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004565
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004566 // FIXME: It's more complicated than this and we don't really support
4567 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004568 // Windows on ARM does not "support" interworking
Renato Golin15b86152015-07-03 16:41:13 +00004569 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004570 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004571
David Tweed8f676532012-10-25 13:33:01 +00004572 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004573 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004574 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4575 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004576 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004577 Builder.defineMacro("__ARM_PCS", "1");
4578
David Tweed8f676532012-10-25 13:33:01 +00004579 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004580 Builder.defineMacro("__ARM_PCS_VFP", "1");
4581 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004582
Daniel Dunbar893d4752009-12-19 04:15:38 +00004583 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004584 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004585
4586 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004587 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004588
4589 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004590 Builder.defineMacro("__THUMBEL__");
4591 Builder.defineMacro("__thumb__");
Renato Golin15b86152015-07-03 16:41:13 +00004592 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004593 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004594 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004595 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4596 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004597
4598 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004599 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004600
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004601 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004602 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004603 if (FPU & VFP2FPU)
4604 Builder.defineMacro("__ARM_VFPV2__");
4605 if (FPU & VFP3FPU)
4606 Builder.defineMacro("__ARM_VFPV3__");
4607 if (FPU & VFP4FPU)
4608 Builder.defineMacro("__ARM_VFPV4__");
4609 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004610
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004611 // This only gets set when Neon instructions are actually available, unlike
4612 // the VFP define, hence the soft float and arch check. This is subtly
4613 // different from gcc, we follow the intent which was that it should be set
4614 // when Neon instructions are actually available.
Renato Golin15b86152015-07-03 16:41:13 +00004615 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
Tim Northover5bb34ca2013-11-21 12:36:34 +00004616 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004617 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004618 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004619
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004620 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4621 Opts.ShortWChar ? "2" : "4");
4622
4623 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4624 Opts.ShortEnums ? "1" : "4");
4625
Bernard Ogden18b57012013-10-29 09:47:51 +00004626 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004627 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004628
Tim Northover02e38602014-02-03 17:28:04 +00004629 if (Crypto)
4630 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4631
Renato Golin15b86152015-07-03 16:41:13 +00004632 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004633 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4634 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4635 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4636 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4637 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004638
Renato Golin15b86152015-07-03 16:41:13 +00004639 bool is5EOrAbove = (CPUArchVer >= 6 ||
4640 (CPUArchVer == 5 &&
4641 CPUArch.find('E') != StringRef::npos));
4642 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4643 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004644 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004645 }
Craig Topper3164f332014-03-11 03:39:26 +00004646 void getTargetBuiltins(const Builtin::Info *&Records,
4647 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004648 Records = BuiltinInfo;
4649 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004650 }
Craig Topper3164f332014-03-11 03:39:26 +00004651 bool isCLZForZeroUndef() const override { return false; }
4652 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004653 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004654 }
Craig Topper3164f332014-03-11 03:39:26 +00004655 void getGCCRegNames(const char * const *&Names,
4656 unsigned &NumNames) const override;
4657 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4658 unsigned &NumAliases) const override;
4659 bool validateAsmConstraint(const char *&Name,
4660 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004661 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004662 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004663 case 'l': // r0-r7
4664 case 'h': // r8-r15
4665 case 'w': // VFP Floating point register single precision
4666 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004667 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004668 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004669 case 'I':
4670 case 'J':
4671 case 'K':
4672 case 'L':
4673 case 'M':
4674 // FIXME
4675 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004676 case 'Q': // A memory address that is a single base register.
4677 Info.setAllowsMemory();
4678 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004679 case 'U': // a memory reference...
4680 switch (Name[1]) {
4681 case 'q': // ...ARMV4 ldrsb
4682 case 'v': // ...VFP load/store (reg+constant offset)
4683 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004684 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004685 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004686 case 'n': // valid address for Neon doubleword vector load/store
4687 case 'm': // valid address for Neon element and structure load/store
4688 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004689 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004690 Info.setAllowsMemory();
4691 Name++;
4692 return true;
4693 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004694 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004695 return false;
4696 }
Craig Topper3164f332014-03-11 03:39:26 +00004697 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004698 std::string R;
4699 switch (*Constraint) {
4700 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004701 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004702 Constraint++;
4703 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004704 case 'p': // 'p' should be translated to 'r' by default.
4705 R = std::string("r");
4706 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004707 default:
4708 return std::string(1, *Constraint);
4709 }
4710 return R;
4711 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004712 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004713 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004714 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004715 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004716 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004717
Bill Wendling9d1ee112012-10-25 23:28:48 +00004718 // Strip off constraint modifiers.
4719 while (Constraint[0] == '=' ||
4720 Constraint[0] == '+' ||
4721 Constraint[0] == '&')
4722 Constraint = Constraint.substr(1);
4723
4724 switch (Constraint[0]) {
4725 default: break;
4726 case 'r': {
4727 switch (Modifier) {
4728 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004729 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004730 case 'q':
4731 // A register of size 32 cannot fit a vector type.
4732 return false;
4733 }
4734 }
4735 }
4736
4737 return true;
4738 }
Craig Topper3164f332014-03-11 03:39:26 +00004739 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004740 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004741 return "";
4742 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004743
Craig Topper3164f332014-03-11 03:39:26 +00004744 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004745 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4746 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004747
Craig Topper3164f332014-03-11 03:39:26 +00004748 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004749 if (RegNo == 0) return 0;
4750 if (RegNo == 1) return 1;
4751 return -1;
4752 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004753};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004754
Rafael Espindolaeb265472013-08-21 21:59:03 +00004755bool ARMTargetInfo::setFPMath(StringRef Name) {
4756 if (Name == "neon") {
4757 FPMath = FP_Neon;
4758 return true;
4759 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4760 Name == "vfp4") {
4761 FPMath = FP_VFP;
4762 return true;
4763 }
4764 return false;
4765}
4766
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004767const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004768 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004769 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004770 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4771
4772 // Float registers
4773 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4774 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4775 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004776 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004777
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004778 // Double registers
4779 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4780 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004781 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4782 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004783
4784 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004785 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4786 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004787};
4788
4789void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004790 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004791 Names = GCCRegNames;
4792 NumNames = llvm::array_lengthof(GCCRegNames);
4793}
4794
4795const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004796 { { "a1" }, "r0" },
4797 { { "a2" }, "r1" },
4798 { { "a3" }, "r2" },
4799 { { "a4" }, "r3" },
4800 { { "v1" }, "r4" },
4801 { { "v2" }, "r5" },
4802 { { "v3" }, "r6" },
4803 { { "v4" }, "r7" },
4804 { { "v5" }, "r8" },
4805 { { "v6", "rfp" }, "r9" },
4806 { { "sl" }, "r10" },
4807 { { "fp" }, "r11" },
4808 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004809 { { "r13" }, "sp" },
4810 { { "r14" }, "lr" },
4811 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004812 // The S, D and Q registers overlap, but aren't really aliases; we
4813 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004814};
4815
4816void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4817 unsigned &NumAliases) const {
4818 Aliases = GCCRegAliases;
4819 NumAliases = llvm::array_lengthof(GCCRegAliases);
4820}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004821
4822const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004823#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004824#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004825 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004826#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004827
4828#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004829#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004830#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4831 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004832#include "clang/Basic/BuiltinsARM.def"
4833};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004834
4835class ARMleTargetInfo : public ARMTargetInfo {
4836public:
4837 ARMleTargetInfo(const llvm::Triple &Triple)
4838 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004839 void getTargetDefines(const LangOptions &Opts,
4840 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004841 Builder.defineMacro("__ARMEL__");
4842 ARMTargetInfo::getTargetDefines(Opts, Builder);
4843 }
4844};
4845
4846class ARMbeTargetInfo : public ARMTargetInfo {
4847public:
4848 ARMbeTargetInfo(const llvm::Triple &Triple)
4849 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004850 void getTargetDefines(const LangOptions &Opts,
4851 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004852 Builder.defineMacro("__ARMEB__");
4853 Builder.defineMacro("__ARM_BIG_ENDIAN");
4854 ARMTargetInfo::getTargetDefines(Opts, Builder);
4855 }
4856};
Chris Lattner17df24e2008-04-21 18:56:49 +00004857
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004858class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4859 const llvm::Triple Triple;
4860public:
4861 WindowsARMTargetInfo(const llvm::Triple &Triple)
4862 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4863 TLSSupported = false;
4864 WCharType = UnsignedShort;
4865 SizeType = UnsignedInt;
4866 UserLabelPrefix = "";
4867 }
4868 void getVisualStudioDefines(const LangOptions &Opts,
4869 MacroBuilder &Builder) const {
4870 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4871
4872 // FIXME: this is invalid for WindowsCE
4873 Builder.defineMacro("_M_ARM_NT", "1");
4874 Builder.defineMacro("_M_ARMT", "_M_ARM");
4875 Builder.defineMacro("_M_THUMB", "_M_ARM");
4876
4877 assert((Triple.getArch() == llvm::Triple::arm ||
4878 Triple.getArch() == llvm::Triple::thumb) &&
4879 "invalid architecture for Windows ARM target info");
4880 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4881 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4882
4883 // TODO map the complete set of values
4884 // 31: VFPv3 40: VFPv4
4885 Builder.defineMacro("_M_ARM_FP", "31");
4886 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004887 BuiltinVaListKind getBuiltinVaListKind() const override {
4888 return TargetInfo::CharPtrBuiltinVaList;
4889 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004890};
4891
4892// Windows ARM + Itanium C++ ABI Target
4893class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4894public:
4895 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4896 : WindowsARMTargetInfo(Triple) {
4897 TheCXXABI.set(TargetCXXABI::GenericARM);
4898 }
4899
4900 void getTargetDefines(const LangOptions &Opts,
4901 MacroBuilder &Builder) const override {
4902 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4903
4904 if (Opts.MSVCCompat)
4905 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4906 }
4907};
4908
4909// Windows ARM, MS (C++) ABI
4910class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4911public:
4912 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4913 : WindowsARMTargetInfo(Triple) {
4914 TheCXXABI.set(TargetCXXABI::Microsoft);
4915 }
4916
4917 void getTargetDefines(const LangOptions &Opts,
4918 MacroBuilder &Builder) const override {
4919 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4920 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4921 }
4922};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004923
Yaron Keren321249c2015-07-15 13:32:23 +00004924// ARM MinGW target
4925class MinGWARMTargetInfo : public WindowsARMTargetInfo {
4926public:
4927 MinGWARMTargetInfo(const llvm::Triple &Triple)
4928 : WindowsARMTargetInfo(Triple) {
4929 TheCXXABI.set(TargetCXXABI::GenericARM);
4930 }
4931
4932 void getTargetDefines(const LangOptions &Opts,
4933 MacroBuilder &Builder) const override {
4934 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4935 DefineStd(Builder, "WIN32", Opts);
4936 DefineStd(Builder, "WINNT", Opts);
4937 Builder.defineMacro("_ARM_");
4938 addMinGWDefines(Opts, Builder);
4939 }
4940};
4941
4942// ARM Cygwin target
4943class CygwinARMTargetInfo : public ARMleTargetInfo {
4944public:
4945 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
4946 TLSSupported = false;
4947 WCharType = UnsignedShort;
4948 DoubleAlign = LongLongAlign = 64;
4949 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4950 }
4951 void getTargetDefines(const LangOptions &Opts,
4952 MacroBuilder &Builder) const override {
4953 ARMleTargetInfo::getTargetDefines(Opts, Builder);
4954 Builder.defineMacro("_ARM_");
4955 Builder.defineMacro("__CYGWIN__");
4956 Builder.defineMacro("__CYGWIN32__");
4957 DefineStd(Builder, "unix", Opts);
4958 if (Opts.CPlusPlus)
4959 Builder.defineMacro("_GNU_SOURCE");
4960 }
4961};
4962
Mike Stump11289f42009-09-09 15:08:12 +00004963class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004964 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004965protected:
Craig Topper3164f332014-03-11 03:39:26 +00004966 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4967 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004968 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004969 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004970
Torok Edwinb2b37c62009-06-30 17:10:35 +00004971public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004972 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004973 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004974 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004975 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004976 // FIXME: This should be based off of the target features in
4977 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004978 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004979
4980 // Darwin on iOS uses a variant of the ARM C++ ABI.
4981 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004982 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004983};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004984
Tim Northover573cbee2014-05-24 12:52:07 +00004985class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004986 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004987 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4988 static const char *const GCCRegNames[];
4989
James Molloy75f5f9e2014-04-16 15:33:48 +00004990 enum FPUModeEnum {
4991 FPUMode,
4992 NeonMode
4993 };
4994
4995 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004996 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004997 unsigned Crypto;
4998
Tim Northovera2ee4332014-03-29 15:09:45 +00004999 static const Builtin::Info BuiltinInfo[];
5000
5001 std::string ABI;
5002
5003public:
Tim Northover573cbee2014-05-24 12:52:07 +00005004 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005005 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005006
5007 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5008 WCharType = SignedInt;
5009
5010 // NetBSD apparently prefers consistency across ARM targets to consistency
5011 // across 64-bit targets.
5012 Int64Type = SignedLongLong;
5013 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005014 } else {
5015 WCharType = UnsignedInt;
5016 Int64Type = SignedLong;
5017 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005018 }
5019
Tim Northovera2ee4332014-03-29 15:09:45 +00005020 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005021 MaxVectorAlign = 128;
5022 RegParmMax = 8;
5023 MaxAtomicInlineWidth = 128;
5024 MaxAtomicPromoteWidth = 128;
5025
Tim Northovera6a19f12015-02-06 01:25:07 +00005026 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005027 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5028
Tim Northovera2ee4332014-03-29 15:09:45 +00005029 // {} in inline assembly are neon specifiers, not assembly variant
5030 // specifiers.
5031 NoAsmVariants = true;
5032
Tim Northover7ad87af2015-01-16 18:44:04 +00005033 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5034 // contributes to the alignment of the containing aggregate in the same way
5035 // a plain (non bit-field) member of that type would, without exception for
5036 // zero-sized or anonymous bit-fields."
5037 UseBitFieldTypeAlignment = true;
5038 UseZeroLengthBitfieldAlignment = true;
5039
Tim Northover573cbee2014-05-24 12:52:07 +00005040 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005041 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5042 }
5043
Alp Toker4925ba72014-06-07 23:30:42 +00005044 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005045 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005046 if (Name != "aapcs" && Name != "darwinpcs")
5047 return false;
5048
5049 ABI = Name;
5050 return true;
5051 }
5052
David Blaikie1cbb9712014-11-14 19:09:44 +00005053 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005054 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005055 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005056 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005057 .Case("cyclone", true)
5058 .Default(false);
5059 return CPUKnown;
5060 }
5061
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005062 void getTargetDefines(const LangOptions &Opts,
5063 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005064 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005065 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005066
5067 // Target properties.
5068 Builder.defineMacro("_LP64");
5069 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005070
5071 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5072 Builder.defineMacro("__ARM_ACLE", "200");
5073 Builder.defineMacro("__ARM_ARCH", "8");
5074 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5075
5076 Builder.defineMacro("__ARM_64BIT_STATE");
5077 Builder.defineMacro("__ARM_PCS_AAPCS64");
5078 Builder.defineMacro("__ARM_ARCH_ISA_A64");
5079
5080 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
5081 Builder.defineMacro("__ARM_FEATURE_CLZ");
5082 Builder.defineMacro("__ARM_FEATURE_FMA");
5083 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00005084 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
5085 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
5086 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
5087 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00005088
5089 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5090
5091 // 0xe implies support for half, single and double precision operations.
5092 Builder.defineMacro("__ARM_FP", "0xe");
5093
5094 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5095 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
5096 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
5097
5098 if (Opts.FastMath || Opts.FiniteMathOnly)
5099 Builder.defineMacro("__ARM_FP_FAST");
5100
Richard Smithab506ad2014-10-20 23:26:58 +00005101 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005102 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5103
5104 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5105
5106 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5107 Opts.ShortEnums ? "1" : "4");
5108
James Molloy75f5f9e2014-04-16 15:33:48 +00005109 if (FPU == NeonMode) {
5110 Builder.defineMacro("__ARM_NEON");
5111 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00005112 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00005113 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005114
Bradley Smith418c5932014-05-02 15:17:51 +00005115 if (CRC)
5116 Builder.defineMacro("__ARM_FEATURE_CRC32");
5117
James Molloy75f5f9e2014-04-16 15:33:48 +00005118 if (Crypto)
5119 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00005120
5121 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5122 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5123 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5124 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5125 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005126 }
5127
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005128 void getTargetBuiltins(const Builtin::Info *&Records,
5129 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005130 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005131 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005132 }
5133
David Blaikie1cbb9712014-11-14 19:09:44 +00005134 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005135 return Feature == "aarch64" ||
5136 Feature == "arm64" ||
5137 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005138 }
5139
James Molloy5e73df52014-04-16 15:06:20 +00005140 bool handleTargetFeatures(std::vector<std::string> &Features,
5141 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005142 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005143 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005144 Crypto = 0;
5145 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5146 if (Features[i] == "+neon")
5147 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005148 if (Features[i] == "+crc")
5149 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005150 if (Features[i] == "+crypto")
5151 Crypto = 1;
5152 }
5153
James Molloy5e73df52014-04-16 15:06:20 +00005154 setDescriptionString();
5155
5156 return true;
5157 }
5158
David Blaikie1cbb9712014-11-14 19:09:44 +00005159 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005160
David Blaikie1cbb9712014-11-14 19:09:44 +00005161 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005162 return TargetInfo::AArch64ABIBuiltinVaList;
5163 }
5164
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005165 void getGCCRegNames(const char *const *&Names,
5166 unsigned &NumNames) const override;
5167 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5168 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005169
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005170 bool validateAsmConstraint(const char *&Name,
5171 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005172 switch (*Name) {
5173 default:
5174 return false;
5175 case 'w': // Floating point and SIMD registers (V0-V31)
5176 Info.setAllowsRegister();
5177 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005178 case 'I': // Constant that can be used with an ADD instruction
5179 case 'J': // Constant that can be used with a SUB instruction
5180 case 'K': // Constant that can be used with a 32-bit logical instruction
5181 case 'L': // Constant that can be used with a 64-bit logical instruction
5182 case 'M': // Constant that can be used as a 32-bit MOV immediate
5183 case 'N': // Constant that can be used as a 64-bit MOV immediate
5184 case 'Y': // Floating point constant zero
5185 case 'Z': // Integer constant zero
5186 return true;
5187 case 'Q': // A memory reference with base register and no offset
5188 Info.setAllowsMemory();
5189 return true;
5190 case 'S': // A symbolic address
5191 Info.setAllowsRegister();
5192 return true;
5193 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005194 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5195 // Utf: A memory address suitable for ldp/stp in TF mode.
5196 // Usa: An absolute symbolic address.
5197 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5198 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005199 case 'z': // Zero register, wzr or xzr
5200 Info.setAllowsRegister();
5201 return true;
5202 case 'x': // Floating point and SIMD registers (V0-V15)
5203 Info.setAllowsRegister();
5204 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005205 }
5206 return false;
5207 }
5208
Akira Hatanaka987f1862014-08-22 06:05:21 +00005209 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005210 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005211 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005212 // Strip off constraint modifiers.
5213 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5214 Constraint = Constraint.substr(1);
5215
5216 switch (Constraint[0]) {
5217 default:
5218 return true;
5219 case 'z':
5220 case 'r': {
5221 switch (Modifier) {
5222 case 'x':
5223 case 'w':
5224 // For now assume that the person knows what they're
5225 // doing with the modifier.
5226 return true;
5227 default:
5228 // By default an 'r' constraint will be in the 'x'
5229 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005230 if (Size == 64)
5231 return true;
5232
5233 SuggestedModifier = "w";
5234 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005235 }
5236 }
5237 }
5238 }
5239
David Blaikie1cbb9712014-11-14 19:09:44 +00005240 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005241
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005242 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005243 if (RegNo == 0)
5244 return 0;
5245 if (RegNo == 1)
5246 return 1;
5247 return -1;
5248 }
5249};
5250
Tim Northover573cbee2014-05-24 12:52:07 +00005251const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005252 // 32-bit Integer registers
5253 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5254 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5255 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5256
5257 // 64-bit Integer registers
5258 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5259 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5260 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5261
5262 // 32-bit floating point regsisters
5263 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5264 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5265 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5266
5267 // 64-bit floating point regsisters
5268 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5269 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5270 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5271
5272 // Vector registers
5273 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5274 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5275 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5276};
5277
Tim Northover573cbee2014-05-24 12:52:07 +00005278void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005279 unsigned &NumNames) const {
5280 Names = GCCRegNames;
5281 NumNames = llvm::array_lengthof(GCCRegNames);
5282}
5283
Tim Northover573cbee2014-05-24 12:52:07 +00005284const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005285 { { "w31" }, "wsp" },
5286 { { "x29" }, "fp" },
5287 { { "x30" }, "lr" },
5288 { { "x31" }, "sp" },
5289 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5290 // don't want to substitute one of these for a different-sized one.
5291};
5292
Tim Northover573cbee2014-05-24 12:52:07 +00005293void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005294 unsigned &NumAliases) const {
5295 Aliases = GCCRegAliases;
5296 NumAliases = llvm::array_lengthof(GCCRegAliases);
5297}
5298
Tim Northover573cbee2014-05-24 12:52:07 +00005299const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005300#define BUILTIN(ID, TYPE, ATTRS) \
5301 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5302#include "clang/Basic/BuiltinsNEON.def"
5303
5304#define BUILTIN(ID, TYPE, ATTRS) \
5305 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005306#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005307};
James Molloy5e73df52014-04-16 15:06:20 +00005308
Tim Northover573cbee2014-05-24 12:52:07 +00005309class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005310 void setDescriptionString() override {
5311 if (getTriple().isOSBinFormatMachO())
5312 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5313 else
5314 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5315 }
5316
5317public:
Tim Northover573cbee2014-05-24 12:52:07 +00005318 AArch64leTargetInfo(const llvm::Triple &Triple)
5319 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005320 BigEndian = false;
5321 }
5322 void getTargetDefines(const LangOptions &Opts,
5323 MacroBuilder &Builder) const override {
5324 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005325 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005326 }
5327};
5328
Tim Northover573cbee2014-05-24 12:52:07 +00005329class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005330 void setDescriptionString() override {
5331 assert(!getTriple().isOSBinFormatMachO());
5332 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5333 }
5334
5335public:
Tim Northover573cbee2014-05-24 12:52:07 +00005336 AArch64beTargetInfo(const llvm::Triple &Triple)
5337 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005338 void getTargetDefines(const LangOptions &Opts,
5339 MacroBuilder &Builder) const override {
5340 Builder.defineMacro("__AARCH64EB__");
5341 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5342 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005343 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005344 }
5345};
Tim Northovera2ee4332014-03-29 15:09:45 +00005346
Tim Northover573cbee2014-05-24 12:52:07 +00005347class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005348protected:
5349 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5350 MacroBuilder &Builder) const override {
5351 Builder.defineMacro("__AARCH64_SIMD__");
5352 Builder.defineMacro("__ARM64_ARCH_8__");
5353 Builder.defineMacro("__ARM_NEON__");
5354 Builder.defineMacro("__LITTLE_ENDIAN__");
5355 Builder.defineMacro("__REGISTER_PREFIX__", "");
5356 Builder.defineMacro("__arm64", "1");
5357 Builder.defineMacro("__arm64__", "1");
5358
5359 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5360 }
5361
Tim Northovera2ee4332014-03-29 15:09:45 +00005362public:
Tim Northover573cbee2014-05-24 12:52:07 +00005363 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5364 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005365 Int64Type = SignedLongLong;
5366 WCharType = SignedInt;
5367 UseSignedCharForObjCBool = false;
5368
Tim Northovera6a19f12015-02-06 01:25:07 +00005369 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005370 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5371
5372 TheCXXABI.set(TargetCXXABI::iOS64);
5373 }
5374
David Blaikie1cbb9712014-11-14 19:09:44 +00005375 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005376 return TargetInfo::CharPtrBuiltinVaList;
5377 }
5378};
Tim Northovera2ee4332014-03-29 15:09:45 +00005379
Tony Linthicum76329bf2011-12-12 21:14:55 +00005380// Hexagon abstract base class
5381class HexagonTargetInfo : public TargetInfo {
5382 static const Builtin::Info BuiltinInfo[];
5383 static const char * const GCCRegNames[];
5384 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5385 std::string CPU;
5386public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005387 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005388 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005389 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005390
5391 // {} in inline assembly are packet specifiers, not assembly variant
5392 // specifiers.
5393 NoAsmVariants = true;
5394 }
5395
Craig Topper3164f332014-03-11 03:39:26 +00005396 void getTargetBuiltins(const Builtin::Info *&Records,
5397 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005398 Records = BuiltinInfo;
5399 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5400 }
5401
Craig Topper3164f332014-03-11 03:39:26 +00005402 bool validateAsmConstraint(const char *&Name,
5403 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005404 return true;
5405 }
5406
Craig Topper3164f332014-03-11 03:39:26 +00005407 void getTargetDefines(const LangOptions &Opts,
5408 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005409
Craig Topper3164f332014-03-11 03:39:26 +00005410 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005411 return Feature == "hexagon";
5412 }
Craig Topper3164f332014-03-11 03:39:26 +00005413
5414 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005415 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005416 }
Craig Topper3164f332014-03-11 03:39:26 +00005417 void getGCCRegNames(const char * const *&Names,
5418 unsigned &NumNames) const override;
5419 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5420 unsigned &NumAliases) const override;
5421 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005422 return "";
5423 }
Sebastian Pop86500282012-01-13 20:37:10 +00005424
5425 static const char *getHexagonCPUSuffix(StringRef Name) {
5426 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005427 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005428 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005429 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005430 }
5431
Craig Topper3164f332014-03-11 03:39:26 +00005432 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005433 if (!getHexagonCPUSuffix(Name))
5434 return false;
5435
Tony Linthicum76329bf2011-12-12 21:14:55 +00005436 CPU = Name;
5437 return true;
5438 }
5439};
5440
5441void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5442 MacroBuilder &Builder) const {
5443 Builder.defineMacro("qdsp6");
5444 Builder.defineMacro("__qdsp6", "1");
5445 Builder.defineMacro("__qdsp6__", "1");
5446
5447 Builder.defineMacro("hexagon");
5448 Builder.defineMacro("__hexagon", "1");
5449 Builder.defineMacro("__hexagon__", "1");
5450
5451 if(CPU == "hexagonv1") {
5452 Builder.defineMacro("__HEXAGON_V1__");
5453 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5454 if(Opts.HexagonQdsp6Compat) {
5455 Builder.defineMacro("__QDSP6_V1__");
5456 Builder.defineMacro("__QDSP6_ARCH__", "1");
5457 }
5458 }
5459 else if(CPU == "hexagonv2") {
5460 Builder.defineMacro("__HEXAGON_V2__");
5461 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5462 if(Opts.HexagonQdsp6Compat) {
5463 Builder.defineMacro("__QDSP6_V2__");
5464 Builder.defineMacro("__QDSP6_ARCH__", "2");
5465 }
5466 }
5467 else if(CPU == "hexagonv3") {
5468 Builder.defineMacro("__HEXAGON_V3__");
5469 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5470 if(Opts.HexagonQdsp6Compat) {
5471 Builder.defineMacro("__QDSP6_V3__");
5472 Builder.defineMacro("__QDSP6_ARCH__", "3");
5473 }
5474 }
5475 else if(CPU == "hexagonv4") {
5476 Builder.defineMacro("__HEXAGON_V4__");
5477 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5478 if(Opts.HexagonQdsp6Compat) {
5479 Builder.defineMacro("__QDSP6_V4__");
5480 Builder.defineMacro("__QDSP6_ARCH__", "4");
5481 }
5482 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005483 else if(CPU == "hexagonv5") {
5484 Builder.defineMacro("__HEXAGON_V5__");
5485 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5486 if(Opts.HexagonQdsp6Compat) {
5487 Builder.defineMacro("__QDSP6_V5__");
5488 Builder.defineMacro("__QDSP6_ARCH__", "5");
5489 }
5490 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005491}
5492
5493const char * const HexagonTargetInfo::GCCRegNames[] = {
5494 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5495 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5496 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5497 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5498 "p0", "p1", "p2", "p3",
5499 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5500};
5501
5502void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5503 unsigned &NumNames) const {
5504 Names = GCCRegNames;
5505 NumNames = llvm::array_lengthof(GCCRegNames);
5506}
5507
5508
5509const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5510 { { "sp" }, "r29" },
5511 { { "fp" }, "r30" },
5512 { { "lr" }, "r31" },
5513 };
5514
5515void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5516 unsigned &NumAliases) const {
5517 Aliases = GCCRegAliases;
5518 NumAliases = llvm::array_lengthof(GCCRegAliases);
5519}
5520
5521
5522const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5523#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5524#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5525 ALL_LANGUAGES },
5526#include "clang/Basic/BuiltinsHexagon.def"
5527};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005528
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005529// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5530class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005531 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5532 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005533 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005534public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005535 SparcTargetInfo(const llvm::Triple &Triple)
5536 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005537
Craig Topper3164f332014-03-11 03:39:26 +00005538 bool handleTargetFeatures(std::vector<std::string> &Features,
5539 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005540 // The backend doesn't actually handle soft float yet, but in case someone
5541 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005542 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5543 if (Feature != Features.end()) {
5544 SoftFloat = true;
5545 Features.erase(Feature);
5546 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005547 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005548 }
Craig Topper3164f332014-03-11 03:39:26 +00005549 void getTargetDefines(const LangOptions &Opts,
5550 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005551 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005552 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005553
5554 if (SoftFloat)
5555 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005556 }
Craig Topper3164f332014-03-11 03:39:26 +00005557
5558 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005559 return llvm::StringSwitch<bool>(Feature)
5560 .Case("softfloat", SoftFloat)
5561 .Case("sparc", true)
5562 .Default(false);
5563 }
Craig Topper3164f332014-03-11 03:39:26 +00005564
5565 void getTargetBuiltins(const Builtin::Info *&Records,
5566 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005567 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005568 }
Craig Topper3164f332014-03-11 03:39:26 +00005569 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005570 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005571 }
Craig Topper3164f332014-03-11 03:39:26 +00005572 void getGCCRegNames(const char * const *&Names,
5573 unsigned &NumNames) const override;
5574 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5575 unsigned &NumAliases) const override;
5576 bool validateAsmConstraint(const char *&Name,
5577 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005578 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005579 switch (*Name) {
5580 case 'I': // Signed 13-bit constant
5581 case 'J': // Zero
5582 case 'K': // 32-bit constant with the low 12 bits clear
5583 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5584 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5585 case 'N': // Same as 'K' but zext (required for SIMode)
5586 case 'O': // The constant 4096
5587 return true;
5588 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005589 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005590 }
Craig Topper3164f332014-03-11 03:39:26 +00005591 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005592 // FIXME: Implement!
5593 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005594 }
5595};
5596
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005597const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005598 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5599 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5600 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5601 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5602};
5603
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005604void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5605 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005606 Names = GCCRegNames;
5607 NumNames = llvm::array_lengthof(GCCRegNames);
5608}
5609
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005610const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005611 { { "g0" }, "r0" },
5612 { { "g1" }, "r1" },
5613 { { "g2" }, "r2" },
5614 { { "g3" }, "r3" },
5615 { { "g4" }, "r4" },
5616 { { "g5" }, "r5" },
5617 { { "g6" }, "r6" },
5618 { { "g7" }, "r7" },
5619 { { "o0" }, "r8" },
5620 { { "o1" }, "r9" },
5621 { { "o2" }, "r10" },
5622 { { "o3" }, "r11" },
5623 { { "o4" }, "r12" },
5624 { { "o5" }, "r13" },
5625 { { "o6", "sp" }, "r14" },
5626 { { "o7" }, "r15" },
5627 { { "l0" }, "r16" },
5628 { { "l1" }, "r17" },
5629 { { "l2" }, "r18" },
5630 { { "l3" }, "r19" },
5631 { { "l4" }, "r20" },
5632 { { "l5" }, "r21" },
5633 { { "l6" }, "r22" },
5634 { { "l7" }, "r23" },
5635 { { "i0" }, "r24" },
5636 { { "i1" }, "r25" },
5637 { { "i2" }, "r26" },
5638 { { "i3" }, "r27" },
5639 { { "i4" }, "r28" },
5640 { { "i5" }, "r29" },
5641 { { "i6", "fp" }, "r30" },
5642 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005643};
5644
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005645void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5646 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005647 Aliases = GCCRegAliases;
5648 NumAliases = llvm::array_lengthof(GCCRegAliases);
5649}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005650
5651// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5652class SparcV8TargetInfo : public SparcTargetInfo {
5653public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005654 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005655 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
James Y Knight4b4d19e2015-06-04 15:36:29 +00005656 // NetBSD uses long (same as llvm default); everyone else uses int.
5657 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5658 SizeType = UnsignedLong;
5659 IntPtrType = SignedLong;
5660 PtrDiffType = SignedLong;
5661 } else {
5662 SizeType = UnsignedInt;
5663 IntPtrType = SignedInt;
5664 PtrDiffType = SignedInt;
5665 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005666 }
5667
Craig Topper3164f332014-03-11 03:39:26 +00005668 void getTargetDefines(const LangOptions &Opts,
5669 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005670 SparcTargetInfo::getTargetDefines(Opts, Builder);
5671 Builder.defineMacro("__sparcv8");
5672 }
5673};
5674
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005675// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5676class SparcV8elTargetInfo : public SparcV8TargetInfo {
5677 public:
5678 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
5679 DescriptionString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
5680 BigEndian = false;
5681 }
5682};
5683
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005684// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5685class SparcV9TargetInfo : public SparcTargetInfo {
5686public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005687 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005688 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005689 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005690 // This is an LP64 platform.
5691 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005692
5693 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005694 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005695 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005696 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005697 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005698 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005699
5700 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5701 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5702 LongDoubleWidth = 128;
5703 LongDoubleAlign = 128;
5704 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005705 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005706 }
5707
Craig Topper3164f332014-03-11 03:39:26 +00005708 void getTargetDefines(const LangOptions &Opts,
5709 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005710 SparcTargetInfo::getTargetDefines(Opts, Builder);
5711 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005712 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005713 // Solaris doesn't need these variants, but the BSDs do.
5714 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005715 Builder.defineMacro("__sparc64__");
5716 Builder.defineMacro("__sparc_v9__");
5717 Builder.defineMacro("__sparcv9__");
5718 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005719 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005720
Craig Topper3164f332014-03-11 03:39:26 +00005721 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005722 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5723 .Case("v9", true)
5724 .Case("ultrasparc", true)
5725 .Case("ultrasparc3", true)
5726 .Case("niagara", true)
5727 .Case("niagara2", true)
5728 .Case("niagara3", true)
5729 .Case("niagara4", true)
5730 .Default(false);
5731
5732 // No need to store the CPU yet. There aren't any CPU-specific
5733 // macros to define.
5734 return CPUKnown;
5735 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005736};
5737
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005738class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005739 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005740 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005741 std::string CPU;
5742 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005743 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005744
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005745public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005746 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005747 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005748 IntMaxType = SignedLong;
5749 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005750 TLSSupported = true;
5751 IntWidth = IntAlign = 32;
5752 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5753 PointerWidth = PointerAlign = 64;
5754 LongDoubleWidth = 128;
5755 LongDoubleAlign = 64;
5756 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005757 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005758 MinGlobalAlign = 16;
5759 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5760 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5761 }
5762 void getTargetDefines(const LangOptions &Opts,
5763 MacroBuilder &Builder) const override {
5764 Builder.defineMacro("__s390__");
5765 Builder.defineMacro("__s390x__");
5766 Builder.defineMacro("__zarch__");
5767 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005768 if (HasTransactionalExecution)
5769 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005770 }
5771 void getTargetBuiltins(const Builtin::Info *&Records,
5772 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005773 Records = BuiltinInfo;
5774 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005775 }
5776
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005777 void getGCCRegNames(const char *const *&Names,
5778 unsigned &NumNames) const override;
5779 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5780 unsigned &NumAliases) const override {
5781 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005782 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005783 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005784 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005785 bool validateAsmConstraint(const char *&Name,
5786 TargetInfo::ConstraintInfo &info) const override;
5787 const char *getClobbers() const override {
5788 // FIXME: Is this really right?
5789 return "";
5790 }
5791 BuiltinVaListKind getBuiltinVaListKind() const override {
5792 return TargetInfo::SystemZBuiltinVaList;
5793 }
5794 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005795 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005796 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5797 .Case("z10", true)
5798 .Case("z196", true)
5799 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005800 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005801 .Default(false);
5802
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005803 return CPUKnown;
5804 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005805 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5806 if (CPU == "zEC12")
5807 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005808 if (CPU == "z13") {
5809 Features["transactional-execution"] = true;
5810 Features["vector"] = true;
5811 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005812 }
5813
5814 bool handleTargetFeatures(std::vector<std::string> &Features,
5815 DiagnosticsEngine &Diags) override {
5816 HasTransactionalExecution = false;
5817 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5818 if (Features[i] == "+transactional-execution")
5819 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005820 if (Features[i] == "+vector")
5821 HasVector = true;
5822 }
5823 // If we use the vector ABI, vector types are 64-bit aligned.
5824 if (HasVector) {
5825 MaxVectorAlign = 64;
5826 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5827 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005828 }
5829 return true;
5830 }
5831
5832 bool hasFeature(StringRef Feature) const override {
5833 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005834 .Case("systemz", true)
5835 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005836 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005837 .Default(false);
5838 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005839
5840 StringRef getABI() const override {
5841 if (HasVector)
5842 return "vector";
5843 return "";
5844 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005845
5846 bool useFloat128ManglingForLongDouble() const override {
5847 return true;
5848 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005849};
5850
5851const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5852#define BUILTIN(ID, TYPE, ATTRS) \
5853 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5854#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005855};
5856
5857const char *const SystemZTargetInfo::GCCRegNames[] = {
5858 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5859 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5860 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5861 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5862};
5863
5864void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5865 unsigned &NumNames) const {
5866 Names = GCCRegNames;
5867 NumNames = llvm::array_lengthof(GCCRegNames);
5868}
5869
5870bool SystemZTargetInfo::
5871validateAsmConstraint(const char *&Name,
5872 TargetInfo::ConstraintInfo &Info) const {
5873 switch (*Name) {
5874 default:
5875 return false;
5876
5877 case 'a': // Address register
5878 case 'd': // Data register (equivalent to 'r')
5879 case 'f': // Floating-point register
5880 Info.setAllowsRegister();
5881 return true;
5882
5883 case 'I': // Unsigned 8-bit constant
5884 case 'J': // Unsigned 12-bit constant
5885 case 'K': // Signed 16-bit constant
5886 case 'L': // Signed 20-bit displacement (on all targets we support)
5887 case 'M': // 0x7fffffff
5888 return true;
5889
5890 case 'Q': // Memory with base and unsigned 12-bit displacement
5891 case 'R': // Likewise, plus an index
5892 case 'S': // Memory with base and signed 20-bit displacement
5893 case 'T': // Likewise, plus an index
5894 Info.setAllowsMemory();
5895 return true;
5896 }
5897}
Ulrich Weigand47445072013-05-06 16:26:41 +00005898
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005899 class MSP430TargetInfo : public TargetInfo {
5900 static const char * const GCCRegNames[];
5901 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005902 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005903 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005904 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005905 IntWidth = 16; IntAlign = 16;
5906 LongWidth = 32; LongLongWidth = 64;
5907 LongAlign = LongLongAlign = 16;
5908 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005909 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005910 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005911 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005912 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005913 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005914 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005915 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005916 }
5917 void getTargetDefines(const LangOptions &Opts,
5918 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005919 Builder.defineMacro("MSP430");
5920 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005921 // FIXME: defines for different 'flavours' of MCU
5922 }
Craig Topper3164f332014-03-11 03:39:26 +00005923 void getTargetBuiltins(const Builtin::Info *&Records,
5924 unsigned &NumRecords) const override {
5925 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005926 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005927 NumRecords = 0;
5928 }
Craig Topper3164f332014-03-11 03:39:26 +00005929 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005930 return Feature == "msp430";
5931 }
Craig Topper3164f332014-03-11 03:39:26 +00005932 void getGCCRegNames(const char * const *&Names,
5933 unsigned &NumNames) const override;
5934 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5935 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005936 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005937 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005938 NumAliases = 0;
5939 }
Eric Christopher917e9522014-11-18 22:36:15 +00005940 bool
5941 validateAsmConstraint(const char *&Name,
5942 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005943 // FIXME: implement
5944 switch (*Name) {
5945 case 'K': // the constant 1
5946 case 'L': // constant -1^20 .. 1^19
5947 case 'M': // constant 1-4:
5948 return true;
5949 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005950 // No target constraints for now.
5951 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005952 }
Craig Topper3164f332014-03-11 03:39:26 +00005953 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005954 // FIXME: Is this really right?
5955 return "";
5956 }
Craig Topper3164f332014-03-11 03:39:26 +00005957 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005958 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005959 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005960 }
5961 };
5962
5963 const char * const MSP430TargetInfo::GCCRegNames[] = {
5964 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5965 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5966 };
5967
5968 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5969 unsigned &NumNames) const {
5970 Names = GCCRegNames;
5971 NumNames = llvm::array_lengthof(GCCRegNames);
5972 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005973
Mike Stump11289f42009-09-09 15:08:12 +00005974 // LLVM and Clang cannot be used directly to output native binaries for
5975 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005976 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005977 //
5978 // TCE uses the llvm bitcode as input and uses it for generating customized
5979 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005980 // publicly available in http://tce.cs.tut.fi
5981
Eli Friedman1f191002011-10-07 19:51:42 +00005982 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5983 3, // opencl_global
5984 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005985 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005986 // FIXME: generic has to be added to the target
5987 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005988 0, // cuda_device
5989 0, // cuda_constant
5990 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005991 };
5992
Eli Friedmana9c3d712009-08-19 20:47:07 +00005993 class TCETargetInfo : public TargetInfo{
5994 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005995 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005996 TLSSupported = false;
5997 IntWidth = 32;
5998 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005999 PointerWidth = 32;
6000 IntAlign = 32;
6001 LongAlign = LongLongAlign = 32;
6002 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006003 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006004 SizeType = UnsignedInt;
6005 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006006 IntPtrType = SignedInt;
6007 PtrDiffType = SignedInt;
6008 FloatWidth = 32;
6009 FloatAlign = 32;
6010 DoubleWidth = 32;
6011 DoubleAlign = 32;
6012 LongDoubleWidth = 32;
6013 LongDoubleAlign = 32;
6014 FloatFormat = &llvm::APFloat::IEEEsingle;
6015 DoubleFormat = &llvm::APFloat::IEEEsingle;
6016 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006017 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6018 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00006019 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006020 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006021 }
6022
Craig Topper3164f332014-03-11 03:39:26 +00006023 void getTargetDefines(const LangOptions &Opts,
6024 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006025 DefineStd(Builder, "tce", Opts);
6026 Builder.defineMacro("__TCE__");
6027 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00006028 }
Craig Topper3164f332014-03-11 03:39:26 +00006029 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006030 return Feature == "tce";
6031 }
Craig Topper3164f332014-03-11 03:39:26 +00006032
6033 void getTargetBuiltins(const Builtin::Info *&Records,
6034 unsigned &NumRecords) const override {}
6035 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00006036 return "";
6037 }
Craig Topper3164f332014-03-11 03:39:26 +00006038 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006039 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006040 }
Craig Topper3164f332014-03-11 03:39:26 +00006041 void getGCCRegNames(const char * const *&Names,
6042 unsigned &NumNames) const override {}
6043 bool validateAsmConstraint(const char *&Name,
6044 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00006045 return true;
6046 }
Craig Topper3164f332014-03-11 03:39:26 +00006047 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6048 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00006049 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00006050
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006051class BPFTargetInfo : public TargetInfo {
6052public:
6053 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6054 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6055 SizeType = UnsignedLong;
6056 PtrDiffType = SignedLong;
6057 IntPtrType = SignedLong;
6058 IntMaxType = SignedLong;
6059 Int64Type = SignedLong;
6060 RegParmMax = 5;
6061 if (Triple.getArch() == llvm::Triple::bpfeb) {
6062 BigEndian = true;
6063 DescriptionString = "E-m:e-p:64:64-i64:64-n32:64-S128";
6064 } else {
6065 BigEndian = false;
6066 DescriptionString = "e-m:e-p:64:64-i64:64-n32:64-S128";
6067 }
6068 MaxAtomicPromoteWidth = 64;
6069 MaxAtomicInlineWidth = 64;
6070 TLSSupported = false;
6071 }
6072 void getTargetDefines(const LangOptions &Opts,
6073 MacroBuilder &Builder) const override {
6074 DefineStd(Builder, "bpf", Opts);
6075 Builder.defineMacro("__BPF__");
6076 }
6077 bool hasFeature(StringRef Feature) const override {
6078 return Feature == "bpf";
6079 }
6080
6081 void getTargetBuiltins(const Builtin::Info *&Records,
6082 unsigned &NumRecords) const override {}
6083 const char *getClobbers() const override {
6084 return "";
6085 }
6086 BuiltinVaListKind getBuiltinVaListKind() const override {
6087 return TargetInfo::VoidPtrBuiltinVaList;
6088 }
6089 void getGCCRegNames(const char * const *&Names,
6090 unsigned &NumNames) const override {
6091 Names = nullptr;
6092 NumNames = 0;
6093 }
6094 bool validateAsmConstraint(const char *&Name,
6095 TargetInfo::ConstraintInfo &info) const override {
6096 return true;
6097 }
6098 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6099 unsigned &NumAliases) const override {
6100 Aliases = nullptr;
6101 NumAliases = 0;
6102 }
6103};
6104
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006105class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006106 virtual void setDescriptionString() = 0;
6107
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006108 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006109 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006110 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006111 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006112 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006113 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006114 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006115 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006116 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006117 enum DspRevEnum {
6118 NoDSP, DSP1, DSP2
6119 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006120 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006121
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006122protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006123 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006124 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006125
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006126public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006127 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6128 const std::string &CPUStr)
6129 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006130 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006131 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6132 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6133 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006134
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006135 bool isNaN2008Default() const {
6136 return CPU == "mips32r6" || CPU == "mips64r6";
6137 }
6138
6139 bool isFP64Default() const {
6140 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6141 }
6142
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006143 bool isNan2008() const override {
6144 return IsNan2008;
6145 }
6146
Alp Toker4925ba72014-06-07 23:30:42 +00006147 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006148 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006149 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6150 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006151 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006152 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006153 .Case("mips1", IsMips32)
6154 .Case("mips2", IsMips32)
6155 .Case("mips3", true)
6156 .Case("mips4", true)
6157 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006158 .Case("mips32", IsMips32)
6159 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006160 .Case("mips32r3", IsMips32)
6161 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006162 .Case("mips32r6", IsMips32)
6163 .Case("mips64", true)
6164 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006165 .Case("mips64r3", true)
6166 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006167 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006168 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006169 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006170 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006171 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00006172 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006173 if (CPU == "octeon")
6174 Features["mips64r2"] = Features["cnmips"] = true;
6175 else
6176 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00006177 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006178
Craig Topper3164f332014-03-11 03:39:26 +00006179 void getTargetDefines(const LangOptions &Opts,
6180 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006181 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006182 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006183 if (Opts.GNUMode)
6184 Builder.defineMacro("mips");
6185
Simon Atanasyan683535b2012-08-29 19:14:58 +00006186 Builder.defineMacro("__REGISTER_PREFIX__", "");
6187
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006188 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006189 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006190 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006191 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006192 case SoftFloat:
6193 Builder.defineMacro("__mips_soft_float", Twine(1));
6194 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006195 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006196
Simon Atanasyan16071912013-04-14 14:07:30 +00006197 if (IsSingleFloat)
6198 Builder.defineMacro("__mips_single_float", Twine(1));
6199
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006200 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6201 Builder.defineMacro("_MIPS_FPSET",
6202 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6203
Simon Atanasyan72244b62012-07-05 16:06:06 +00006204 if (IsMips16)
6205 Builder.defineMacro("__mips16", Twine(1));
6206
Simon Atanasyan60777612013-04-14 14:07:51 +00006207 if (IsMicromips)
6208 Builder.defineMacro("__mips_micromips", Twine(1));
6209
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006210 if (IsNan2008)
6211 Builder.defineMacro("__mips_nan2008", Twine(1));
6212
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006213 switch (DspRev) {
6214 default:
6215 break;
6216 case DSP1:
6217 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6218 Builder.defineMacro("__mips_dsp", Twine(1));
6219 break;
6220 case DSP2:
6221 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6222 Builder.defineMacro("__mips_dspr2", Twine(1));
6223 Builder.defineMacro("__mips_dsp", Twine(1));
6224 break;
6225 }
6226
Jack Carter44ff1e52013-08-12 17:20:29 +00006227 if (HasMSA)
6228 Builder.defineMacro("__mips_msa", Twine(1));
6229
Simon Atanasyan26f19672012-04-05 19:28:31 +00006230 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6231 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6232 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006233
6234 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6235 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006236 }
6237
Craig Topper3164f332014-03-11 03:39:26 +00006238 void getTargetBuiltins(const Builtin::Info *&Records,
6239 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006240 Records = BuiltinInfo;
6241 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006242 }
Craig Topper3164f332014-03-11 03:39:26 +00006243 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006244 return llvm::StringSwitch<bool>(Feature)
6245 .Case("mips", true)
6246 .Case("fp64", HasFP64)
6247 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006248 }
Craig Topper3164f332014-03-11 03:39:26 +00006249 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006250 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006251 }
Craig Topper3164f332014-03-11 03:39:26 +00006252 void getGCCRegNames(const char * const *&Names,
6253 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006254 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006255 // CPU register names
6256 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006257 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6258 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6259 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006260 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6261 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006262 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6263 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6264 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6265 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006266 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006267 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006268 "$fcc5","$fcc6","$fcc7",
6269 // MSA register names
6270 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6271 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6272 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6273 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6274 // MSA control register names
6275 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6276 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006277 };
6278 Names = GCCRegNames;
6279 NumNames = llvm::array_lengthof(GCCRegNames);
6280 }
Craig Topper3164f332014-03-11 03:39:26 +00006281 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6282 unsigned &NumAliases) const override = 0;
6283 bool validateAsmConstraint(const char *&Name,
6284 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006285 switch (*Name) {
6286 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006287 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006288 case 'r': // CPU registers.
6289 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006290 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006291 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006292 case 'c': // $25 for indirect jumps
6293 case 'l': // lo register
6294 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006295 Info.setAllowsRegister();
6296 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006297 case 'I': // Signed 16-bit constant
6298 case 'J': // Integer 0
6299 case 'K': // Unsigned 16-bit constant
6300 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6301 case 'M': // Constants not loadable via lui, addiu, or ori
6302 case 'N': // Constant -1 to -65535
6303 case 'O': // A signed 15-bit constant
6304 case 'P': // A constant between 1 go 65535
6305 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006306 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006307 Info.setAllowsMemory();
6308 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006309 case 'Z':
6310 if (Name[1] == 'C') { // An address usable by ll, and sc.
6311 Info.setAllowsMemory();
6312 Name++; // Skip over 'Z'.
6313 return true;
6314 }
6315 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006316 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006317 }
6318
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006319 std::string convertConstraint(const char *&Constraint) const override {
6320 std::string R;
6321 switch (*Constraint) {
6322 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6323 if (Constraint[1] == 'C') {
6324 R = std::string("^") + std::string(Constraint, 2);
6325 Constraint++;
6326 return R;
6327 }
6328 break;
6329 }
6330 return TargetInfo::convertConstraint(Constraint);
6331 }
6332
Craig Topper3164f332014-03-11 03:39:26 +00006333 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006334 // In GCC, $1 is not widely used in generated code (it's used only in a few
6335 // specific situations), so there is no real need for users to add it to
6336 // the clobbers list if they want to use it in their inline assembly code.
6337 //
6338 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6339 // code generation, so using it in inline assembly without adding it to the
6340 // clobbers list can cause conflicts between the inline assembly code and
6341 // the surrounding generated code.
6342 //
6343 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6344 // operands, which will conflict with the ".set at" assembler option (which
6345 // we use only for inline assembly, in order to maintain compatibility with
6346 // GCC) and will also conflict with the user's usage of $1.
6347 //
6348 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6349 // register for generated code is to automatically clobber $1 for all inline
6350 // assembly code.
6351 //
6352 // FIXME: We should automatically clobber $1 only for inline assembly code
6353 // which actually uses it. This would allow LLVM to use $1 for inline
6354 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006355 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006356 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006357
Craig Topper3164f332014-03-11 03:39:26 +00006358 bool handleTargetFeatures(std::vector<std::string> &Features,
6359 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006360 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006361 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006362 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006363 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006364 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006365 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006366 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006367
6368 for (std::vector<std::string>::iterator it = Features.begin(),
6369 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006370 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006371 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006372 else if (*it == "+soft-float")
6373 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006374 else if (*it == "+mips16")
6375 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006376 else if (*it == "+micromips")
6377 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006378 else if (*it == "+dsp")
6379 DspRev = std::max(DspRev, DSP1);
6380 else if (*it == "+dspr2")
6381 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006382 else if (*it == "+msa")
6383 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006384 else if (*it == "+fp64")
6385 HasFP64 = true;
6386 else if (*it == "-fp64")
6387 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006388 else if (*it == "+nan2008")
6389 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006390 else if (*it == "-nan2008")
6391 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006392 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006393
Akira Hatanaka9064e362013-10-29 18:30:33 +00006394 setDescriptionString();
6395
Rafael Espindolaeb265472013-08-21 21:59:03 +00006396 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006397 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006398
Craig Topper3164f332014-03-11 03:39:26 +00006399 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006400 if (RegNo == 0) return 4;
6401 if (RegNo == 1) return 5;
6402 return -1;
6403 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006404
6405 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006406};
6407
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006408const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6409#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6410#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6411 ALL_LANGUAGES },
6412#include "clang/Basic/BuiltinsMips.def"
6413};
6414
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006415class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006416public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006417 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006418 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006419 SizeType = UnsignedInt;
6420 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006421 Int64Type = SignedLongLong;
6422 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006423 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006424 }
Craig Topper3164f332014-03-11 03:39:26 +00006425 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006426 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006427 ABI = Name;
6428 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006429 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006430 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006431 }
Craig Topper3164f332014-03-11 03:39:26 +00006432 void getTargetDefines(const LangOptions &Opts,
6433 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006434 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006435
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006436 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006437 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6438
6439 const std::string& CPUStr = getCPU();
6440 if (CPUStr == "mips32")
6441 Builder.defineMacro("__mips_isa_rev", "1");
6442 else if (CPUStr == "mips32r2")
6443 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006444 else if (CPUStr == "mips32r3")
6445 Builder.defineMacro("__mips_isa_rev", "3");
6446 else if (CPUStr == "mips32r5")
6447 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006448 else if (CPUStr == "mips32r6")
6449 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006450
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006451 if (ABI == "o32") {
6452 Builder.defineMacro("__mips_o32");
6453 Builder.defineMacro("_ABIO32", "1");
6454 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6455 }
6456 else if (ABI == "eabi")
6457 Builder.defineMacro("__mips_eabi");
6458 else
David Blaikie83d382b2011-09-23 05:06:16 +00006459 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006460 }
Craig Topper3164f332014-03-11 03:39:26 +00006461 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6462 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006463 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6464 { { "at" }, "$1" },
6465 { { "v0" }, "$2" },
6466 { { "v1" }, "$3" },
6467 { { "a0" }, "$4" },
6468 { { "a1" }, "$5" },
6469 { { "a2" }, "$6" },
6470 { { "a3" }, "$7" },
6471 { { "t0" }, "$8" },
6472 { { "t1" }, "$9" },
6473 { { "t2" }, "$10" },
6474 { { "t3" }, "$11" },
6475 { { "t4" }, "$12" },
6476 { { "t5" }, "$13" },
6477 { { "t6" }, "$14" },
6478 { { "t7" }, "$15" },
6479 { { "s0" }, "$16" },
6480 { { "s1" }, "$17" },
6481 { { "s2" }, "$18" },
6482 { { "s3" }, "$19" },
6483 { { "s4" }, "$20" },
6484 { { "s5" }, "$21" },
6485 { { "s6" }, "$22" },
6486 { { "s7" }, "$23" },
6487 { { "t8" }, "$24" },
6488 { { "t9" }, "$25" },
6489 { { "k0" }, "$26" },
6490 { { "k1" }, "$27" },
6491 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006492 { { "sp","$sp" }, "$29" },
6493 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006494 { { "ra" }, "$31" }
6495 };
6496 Aliases = GCCRegAliases;
6497 NumAliases = llvm::array_lengthof(GCCRegAliases);
6498 }
6499};
6500
6501class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006502 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006503 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006504 }
6505
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006506public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507 Mips32EBTargetInfo(const llvm::Triple &Triple)
6508 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006509 }
Craig Topper3164f332014-03-11 03:39:26 +00006510 void getTargetDefines(const LangOptions &Opts,
6511 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006512 DefineStd(Builder, "MIPSEB", Opts);
6513 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006514 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006515 }
6516};
6517
6518class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006519 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006520 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006521 }
6522
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006523public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006524 Mips32ELTargetInfo(const llvm::Triple &Triple)
6525 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006526 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006527 }
Craig Topper3164f332014-03-11 03:39:26 +00006528 void getTargetDefines(const LangOptions &Opts,
6529 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006530 DefineStd(Builder, "MIPSEL", Opts);
6531 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006532 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006533 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006534};
Akira Hatanakabef17452011-09-20 19:21:49 +00006535
6536class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006537public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006538 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006539 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006540 LongDoubleWidth = LongDoubleAlign = 128;
6541 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006542 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6543 LongDoubleWidth = LongDoubleAlign = 64;
6544 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6545 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006546 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006547 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006548 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006549 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006550
6551 void setN64ABITypes() {
6552 LongWidth = LongAlign = 64;
6553 PointerWidth = PointerAlign = 64;
6554 SizeType = UnsignedLong;
6555 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006556 Int64Type = SignedLong;
6557 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006558 }
6559
6560 void setN32ABITypes() {
6561 LongWidth = LongAlign = 32;
6562 PointerWidth = PointerAlign = 32;
6563 SizeType = UnsignedInt;
6564 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006565 Int64Type = SignedLongLong;
6566 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006567 }
6568
Craig Topper3164f332014-03-11 03:39:26 +00006569 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006570 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006571 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006572 ABI = Name;
6573 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006574 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006575 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006576 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006577 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006578 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006579 }
6580 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006581 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006582
Craig Topper3164f332014-03-11 03:39:26 +00006583 void getTargetDefines(const LangOptions &Opts,
6584 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006585 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006586
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006587 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006588 Builder.defineMacro("__mips64");
6589 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006590 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6591
6592 const std::string& CPUStr = getCPU();
6593 if (CPUStr == "mips64")
6594 Builder.defineMacro("__mips_isa_rev", "1");
6595 else if (CPUStr == "mips64r2")
6596 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006597 else if (CPUStr == "mips64r3")
6598 Builder.defineMacro("__mips_isa_rev", "3");
6599 else if (CPUStr == "mips64r5")
6600 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006601 else if (CPUStr == "mips64r6")
6602 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006603
Akira Hatanakabef17452011-09-20 19:21:49 +00006604 if (ABI == "n32") {
6605 Builder.defineMacro("__mips_n32");
6606 Builder.defineMacro("_ABIN32", "2");
6607 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6608 }
6609 else if (ABI == "n64") {
6610 Builder.defineMacro("__mips_n64");
6611 Builder.defineMacro("_ABI64", "3");
6612 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6613 }
6614 else
David Blaikie83d382b2011-09-23 05:06:16 +00006615 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006616 }
Craig Topper3164f332014-03-11 03:39:26 +00006617 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6618 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006619 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6620 { { "at" }, "$1" },
6621 { { "v0" }, "$2" },
6622 { { "v1" }, "$3" },
6623 { { "a0" }, "$4" },
6624 { { "a1" }, "$5" },
6625 { { "a2" }, "$6" },
6626 { { "a3" }, "$7" },
6627 { { "a4" }, "$8" },
6628 { { "a5" }, "$9" },
6629 { { "a6" }, "$10" },
6630 { { "a7" }, "$11" },
6631 { { "t0" }, "$12" },
6632 { { "t1" }, "$13" },
6633 { { "t2" }, "$14" },
6634 { { "t3" }, "$15" },
6635 { { "s0" }, "$16" },
6636 { { "s1" }, "$17" },
6637 { { "s2" }, "$18" },
6638 { { "s3" }, "$19" },
6639 { { "s4" }, "$20" },
6640 { { "s5" }, "$21" },
6641 { { "s6" }, "$22" },
6642 { { "s7" }, "$23" },
6643 { { "t8" }, "$24" },
6644 { { "t9" }, "$25" },
6645 { { "k0" }, "$26" },
6646 { { "k1" }, "$27" },
6647 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006648 { { "sp","$sp" }, "$29" },
6649 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006650 { { "ra" }, "$31" }
6651 };
6652 Aliases = GCCRegAliases;
6653 NumAliases = llvm::array_lengthof(GCCRegAliases);
6654 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006655
6656 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006657};
6658
6659class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006660 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006661 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006662 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 +00006663 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006664 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006665
Akira Hatanakabef17452011-09-20 19:21:49 +00006666 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006667
Akira Hatanakabef17452011-09-20 19:21:49 +00006668public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006669 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006670 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006671 void getTargetDefines(const LangOptions &Opts,
6672 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006673 DefineStd(Builder, "MIPSEB", Opts);
6674 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006675 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006676 }
6677};
6678
6679class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006680 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006681 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006682 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 +00006683 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006684 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006685 }
6686public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006687 Mips64ELTargetInfo(const llvm::Triple &Triple)
6688 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006689 // Default ABI is n64.
6690 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006691 }
Craig Topper3164f332014-03-11 03:39:26 +00006692 void getTargetDefines(const LangOptions &Opts,
6693 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006694 DefineStd(Builder, "MIPSEL", Opts);
6695 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006696 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006697 }
6698};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006699
Ivan Krasindd7403e2011-08-24 20:22:22 +00006700class PNaClTargetInfo : public TargetInfo {
6701public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006702 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006703 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006704 this->UserLabelPrefix = "";
6705 this->LongAlign = 32;
6706 this->LongWidth = 32;
6707 this->PointerAlign = 32;
6708 this->PointerWidth = 32;
6709 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006710 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006711 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006712 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006713 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006714 this->SizeType = TargetInfo::UnsignedInt;
6715 this->PtrDiffType = TargetInfo::SignedInt;
6716 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006717 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006718 }
6719
Craig Topper3164f332014-03-11 03:39:26 +00006720 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006721 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006722 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006723 Builder.defineMacro("__le32__");
6724 Builder.defineMacro("__pnacl__");
6725 }
Craig Topper3164f332014-03-11 03:39:26 +00006726 void getTargetDefines(const LangOptions &Opts,
6727 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006728 getArchDefines(Opts, Builder);
6729 }
Craig Topper3164f332014-03-11 03:39:26 +00006730 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006731 return Feature == "pnacl";
6732 }
Craig Topper3164f332014-03-11 03:39:26 +00006733 void getTargetBuiltins(const Builtin::Info *&Records,
6734 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006735 }
Craig Topper3164f332014-03-11 03:39:26 +00006736 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006737 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006738 }
Craig Topper3164f332014-03-11 03:39:26 +00006739 void getGCCRegNames(const char * const *&Names,
6740 unsigned &NumNames) const override;
6741 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6742 unsigned &NumAliases) const override;
6743 bool validateAsmConstraint(const char *&Name,
6744 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006745 return false;
6746 }
6747
Craig Topper3164f332014-03-11 03:39:26 +00006748 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006749 return "";
6750 }
6751};
6752
6753void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6754 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006755 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006756 NumNames = 0;
6757}
6758
6759void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6760 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006761 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006762 NumAliases = 0;
6763}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006764
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006765// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6766class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6767public:
6768 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
6769 Mips32ELTargetInfo(Triple) {
6770 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
6771 }
6772
6773 BuiltinVaListKind getBuiltinVaListKind() const override {
6774 return TargetInfo::PNaClABIBuiltinVaList;
6775 }
6776};
6777
JF Bastien643817d2014-09-12 17:52:47 +00006778class Le64TargetInfo : public TargetInfo {
6779 static const Builtin::Info BuiltinInfo[];
6780
6781public:
6782 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6783 BigEndian = false;
6784 NoAsmVariants = true;
6785 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6786 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6787 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006788 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006789 }
6790
6791 void getTargetDefines(const LangOptions &Opts,
6792 MacroBuilder &Builder) const override {
6793 DefineStd(Builder, "unix", Opts);
6794 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6795 Builder.defineMacro("__ELF__");
6796 }
6797 void getTargetBuiltins(const Builtin::Info *&Records,
6798 unsigned &NumRecords) const override {
6799 Records = BuiltinInfo;
6800 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6801 }
6802 BuiltinVaListKind getBuiltinVaListKind() const override {
6803 return TargetInfo::PNaClABIBuiltinVaList;
6804 }
6805 const char *getClobbers() const override { return ""; }
6806 void getGCCRegNames(const char *const *&Names,
6807 unsigned &NumNames) const override {
6808 Names = nullptr;
6809 NumNames = 0;
6810 }
6811 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6812 unsigned &NumAliases) const override {
6813 Aliases = nullptr;
6814 NumAliases = 0;
6815 }
6816 bool validateAsmConstraint(const char *&Name,
6817 TargetInfo::ConstraintInfo &Info) const override {
6818 return false;
6819 }
6820
6821 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006822};
6823} // end anonymous namespace.
6824
6825const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6826#define BUILTIN(ID, TYPE, ATTRS) \
6827 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6828#include "clang/Basic/BuiltinsLe64.def"
6829};
6830
6831namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006832 static const unsigned SPIRAddrSpaceMap[] = {
6833 1, // opencl_global
6834 3, // opencl_local
6835 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006836 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006837 0, // cuda_device
6838 0, // cuda_constant
6839 0 // cuda_shared
6840 };
6841 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006842 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006843 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006844 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6845 "SPIR target must use unknown OS");
6846 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6847 "SPIR target must use unknown environment type");
6848 BigEndian = false;
6849 TLSSupported = false;
6850 LongWidth = LongAlign = 64;
6851 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006852 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006853 // Define available target features
6854 // These must be defined in sorted order!
6855 NoAsmVariants = true;
6856 }
Craig Topper3164f332014-03-11 03:39:26 +00006857 void getTargetDefines(const LangOptions &Opts,
6858 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006859 DefineStd(Builder, "SPIR", Opts);
6860 }
Craig Topper3164f332014-03-11 03:39:26 +00006861 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006862 return Feature == "spir";
6863 }
Craig Topper3164f332014-03-11 03:39:26 +00006864
6865 void getTargetBuiltins(const Builtin::Info *&Records,
6866 unsigned &NumRecords) const override {}
6867 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006868 return "";
6869 }
Craig Topper3164f332014-03-11 03:39:26 +00006870 void getGCCRegNames(const char * const *&Names,
6871 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006872 bool
6873 validateAsmConstraint(const char *&Name,
6874 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006875 return true;
6876 }
Craig Topper3164f332014-03-11 03:39:26 +00006877 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6878 unsigned &NumAliases) const override {}
6879 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006880 return TargetInfo::VoidPtrBuiltinVaList;
6881 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006882
6883 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6884 return (CC == CC_SpirFunction ||
6885 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6886 }
6887
6888 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6889 return CC_SpirFunction;
6890 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006891 };
6892
6893
6894 class SPIR32TargetInfo : public SPIRTargetInfo {
6895 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006896 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006897 PointerWidth = PointerAlign = 32;
6898 SizeType = TargetInfo::UnsignedInt;
6899 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6900 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006901 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6902 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006903 }
Craig Topper3164f332014-03-11 03:39:26 +00006904 void getTargetDefines(const LangOptions &Opts,
6905 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006906 DefineStd(Builder, "SPIR32", Opts);
6907 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006908 };
6909
6910 class SPIR64TargetInfo : public SPIRTargetInfo {
6911 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006912 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006913 PointerWidth = PointerAlign = 64;
6914 SizeType = TargetInfo::UnsignedLong;
6915 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006916 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6917 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006918 }
Craig Topper3164f332014-03-11 03:39:26 +00006919 void getTargetDefines(const LangOptions &Opts,
6920 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006921 DefineStd(Builder, "SPIR64", Opts);
6922 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006923 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006924
Robert Lytton0e076492013-08-13 09:43:10 +00006925class XCoreTargetInfo : public TargetInfo {
6926 static const Builtin::Info BuiltinInfo[];
6927public:
6928 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6929 BigEndian = false;
6930 NoAsmVariants = true;
6931 LongLongAlign = 32;
6932 SuitableAlign = 32;
6933 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006934 SizeType = UnsignedInt;
6935 PtrDiffType = SignedInt;
6936 IntPtrType = SignedInt;
6937 WCharType = UnsignedChar;
6938 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006939 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006940 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 +00006941 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006942 }
Craig Topper3164f332014-03-11 03:39:26 +00006943 void getTargetDefines(const LangOptions &Opts,
6944 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006945 Builder.defineMacro("__XS1B__");
6946 }
Craig Topper3164f332014-03-11 03:39:26 +00006947 void getTargetBuiltins(const Builtin::Info *&Records,
6948 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006949 Records = BuiltinInfo;
6950 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6951 }
Craig Topper3164f332014-03-11 03:39:26 +00006952 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006953 return TargetInfo::VoidPtrBuiltinVaList;
6954 }
Craig Topper3164f332014-03-11 03:39:26 +00006955 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006956 return "";
6957 }
Craig Topper3164f332014-03-11 03:39:26 +00006958 void getGCCRegNames(const char * const *&Names,
6959 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006960 static const char * const GCCRegNames[] = {
6961 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6962 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6963 };
6964 Names = GCCRegNames;
6965 NumNames = llvm::array_lengthof(GCCRegNames);
6966 }
Craig Topper3164f332014-03-11 03:39:26 +00006967 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6968 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006969 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006970 NumAliases = 0;
6971 }
Craig Topper3164f332014-03-11 03:39:26 +00006972 bool validateAsmConstraint(const char *&Name,
6973 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006974 return false;
6975 }
Craig Topper3164f332014-03-11 03:39:26 +00006976 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006977 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6978 return (RegNo < 2)? RegNo : -1;
6979 }
Robert Lytton0e076492013-08-13 09:43:10 +00006980};
6981
6982const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6983#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6984#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6985 ALL_LANGUAGES },
6986#include "clang/Basic/BuiltinsXCore.def"
6987};
6988} // end anonymous namespace.
6989
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006990namespace {
6991// x86_32 Android target
6992class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6993public:
6994 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6995 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6996 SuitableAlign = 32;
6997 LongDoubleWidth = 64;
6998 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6999 }
7000};
7001} // end anonymous namespace
7002
7003namespace {
7004// x86_64 Android target
7005class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7006public:
7007 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7008 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7009 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7010 }
7011};
7012} // end anonymous namespace
7013
Ivan Krasindd7403e2011-08-24 20:22:22 +00007014
Chris Lattner5ba61f02006-10-14 07:39:34 +00007015//===----------------------------------------------------------------------===//
7016// Driver code
7017//===----------------------------------------------------------------------===//
7018
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007019static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007020 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007021
Daniel Dunbar52322032009-08-18 05:47:58 +00007022 switch (Triple.getArch()) {
7023 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007024 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007025
Tim Northover2a0783d2014-05-30 14:14:07 +00007026 case llvm::Triple::xcore:
7027 return new XCoreTargetInfo(Triple);
7028
7029 case llvm::Triple::hexagon:
7030 return new HexagonTargetInfo(Triple);
7031
7032 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007033 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007034 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007035
7036 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007037 case llvm::Triple::FreeBSD:
7038 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007039 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007040 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007041 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007042 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007043 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007044 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007045 }
7046
Christian Pirker9b019ae2014-02-25 13:51:00 +00007047 case llvm::Triple::aarch64_be:
7048 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007049 case llvm::Triple::FreeBSD:
7050 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007051 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007052 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007053 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007054 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007055 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007056 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007057 }
7058
Daniel Dunbar52322032009-08-18 05:47:58 +00007059 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007060 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007061 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007062 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007063
Daniel Dunbar52322032009-08-18 05:47:58 +00007064 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007065 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007066 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007067 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007068 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007069 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007070 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007071 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007072 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007073 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007074 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007075 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007076 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007077 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007078 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007079 case llvm::Triple::Win32:
7080 switch (Triple.getEnvironment()) {
7081 default:
7082 return new ARMleTargetInfo(Triple);
Yaron Keren321249c2015-07-15 13:32:23 +00007083 case llvm::Triple::Cygnus:
7084 return new CygwinARMTargetInfo(Triple);
7085 case llvm::Triple::GNU:
7086 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007087 case llvm::Triple::Itanium:
7088 return new ItaniumWindowsARMleTargetInfo(Triple);
7089 case llvm::Triple::MSVC:
7090 return new MicrosoftARMleTargetInfo(Triple);
7091 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007092 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007093 return new ARMleTargetInfo(Triple);
7094 }
7095
7096 case llvm::Triple::armeb:
7097 case llvm::Triple::thumbeb:
7098 if (Triple.isOSDarwin())
7099 return new DarwinARMTargetInfo(Triple);
7100
7101 switch (os) {
7102 case llvm::Triple::Linux:
7103 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7104 case llvm::Triple::FreeBSD:
7105 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7106 case llvm::Triple::NetBSD:
7107 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7108 case llvm::Triple::OpenBSD:
7109 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7110 case llvm::Triple::Bitrig:
7111 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7112 case llvm::Triple::RTEMS:
7113 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7114 case llvm::Triple::NaCl:
7115 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7116 default:
7117 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007118 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007119
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007120 case llvm::Triple::bpfeb:
7121 case llvm::Triple::bpfel:
7122 return new BPFTargetInfo(Triple);
7123
Daniel Dunbar52322032009-08-18 05:47:58 +00007124 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007125 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007126
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007127 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007128 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007129 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007130 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007131 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007132 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007133 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007134 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007135 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007136 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007137 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007138 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007139 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007140
7141 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007142 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007143 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007144 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007145 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007146 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007147 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007148 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007149 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007150 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007151 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007152 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007153 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007154 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007155 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007156
Akira Hatanakabef17452011-09-20 19:21:49 +00007157 case llvm::Triple::mips64:
7158 switch (os) {
7159 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007160 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007161 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007162 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007163 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007164 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007165 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007166 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007167 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007168 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007169 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007170 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007171 }
7172
7173 case llvm::Triple::mips64el:
7174 switch (os) {
7175 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007176 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007177 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007178 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007179 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007180 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007181 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007182 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007183 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007184 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007185 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007186 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007187 }
7188
Ivan Krasindd7403e2011-08-24 20:22:22 +00007189 case llvm::Triple::le32:
7190 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007191 case llvm::Triple::NaCl:
7192 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7193 default:
7194 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007195 }
7196
JF Bastien643817d2014-09-12 17:52:47 +00007197 case llvm::Triple::le64:
7198 return new Le64TargetInfo(Triple);
7199
Daniel Dunbar52322032009-08-18 05:47:58 +00007200 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007201 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007202 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007203 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007204 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007205 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007206 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007207 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007208 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007209 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007210 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007211 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007212 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007213 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007214 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007215 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007216 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007217
7218 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007219 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007220 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007221 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007222 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007223 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007224 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007225 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007226 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007227 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007228 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007229 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007230 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007231 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007232 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007233
Bill Schmidt778d3872013-07-26 01:36:11 +00007234 case llvm::Triple::ppc64le:
7235 switch (os) {
7236 case llvm::Triple::Linux:
7237 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007238 case llvm::Triple::NetBSD:
7239 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007240 default:
7241 return new PPC64TargetInfo(Triple);
7242 }
7243
Peter Collingbournec947aae2012-05-20 23:28:41 +00007244 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007245 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007246 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007247 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007248
Tom Stellardd8e38a32015-01-06 20:34:47 +00007249 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007250 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007251 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007252
Daniel Dunbar52322032009-08-18 05:47:58 +00007253 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007254 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007255 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007256 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007257 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007258 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007259 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007260 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007261 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007262 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007263 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007264 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007265 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007266 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007267 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007268
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007269 // The 'sparcel' architecture copies all the above cases except for Solaris.
7270 case llvm::Triple::sparcel:
7271 switch (os) {
7272 case llvm::Triple::Linux:
7273 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7274 case llvm::Triple::NetBSD:
7275 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7276 case llvm::Triple::OpenBSD:
7277 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7278 case llvm::Triple::RTEMS:
7279 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7280 default:
7281 return new SparcV8elTargetInfo(Triple);
7282 }
7283
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007284 case llvm::Triple::sparcv9:
7285 switch (os) {
7286 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007287 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007288 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007289 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007290 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007291 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007292 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007293 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007294 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007295 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007296 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007297 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007298 }
7299
Ulrich Weigand47445072013-05-06 16:26:41 +00007300 case llvm::Triple::systemz:
7301 switch (os) {
7302 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007303 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007304 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007305 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007306 }
7307
Eli Friedmana9c3d712009-08-19 20:47:07 +00007308 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007309 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007310
Daniel Dunbar52322032009-08-18 05:47:58 +00007311 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007312 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007313 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007314
Daniel Dunbar52322032009-08-18 05:47:58 +00007315 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007316 case llvm::Triple::CloudABI:
7317 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007318 case llvm::Triple::Linux: {
7319 switch (Triple.getEnvironment()) {
7320 default:
7321 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7322 case llvm::Triple::Android:
7323 return new AndroidX86_32TargetInfo(Triple);
7324 }
7325 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007326 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007327 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007328 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007329 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007330 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007331 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007332 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007333 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007334 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007335 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007336 case llvm::Triple::KFreeBSD:
7337 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007338 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007339 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007340 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007341 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007342 case llvm::Triple::Win32: {
7343 switch (Triple.getEnvironment()) {
7344 default:
7345 return new X86_32TargetInfo(Triple);
7346 case llvm::Triple::Cygnus:
7347 return new CygwinX86_32TargetInfo(Triple);
7348 case llvm::Triple::GNU:
7349 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007350 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007351 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007352 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007353 }
7354 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007355 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007356 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007357 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007358 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007359 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007360 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007361 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007362 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007363 }
7364
7365 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007366 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007367 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007368
Daniel Dunbar52322032009-08-18 05:47:58 +00007369 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007370 case llvm::Triple::CloudABI:
7371 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007372 case llvm::Triple::Linux: {
7373 switch (Triple.getEnvironment()) {
7374 default:
7375 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7376 case llvm::Triple::Android:
7377 return new AndroidX86_64TargetInfo(Triple);
7378 }
7379 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007380 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007381 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007382 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007383 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007384 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007385 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007386 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007387 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007388 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007389 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007390 case llvm::Triple::KFreeBSD:
7391 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007392 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007393 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007394 case llvm::Triple::Win32: {
7395 switch (Triple.getEnvironment()) {
7396 default:
7397 return new X86_64TargetInfo(Triple);
7398 case llvm::Triple::GNU:
7399 return new MinGWX86_64TargetInfo(Triple);
7400 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007401 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007402 }
7403 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007404 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007405 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007406 case llvm::Triple::PS4:
7407 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007408 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007409 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007410 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007411
Douglas Katzman78d7c542015-05-12 21:18:10 +00007412 case llvm::Triple::spir: {
7413 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7414 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7415 return nullptr;
7416 return new SPIR32TargetInfo(Triple);
7417 }
7418 case llvm::Triple::spir64: {
7419 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7420 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7421 return nullptr;
7422 return new SPIR64TargetInfo(Triple);
7423 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007424 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007425}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007426
7427/// CreateTargetInfo - Return the target info object for the specified target
7428/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007429TargetInfo *
7430TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7431 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007432 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007433
7434 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007435 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007436 if (!Target) {
7437 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007438 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007439 }
Alp Toker80758082014-07-06 05:26:44 +00007440 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007441
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007442 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007443 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7444 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007445 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007446 }
7447
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007448 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007449 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7450 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007451 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007452 }
7453
Rafael Espindolaeb265472013-08-21 21:59:03 +00007454 // Set the fp math unit.
7455 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7456 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007457 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007458 }
7459
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007460 // Compute the default target features, we need the target to handle this
7461 // because features may have dependencies on one another.
7462 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007463 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007464
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007465 // Apply the user specified deltas.
7466 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7467 I < N; ++I) {
7468 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007469 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007470 bool Enabled = Name[0] == '+';
7471 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007472 }
7473
7474 // Add the features to the compile options.
7475 //
7476 // FIXME: If we are completely confident that we have the right set, we only
7477 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007478 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007479 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7480 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007481 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007482 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007483 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007484
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007485 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007486}