blob: ab85cc3adb1a49c98f4fc87fa0ef8946475f7a66 [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
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004044 StringRef DefaultCPU;
4045 StringRef CPUProfile;
4046 StringRef CPUAttr;
4047
Rafael Espindolaeb265472013-08-21 21:59:03 +00004048 enum {
4049 FP_Default,
4050 FP_VFP,
4051 FP_Neon
4052 } FPMath;
4053
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004054 unsigned ArchISA;
4055 unsigned ArchKind;
4056 unsigned ArchProfile;
4057 unsigned ArchVersion;
4058
Bernard Ogdenda13af32013-10-24 18:32:51 +00004059 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004060
Logan Chien57086ce2012-10-10 06:56:20 +00004061 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004062 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004063
4064 // Initialized via features.
4065 unsigned SoftFloat : 1;
4066 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004067
Bernard Ogden18b57012013-10-29 09:47:51 +00004068 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004069 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00004070
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004071 // ACLE 6.5.1 Hardware floating point
4072 enum {
4073 HW_FP_HP = (1 << 1), /// half (16-bit)
4074 HW_FP_SP = (1 << 2), /// single (32-bit)
4075 HW_FP_DP = (1 << 3), /// double (64-bit)
4076 };
4077 uint32_t HW_FP;
4078
Chris Lattner5cc15e02010-03-03 19:03:45 +00004079 static const Builtin::Info BuiltinInfo[];
4080
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004081 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004082 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004083
4084 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004085 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004086
Renato Golin9ba39232015-02-27 16:35:48 +00004087 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4088 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4089 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004090 SizeType = UnsignedLong;
4091 else
4092 SizeType = UnsignedInt;
4093
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004094 switch (T.getOS()) {
4095 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004096 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004097 break;
4098 case llvm::Triple::Win32:
4099 WCharType = UnsignedShort;
4100 break;
4101 case llvm::Triple::Linux:
4102 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004103 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4104 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004105 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004106 }
4107
4108 UseBitFieldTypeAlignment = true;
4109
4110 ZeroLengthBitfieldBoundary = 0;
4111
Tim Northover147cd2f2014-10-14 22:12:21 +00004112 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4113 // so set preferred for small types to 32.
4114 if (T.isOSBinFormatMachO()) {
4115 DescriptionString =
4116 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4117 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4118 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004119 assert(!BigEndian && "Windows on ARM does not support big endian");
4120 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00004121 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00004122 "-p:32:32"
4123 "-i64:64"
4124 "-v128:64:128"
4125 "-a:0:32"
4126 "-n32"
4127 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004128 } else if (T.isOSNaCl()) {
4129 assert(!BigEndian && "NaCl on ARM does not support big endian");
4130 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004131 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00004132 DescriptionString =
4133 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4134 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004135 }
4136
4137 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004138 }
4139
4140 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004141 const llvm::Triple &T = getTriple();
4142
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004143 IsAAPCS = false;
4144
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004145 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004146
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004147 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004148 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004149 SizeType = UnsignedInt;
4150 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004151 SizeType = UnsignedLong;
4152
4153 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4154 WCharType = SignedInt;
4155
4156 // Do not respect the alignment of bit-field types when laying out
4157 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4158 UseBitFieldTypeAlignment = false;
4159
4160 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4161 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4162 /// gcc.
4163 ZeroLengthBitfieldBoundary = 32;
4164
Tim Northover147cd2f2014-10-14 22:12:21 +00004165 if (T.isOSBinFormatMachO())
4166 DescriptionString =
4167 BigEndian
4168 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4169 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4170 else
4171 DescriptionString =
4172 BigEndian
4173 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4174 : "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 +00004175
4176 // FIXME: Override "preferred align" for double and long long.
4177 }
4178
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004179 void setArchInfo() {
4180 StringRef ArchName = getTriple().getArchName();
4181
4182 ArchISA = llvm::ARMTargetParser::parseArchISA(ArchName);
4183 DefaultCPU = getDefaultCPU(ArchName);
4184
4185 // SubArch is specified by the target triple
4186 if (!DefaultCPU.empty())
4187 setArchInfo(DefaultCPU);
4188 else
4189 // FIXME ArchInfo should be based on ArchName from triple, not on
4190 // a hard-coded CPU name. Doing so currently causes regressions:
4191 // test/Preprocessor/init.c: __ARM_ARCH_6J__ not defined
4192 setArchInfo(CPU);
4193 }
4194
4195 void setArchInfo(StringRef CPU) {
4196 StringRef SubArch;
4197
4198 // cache TargetParser info
4199 ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
4200 SubArch = llvm::ARMTargetParser::getSubArch(ArchKind);
4201 ArchProfile = llvm::ARMTargetParser::parseArchProfile(SubArch);
4202 ArchVersion = llvm::ARMTargetParser::parseArchVersion(SubArch);
4203
4204 // cache CPU related strings
4205 CPUAttr = getCPUAttr();
4206 CPUProfile = getCPUProfile();
4207 }
4208
4209 void setAtomic() {
4210 // when triple does not specify a sub arch,
4211 // then we are not using inline atomics
4212 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4213 false :
4214 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4215 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4216 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4217 if (ArchProfile == llvm::ARM::PK_M) {
4218 MaxAtomicPromoteWidth = 32;
4219 if (ShouldUseInlineAtomic)
4220 MaxAtomicInlineWidth = 32;
4221 }
4222 else {
4223 MaxAtomicPromoteWidth = 64;
4224 if (ShouldUseInlineAtomic)
4225 MaxAtomicInlineWidth = 64;
4226 }
4227 }
4228
4229 bool isThumb() const {
4230 return (ArchISA == llvm::ARM::IK_THUMB);
4231 }
4232
4233 bool supportsThumb() const {
4234 return CPUAttr.count('T') || ArchVersion >= 6;
4235 }
4236
4237 bool supportsThumb2() const {
4238 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4239 }
4240
4241 StringRef getDefaultCPU(StringRef ArchName) const {
4242 const char *DefaultCPU = llvm::ARMTargetParser::getDefaultCPU(ArchName);
4243 return DefaultCPU ? DefaultCPU : "";
4244 }
4245
4246 StringRef getCPUAttr() const {
4247 const char *CPUAttr;
4248 // For most sub-arches, the build attribute CPU name is enough.
4249 // For Cortex variants, it's slightly different.
4250 switch(ArchKind) {
4251 default:
4252 CPUAttr = llvm::ARMTargetParser::getCPUAttr(ArchKind);
4253 return CPUAttr ? CPUAttr : "";
4254 case llvm::ARM::AK_ARMV6M:
4255 case llvm::ARM::AK_ARMV6SM:
4256 case llvm::ARM::AK_ARMV6HL:
4257 return "6M";
4258 case llvm::ARM::AK_ARMV7:
4259 case llvm::ARM::AK_ARMV7A:
4260 case llvm::ARM::AK_ARMV7S:
4261 case llvm::ARM::AK_ARMV7L:
4262 case llvm::ARM::AK_ARMV7HL:
4263 return "7A";
4264 case llvm::ARM::AK_ARMV7R:
4265 return "7R";
4266 case llvm::ARM::AK_ARMV7M:
4267 return "7M";
4268 case llvm::ARM::AK_ARMV7EM:
4269 return "7EM";
4270 case llvm::ARM::AK_ARMV8A:
4271 return "8A";
4272 case llvm::ARM::AK_ARMV8_1A:
4273 return "8_1A";
4274 }
4275 }
4276
4277 StringRef getCPUProfile() const {
4278 switch(ArchProfile) {
4279 case llvm::ARM::PK_A:
4280 return "A";
4281 case llvm::ARM::PK_R:
4282 return "R";
4283 case llvm::ARM::PK_M:
4284 return "M";
4285 default:
4286 return "";
4287 }
4288 }
4289
Chris Lattner17df24e2008-04-21 18:56:49 +00004290public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004291 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004292 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004293 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004294 BigEndian = IsBigEndian;
4295
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004296 switch (getTriple().getOS()) {
4297 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004298 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004299 break;
4300 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004301 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004302 break;
4303 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004304
4305 // cache arch related info
4306 setArchInfo();
4307
Chris Lattner1a8f3942010-04-23 16:29:58 +00004308 // {} in inline assembly are neon specifiers, not assembly variant
4309 // specifiers.
4310 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004311
Eric Christopher0e261882014-12-05 01:06:59 +00004312 // FIXME: This duplicates code from the driver that sets the -target-abi
4313 // option - this code is used if -target-abi isn't passed and should
4314 // be unified in some way.
4315 if (Triple.isOSBinFormatMachO()) {
4316 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4317 // the frontend matches that.
4318 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4319 Triple.getOS() == llvm::Triple::UnknownOS ||
4320 StringRef(CPU).startswith("cortex-m")) {
4321 setABI("aapcs");
4322 } else {
4323 setABI("apcs-gnu");
4324 }
4325 } else if (Triple.isOSWindows()) {
4326 // FIXME: this is invalid for WindowsCE
4327 setABI("aapcs");
4328 } else {
4329 // Select the default based on the platform.
4330 switch (Triple.getEnvironment()) {
4331 case llvm::Triple::Android:
4332 case llvm::Triple::GNUEABI:
4333 case llvm::Triple::GNUEABIHF:
4334 setABI("aapcs-linux");
4335 break;
4336 case llvm::Triple::EABIHF:
4337 case llvm::Triple::EABI:
4338 setABI("aapcs");
4339 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004340 case llvm::Triple::GNU:
4341 setABI("apcs-gnu");
4342 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004343 default:
4344 if (Triple.getOS() == llvm::Triple::NetBSD)
4345 setABI("apcs-gnu");
4346 else
4347 setABI("aapcs");
4348 break;
4349 }
4350 }
John McCall86353412010-08-21 22:46:04 +00004351
4352 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004353 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004354
Renato Golin15b86152015-07-03 16:41:13 +00004355 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004356 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004357
James Molloya7139222012-03-12 09:14:10 +00004358 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004359 // the alignment of the zero-length bitfield is greater than the member
4360 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004361 // zero length bitfield.
4362 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004363 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004364
Alp Toker4925ba72014-06-07 23:30:42 +00004365 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004366
Craig Topper3164f332014-03-11 03:39:26 +00004367 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004368 ABI = Name;
4369
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004370 // The defaults (above) are for AAPCS, check if we need to change them.
4371 //
4372 // FIXME: We need support for -meabi... we could just mangle it into the
4373 // name.
4374 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004375 setABIAPCS();
4376 return true;
4377 }
4378 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4379 setABIAAPCS();
4380 return true;
4381 }
4382 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004383 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004384
Renato Golinf5c4dec2015-05-27 13:33:00 +00004385 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004386 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004387 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4388 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004389 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004390 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004391 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004392 }
4393 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004394 Features["vfp4"] = true;
4395 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004396 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4397 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004398 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004399 Features["vfp4"] = true;
4400 Features["neon"] = true;
4401 Features["hwdiv"] = true;
4402 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004403 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4404 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004405 Features["fp-armv8"] = true;
4406 Features["neon"] = true;
4407 Features["hwdiv"] = true;
4408 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004409 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004410 Features["crypto"] = true;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004411 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || ArchVersion == 8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004412 Features["hwdiv"] = true;
4413 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004414 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004415 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004416 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004417 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004418 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004419
Craig Topper3164f332014-03-11 03:39:26 +00004420 bool handleTargetFeatures(std::vector<std::string> &Features,
4421 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004422 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004423 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004424 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004425 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004426 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004427
Ranjeet Singhac08e532015-06-24 23:39:25 +00004428 // This does not diagnose illegal cases like having both
4429 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4430 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004431 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004432 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004433 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004434 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004435 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004436 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004437 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004438 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004439 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004440 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004441 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004442 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004443 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004444 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004445 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004446 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004447 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004448 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004449 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004450 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004451 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004452 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004453 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004454 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004455 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004456 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004457 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004458 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004459 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004460 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004461 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004462 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004463 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004464
Rafael Espindolaeb265472013-08-21 21:59:03 +00004465 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4466 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4467 return false;
4468 }
4469
4470 if (FPMath == FP_Neon)
4471 Features.push_back("+neonfp");
4472 else if (FPMath == FP_VFP)
4473 Features.push_back("-neonfp");
4474
Daniel Dunbar893d4752009-12-19 04:15:38 +00004475 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004476 auto Feature =
4477 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4478 if (Feature != Features.end())
4479 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004480
Rafael Espindolaeb265472013-08-21 21:59:03 +00004481 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004482 }
4483
Craig Topper3164f332014-03-11 03:39:26 +00004484 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004485 return llvm::StringSwitch<bool>(Feature)
4486 .Case("arm", true)
4487 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004488 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004489 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004490 .Case("hwdiv", HWDiv & HWDivThumb)
4491 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004492 .Default(false);
4493 }
Renato Golin15b86152015-07-03 16:41:13 +00004494
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004495 bool setCPU(const std::string &Name) override {
Renato Golin15b86152015-07-03 16:41:13 +00004496 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
4497 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004498 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004499 setArchInfo(Name);
4500 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004501 CPU = Name;
4502 return true;
4503 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004504
Craig Topper3164f332014-03-11 03:39:26 +00004505 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +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__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004515 if (!CPUAttr.empty())
4516 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004517
4518 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004519 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004520 Builder.defineMacro("__ARM_ARCH", std::to_string(ArchVersion));
4521 if (ArchVersion >= 8) {
Eric Christopher917e9522014-11-18 22:36:15 +00004522 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4523 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004524 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004525
4526 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4527 // is not defined for the M-profile.
4528 // NOTE that the deffault profile is assumed to be 'A'
4529 if (CPUProfile.empty() || CPUProfile != "M")
4530 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4531
4532 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4533 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4534 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004535 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004536 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004537 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004538 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4539
4540 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4541 // instruction set such as ARM or Thumb.
4542 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4543
4544 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4545
4546 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004547 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004548 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004549
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004550 // ACLE 6.5.1 Hardware Floating Point
4551 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004552 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004553
Yi Konga44c4d72014-06-27 21:25:42 +00004554 // ACLE predefines.
4555 Builder.defineMacro("__ARM_ACLE", "200");
4556
Mike Stump9d54bd72009-04-08 02:07:04 +00004557 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004558
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004559 // FIXME: It's more complicated than this and we don't really support
4560 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004561 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004562 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004563 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004564
David Tweed8f676532012-10-25 13:33:01 +00004565 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004566 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004567 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4568 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004569 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004570 Builder.defineMacro("__ARM_PCS", "1");
4571
David Tweed8f676532012-10-25 13:33:01 +00004572 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004573 Builder.defineMacro("__ARM_PCS_VFP", "1");
4574 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004575
Daniel Dunbar893d4752009-12-19 04:15:38 +00004576 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004577 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004578
4579 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004580 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004581
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004582 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004583 Builder.defineMacro("__THUMBEL__");
4584 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004585 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004586 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004587 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004588 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb()))
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004589 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004590
4591 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004592 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004593
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004594 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004595 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004596 if (FPU & VFP2FPU)
4597 Builder.defineMacro("__ARM_VFPV2__");
4598 if (FPU & VFP3FPU)
4599 Builder.defineMacro("__ARM_VFPV3__");
4600 if (FPU & VFP4FPU)
4601 Builder.defineMacro("__ARM_VFPV4__");
4602 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004603
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004604 // This only gets set when Neon instructions are actually available, unlike
4605 // the VFP define, hence the soft float and arch check. This is subtly
4606 // different from gcc, we follow the intent which was that it should be set
4607 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004608 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Tim Northover5bb34ca2013-11-21 12:36:34 +00004609 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004610 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004611 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004612
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004613 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4614 Opts.ShortWChar ? "2" : "4");
4615
4616 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4617 Opts.ShortEnums ? "1" : "4");
4618
Bernard Ogden18b57012013-10-29 09:47:51 +00004619 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004620 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004621
Tim Northover02e38602014-02-03 17:28:04 +00004622 if (Crypto)
4623 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4624
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004625 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004626 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4627 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4628 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4629 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4630 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004631
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004632 bool is5EOrAbove = (ArchVersion >= 6 ||
4633 (ArchVersion == 5 && CPUAttr.count('E')));
4634 // FIXME: We are not getting all 32-bit ARM architectures
4635 bool is32Bit = (!isThumb() || supportsThumb2());
4636 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUAttr == "7EM"))
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004637 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004638 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004639
Craig Topper3164f332014-03-11 03:39:26 +00004640 void getTargetBuiltins(const Builtin::Info *&Records,
4641 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004642 Records = BuiltinInfo;
4643 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004644 }
Craig Topper3164f332014-03-11 03:39:26 +00004645 bool isCLZForZeroUndef() const override { return false; }
4646 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004647 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004648 }
Craig Topper3164f332014-03-11 03:39:26 +00004649 void getGCCRegNames(const char * const *&Names,
4650 unsigned &NumNames) const override;
4651 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4652 unsigned &NumAliases) const override;
4653 bool validateAsmConstraint(const char *&Name,
4654 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004655 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004656 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004657 case 'l': // r0-r7
4658 case 'h': // r8-r15
4659 case 'w': // VFP Floating point register single precision
4660 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004661 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004662 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004663 case 'I':
4664 case 'J':
4665 case 'K':
4666 case 'L':
4667 case 'M':
4668 // FIXME
4669 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004670 case 'Q': // A memory address that is a single base register.
4671 Info.setAllowsMemory();
4672 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004673 case 'U': // a memory reference...
4674 switch (Name[1]) {
4675 case 'q': // ...ARMV4 ldrsb
4676 case 'v': // ...VFP load/store (reg+constant offset)
4677 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004678 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004679 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004680 case 'n': // valid address for Neon doubleword vector load/store
4681 case 'm': // valid address for Neon element and structure load/store
4682 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004683 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004684 Info.setAllowsMemory();
4685 Name++;
4686 return true;
4687 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004688 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004689 return false;
4690 }
Craig Topper3164f332014-03-11 03:39:26 +00004691 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004692 std::string R;
4693 switch (*Constraint) {
4694 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004695 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004696 Constraint++;
4697 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004698 case 'p': // 'p' should be translated to 'r' by default.
4699 R = std::string("r");
4700 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004701 default:
4702 return std::string(1, *Constraint);
4703 }
4704 return R;
4705 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004706 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004707 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004708 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004709 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004710 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004711
Bill Wendling9d1ee112012-10-25 23:28:48 +00004712 // Strip off constraint modifiers.
4713 while (Constraint[0] == '=' ||
4714 Constraint[0] == '+' ||
4715 Constraint[0] == '&')
4716 Constraint = Constraint.substr(1);
4717
4718 switch (Constraint[0]) {
4719 default: break;
4720 case 'r': {
4721 switch (Modifier) {
4722 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004723 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004724 case 'q':
4725 // A register of size 32 cannot fit a vector type.
4726 return false;
4727 }
4728 }
4729 }
4730
4731 return true;
4732 }
Craig Topper3164f332014-03-11 03:39:26 +00004733 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004734 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004735 return "";
4736 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004737
Craig Topper3164f332014-03-11 03:39:26 +00004738 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004739 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4740 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004741
Craig Topper3164f332014-03-11 03:39:26 +00004742 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004743 if (RegNo == 0) return 0;
4744 if (RegNo == 1) return 1;
4745 return -1;
4746 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004747
4748 bool hasSjLjLowering() const override {
4749 return true;
4750 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004751};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004752
Rafael Espindolaeb265472013-08-21 21:59:03 +00004753bool ARMTargetInfo::setFPMath(StringRef Name) {
4754 if (Name == "neon") {
4755 FPMath = FP_Neon;
4756 return true;
4757 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4758 Name == "vfp4") {
4759 FPMath = FP_VFP;
4760 return true;
4761 }
4762 return false;
4763}
4764
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004765const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004766 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004767 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004768 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4769
4770 // Float registers
4771 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4772 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4773 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004774 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004775
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004776 // Double registers
4777 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4778 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004779 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4780 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004781
4782 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004783 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4784 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004785};
4786
4787void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004788 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004789 Names = GCCRegNames;
4790 NumNames = llvm::array_lengthof(GCCRegNames);
4791}
4792
4793const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004794 { { "a1" }, "r0" },
4795 { { "a2" }, "r1" },
4796 { { "a3" }, "r2" },
4797 { { "a4" }, "r3" },
4798 { { "v1" }, "r4" },
4799 { { "v2" }, "r5" },
4800 { { "v3" }, "r6" },
4801 { { "v4" }, "r7" },
4802 { { "v5" }, "r8" },
4803 { { "v6", "rfp" }, "r9" },
4804 { { "sl" }, "r10" },
4805 { { "fp" }, "r11" },
4806 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004807 { { "r13" }, "sp" },
4808 { { "r14" }, "lr" },
4809 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004810 // The S, D and Q registers overlap, but aren't really aliases; we
4811 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004812};
4813
4814void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4815 unsigned &NumAliases) const {
4816 Aliases = GCCRegAliases;
4817 NumAliases = llvm::array_lengthof(GCCRegAliases);
4818}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004819
4820const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004821#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004822#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004823 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004824#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004825
4826#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004827#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004828#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4829 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004830#include "clang/Basic/BuiltinsARM.def"
4831};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004832
4833class ARMleTargetInfo : public ARMTargetInfo {
4834public:
4835 ARMleTargetInfo(const llvm::Triple &Triple)
4836 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004837 void getTargetDefines(const LangOptions &Opts,
4838 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004839 Builder.defineMacro("__ARMEL__");
4840 ARMTargetInfo::getTargetDefines(Opts, Builder);
4841 }
4842};
4843
4844class ARMbeTargetInfo : public ARMTargetInfo {
4845public:
4846 ARMbeTargetInfo(const llvm::Triple &Triple)
4847 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004848 void getTargetDefines(const LangOptions &Opts,
4849 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004850 Builder.defineMacro("__ARMEB__");
4851 Builder.defineMacro("__ARM_BIG_ENDIAN");
4852 ARMTargetInfo::getTargetDefines(Opts, Builder);
4853 }
4854};
Chris Lattner17df24e2008-04-21 18:56:49 +00004855
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004856class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4857 const llvm::Triple Triple;
4858public:
4859 WindowsARMTargetInfo(const llvm::Triple &Triple)
4860 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4861 TLSSupported = false;
4862 WCharType = UnsignedShort;
4863 SizeType = UnsignedInt;
4864 UserLabelPrefix = "";
4865 }
4866 void getVisualStudioDefines(const LangOptions &Opts,
4867 MacroBuilder &Builder) const {
4868 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4869
4870 // FIXME: this is invalid for WindowsCE
4871 Builder.defineMacro("_M_ARM_NT", "1");
4872 Builder.defineMacro("_M_ARMT", "_M_ARM");
4873 Builder.defineMacro("_M_THUMB", "_M_ARM");
4874
4875 assert((Triple.getArch() == llvm::Triple::arm ||
4876 Triple.getArch() == llvm::Triple::thumb) &&
4877 "invalid architecture for Windows ARM target info");
4878 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4879 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4880
4881 // TODO map the complete set of values
4882 // 31: VFPv3 40: VFPv4
4883 Builder.defineMacro("_M_ARM_FP", "31");
4884 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004885 BuiltinVaListKind getBuiltinVaListKind() const override {
4886 return TargetInfo::CharPtrBuiltinVaList;
4887 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004888};
4889
4890// Windows ARM + Itanium C++ ABI Target
4891class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4892public:
4893 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4894 : WindowsARMTargetInfo(Triple) {
4895 TheCXXABI.set(TargetCXXABI::GenericARM);
4896 }
4897
4898 void getTargetDefines(const LangOptions &Opts,
4899 MacroBuilder &Builder) const override {
4900 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4901
4902 if (Opts.MSVCCompat)
4903 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4904 }
4905};
4906
4907// Windows ARM, MS (C++) ABI
4908class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4909public:
4910 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4911 : WindowsARMTargetInfo(Triple) {
4912 TheCXXABI.set(TargetCXXABI::Microsoft);
4913 }
4914
4915 void getTargetDefines(const LangOptions &Opts,
4916 MacroBuilder &Builder) const override {
4917 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4918 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4919 }
4920};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004921
Yaron Keren321249c2015-07-15 13:32:23 +00004922// ARM MinGW target
4923class MinGWARMTargetInfo : public WindowsARMTargetInfo {
4924public:
4925 MinGWARMTargetInfo(const llvm::Triple &Triple)
4926 : WindowsARMTargetInfo(Triple) {
4927 TheCXXABI.set(TargetCXXABI::GenericARM);
4928 }
4929
4930 void getTargetDefines(const LangOptions &Opts,
4931 MacroBuilder &Builder) const override {
4932 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4933 DefineStd(Builder, "WIN32", Opts);
4934 DefineStd(Builder, "WINNT", Opts);
4935 Builder.defineMacro("_ARM_");
4936 addMinGWDefines(Opts, Builder);
4937 }
4938};
4939
4940// ARM Cygwin target
4941class CygwinARMTargetInfo : public ARMleTargetInfo {
4942public:
4943 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
4944 TLSSupported = false;
4945 WCharType = UnsignedShort;
4946 DoubleAlign = LongLongAlign = 64;
4947 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4948 }
4949 void getTargetDefines(const LangOptions &Opts,
4950 MacroBuilder &Builder) const override {
4951 ARMleTargetInfo::getTargetDefines(Opts, Builder);
4952 Builder.defineMacro("_ARM_");
4953 Builder.defineMacro("__CYGWIN__");
4954 Builder.defineMacro("__CYGWIN32__");
4955 DefineStd(Builder, "unix", Opts);
4956 if (Opts.CPlusPlus)
4957 Builder.defineMacro("_GNU_SOURCE");
4958 }
4959};
4960
Mike Stump11289f42009-09-09 15:08:12 +00004961class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004962 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004963protected:
Craig Topper3164f332014-03-11 03:39:26 +00004964 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4965 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004966 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004967 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004968
Torok Edwinb2b37c62009-06-30 17:10:35 +00004969public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004970 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004971 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004972 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004973 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004974 // FIXME: This should be based off of the target features in
4975 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004976 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004977
4978 // Darwin on iOS uses a variant of the ARM C++ ABI.
4979 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004980 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004981};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004982
Tim Northover573cbee2014-05-24 12:52:07 +00004983class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004984 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004985 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4986 static const char *const GCCRegNames[];
4987
James Molloy75f5f9e2014-04-16 15:33:48 +00004988 enum FPUModeEnum {
4989 FPUMode,
4990 NeonMode
4991 };
4992
4993 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004994 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004995 unsigned Crypto;
4996
Tim Northovera2ee4332014-03-29 15:09:45 +00004997 static const Builtin::Info BuiltinInfo[];
4998
4999 std::string ABI;
5000
5001public:
Tim Northover573cbee2014-05-24 12:52:07 +00005002 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005003 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005004
5005 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5006 WCharType = SignedInt;
5007
5008 // NetBSD apparently prefers consistency across ARM targets to consistency
5009 // across 64-bit targets.
5010 Int64Type = SignedLongLong;
5011 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005012 } else {
5013 WCharType = UnsignedInt;
5014 Int64Type = SignedLong;
5015 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005016 }
5017
Tim Northovera2ee4332014-03-29 15:09:45 +00005018 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005019 MaxVectorAlign = 128;
5020 RegParmMax = 8;
5021 MaxAtomicInlineWidth = 128;
5022 MaxAtomicPromoteWidth = 128;
5023
Tim Northovera6a19f12015-02-06 01:25:07 +00005024 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005025 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5026
Tim Northovera2ee4332014-03-29 15:09:45 +00005027 // {} in inline assembly are neon specifiers, not assembly variant
5028 // specifiers.
5029 NoAsmVariants = true;
5030
Tim Northover7ad87af2015-01-16 18:44:04 +00005031 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5032 // contributes to the alignment of the containing aggregate in the same way
5033 // a plain (non bit-field) member of that type would, without exception for
5034 // zero-sized or anonymous bit-fields."
5035 UseBitFieldTypeAlignment = true;
5036 UseZeroLengthBitfieldAlignment = true;
5037
Tim Northover573cbee2014-05-24 12:52:07 +00005038 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005039 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5040 }
5041
Alp Toker4925ba72014-06-07 23:30:42 +00005042 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005043 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005044 if (Name != "aapcs" && Name != "darwinpcs")
5045 return false;
5046
5047 ABI = Name;
5048 return true;
5049 }
5050
David Blaikie1cbb9712014-11-14 19:09:44 +00005051 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005052 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005053 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005054 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005055 .Case("cyclone", true)
5056 .Default(false);
5057 return CPUKnown;
5058 }
5059
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005060 void getTargetDefines(const LangOptions &Opts,
5061 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005062 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005063 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005064
5065 // Target properties.
5066 Builder.defineMacro("_LP64");
5067 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005068
5069 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5070 Builder.defineMacro("__ARM_ACLE", "200");
5071 Builder.defineMacro("__ARM_ARCH", "8");
5072 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5073
5074 Builder.defineMacro("__ARM_64BIT_STATE");
5075 Builder.defineMacro("__ARM_PCS_AAPCS64");
5076 Builder.defineMacro("__ARM_ARCH_ISA_A64");
5077
5078 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
5079 Builder.defineMacro("__ARM_FEATURE_CLZ");
5080 Builder.defineMacro("__ARM_FEATURE_FMA");
5081 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00005082 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
5083 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
5084 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
5085 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00005086
5087 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5088
5089 // 0xe implies support for half, single and double precision operations.
5090 Builder.defineMacro("__ARM_FP", "0xe");
5091
5092 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5093 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
5094 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
5095
5096 if (Opts.FastMath || Opts.FiniteMathOnly)
5097 Builder.defineMacro("__ARM_FP_FAST");
5098
Richard Smithab506ad2014-10-20 23:26:58 +00005099 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005100 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5101
5102 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5103
5104 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5105 Opts.ShortEnums ? "1" : "4");
5106
James Molloy75f5f9e2014-04-16 15:33:48 +00005107 if (FPU == NeonMode) {
5108 Builder.defineMacro("__ARM_NEON");
5109 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00005110 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00005111 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005112
Bradley Smith418c5932014-05-02 15:17:51 +00005113 if (CRC)
5114 Builder.defineMacro("__ARM_FEATURE_CRC32");
5115
James Molloy75f5f9e2014-04-16 15:33:48 +00005116 if (Crypto)
5117 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00005118
5119 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5120 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5121 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5122 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5123 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005124 }
5125
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005126 void getTargetBuiltins(const Builtin::Info *&Records,
5127 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005128 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005129 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005130 }
5131
David Blaikie1cbb9712014-11-14 19:09:44 +00005132 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005133 return Feature == "aarch64" ||
5134 Feature == "arm64" ||
5135 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005136 }
5137
James Molloy5e73df52014-04-16 15:06:20 +00005138 bool handleTargetFeatures(std::vector<std::string> &Features,
5139 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005140 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005141 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005142 Crypto = 0;
5143 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5144 if (Features[i] == "+neon")
5145 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005146 if (Features[i] == "+crc")
5147 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005148 if (Features[i] == "+crypto")
5149 Crypto = 1;
5150 }
5151
James Molloy5e73df52014-04-16 15:06:20 +00005152 setDescriptionString();
5153
5154 return true;
5155 }
5156
David Blaikie1cbb9712014-11-14 19:09:44 +00005157 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005158
David Blaikie1cbb9712014-11-14 19:09:44 +00005159 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005160 return TargetInfo::AArch64ABIBuiltinVaList;
5161 }
5162
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005163 void getGCCRegNames(const char *const *&Names,
5164 unsigned &NumNames) const override;
5165 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5166 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005167
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005168 bool validateAsmConstraint(const char *&Name,
5169 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005170 switch (*Name) {
5171 default:
5172 return false;
5173 case 'w': // Floating point and SIMD registers (V0-V31)
5174 Info.setAllowsRegister();
5175 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005176 case 'I': // Constant that can be used with an ADD instruction
5177 case 'J': // Constant that can be used with a SUB instruction
5178 case 'K': // Constant that can be used with a 32-bit logical instruction
5179 case 'L': // Constant that can be used with a 64-bit logical instruction
5180 case 'M': // Constant that can be used as a 32-bit MOV immediate
5181 case 'N': // Constant that can be used as a 64-bit MOV immediate
5182 case 'Y': // Floating point constant zero
5183 case 'Z': // Integer constant zero
5184 return true;
5185 case 'Q': // A memory reference with base register and no offset
5186 Info.setAllowsMemory();
5187 return true;
5188 case 'S': // A symbolic address
5189 Info.setAllowsRegister();
5190 return true;
5191 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005192 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5193 // Utf: A memory address suitable for ldp/stp in TF mode.
5194 // Usa: An absolute symbolic address.
5195 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5196 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005197 case 'z': // Zero register, wzr or xzr
5198 Info.setAllowsRegister();
5199 return true;
5200 case 'x': // Floating point and SIMD registers (V0-V15)
5201 Info.setAllowsRegister();
5202 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005203 }
5204 return false;
5205 }
5206
Akira Hatanaka987f1862014-08-22 06:05:21 +00005207 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005208 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005209 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005210 // Strip off constraint modifiers.
5211 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5212 Constraint = Constraint.substr(1);
5213
5214 switch (Constraint[0]) {
5215 default:
5216 return true;
5217 case 'z':
5218 case 'r': {
5219 switch (Modifier) {
5220 case 'x':
5221 case 'w':
5222 // For now assume that the person knows what they're
5223 // doing with the modifier.
5224 return true;
5225 default:
5226 // By default an 'r' constraint will be in the 'x'
5227 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005228 if (Size == 64)
5229 return true;
5230
5231 SuggestedModifier = "w";
5232 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005233 }
5234 }
5235 }
5236 }
5237
David Blaikie1cbb9712014-11-14 19:09:44 +00005238 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005239
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005240 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005241 if (RegNo == 0)
5242 return 0;
5243 if (RegNo == 1)
5244 return 1;
5245 return -1;
5246 }
5247};
5248
Tim Northover573cbee2014-05-24 12:52:07 +00005249const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005250 // 32-bit Integer registers
5251 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5252 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5253 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5254
5255 // 64-bit Integer registers
5256 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5257 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5258 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5259
5260 // 32-bit floating point regsisters
5261 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5262 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5263 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5264
5265 // 64-bit floating point regsisters
5266 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5267 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5268 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5269
5270 // Vector registers
5271 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5272 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5273 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5274};
5275
Tim Northover573cbee2014-05-24 12:52:07 +00005276void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005277 unsigned &NumNames) const {
5278 Names = GCCRegNames;
5279 NumNames = llvm::array_lengthof(GCCRegNames);
5280}
5281
Tim Northover573cbee2014-05-24 12:52:07 +00005282const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005283 { { "w31" }, "wsp" },
5284 { { "x29" }, "fp" },
5285 { { "x30" }, "lr" },
5286 { { "x31" }, "sp" },
5287 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5288 // don't want to substitute one of these for a different-sized one.
5289};
5290
Tim Northover573cbee2014-05-24 12:52:07 +00005291void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005292 unsigned &NumAliases) const {
5293 Aliases = GCCRegAliases;
5294 NumAliases = llvm::array_lengthof(GCCRegAliases);
5295}
5296
Tim Northover573cbee2014-05-24 12:52:07 +00005297const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005298#define BUILTIN(ID, TYPE, ATTRS) \
5299 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5300#include "clang/Basic/BuiltinsNEON.def"
5301
5302#define BUILTIN(ID, TYPE, ATTRS) \
5303 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005304#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005305};
James Molloy5e73df52014-04-16 15:06:20 +00005306
Tim Northover573cbee2014-05-24 12:52:07 +00005307class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005308 void setDescriptionString() override {
5309 if (getTriple().isOSBinFormatMachO())
5310 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5311 else
5312 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5313 }
5314
5315public:
Tim Northover573cbee2014-05-24 12:52:07 +00005316 AArch64leTargetInfo(const llvm::Triple &Triple)
5317 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005318 BigEndian = false;
5319 }
5320 void getTargetDefines(const LangOptions &Opts,
5321 MacroBuilder &Builder) const override {
5322 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005323 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005324 }
5325};
5326
Tim Northover573cbee2014-05-24 12:52:07 +00005327class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005328 void setDescriptionString() override {
5329 assert(!getTriple().isOSBinFormatMachO());
5330 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5331 }
5332
5333public:
Tim Northover573cbee2014-05-24 12:52:07 +00005334 AArch64beTargetInfo(const llvm::Triple &Triple)
5335 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005336 void getTargetDefines(const LangOptions &Opts,
5337 MacroBuilder &Builder) const override {
5338 Builder.defineMacro("__AARCH64EB__");
5339 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5340 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005341 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005342 }
5343};
Tim Northovera2ee4332014-03-29 15:09:45 +00005344
Tim Northover573cbee2014-05-24 12:52:07 +00005345class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005346protected:
5347 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5348 MacroBuilder &Builder) const override {
5349 Builder.defineMacro("__AARCH64_SIMD__");
5350 Builder.defineMacro("__ARM64_ARCH_8__");
5351 Builder.defineMacro("__ARM_NEON__");
5352 Builder.defineMacro("__LITTLE_ENDIAN__");
5353 Builder.defineMacro("__REGISTER_PREFIX__", "");
5354 Builder.defineMacro("__arm64", "1");
5355 Builder.defineMacro("__arm64__", "1");
5356
5357 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5358 }
5359
Tim Northovera2ee4332014-03-29 15:09:45 +00005360public:
Tim Northover573cbee2014-05-24 12:52:07 +00005361 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5362 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005363 Int64Type = SignedLongLong;
5364 WCharType = SignedInt;
5365 UseSignedCharForObjCBool = false;
5366
Tim Northovera6a19f12015-02-06 01:25:07 +00005367 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005368 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5369
5370 TheCXXABI.set(TargetCXXABI::iOS64);
5371 }
5372
David Blaikie1cbb9712014-11-14 19:09:44 +00005373 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005374 return TargetInfo::CharPtrBuiltinVaList;
5375 }
5376};
Tim Northovera2ee4332014-03-29 15:09:45 +00005377
Tony Linthicum76329bf2011-12-12 21:14:55 +00005378// Hexagon abstract base class
5379class HexagonTargetInfo : public TargetInfo {
5380 static const Builtin::Info BuiltinInfo[];
5381 static const char * const GCCRegNames[];
5382 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5383 std::string CPU;
5384public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005385 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005386 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005387 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005388
5389 // {} in inline assembly are packet specifiers, not assembly variant
5390 // specifiers.
5391 NoAsmVariants = true;
5392 }
5393
Craig Topper3164f332014-03-11 03:39:26 +00005394 void getTargetBuiltins(const Builtin::Info *&Records,
5395 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005396 Records = BuiltinInfo;
5397 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5398 }
5399
Craig Topper3164f332014-03-11 03:39:26 +00005400 bool validateAsmConstraint(const char *&Name,
5401 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005402 return true;
5403 }
5404
Craig Topper3164f332014-03-11 03:39:26 +00005405 void getTargetDefines(const LangOptions &Opts,
5406 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005407
Craig Topper3164f332014-03-11 03:39:26 +00005408 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005409 return Feature == "hexagon";
5410 }
Craig Topper3164f332014-03-11 03:39:26 +00005411
5412 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005413 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005414 }
Craig Topper3164f332014-03-11 03:39:26 +00005415 void getGCCRegNames(const char * const *&Names,
5416 unsigned &NumNames) const override;
5417 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5418 unsigned &NumAliases) const override;
5419 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005420 return "";
5421 }
Sebastian Pop86500282012-01-13 20:37:10 +00005422
5423 static const char *getHexagonCPUSuffix(StringRef Name) {
5424 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005425 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005426 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005427 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005428 }
5429
Craig Topper3164f332014-03-11 03:39:26 +00005430 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005431 if (!getHexagonCPUSuffix(Name))
5432 return false;
5433
Tony Linthicum76329bf2011-12-12 21:14:55 +00005434 CPU = Name;
5435 return true;
5436 }
5437};
5438
5439void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5440 MacroBuilder &Builder) const {
5441 Builder.defineMacro("qdsp6");
5442 Builder.defineMacro("__qdsp6", "1");
5443 Builder.defineMacro("__qdsp6__", "1");
5444
5445 Builder.defineMacro("hexagon");
5446 Builder.defineMacro("__hexagon", "1");
5447 Builder.defineMacro("__hexagon__", "1");
5448
5449 if(CPU == "hexagonv1") {
5450 Builder.defineMacro("__HEXAGON_V1__");
5451 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5452 if(Opts.HexagonQdsp6Compat) {
5453 Builder.defineMacro("__QDSP6_V1__");
5454 Builder.defineMacro("__QDSP6_ARCH__", "1");
5455 }
5456 }
5457 else if(CPU == "hexagonv2") {
5458 Builder.defineMacro("__HEXAGON_V2__");
5459 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5460 if(Opts.HexagonQdsp6Compat) {
5461 Builder.defineMacro("__QDSP6_V2__");
5462 Builder.defineMacro("__QDSP6_ARCH__", "2");
5463 }
5464 }
5465 else if(CPU == "hexagonv3") {
5466 Builder.defineMacro("__HEXAGON_V3__");
5467 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5468 if(Opts.HexagonQdsp6Compat) {
5469 Builder.defineMacro("__QDSP6_V3__");
5470 Builder.defineMacro("__QDSP6_ARCH__", "3");
5471 }
5472 }
5473 else if(CPU == "hexagonv4") {
5474 Builder.defineMacro("__HEXAGON_V4__");
5475 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5476 if(Opts.HexagonQdsp6Compat) {
5477 Builder.defineMacro("__QDSP6_V4__");
5478 Builder.defineMacro("__QDSP6_ARCH__", "4");
5479 }
5480 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005481 else if(CPU == "hexagonv5") {
5482 Builder.defineMacro("__HEXAGON_V5__");
5483 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5484 if(Opts.HexagonQdsp6Compat) {
5485 Builder.defineMacro("__QDSP6_V5__");
5486 Builder.defineMacro("__QDSP6_ARCH__", "5");
5487 }
5488 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005489}
5490
5491const char * const HexagonTargetInfo::GCCRegNames[] = {
5492 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5493 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5494 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5495 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5496 "p0", "p1", "p2", "p3",
5497 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5498};
5499
5500void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5501 unsigned &NumNames) const {
5502 Names = GCCRegNames;
5503 NumNames = llvm::array_lengthof(GCCRegNames);
5504}
5505
5506
5507const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5508 { { "sp" }, "r29" },
5509 { { "fp" }, "r30" },
5510 { { "lr" }, "r31" },
5511 };
5512
5513void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5514 unsigned &NumAliases) const {
5515 Aliases = GCCRegAliases;
5516 NumAliases = llvm::array_lengthof(GCCRegAliases);
5517}
5518
5519
5520const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5521#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5522#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5523 ALL_LANGUAGES },
5524#include "clang/Basic/BuiltinsHexagon.def"
5525};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005526
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005527// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5528class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005529 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5530 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005531 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005532public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005533 SparcTargetInfo(const llvm::Triple &Triple)
5534 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005535
Craig Topper3164f332014-03-11 03:39:26 +00005536 bool handleTargetFeatures(std::vector<std::string> &Features,
5537 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005538 // The backend doesn't actually handle soft float yet, but in case someone
5539 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005540 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5541 if (Feature != Features.end()) {
5542 SoftFloat = true;
5543 Features.erase(Feature);
5544 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005545 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005546 }
Craig Topper3164f332014-03-11 03:39:26 +00005547 void getTargetDefines(const LangOptions &Opts,
5548 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005549 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005550 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005551
5552 if (SoftFloat)
5553 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005554 }
Craig Topper3164f332014-03-11 03:39:26 +00005555
5556 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005557 return llvm::StringSwitch<bool>(Feature)
5558 .Case("softfloat", SoftFloat)
5559 .Case("sparc", true)
5560 .Default(false);
5561 }
Craig Topper3164f332014-03-11 03:39:26 +00005562
5563 void getTargetBuiltins(const Builtin::Info *&Records,
5564 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005565 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005566 }
Craig Topper3164f332014-03-11 03:39:26 +00005567 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005568 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005569 }
Craig Topper3164f332014-03-11 03:39:26 +00005570 void getGCCRegNames(const char * const *&Names,
5571 unsigned &NumNames) const override;
5572 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5573 unsigned &NumAliases) const override;
5574 bool validateAsmConstraint(const char *&Name,
5575 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005576 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005577 switch (*Name) {
5578 case 'I': // Signed 13-bit constant
5579 case 'J': // Zero
5580 case 'K': // 32-bit constant with the low 12 bits clear
5581 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5582 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5583 case 'N': // Same as 'K' but zext (required for SIMode)
5584 case 'O': // The constant 4096
5585 return true;
5586 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005587 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005588 }
Craig Topper3164f332014-03-11 03:39:26 +00005589 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005590 // FIXME: Implement!
5591 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005592 }
5593};
5594
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005595const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005596 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5597 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5598 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5599 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5600};
5601
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005602void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5603 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005604 Names = GCCRegNames;
5605 NumNames = llvm::array_lengthof(GCCRegNames);
5606}
5607
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005608const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005609 { { "g0" }, "r0" },
5610 { { "g1" }, "r1" },
5611 { { "g2" }, "r2" },
5612 { { "g3" }, "r3" },
5613 { { "g4" }, "r4" },
5614 { { "g5" }, "r5" },
5615 { { "g6" }, "r6" },
5616 { { "g7" }, "r7" },
5617 { { "o0" }, "r8" },
5618 { { "o1" }, "r9" },
5619 { { "o2" }, "r10" },
5620 { { "o3" }, "r11" },
5621 { { "o4" }, "r12" },
5622 { { "o5" }, "r13" },
5623 { { "o6", "sp" }, "r14" },
5624 { { "o7" }, "r15" },
5625 { { "l0" }, "r16" },
5626 { { "l1" }, "r17" },
5627 { { "l2" }, "r18" },
5628 { { "l3" }, "r19" },
5629 { { "l4" }, "r20" },
5630 { { "l5" }, "r21" },
5631 { { "l6" }, "r22" },
5632 { { "l7" }, "r23" },
5633 { { "i0" }, "r24" },
5634 { { "i1" }, "r25" },
5635 { { "i2" }, "r26" },
5636 { { "i3" }, "r27" },
5637 { { "i4" }, "r28" },
5638 { { "i5" }, "r29" },
5639 { { "i6", "fp" }, "r30" },
5640 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005641};
5642
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005643void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5644 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005645 Aliases = GCCRegAliases;
5646 NumAliases = llvm::array_lengthof(GCCRegAliases);
5647}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005648
5649// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5650class SparcV8TargetInfo : public SparcTargetInfo {
5651public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005652 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005653 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
James Y Knight4b4d19e2015-06-04 15:36:29 +00005654 // NetBSD uses long (same as llvm default); everyone else uses int.
5655 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5656 SizeType = UnsignedLong;
5657 IntPtrType = SignedLong;
5658 PtrDiffType = SignedLong;
5659 } else {
5660 SizeType = UnsignedInt;
5661 IntPtrType = SignedInt;
5662 PtrDiffType = SignedInt;
5663 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005664 }
5665
Craig Topper3164f332014-03-11 03:39:26 +00005666 void getTargetDefines(const LangOptions &Opts,
5667 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005668 SparcTargetInfo::getTargetDefines(Opts, Builder);
5669 Builder.defineMacro("__sparcv8");
5670 }
5671};
5672
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005673// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5674class SparcV8elTargetInfo : public SparcV8TargetInfo {
5675 public:
5676 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
5677 DescriptionString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
5678 BigEndian = false;
5679 }
5680};
5681
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005682// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5683class SparcV9TargetInfo : public SparcTargetInfo {
5684public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005685 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005686 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005687 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005688 // This is an LP64 platform.
5689 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005690
5691 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005692 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005693 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005694 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005695 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005696 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005697
5698 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5699 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5700 LongDoubleWidth = 128;
5701 LongDoubleAlign = 128;
5702 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005703 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005704 }
5705
Craig Topper3164f332014-03-11 03:39:26 +00005706 void getTargetDefines(const LangOptions &Opts,
5707 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005708 SparcTargetInfo::getTargetDefines(Opts, Builder);
5709 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005710 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005711 // Solaris doesn't need these variants, but the BSDs do.
5712 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005713 Builder.defineMacro("__sparc64__");
5714 Builder.defineMacro("__sparc_v9__");
5715 Builder.defineMacro("__sparcv9__");
5716 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005717 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005718
Craig Topper3164f332014-03-11 03:39:26 +00005719 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005720 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5721 .Case("v9", true)
5722 .Case("ultrasparc", true)
5723 .Case("ultrasparc3", true)
5724 .Case("niagara", true)
5725 .Case("niagara2", true)
5726 .Case("niagara3", true)
5727 .Case("niagara4", true)
5728 .Default(false);
5729
5730 // No need to store the CPU yet. There aren't any CPU-specific
5731 // macros to define.
5732 return CPUKnown;
5733 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005734};
5735
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005736class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005737 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005738 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005739 std::string CPU;
5740 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005741 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005742
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005743public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005744 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005745 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005746 IntMaxType = SignedLong;
5747 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005748 TLSSupported = true;
5749 IntWidth = IntAlign = 32;
5750 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5751 PointerWidth = PointerAlign = 64;
5752 LongDoubleWidth = 128;
5753 LongDoubleAlign = 64;
5754 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005755 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005756 MinGlobalAlign = 16;
5757 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5758 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5759 }
5760 void getTargetDefines(const LangOptions &Opts,
5761 MacroBuilder &Builder) const override {
5762 Builder.defineMacro("__s390__");
5763 Builder.defineMacro("__s390x__");
5764 Builder.defineMacro("__zarch__");
5765 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005766 if (HasTransactionalExecution)
5767 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005768 }
5769 void getTargetBuiltins(const Builtin::Info *&Records,
5770 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005771 Records = BuiltinInfo;
5772 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005773 }
5774
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005775 void getGCCRegNames(const char *const *&Names,
5776 unsigned &NumNames) const override;
5777 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5778 unsigned &NumAliases) const override {
5779 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005780 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005781 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005782 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005783 bool validateAsmConstraint(const char *&Name,
5784 TargetInfo::ConstraintInfo &info) const override;
5785 const char *getClobbers() const override {
5786 // FIXME: Is this really right?
5787 return "";
5788 }
5789 BuiltinVaListKind getBuiltinVaListKind() const override {
5790 return TargetInfo::SystemZBuiltinVaList;
5791 }
5792 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005793 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005794 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5795 .Case("z10", true)
5796 .Case("z196", true)
5797 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005798 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005799 .Default(false);
5800
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005801 return CPUKnown;
5802 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005803 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5804 if (CPU == "zEC12")
5805 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005806 if (CPU == "z13") {
5807 Features["transactional-execution"] = true;
5808 Features["vector"] = true;
5809 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005810 }
5811
5812 bool handleTargetFeatures(std::vector<std::string> &Features,
5813 DiagnosticsEngine &Diags) override {
5814 HasTransactionalExecution = false;
5815 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5816 if (Features[i] == "+transactional-execution")
5817 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005818 if (Features[i] == "+vector")
5819 HasVector = true;
5820 }
5821 // If we use the vector ABI, vector types are 64-bit aligned.
5822 if (HasVector) {
5823 MaxVectorAlign = 64;
5824 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5825 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005826 }
5827 return true;
5828 }
5829
5830 bool hasFeature(StringRef Feature) const override {
5831 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005832 .Case("systemz", true)
5833 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005834 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005835 .Default(false);
5836 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005837
5838 StringRef getABI() const override {
5839 if (HasVector)
5840 return "vector";
5841 return "";
5842 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005843
5844 bool useFloat128ManglingForLongDouble() const override {
5845 return true;
5846 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005847};
5848
5849const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5850#define BUILTIN(ID, TYPE, ATTRS) \
5851 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5852#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005853};
5854
5855const char *const SystemZTargetInfo::GCCRegNames[] = {
5856 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5857 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5858 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5859 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5860};
5861
5862void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5863 unsigned &NumNames) const {
5864 Names = GCCRegNames;
5865 NumNames = llvm::array_lengthof(GCCRegNames);
5866}
5867
5868bool SystemZTargetInfo::
5869validateAsmConstraint(const char *&Name,
5870 TargetInfo::ConstraintInfo &Info) const {
5871 switch (*Name) {
5872 default:
5873 return false;
5874
5875 case 'a': // Address register
5876 case 'd': // Data register (equivalent to 'r')
5877 case 'f': // Floating-point register
5878 Info.setAllowsRegister();
5879 return true;
5880
5881 case 'I': // Unsigned 8-bit constant
5882 case 'J': // Unsigned 12-bit constant
5883 case 'K': // Signed 16-bit constant
5884 case 'L': // Signed 20-bit displacement (on all targets we support)
5885 case 'M': // 0x7fffffff
5886 return true;
5887
5888 case 'Q': // Memory with base and unsigned 12-bit displacement
5889 case 'R': // Likewise, plus an index
5890 case 'S': // Memory with base and signed 20-bit displacement
5891 case 'T': // Likewise, plus an index
5892 Info.setAllowsMemory();
5893 return true;
5894 }
5895}
Ulrich Weigand47445072013-05-06 16:26:41 +00005896
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005897 class MSP430TargetInfo : public TargetInfo {
5898 static const char * const GCCRegNames[];
5899 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005900 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005901 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005902 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005903 IntWidth = 16; IntAlign = 16;
5904 LongWidth = 32; LongLongWidth = 64;
5905 LongAlign = LongLongAlign = 16;
5906 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005907 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005908 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005909 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005910 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005911 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005912 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005913 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005914 }
5915 void getTargetDefines(const LangOptions &Opts,
5916 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005917 Builder.defineMacro("MSP430");
5918 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005919 // FIXME: defines for different 'flavours' of MCU
5920 }
Craig Topper3164f332014-03-11 03:39:26 +00005921 void getTargetBuiltins(const Builtin::Info *&Records,
5922 unsigned &NumRecords) const override {
5923 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005924 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005925 NumRecords = 0;
5926 }
Craig Topper3164f332014-03-11 03:39:26 +00005927 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005928 return Feature == "msp430";
5929 }
Craig Topper3164f332014-03-11 03:39:26 +00005930 void getGCCRegNames(const char * const *&Names,
5931 unsigned &NumNames) const override;
5932 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5933 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005934 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005935 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005936 NumAliases = 0;
5937 }
Eric Christopher917e9522014-11-18 22:36:15 +00005938 bool
5939 validateAsmConstraint(const char *&Name,
5940 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005941 // FIXME: implement
5942 switch (*Name) {
5943 case 'K': // the constant 1
5944 case 'L': // constant -1^20 .. 1^19
5945 case 'M': // constant 1-4:
5946 return true;
5947 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005948 // No target constraints for now.
5949 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005950 }
Craig Topper3164f332014-03-11 03:39:26 +00005951 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005952 // FIXME: Is this really right?
5953 return "";
5954 }
Craig Topper3164f332014-03-11 03:39:26 +00005955 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005956 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005957 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005958 }
5959 };
5960
5961 const char * const MSP430TargetInfo::GCCRegNames[] = {
5962 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5963 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5964 };
5965
5966 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5967 unsigned &NumNames) const {
5968 Names = GCCRegNames;
5969 NumNames = llvm::array_lengthof(GCCRegNames);
5970 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005971
Mike Stump11289f42009-09-09 15:08:12 +00005972 // LLVM and Clang cannot be used directly to output native binaries for
5973 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005974 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005975 //
5976 // TCE uses the llvm bitcode as input and uses it for generating customized
5977 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005978 // publicly available in http://tce.cs.tut.fi
5979
Eli Friedman1f191002011-10-07 19:51:42 +00005980 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5981 3, // opencl_global
5982 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005983 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005984 // FIXME: generic has to be added to the target
5985 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005986 0, // cuda_device
5987 0, // cuda_constant
5988 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005989 };
5990
Eli Friedmana9c3d712009-08-19 20:47:07 +00005991 class TCETargetInfo : public TargetInfo{
5992 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005993 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005994 TLSSupported = false;
5995 IntWidth = 32;
5996 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005997 PointerWidth = 32;
5998 IntAlign = 32;
5999 LongAlign = LongLongAlign = 32;
6000 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006001 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006002 SizeType = UnsignedInt;
6003 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006004 IntPtrType = SignedInt;
6005 PtrDiffType = SignedInt;
6006 FloatWidth = 32;
6007 FloatAlign = 32;
6008 DoubleWidth = 32;
6009 DoubleAlign = 32;
6010 LongDoubleWidth = 32;
6011 LongDoubleAlign = 32;
6012 FloatFormat = &llvm::APFloat::IEEEsingle;
6013 DoubleFormat = &llvm::APFloat::IEEEsingle;
6014 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006015 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6016 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00006017 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006018 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006019 }
6020
Craig Topper3164f332014-03-11 03:39:26 +00006021 void getTargetDefines(const LangOptions &Opts,
6022 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006023 DefineStd(Builder, "tce", Opts);
6024 Builder.defineMacro("__TCE__");
6025 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00006026 }
Craig Topper3164f332014-03-11 03:39:26 +00006027 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006028 return Feature == "tce";
6029 }
Craig Topper3164f332014-03-11 03:39:26 +00006030
6031 void getTargetBuiltins(const Builtin::Info *&Records,
6032 unsigned &NumRecords) const override {}
6033 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00006034 return "";
6035 }
Craig Topper3164f332014-03-11 03:39:26 +00006036 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006037 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006038 }
Craig Topper3164f332014-03-11 03:39:26 +00006039 void getGCCRegNames(const char * const *&Names,
6040 unsigned &NumNames) const override {}
6041 bool validateAsmConstraint(const char *&Name,
6042 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00006043 return true;
6044 }
Craig Topper3164f332014-03-11 03:39:26 +00006045 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6046 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00006047 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00006048
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006049class BPFTargetInfo : public TargetInfo {
6050public:
6051 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6052 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6053 SizeType = UnsignedLong;
6054 PtrDiffType = SignedLong;
6055 IntPtrType = SignedLong;
6056 IntMaxType = SignedLong;
6057 Int64Type = SignedLong;
6058 RegParmMax = 5;
6059 if (Triple.getArch() == llvm::Triple::bpfeb) {
6060 BigEndian = true;
6061 DescriptionString = "E-m:e-p:64:64-i64:64-n32:64-S128";
6062 } else {
6063 BigEndian = false;
6064 DescriptionString = "e-m:e-p:64:64-i64:64-n32:64-S128";
6065 }
6066 MaxAtomicPromoteWidth = 64;
6067 MaxAtomicInlineWidth = 64;
6068 TLSSupported = false;
6069 }
6070 void getTargetDefines(const LangOptions &Opts,
6071 MacroBuilder &Builder) const override {
6072 DefineStd(Builder, "bpf", Opts);
6073 Builder.defineMacro("__BPF__");
6074 }
6075 bool hasFeature(StringRef Feature) const override {
6076 return Feature == "bpf";
6077 }
6078
6079 void getTargetBuiltins(const Builtin::Info *&Records,
6080 unsigned &NumRecords) const override {}
6081 const char *getClobbers() const override {
6082 return "";
6083 }
6084 BuiltinVaListKind getBuiltinVaListKind() const override {
6085 return TargetInfo::VoidPtrBuiltinVaList;
6086 }
6087 void getGCCRegNames(const char * const *&Names,
6088 unsigned &NumNames) const override {
6089 Names = nullptr;
6090 NumNames = 0;
6091 }
6092 bool validateAsmConstraint(const char *&Name,
6093 TargetInfo::ConstraintInfo &info) const override {
6094 return true;
6095 }
6096 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6097 unsigned &NumAliases) const override {
6098 Aliases = nullptr;
6099 NumAliases = 0;
6100 }
6101};
6102
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006103class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006104 virtual void setDescriptionString() = 0;
6105
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006106 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006107 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006108 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006109 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006110 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006111 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006112 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006113 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006114 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006115 enum DspRevEnum {
6116 NoDSP, DSP1, DSP2
6117 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006118 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006119
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006120protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006121 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006122 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006123
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006124public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006125 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6126 const std::string &CPUStr)
6127 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006128 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006129 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6130 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6131 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006132
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006133 bool isNaN2008Default() const {
6134 return CPU == "mips32r6" || CPU == "mips64r6";
6135 }
6136
6137 bool isFP64Default() const {
6138 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6139 }
6140
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006141 bool isNan2008() const override {
6142 return IsNan2008;
6143 }
6144
Alp Toker4925ba72014-06-07 23:30:42 +00006145 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006146 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006147 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6148 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006149 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006150 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006151 .Case("mips1", IsMips32)
6152 .Case("mips2", IsMips32)
6153 .Case("mips3", true)
6154 .Case("mips4", true)
6155 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006156 .Case("mips32", IsMips32)
6157 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006158 .Case("mips32r3", IsMips32)
6159 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006160 .Case("mips32r6", IsMips32)
6161 .Case("mips64", true)
6162 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006163 .Case("mips64r3", true)
6164 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006165 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006166 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006167 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006168 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006169 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00006170 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006171 if (CPU == "octeon")
6172 Features["mips64r2"] = Features["cnmips"] = true;
6173 else
6174 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00006175 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006176
Craig Topper3164f332014-03-11 03:39:26 +00006177 void getTargetDefines(const LangOptions &Opts,
6178 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006179 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006180 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006181 if (Opts.GNUMode)
6182 Builder.defineMacro("mips");
6183
Simon Atanasyan683535b2012-08-29 19:14:58 +00006184 Builder.defineMacro("__REGISTER_PREFIX__", "");
6185
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006186 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006187 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006188 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006189 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006190 case SoftFloat:
6191 Builder.defineMacro("__mips_soft_float", Twine(1));
6192 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006193 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006194
Simon Atanasyan16071912013-04-14 14:07:30 +00006195 if (IsSingleFloat)
6196 Builder.defineMacro("__mips_single_float", Twine(1));
6197
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006198 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6199 Builder.defineMacro("_MIPS_FPSET",
6200 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6201
Simon Atanasyan72244b62012-07-05 16:06:06 +00006202 if (IsMips16)
6203 Builder.defineMacro("__mips16", Twine(1));
6204
Simon Atanasyan60777612013-04-14 14:07:51 +00006205 if (IsMicromips)
6206 Builder.defineMacro("__mips_micromips", Twine(1));
6207
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006208 if (IsNan2008)
6209 Builder.defineMacro("__mips_nan2008", Twine(1));
6210
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006211 switch (DspRev) {
6212 default:
6213 break;
6214 case DSP1:
6215 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6216 Builder.defineMacro("__mips_dsp", Twine(1));
6217 break;
6218 case DSP2:
6219 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6220 Builder.defineMacro("__mips_dspr2", Twine(1));
6221 Builder.defineMacro("__mips_dsp", Twine(1));
6222 break;
6223 }
6224
Jack Carter44ff1e52013-08-12 17:20:29 +00006225 if (HasMSA)
6226 Builder.defineMacro("__mips_msa", Twine(1));
6227
Simon Atanasyan26f19672012-04-05 19:28:31 +00006228 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6229 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6230 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006231
6232 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6233 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006234 }
6235
Craig Topper3164f332014-03-11 03:39:26 +00006236 void getTargetBuiltins(const Builtin::Info *&Records,
6237 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006238 Records = BuiltinInfo;
6239 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006240 }
Craig Topper3164f332014-03-11 03:39:26 +00006241 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006242 return llvm::StringSwitch<bool>(Feature)
6243 .Case("mips", true)
6244 .Case("fp64", HasFP64)
6245 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006246 }
Craig Topper3164f332014-03-11 03:39:26 +00006247 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006248 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006249 }
Craig Topper3164f332014-03-11 03:39:26 +00006250 void getGCCRegNames(const char * const *&Names,
6251 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006252 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006253 // CPU register names
6254 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006255 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6256 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6257 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006258 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6259 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006260 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6261 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6262 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6263 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006264 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006265 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006266 "$fcc5","$fcc6","$fcc7",
6267 // MSA register names
6268 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6269 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6270 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6271 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6272 // MSA control register names
6273 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6274 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006275 };
6276 Names = GCCRegNames;
6277 NumNames = llvm::array_lengthof(GCCRegNames);
6278 }
Craig Topper3164f332014-03-11 03:39:26 +00006279 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6280 unsigned &NumAliases) const override = 0;
6281 bool validateAsmConstraint(const char *&Name,
6282 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006283 switch (*Name) {
6284 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006285 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006286 case 'r': // CPU registers.
6287 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006288 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006289 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006290 case 'c': // $25 for indirect jumps
6291 case 'l': // lo register
6292 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006293 Info.setAllowsRegister();
6294 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006295 case 'I': // Signed 16-bit constant
6296 case 'J': // Integer 0
6297 case 'K': // Unsigned 16-bit constant
6298 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6299 case 'M': // Constants not loadable via lui, addiu, or ori
6300 case 'N': // Constant -1 to -65535
6301 case 'O': // A signed 15-bit constant
6302 case 'P': // A constant between 1 go 65535
6303 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006304 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006305 Info.setAllowsMemory();
6306 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006307 case 'Z':
6308 if (Name[1] == 'C') { // An address usable by ll, and sc.
6309 Info.setAllowsMemory();
6310 Name++; // Skip over 'Z'.
6311 return true;
6312 }
6313 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006314 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006315 }
6316
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006317 std::string convertConstraint(const char *&Constraint) const override {
6318 std::string R;
6319 switch (*Constraint) {
6320 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6321 if (Constraint[1] == 'C') {
6322 R = std::string("^") + std::string(Constraint, 2);
6323 Constraint++;
6324 return R;
6325 }
6326 break;
6327 }
6328 return TargetInfo::convertConstraint(Constraint);
6329 }
6330
Craig Topper3164f332014-03-11 03:39:26 +00006331 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006332 // In GCC, $1 is not widely used in generated code (it's used only in a few
6333 // specific situations), so there is no real need for users to add it to
6334 // the clobbers list if they want to use it in their inline assembly code.
6335 //
6336 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6337 // code generation, so using it in inline assembly without adding it to the
6338 // clobbers list can cause conflicts between the inline assembly code and
6339 // the surrounding generated code.
6340 //
6341 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6342 // operands, which will conflict with the ".set at" assembler option (which
6343 // we use only for inline assembly, in order to maintain compatibility with
6344 // GCC) and will also conflict with the user's usage of $1.
6345 //
6346 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6347 // register for generated code is to automatically clobber $1 for all inline
6348 // assembly code.
6349 //
6350 // FIXME: We should automatically clobber $1 only for inline assembly code
6351 // which actually uses it. This would allow LLVM to use $1 for inline
6352 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006353 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006354 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006355
Craig Topper3164f332014-03-11 03:39:26 +00006356 bool handleTargetFeatures(std::vector<std::string> &Features,
6357 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006358 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006359 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006360 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006361 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006362 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006363 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006364 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006365
6366 for (std::vector<std::string>::iterator it = Features.begin(),
6367 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006368 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006369 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006370 else if (*it == "+soft-float")
6371 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006372 else if (*it == "+mips16")
6373 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006374 else if (*it == "+micromips")
6375 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006376 else if (*it == "+dsp")
6377 DspRev = std::max(DspRev, DSP1);
6378 else if (*it == "+dspr2")
6379 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006380 else if (*it == "+msa")
6381 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006382 else if (*it == "+fp64")
6383 HasFP64 = true;
6384 else if (*it == "-fp64")
6385 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006386 else if (*it == "+nan2008")
6387 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006388 else if (*it == "-nan2008")
6389 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006390 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006391
Akira Hatanaka9064e362013-10-29 18:30:33 +00006392 setDescriptionString();
6393
Rafael Espindolaeb265472013-08-21 21:59:03 +00006394 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006395 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006396
Craig Topper3164f332014-03-11 03:39:26 +00006397 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006398 if (RegNo == 0) return 4;
6399 if (RegNo == 1) return 5;
6400 return -1;
6401 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006402
6403 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006404};
6405
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006406const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6407#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6408#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6409 ALL_LANGUAGES },
6410#include "clang/Basic/BuiltinsMips.def"
6411};
6412
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006413class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006414public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006415 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006416 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006417 SizeType = UnsignedInt;
6418 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006419 Int64Type = SignedLongLong;
6420 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006421 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006422 }
Craig Topper3164f332014-03-11 03:39:26 +00006423 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006424 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006425 ABI = Name;
6426 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006427 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006428 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006429 }
Craig Topper3164f332014-03-11 03:39:26 +00006430 void getTargetDefines(const LangOptions &Opts,
6431 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006432 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006433
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006434 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006435 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6436
6437 const std::string& CPUStr = getCPU();
6438 if (CPUStr == "mips32")
6439 Builder.defineMacro("__mips_isa_rev", "1");
6440 else if (CPUStr == "mips32r2")
6441 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006442 else if (CPUStr == "mips32r3")
6443 Builder.defineMacro("__mips_isa_rev", "3");
6444 else if (CPUStr == "mips32r5")
6445 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006446 else if (CPUStr == "mips32r6")
6447 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006448
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006449 if (ABI == "o32") {
6450 Builder.defineMacro("__mips_o32");
6451 Builder.defineMacro("_ABIO32", "1");
6452 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6453 }
6454 else if (ABI == "eabi")
6455 Builder.defineMacro("__mips_eabi");
6456 else
David Blaikie83d382b2011-09-23 05:06:16 +00006457 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006458 }
Craig Topper3164f332014-03-11 03:39:26 +00006459 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6460 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006461 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6462 { { "at" }, "$1" },
6463 { { "v0" }, "$2" },
6464 { { "v1" }, "$3" },
6465 { { "a0" }, "$4" },
6466 { { "a1" }, "$5" },
6467 { { "a2" }, "$6" },
6468 { { "a3" }, "$7" },
6469 { { "t0" }, "$8" },
6470 { { "t1" }, "$9" },
6471 { { "t2" }, "$10" },
6472 { { "t3" }, "$11" },
6473 { { "t4" }, "$12" },
6474 { { "t5" }, "$13" },
6475 { { "t6" }, "$14" },
6476 { { "t7" }, "$15" },
6477 { { "s0" }, "$16" },
6478 { { "s1" }, "$17" },
6479 { { "s2" }, "$18" },
6480 { { "s3" }, "$19" },
6481 { { "s4" }, "$20" },
6482 { { "s5" }, "$21" },
6483 { { "s6" }, "$22" },
6484 { { "s7" }, "$23" },
6485 { { "t8" }, "$24" },
6486 { { "t9" }, "$25" },
6487 { { "k0" }, "$26" },
6488 { { "k1" }, "$27" },
6489 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006490 { { "sp","$sp" }, "$29" },
6491 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006492 { { "ra" }, "$31" }
6493 };
6494 Aliases = GCCRegAliases;
6495 NumAliases = llvm::array_lengthof(GCCRegAliases);
6496 }
6497};
6498
6499class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006500 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006501 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006502 }
6503
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006504public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006505 Mips32EBTargetInfo(const llvm::Triple &Triple)
6506 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006507 }
Craig Topper3164f332014-03-11 03:39:26 +00006508 void getTargetDefines(const LangOptions &Opts,
6509 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006510 DefineStd(Builder, "MIPSEB", Opts);
6511 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006512 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006513 }
6514};
6515
6516class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006517 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006518 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006519 }
6520
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006521public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006522 Mips32ELTargetInfo(const llvm::Triple &Triple)
6523 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006524 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006525 }
Craig Topper3164f332014-03-11 03:39:26 +00006526 void getTargetDefines(const LangOptions &Opts,
6527 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006528 DefineStd(Builder, "MIPSEL", Opts);
6529 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006530 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006531 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006532};
Akira Hatanakabef17452011-09-20 19:21:49 +00006533
6534class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006535public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006536 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006537 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006538 LongDoubleWidth = LongDoubleAlign = 128;
6539 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006540 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6541 LongDoubleWidth = LongDoubleAlign = 64;
6542 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6543 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006544 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006545 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006546 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006547 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006548
6549 void setN64ABITypes() {
6550 LongWidth = LongAlign = 64;
6551 PointerWidth = PointerAlign = 64;
6552 SizeType = UnsignedLong;
6553 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006554 Int64Type = SignedLong;
6555 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006556 }
6557
6558 void setN32ABITypes() {
6559 LongWidth = LongAlign = 32;
6560 PointerWidth = PointerAlign = 32;
6561 SizeType = UnsignedInt;
6562 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006563 Int64Type = SignedLongLong;
6564 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006565 }
6566
Craig Topper3164f332014-03-11 03:39:26 +00006567 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006568 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006569 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006570 ABI = Name;
6571 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006572 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006573 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006574 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006575 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006576 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006577 }
6578 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006579 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006580
Craig Topper3164f332014-03-11 03:39:26 +00006581 void getTargetDefines(const LangOptions &Opts,
6582 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006583 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006584
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006585 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006586 Builder.defineMacro("__mips64");
6587 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006588 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6589
6590 const std::string& CPUStr = getCPU();
6591 if (CPUStr == "mips64")
6592 Builder.defineMacro("__mips_isa_rev", "1");
6593 else if (CPUStr == "mips64r2")
6594 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006595 else if (CPUStr == "mips64r3")
6596 Builder.defineMacro("__mips_isa_rev", "3");
6597 else if (CPUStr == "mips64r5")
6598 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006599 else if (CPUStr == "mips64r6")
6600 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006601
Akira Hatanakabef17452011-09-20 19:21:49 +00006602 if (ABI == "n32") {
6603 Builder.defineMacro("__mips_n32");
6604 Builder.defineMacro("_ABIN32", "2");
6605 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6606 }
6607 else if (ABI == "n64") {
6608 Builder.defineMacro("__mips_n64");
6609 Builder.defineMacro("_ABI64", "3");
6610 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6611 }
6612 else
David Blaikie83d382b2011-09-23 05:06:16 +00006613 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006614 }
Craig Topper3164f332014-03-11 03:39:26 +00006615 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6616 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006617 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6618 { { "at" }, "$1" },
6619 { { "v0" }, "$2" },
6620 { { "v1" }, "$3" },
6621 { { "a0" }, "$4" },
6622 { { "a1" }, "$5" },
6623 { { "a2" }, "$6" },
6624 { { "a3" }, "$7" },
6625 { { "a4" }, "$8" },
6626 { { "a5" }, "$9" },
6627 { { "a6" }, "$10" },
6628 { { "a7" }, "$11" },
6629 { { "t0" }, "$12" },
6630 { { "t1" }, "$13" },
6631 { { "t2" }, "$14" },
6632 { { "t3" }, "$15" },
6633 { { "s0" }, "$16" },
6634 { { "s1" }, "$17" },
6635 { { "s2" }, "$18" },
6636 { { "s3" }, "$19" },
6637 { { "s4" }, "$20" },
6638 { { "s5" }, "$21" },
6639 { { "s6" }, "$22" },
6640 { { "s7" }, "$23" },
6641 { { "t8" }, "$24" },
6642 { { "t9" }, "$25" },
6643 { { "k0" }, "$26" },
6644 { { "k1" }, "$27" },
6645 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006646 { { "sp","$sp" }, "$29" },
6647 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006648 { { "ra" }, "$31" }
6649 };
6650 Aliases = GCCRegAliases;
6651 NumAliases = llvm::array_lengthof(GCCRegAliases);
6652 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006653
6654 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006655};
6656
6657class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006658 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006659 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006660 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 +00006661 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006662 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006663
Akira Hatanakabef17452011-09-20 19:21:49 +00006664 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006665
Akira Hatanakabef17452011-09-20 19:21:49 +00006666public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006667 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006668 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006669 void getTargetDefines(const LangOptions &Opts,
6670 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006671 DefineStd(Builder, "MIPSEB", Opts);
6672 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006673 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006674 }
6675};
6676
6677class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006678 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006679 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006680 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 +00006681 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006682 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006683 }
6684public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006685 Mips64ELTargetInfo(const llvm::Triple &Triple)
6686 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006687 // Default ABI is n64.
6688 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006689 }
Craig Topper3164f332014-03-11 03:39:26 +00006690 void getTargetDefines(const LangOptions &Opts,
6691 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006692 DefineStd(Builder, "MIPSEL", Opts);
6693 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006694 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006695 }
6696};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006697
Ivan Krasindd7403e2011-08-24 20:22:22 +00006698class PNaClTargetInfo : public TargetInfo {
6699public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006700 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006701 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006702 this->UserLabelPrefix = "";
6703 this->LongAlign = 32;
6704 this->LongWidth = 32;
6705 this->PointerAlign = 32;
6706 this->PointerWidth = 32;
6707 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006708 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006709 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006710 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006711 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006712 this->SizeType = TargetInfo::UnsignedInt;
6713 this->PtrDiffType = TargetInfo::SignedInt;
6714 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006715 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006716 }
6717
Craig Topper3164f332014-03-11 03:39:26 +00006718 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006719 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006720 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006721 Builder.defineMacro("__le32__");
6722 Builder.defineMacro("__pnacl__");
6723 }
Craig Topper3164f332014-03-11 03:39:26 +00006724 void getTargetDefines(const LangOptions &Opts,
6725 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006726 getArchDefines(Opts, Builder);
6727 }
Craig Topper3164f332014-03-11 03:39:26 +00006728 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006729 return Feature == "pnacl";
6730 }
Craig Topper3164f332014-03-11 03:39:26 +00006731 void getTargetBuiltins(const Builtin::Info *&Records,
6732 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006733 }
Craig Topper3164f332014-03-11 03:39:26 +00006734 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006735 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006736 }
Craig Topper3164f332014-03-11 03:39:26 +00006737 void getGCCRegNames(const char * const *&Names,
6738 unsigned &NumNames) const override;
6739 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6740 unsigned &NumAliases) const override;
6741 bool validateAsmConstraint(const char *&Name,
6742 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006743 return false;
6744 }
6745
Craig Topper3164f332014-03-11 03:39:26 +00006746 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006747 return "";
6748 }
6749};
6750
6751void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6752 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006753 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006754 NumNames = 0;
6755}
6756
6757void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6758 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006759 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006760 NumAliases = 0;
6761}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006762
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006763// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6764class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6765public:
6766 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
6767 Mips32ELTargetInfo(Triple) {
6768 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
6769 }
6770
6771 BuiltinVaListKind getBuiltinVaListKind() const override {
6772 return TargetInfo::PNaClABIBuiltinVaList;
6773 }
6774};
6775
JF Bastien643817d2014-09-12 17:52:47 +00006776class Le64TargetInfo : public TargetInfo {
6777 static const Builtin::Info BuiltinInfo[];
6778
6779public:
6780 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6781 BigEndian = false;
6782 NoAsmVariants = true;
6783 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6784 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6785 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006786 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006787 }
6788
6789 void getTargetDefines(const LangOptions &Opts,
6790 MacroBuilder &Builder) const override {
6791 DefineStd(Builder, "unix", Opts);
6792 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6793 Builder.defineMacro("__ELF__");
6794 }
6795 void getTargetBuiltins(const Builtin::Info *&Records,
6796 unsigned &NumRecords) const override {
6797 Records = BuiltinInfo;
6798 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6799 }
6800 BuiltinVaListKind getBuiltinVaListKind() const override {
6801 return TargetInfo::PNaClABIBuiltinVaList;
6802 }
6803 const char *getClobbers() const override { return ""; }
6804 void getGCCRegNames(const char *const *&Names,
6805 unsigned &NumNames) const override {
6806 Names = nullptr;
6807 NumNames = 0;
6808 }
6809 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6810 unsigned &NumAliases) const override {
6811 Aliases = nullptr;
6812 NumAliases = 0;
6813 }
6814 bool validateAsmConstraint(const char *&Name,
6815 TargetInfo::ConstraintInfo &Info) const override {
6816 return false;
6817 }
6818
6819 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006820};
6821} // end anonymous namespace.
6822
6823const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6824#define BUILTIN(ID, TYPE, ATTRS) \
6825 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6826#include "clang/Basic/BuiltinsLe64.def"
6827};
6828
6829namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006830 static const unsigned SPIRAddrSpaceMap[] = {
6831 1, // opencl_global
6832 3, // opencl_local
6833 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006834 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006835 0, // cuda_device
6836 0, // cuda_constant
6837 0 // cuda_shared
6838 };
6839 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006840 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006841 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006842 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6843 "SPIR target must use unknown OS");
6844 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6845 "SPIR target must use unknown environment type");
6846 BigEndian = false;
6847 TLSSupported = false;
6848 LongWidth = LongAlign = 64;
6849 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006850 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006851 // Define available target features
6852 // These must be defined in sorted order!
6853 NoAsmVariants = true;
6854 }
Craig Topper3164f332014-03-11 03:39:26 +00006855 void getTargetDefines(const LangOptions &Opts,
6856 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006857 DefineStd(Builder, "SPIR", Opts);
6858 }
Craig Topper3164f332014-03-11 03:39:26 +00006859 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006860 return Feature == "spir";
6861 }
Craig Topper3164f332014-03-11 03:39:26 +00006862
6863 void getTargetBuiltins(const Builtin::Info *&Records,
6864 unsigned &NumRecords) const override {}
6865 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006866 return "";
6867 }
Craig Topper3164f332014-03-11 03:39:26 +00006868 void getGCCRegNames(const char * const *&Names,
6869 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006870 bool
6871 validateAsmConstraint(const char *&Name,
6872 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006873 return true;
6874 }
Craig Topper3164f332014-03-11 03:39:26 +00006875 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6876 unsigned &NumAliases) const override {}
6877 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006878 return TargetInfo::VoidPtrBuiltinVaList;
6879 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006880
6881 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6882 return (CC == CC_SpirFunction ||
6883 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6884 }
6885
6886 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6887 return CC_SpirFunction;
6888 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006889 };
6890
6891
6892 class SPIR32TargetInfo : public SPIRTargetInfo {
6893 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006894 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006895 PointerWidth = PointerAlign = 32;
6896 SizeType = TargetInfo::UnsignedInt;
6897 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6898 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006899 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6900 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006901 }
Craig Topper3164f332014-03-11 03:39:26 +00006902 void getTargetDefines(const LangOptions &Opts,
6903 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006904 DefineStd(Builder, "SPIR32", Opts);
6905 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006906 };
6907
6908 class SPIR64TargetInfo : public SPIRTargetInfo {
6909 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006911 PointerWidth = PointerAlign = 64;
6912 SizeType = TargetInfo::UnsignedLong;
6913 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006914 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6915 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006916 }
Craig Topper3164f332014-03-11 03:39:26 +00006917 void getTargetDefines(const LangOptions &Opts,
6918 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006919 DefineStd(Builder, "SPIR64", Opts);
6920 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006921 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006922
Robert Lytton0e076492013-08-13 09:43:10 +00006923class XCoreTargetInfo : public TargetInfo {
6924 static const Builtin::Info BuiltinInfo[];
6925public:
6926 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6927 BigEndian = false;
6928 NoAsmVariants = true;
6929 LongLongAlign = 32;
6930 SuitableAlign = 32;
6931 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006932 SizeType = UnsignedInt;
6933 PtrDiffType = SignedInt;
6934 IntPtrType = SignedInt;
6935 WCharType = UnsignedChar;
6936 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006937 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006938 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 +00006939 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006940 }
Craig Topper3164f332014-03-11 03:39:26 +00006941 void getTargetDefines(const LangOptions &Opts,
6942 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006943 Builder.defineMacro("__XS1B__");
6944 }
Craig Topper3164f332014-03-11 03:39:26 +00006945 void getTargetBuiltins(const Builtin::Info *&Records,
6946 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006947 Records = BuiltinInfo;
6948 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6949 }
Craig Topper3164f332014-03-11 03:39:26 +00006950 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006951 return TargetInfo::VoidPtrBuiltinVaList;
6952 }
Craig Topper3164f332014-03-11 03:39:26 +00006953 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006954 return "";
6955 }
Craig Topper3164f332014-03-11 03:39:26 +00006956 void getGCCRegNames(const char * const *&Names,
6957 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006958 static const char * const GCCRegNames[] = {
6959 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6960 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6961 };
6962 Names = GCCRegNames;
6963 NumNames = llvm::array_lengthof(GCCRegNames);
6964 }
Craig Topper3164f332014-03-11 03:39:26 +00006965 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6966 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006967 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006968 NumAliases = 0;
6969 }
Craig Topper3164f332014-03-11 03:39:26 +00006970 bool validateAsmConstraint(const char *&Name,
6971 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006972 return false;
6973 }
Craig Topper3164f332014-03-11 03:39:26 +00006974 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006975 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6976 return (RegNo < 2)? RegNo : -1;
6977 }
Robert Lytton0e076492013-08-13 09:43:10 +00006978};
6979
6980const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6981#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6982#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6983 ALL_LANGUAGES },
6984#include "clang/Basic/BuiltinsXCore.def"
6985};
6986} // end anonymous namespace.
6987
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006988namespace {
6989// x86_32 Android target
6990class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6991public:
6992 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6993 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6994 SuitableAlign = 32;
6995 LongDoubleWidth = 64;
6996 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6997 }
6998};
6999} // end anonymous namespace
7000
7001namespace {
7002// x86_64 Android target
7003class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7004public:
7005 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7006 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7007 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7008 }
7009};
7010} // end anonymous namespace
7011
Ivan Krasindd7403e2011-08-24 20:22:22 +00007012
Chris Lattner5ba61f02006-10-14 07:39:34 +00007013//===----------------------------------------------------------------------===//
7014// Driver code
7015//===----------------------------------------------------------------------===//
7016
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007017static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007018 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007019
Daniel Dunbar52322032009-08-18 05:47:58 +00007020 switch (Triple.getArch()) {
7021 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007022 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007023
Tim Northover2a0783d2014-05-30 14:14:07 +00007024 case llvm::Triple::xcore:
7025 return new XCoreTargetInfo(Triple);
7026
7027 case llvm::Triple::hexagon:
7028 return new HexagonTargetInfo(Triple);
7029
7030 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007031 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007032 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007033
7034 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007035 case llvm::Triple::FreeBSD:
7036 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007037 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007038 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007039 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007040 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007041 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007042 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007043 }
7044
Christian Pirker9b019ae2014-02-25 13:51:00 +00007045 case llvm::Triple::aarch64_be:
7046 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007047 case llvm::Triple::FreeBSD:
7048 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007049 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007050 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007051 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007052 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007053 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007054 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007055 }
7056
Daniel Dunbar52322032009-08-18 05:47:58 +00007057 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007058 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007059 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007060 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007061
Daniel Dunbar52322032009-08-18 05:47:58 +00007062 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007063 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007064 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007065 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007066 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007067 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007068 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007069 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007070 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007071 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007072 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007073 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007074 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007075 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007076 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007077 case llvm::Triple::Win32:
7078 switch (Triple.getEnvironment()) {
7079 default:
7080 return new ARMleTargetInfo(Triple);
Yaron Keren321249c2015-07-15 13:32:23 +00007081 case llvm::Triple::Cygnus:
7082 return new CygwinARMTargetInfo(Triple);
7083 case llvm::Triple::GNU:
7084 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007085 case llvm::Triple::Itanium:
7086 return new ItaniumWindowsARMleTargetInfo(Triple);
7087 case llvm::Triple::MSVC:
7088 return new MicrosoftARMleTargetInfo(Triple);
7089 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007090 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007091 return new ARMleTargetInfo(Triple);
7092 }
7093
7094 case llvm::Triple::armeb:
7095 case llvm::Triple::thumbeb:
7096 if (Triple.isOSDarwin())
7097 return new DarwinARMTargetInfo(Triple);
7098
7099 switch (os) {
7100 case llvm::Triple::Linux:
7101 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7102 case llvm::Triple::FreeBSD:
7103 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7104 case llvm::Triple::NetBSD:
7105 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7106 case llvm::Triple::OpenBSD:
7107 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7108 case llvm::Triple::Bitrig:
7109 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7110 case llvm::Triple::RTEMS:
7111 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7112 case llvm::Triple::NaCl:
7113 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7114 default:
7115 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007116 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007117
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007118 case llvm::Triple::bpfeb:
7119 case llvm::Triple::bpfel:
7120 return new BPFTargetInfo(Triple);
7121
Daniel Dunbar52322032009-08-18 05:47:58 +00007122 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007123 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007124
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007125 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007126 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007127 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007128 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007129 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007130 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007131 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007132 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007133 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007134 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007135 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007136 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007137 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007138
7139 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007140 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007141 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007142 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007143 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007144 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007145 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007146 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007147 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007148 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007149 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007150 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007151 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007152 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007153 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007154
Akira Hatanakabef17452011-09-20 19:21:49 +00007155 case llvm::Triple::mips64:
7156 switch (os) {
7157 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007158 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007159 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007160 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007161 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007162 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007163 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007164 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007165 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007166 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007167 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007168 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007169 }
7170
7171 case llvm::Triple::mips64el:
7172 switch (os) {
7173 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007174 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007175 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007176 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007177 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007178 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007179 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007180 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007181 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007182 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007183 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007184 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007185 }
7186
Ivan Krasindd7403e2011-08-24 20:22:22 +00007187 case llvm::Triple::le32:
7188 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007189 case llvm::Triple::NaCl:
7190 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7191 default:
7192 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007193 }
7194
JF Bastien643817d2014-09-12 17:52:47 +00007195 case llvm::Triple::le64:
7196 return new Le64TargetInfo(Triple);
7197
Daniel Dunbar52322032009-08-18 05:47:58 +00007198 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007199 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007200 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007201 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007202 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007203 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007204 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007205 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007206 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007207 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007208 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007209 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007210 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007211 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007212 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007213 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007214 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007215
7216 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007217 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007218 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007219 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007220 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007221 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007222 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007223 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007224 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007225 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007226 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007227 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007228 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007229 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007230 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007231
Bill Schmidt778d3872013-07-26 01:36:11 +00007232 case llvm::Triple::ppc64le:
7233 switch (os) {
7234 case llvm::Triple::Linux:
7235 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007236 case llvm::Triple::NetBSD:
7237 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007238 default:
7239 return new PPC64TargetInfo(Triple);
7240 }
7241
Peter Collingbournec947aae2012-05-20 23:28:41 +00007242 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007243 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007244 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007245 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007246
Tom Stellardd8e38a32015-01-06 20:34:47 +00007247 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007248 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007249 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007250
Daniel Dunbar52322032009-08-18 05:47:58 +00007251 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007252 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007253 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007254 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007255 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007256 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007257 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007258 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007259 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007260 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007261 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007262 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007263 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007264 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007265 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007266
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007267 // The 'sparcel' architecture copies all the above cases except for Solaris.
7268 case llvm::Triple::sparcel:
7269 switch (os) {
7270 case llvm::Triple::Linux:
7271 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7272 case llvm::Triple::NetBSD:
7273 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7274 case llvm::Triple::OpenBSD:
7275 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7276 case llvm::Triple::RTEMS:
7277 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7278 default:
7279 return new SparcV8elTargetInfo(Triple);
7280 }
7281
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007282 case llvm::Triple::sparcv9:
7283 switch (os) {
7284 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007285 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007286 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007287 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007288 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007289 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007290 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007291 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007292 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007293 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007294 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007295 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007296 }
7297
Ulrich Weigand47445072013-05-06 16:26:41 +00007298 case llvm::Triple::systemz:
7299 switch (os) {
7300 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007301 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007302 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007303 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007304 }
7305
Eli Friedmana9c3d712009-08-19 20:47:07 +00007306 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007307 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007308
Daniel Dunbar52322032009-08-18 05:47:58 +00007309 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007310 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007311 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007312
Daniel Dunbar52322032009-08-18 05:47:58 +00007313 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007314 case llvm::Triple::CloudABI:
7315 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007316 case llvm::Triple::Linux: {
7317 switch (Triple.getEnvironment()) {
7318 default:
7319 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7320 case llvm::Triple::Android:
7321 return new AndroidX86_32TargetInfo(Triple);
7322 }
7323 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007324 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007325 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007326 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007327 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007328 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007329 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007330 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007331 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007332 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007333 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007334 case llvm::Triple::KFreeBSD:
7335 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007336 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007337 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007338 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007339 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007340 case llvm::Triple::Win32: {
7341 switch (Triple.getEnvironment()) {
7342 default:
7343 return new X86_32TargetInfo(Triple);
7344 case llvm::Triple::Cygnus:
7345 return new CygwinX86_32TargetInfo(Triple);
7346 case llvm::Triple::GNU:
7347 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007348 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007349 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007350 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007351 }
7352 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007353 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007354 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007355 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007356 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007357 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007358 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007359 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007360 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007361 }
7362
7363 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007364 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007365 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007366
Daniel Dunbar52322032009-08-18 05:47:58 +00007367 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007368 case llvm::Triple::CloudABI:
7369 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007370 case llvm::Triple::Linux: {
7371 switch (Triple.getEnvironment()) {
7372 default:
7373 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7374 case llvm::Triple::Android:
7375 return new AndroidX86_64TargetInfo(Triple);
7376 }
7377 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007378 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007379 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007380 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007381 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007382 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007383 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007384 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007385 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007386 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007387 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007388 case llvm::Triple::KFreeBSD:
7389 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007390 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007391 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007392 case llvm::Triple::Win32: {
7393 switch (Triple.getEnvironment()) {
7394 default:
7395 return new X86_64TargetInfo(Triple);
7396 case llvm::Triple::GNU:
7397 return new MinGWX86_64TargetInfo(Triple);
7398 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007399 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007400 }
7401 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007402 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007403 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007404 case llvm::Triple::PS4:
7405 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007406 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007407 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007408 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007409
Douglas Katzman78d7c542015-05-12 21:18:10 +00007410 case llvm::Triple::spir: {
7411 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7412 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7413 return nullptr;
7414 return new SPIR32TargetInfo(Triple);
7415 }
7416 case llvm::Triple::spir64: {
7417 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7418 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7419 return nullptr;
7420 return new SPIR64TargetInfo(Triple);
7421 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007422 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007423}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007424
7425/// CreateTargetInfo - Return the target info object for the specified target
7426/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007427TargetInfo *
7428TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7429 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007430 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007431
7432 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007433 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007434 if (!Target) {
7435 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007436 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007437 }
Alp Toker80758082014-07-06 05:26:44 +00007438 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007439
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007440 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007441 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7442 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007443 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007444 }
7445
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007446 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007447 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7448 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007449 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007450 }
7451
Rafael Espindolaeb265472013-08-21 21:59:03 +00007452 // Set the fp math unit.
7453 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7454 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007455 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007456 }
7457
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007458 // Compute the default target features, we need the target to handle this
7459 // because features may have dependencies on one another.
7460 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007461 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007462
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007463 // Apply the user specified deltas.
7464 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7465 I < N; ++I) {
7466 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007467 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007468 bool Enabled = Name[0] == '+';
7469 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007470 }
7471
7472 // Add the features to the compile options.
7473 //
7474 // FIXME: If we are completely confident that we have the right set, we only
7475 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007476 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007477 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7478 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007479 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007480 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007481 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007482
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007483 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007484}