blob: b4b8ec007db40f6d09e82abb5c88adc2e8b2bdab [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"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.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.
Will Dietzf54319c2013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Chris Lattner30ba6742009-08-10 19:03:04 +0000186namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187template<typename Target>
188class DarwinTargetInfo : public OSTargetInfo<Target> {
189protected:
Craig Topper3164f332014-03-11 03:39:26 +0000190 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
191 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000192 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000193 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000194 }
Mike Stump11289f42009-09-09 15:08:12 +0000195
Torok Edwinb2b37c62009-06-30 17:10:35 +0000196public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000197 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
198 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
199 this->MCountName = "\01mcount";
200 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000201
Craig Topper3164f332014-03-11 03:39:26 +0000202 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000203 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000204 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000205 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000206 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000207 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000208 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000209 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000210
Craig Topper3164f332014-03-11 03:39:26 +0000211 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000212 // FIXME: We should return 0 when building kexts.
213 return "__TEXT,__StaticInit,regular,pure_instructions";
214 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000215
John McCalleed64c72012-01-29 01:20:30 +0000216 /// Darwin does not support protected visibility. Darwin's "default"
217 /// is very similar to ELF's "protected"; Darwin requires a "weak"
218 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000219 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000220 return false;
221 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222};
223
Chris Lattner30ba6742009-08-10 19:03:04 +0000224
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225// DragonFlyBSD Target
226template<typename Target>
227class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
228protected:
Craig Topper3164f332014-03-11 03:39:26 +0000229 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
230 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000231 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000232 Builder.defineMacro("__DragonFly__");
233 Builder.defineMacro("__DragonFly_cc_version", "100001");
234 Builder.defineMacro("__ELF__");
235 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
236 Builder.defineMacro("__tune_i386__");
237 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000238 }
239public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000240 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
241 : OSTargetInfo<Target>(Triple) {
242 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000243
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000244 switch (Triple.getArch()) {
245 default:
246 case llvm::Triple::x86:
247 case llvm::Triple::x86_64:
248 this->MCountName = ".mcount";
249 break;
250 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000251 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000252};
253
254// FreeBSD Target
255template<typename Target>
256class FreeBSDTargetInfo : public OSTargetInfo<Target> {
257protected:
Craig Topper3164f332014-03-11 03:39:26 +0000258 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
259 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 // FreeBSD defines; list based off of gcc output
261
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000262 unsigned Release = Triple.getOSMajorVersion();
263 if (Release == 0U)
264 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000265
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000266 Builder.defineMacro("__FreeBSD__", Twine(Release));
267 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000268 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
269 DefineStd(Builder, "unix", Opts);
270 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000271
272 // On FreeBSD, wchar_t contains the number of the code point as
273 // used by the character set of the locale. These character sets are
274 // not necessarily a superset of ASCII.
275 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000276 }
277public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000278 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
279 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000280
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000281 switch (Triple.getArch()) {
282 default:
283 case llvm::Triple::x86:
284 case llvm::Triple::x86_64:
285 this->MCountName = ".mcount";
286 break;
287 case llvm::Triple::mips:
288 case llvm::Triple::mipsel:
289 case llvm::Triple::ppc:
290 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000291 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000292 this->MCountName = "_mcount";
293 break;
294 case llvm::Triple::arm:
295 this->MCountName = "__mcount";
296 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000297 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000298 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000299};
300
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000301// GNU/kFreeBSD Target
302template<typename Target>
303class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
304protected:
Craig Topper3164f332014-03-11 03:39:26 +0000305 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
306 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000307 // GNU/kFreeBSD defines; list based off of gcc output
308
309 DefineStd(Builder, "unix", Opts);
310 Builder.defineMacro("__FreeBSD_kernel__");
311 Builder.defineMacro("__GLIBC__");
312 Builder.defineMacro("__ELF__");
313 if (Opts.POSIXThreads)
314 Builder.defineMacro("_REENTRANT");
315 if (Opts.CPlusPlus)
316 Builder.defineMacro("_GNU_SOURCE");
317 }
318public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000319 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000320 this->UserLabelPrefix = "";
321 }
322};
323
Chris Lattner3e2ee142010-07-07 16:01:42 +0000324// Minix Target
325template<typename Target>
326class MinixTargetInfo : public OSTargetInfo<Target> {
327protected:
Craig Topper3164f332014-03-11 03:39:26 +0000328 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
329 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000330 // Minix defines
331
332 Builder.defineMacro("__minix", "3");
333 Builder.defineMacro("_EM_WSIZE", "4");
334 Builder.defineMacro("_EM_PSIZE", "4");
335 Builder.defineMacro("_EM_SSIZE", "2");
336 Builder.defineMacro("_EM_LSIZE", "4");
337 Builder.defineMacro("_EM_FSIZE", "4");
338 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000339 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000340 DefineStd(Builder, "unix", Opts);
341 }
342public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
344 this->UserLabelPrefix = "";
345 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000346};
347
Torok Edwinb2b37c62009-06-30 17:10:35 +0000348// Linux target
349template<typename Target>
350class LinuxTargetInfo : public OSTargetInfo<Target> {
351protected:
Craig Topper3164f332014-03-11 03:39:26 +0000352 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
353 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000354 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000355 DefineStd(Builder, "unix", Opts);
356 DefineStd(Builder, "linux", Opts);
357 Builder.defineMacro("__gnu_linux__");
358 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000359 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000360 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000361 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000362 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000363 if (Opts.CPlusPlus)
364 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000365 }
366public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000367 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000369 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000370
371 switch (Triple.getArch()) {
372 default:
373 break;
374 case llvm::Triple::ppc:
375 case llvm::Triple::ppc64:
376 case llvm::Triple::ppc64le:
377 this->MCountName = "_mcount";
378 break;
379 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000380 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000381
Craig Topper3164f332014-03-11 03:39:26 +0000382 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000383 return ".text.startup";
384 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000385};
386
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000387// NetBSD Target
388template<typename Target>
389class NetBSDTargetInfo : public OSTargetInfo<Target> {
390protected:
Craig Topper3164f332014-03-11 03:39:26 +0000391 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
392 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000393 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 Builder.defineMacro("__NetBSD__");
395 Builder.defineMacro("__unix__");
396 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000397 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000398 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000399
400 switch (Triple.getArch()) {
401 default:
402 break;
403 case llvm::Triple::arm:
404 case llvm::Triple::armeb:
405 case llvm::Triple::thumb:
406 case llvm::Triple::thumbeb:
407 Builder.defineMacro("__ARM_DWARF_EH__");
408 break;
409 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000410 }
411public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000412 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
413 this->UserLabelPrefix = "";
414 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000415};
416
Torok Edwinb2b37c62009-06-30 17:10:35 +0000417// OpenBSD Target
418template<typename Target>
419class OpenBSDTargetInfo : public OSTargetInfo<Target> {
420protected:
Craig Topper3164f332014-03-11 03:39:26 +0000421 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
422 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000423 // OpenBSD defines; list based off of gcc output
424
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000425 Builder.defineMacro("__OpenBSD__");
426 DefineStd(Builder, "unix", Opts);
427 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000428 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000429 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000430 }
431public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000432 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
433 this->UserLabelPrefix = "";
434 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000435
Eli Friedman3715d1f2011-12-15 02:15:56 +0000436 switch (Triple.getArch()) {
437 default:
438 case llvm::Triple::x86:
439 case llvm::Triple::x86_64:
440 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000441 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000442 this->MCountName = "__mcount";
443 break;
444 case llvm::Triple::mips64:
445 case llvm::Triple::mips64el:
446 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000447 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000448 this->MCountName = "_mcount";
449 break;
450 }
451 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000452};
453
Eli Friedman9fa28852012-08-08 23:57:20 +0000454// Bitrig Target
455template<typename Target>
456class BitrigTargetInfo : public OSTargetInfo<Target> {
457protected:
Craig Topper3164f332014-03-11 03:39:26 +0000458 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
459 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000460 // Bitrig defines; list based off of gcc output
461
462 Builder.defineMacro("__Bitrig__");
463 DefineStd(Builder, "unix", Opts);
464 Builder.defineMacro("__ELF__");
465 if (Opts.POSIXThreads)
466 Builder.defineMacro("_REENTRANT");
467 }
468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000469 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
470 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000471 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000472 }
473};
474
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000475// PSP Target
476template<typename Target>
477class PSPTargetInfo : public OSTargetInfo<Target> {
478protected:
Craig Topper3164f332014-03-11 03:39:26 +0000479 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
480 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000481 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000482 Builder.defineMacro("PSP");
483 Builder.defineMacro("_PSP");
484 Builder.defineMacro("__psp__");
485 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000486 }
487public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000488 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000489 this->UserLabelPrefix = "";
490 }
491};
492
John Thompsone467e192009-11-19 17:18:50 +0000493// PS3 PPU Target
494template<typename Target>
495class PS3PPUTargetInfo : public OSTargetInfo<Target> {
496protected:
Craig Topper3164f332014-03-11 03:39:26 +0000497 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
498 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000499 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000500 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000501 Builder.defineMacro("__PPU__");
502 Builder.defineMacro("__CELLOS_LV2__");
503 Builder.defineMacro("__ELF__");
504 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000505 Builder.defineMacro("_ARCH_PPC64");
506 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000507 }
508public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000509 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000510 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000511 this->LongWidth = this->LongAlign = 32;
512 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000513 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000514 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000515 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000516 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000517 }
518};
519
Torok Edwinb2b37c62009-06-30 17:10:35 +0000520// Solaris target
521template<typename Target>
522class SolarisTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000526 DefineStd(Builder, "sun", Opts);
527 DefineStd(Builder, "unix", Opts);
528 Builder.defineMacro("__ELF__");
529 Builder.defineMacro("__svr4__");
530 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000531 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
532 // newer, but to 500 for everything else. feature_test.h has a check to
533 // ensure that you are not using C99 with an old version of X/Open or C89
534 // with a new version.
535 if (Opts.C99 || Opts.C11)
536 Builder.defineMacro("_XOPEN_SOURCE", "600");
537 else
538 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000539 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000540 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000541 Builder.defineMacro("_LARGEFILE_SOURCE");
542 Builder.defineMacro("_LARGEFILE64_SOURCE");
543 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000544 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000545 }
546public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000547 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000549 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 // FIXME: WIntType should be SignedLong
551 }
552};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000553
554// Windows target
555template<typename Target>
556class WindowsTargetInfo : public OSTargetInfo<Target> {
557protected:
Craig Topper3164f332014-03-11 03:39:26 +0000558 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
559 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000560 Builder.defineMacro("_WIN32");
561 }
562 void getVisualStudioDefines(const LangOptions &Opts,
563 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000564 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000565 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000566 Builder.defineMacro("_CPPRTTI");
567
568 if (Opts.Exceptions)
569 Builder.defineMacro("_CPPUNWIND");
570 }
571
572 if (!Opts.CharIsSigned)
573 Builder.defineMacro("_CHAR_UNSIGNED");
574
575 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
576 // but it works for now.
577 if (Opts.POSIXThreads)
578 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000579
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000580 if (Opts.MSCompatibilityVersion) {
581 Builder.defineMacro("_MSC_VER",
582 Twine(Opts.MSCompatibilityVersion / 100000));
583 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000584 // FIXME We cannot encode the revision information into 32-bits
585 Builder.defineMacro("_MSC_BUILD", Twine(1));
586 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000587
588 if (Opts.MicrosoftExt) {
589 Builder.defineMacro("_MSC_EXTENSIONS");
590
591 if (Opts.CPlusPlus11) {
592 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
593 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
594 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
595 }
596 }
597
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000598 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000599 }
600
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000602 WindowsTargetInfo(const llvm::Triple &Triple)
603 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000604};
605
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000606template <typename Target>
607class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000608protected:
Craig Topper3164f332014-03-11 03:39:26 +0000609 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
610 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000611 if (Opts.POSIXThreads)
612 Builder.defineMacro("_REENTRANT");
613 if (Opts.CPlusPlus)
614 Builder.defineMacro("_GNU_SOURCE");
615
616 DefineStd(Builder, "unix", Opts);
617 Builder.defineMacro("__ELF__");
618 Builder.defineMacro("__native_client__");
619 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620
621public:
622 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000623 this->UserLabelPrefix = "";
624 this->LongAlign = 32;
625 this->LongWidth = 32;
626 this->PointerAlign = 32;
627 this->PointerWidth = 32;
628 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000629 this->Int64Type = TargetInfo::SignedLongLong;
630 this->DoubleAlign = 64;
631 this->LongDoubleWidth = 64;
632 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000633 this->LongLongWidth = 64;
634 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000635 this->SizeType = TargetInfo::UnsignedInt;
636 this->PtrDiffType = TargetInfo::SignedInt;
637 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000638 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000639 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000640 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000641 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000642 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000643 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000644 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000645 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000646 } else if (Triple.getArch() == llvm::Triple::mipsel) {
647 // Handled on mips' setDescriptionString.
648 } else {
649 assert(Triple.getArch() == llvm::Triple::le32);
650 this->DescriptionString = "e-p:32:32-i64:64";
651 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000652 }
Craig Topper3164f332014-03-11 03:39:26 +0000653 typename Target::CallingConvCheckResult checkCallingConvention(
654 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000655 return CC == CC_PnaclCall ? Target::CCCR_OK :
656 Target::checkCallingConvention(CC);
657 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000658};
Mike Stump11289f42009-09-09 15:08:12 +0000659} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000660
Chris Lattner09d98f52008-10-05 21:50:58 +0000661//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000662// Specific target implementations.
663//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000664
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000665namespace {
666// PPC abstract base class
667class PPCTargetInfo : public TargetInfo {
668 static const Builtin::Info BuiltinInfo[];
669 static const char * const GCCRegNames[];
670 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000671 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000672
673 // Target cpu features.
674 bool HasVSX;
675
Ulrich Weigand8afad612014-07-28 13:17:52 +0000676protected:
677 std::string ABI;
678
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000679public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000680 PPCTargetInfo(const llvm::Triple &Triple)
681 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000682 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000683 LongDoubleWidth = LongDoubleAlign = 128;
684 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
685 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000686
Hal Finkel6b984f02012-07-03 16:51:04 +0000687 /// \brief Flags for architecture specific defines.
688 typedef enum {
689 ArchDefineNone = 0,
690 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
691 ArchDefinePpcgr = 1 << 1,
692 ArchDefinePpcsq = 1 << 2,
693 ArchDefine440 = 1 << 3,
694 ArchDefine603 = 1 << 4,
695 ArchDefine604 = 1 << 5,
696 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000697 ArchDefinePwr5 = 1 << 7,
698 ArchDefinePwr5x = 1 << 8,
699 ArchDefinePwr6 = 1 << 9,
700 ArchDefinePwr6x = 1 << 10,
701 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000702 ArchDefinePwr8 = 1 << 12,
703 ArchDefineA2 = 1 << 13,
704 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000705 } ArchDefineTypes;
706
Bill Schmidt38378a02013-02-01 20:23:10 +0000707 // Note: GCC recognizes the following additional cpus:
708 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
709 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
710 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000711 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000712 bool CPUKnown = llvm::StringSwitch<bool>(Name)
713 .Case("generic", true)
714 .Case("440", true)
715 .Case("450", true)
716 .Case("601", true)
717 .Case("602", true)
718 .Case("603", true)
719 .Case("603e", true)
720 .Case("603ev", true)
721 .Case("604", true)
722 .Case("604e", true)
723 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000724 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000725 .Case("g3", true)
726 .Case("7400", true)
727 .Case("g4", true)
728 .Case("7450", true)
729 .Case("g4+", true)
730 .Case("750", true)
731 .Case("970", true)
732 .Case("g5", true)
733 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000734 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000735 .Case("e500mc", true)
736 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000737 .Case("power3", true)
738 .Case("pwr3", true)
739 .Case("power4", true)
740 .Case("pwr4", true)
741 .Case("power5", true)
742 .Case("pwr5", true)
743 .Case("power5x", true)
744 .Case("pwr5x", true)
745 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000746 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000747 .Case("power6x", true)
748 .Case("pwr6x", true)
749 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000750 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000751 .Case("power8", true)
752 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000753 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000754 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000755 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000756 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000757 .Case("powerpc64le", true)
758 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000759 .Default(false);
760
761 if (CPUKnown)
762 CPU = Name;
763
764 return CPUKnown;
765 }
766
Ulrich Weigand8afad612014-07-28 13:17:52 +0000767
768 StringRef getABI() const override { return ABI; }
769
Craig Topper3164f332014-03-11 03:39:26 +0000770 void getTargetBuiltins(const Builtin::Info *&Records,
771 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000772 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000773 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000774 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000775
Craig Topper3164f332014-03-11 03:39:26 +0000776 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000777
Craig Topper3164f332014-03-11 03:39:26 +0000778 void getTargetDefines(const LangOptions &Opts,
779 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000780
Craig Topper3164f332014-03-11 03:39:26 +0000781 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000782
Craig Topper3164f332014-03-11 03:39:26 +0000783 bool handleTargetFeatures(std::vector<std::string> &Features,
784 DiagnosticsEngine &Diags) override;
785 bool hasFeature(StringRef Feature) const override;
786
787 void getGCCRegNames(const char * const *&Names,
788 unsigned &NumNames) const override;
789 void getGCCRegAliases(const GCCRegAlias *&Aliases,
790 unsigned &NumAliases) const override;
791 bool validateAsmConstraint(const char *&Name,
792 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000793 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000794 default: return false;
795 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000796 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000797 case 'b': // Base register
798 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000799 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000800 break;
801 // FIXME: The following are added to allow parsing.
802 // I just took a guess at what the actions should be.
803 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000804 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000805 case 'v': // Altivec vector register
806 Info.setAllowsRegister();
807 break;
808 case 'w':
809 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000810 case 'd':// VSX vector register to hold vector double data
811 case 'f':// VSX vector register to hold vector float data
812 case 's':// VSX vector register to hold scalar float data
813 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000814 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000815 break;
816 default:
817 return false;
818 }
819 Info.setAllowsRegister();
820 Name++; // Skip over 'w'.
821 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000822 case 'h': // `MQ', `CTR', or `LINK' register
823 case 'q': // `MQ' register
824 case 'c': // `CTR' register
825 case 'l': // `LINK' register
826 case 'x': // `CR' register (condition register) number 0
827 case 'y': // `CR' register (condition register)
828 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000829 Info.setAllowsRegister();
830 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000831 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000832 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000833 // (use `L' instead for SImode constants)
834 case 'K': // Unsigned 16-bit constant
835 case 'L': // Signed 16-bit constant shifted left 16 bits
836 case 'M': // Constant larger than 31
837 case 'N': // Exact power of 2
838 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000839 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000840 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000841 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000843 break;
844 case 'm': // Memory operand. Note that on PowerPC targets, m can
845 // include addresses that update the base register. It
846 // is therefore only safe to use `m' in an asm statement
847 // if that asm statement accesses the operand exactly once.
848 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000849 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000850 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000851 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000852 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000853 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
854 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000855 // register to be updated.
856 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000857 if (Name[1] != 's')
858 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000859 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000860 // include any automodification of the base register. Unlike
861 // `m', this constraint can be used in asm statements that
862 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000863 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000864 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000865 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000866 break;
867 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000868 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000869 case 'Z': // Memory operand that is an indexed or indirect from a
870 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000871 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000872 Info.setAllowsMemory();
873 Info.setAllowsRegister();
874 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000875 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000876 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000877 // register (`p' is preferable for asm statements)
878 case 'S': // Constant suitable as a 64-bit mask operand
879 case 'T': // Constant suitable as a 32-bit mask operand
880 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000881 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 // instructions
883 case 'W': // Vector constant that does not require memory
884 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000885 break;
886 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000887 }
John Thompson07a61a42010-06-24 22:44:13 +0000888 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000889 }
Craig Topper3164f332014-03-11 03:39:26 +0000890 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000891 std::string R;
892 switch (*Constraint) {
893 case 'e':
894 case 'w':
895 // Two-character constraint; add "^" hint for later parsing.
896 R = std::string("^") + std::string(Constraint, 2);
897 Constraint++;
898 break;
899 default:
900 return TargetInfo::convertConstraint(Constraint);
901 }
902 return R;
903 }
Craig Topper3164f332014-03-11 03:39:26 +0000904 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000905 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000906 }
Craig Topper3164f332014-03-11 03:39:26 +0000907 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000908 if (RegNo == 0) return 3;
909 if (RegNo == 1) return 4;
910 return -1;
911 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000912};
Anders Carlssonf511f642007-11-27 04:11:28 +0000913
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000914const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000915#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000916#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000917 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000918#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000919};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000920
Eric Christopher3ff21b32013-10-16 21:26:26 +0000921 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000922/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000923bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000924 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000925 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
926 // Ignore disabled features.
927 if (Features[i][0] == '-')
928 continue;
929
930 StringRef Feature = StringRef(Features[i]).substr(1);
931
932 if (Feature == "vsx") {
933 HasVSX = true;
934 continue;
935 }
936
937 // TODO: Finish this list and add an assert that we've handled them
938 // all.
939 }
940
941 return true;
942}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000943
Chris Lattnerecd49032009-03-02 22:27:17 +0000944/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
945/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000946void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000947 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000948 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000949 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000950 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000951 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000952 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000953 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000954 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000955 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000956 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000957 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000958 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000959 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000960
Chris Lattnerecd49032009-03-02 22:27:17 +0000961 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000962 if (getTriple().getArch() == llvm::Triple::ppc64le) {
963 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000964 } else {
965 if (getTriple().getOS() != llvm::Triple::NetBSD &&
966 getTriple().getOS() != llvm::Triple::OpenBSD)
967 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000968 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000969
Ulrich Weigand8afad612014-07-28 13:17:52 +0000970 // ABI options.
971 if (ABI == "elfv1")
972 Builder.defineMacro("_CALL_ELF", "1");
973 if (ABI == "elfv2")
974 Builder.defineMacro("_CALL_ELF", "2");
975
Chris Lattnerecd49032009-03-02 22:27:17 +0000976 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000977 Builder.defineMacro("__NATURAL_ALIGNMENT__");
978 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000979
Chris Lattnerecd49032009-03-02 22:27:17 +0000980 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000981 if (LongDoubleWidth == 128)
982 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000983
John Thompsone467e192009-11-19 17:18:50 +0000984 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000985 Builder.defineMacro("__VEC__", "10206");
986 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000987 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000988
989 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000990 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
991 .Case("440", ArchDefineName)
992 .Case("450", ArchDefineName | ArchDefine440)
993 .Case("601", ArchDefineName)
994 .Case("602", ArchDefineName | ArchDefinePpcgr)
995 .Case("603", ArchDefineName | ArchDefinePpcgr)
996 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
997 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
998 .Case("604", ArchDefineName | ArchDefinePpcgr)
999 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1000 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001001 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001002 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1003 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1004 .Case("750", ArchDefineName | ArchDefinePpcgr)
1005 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1006 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001007 .Case("a2", ArchDefineA2)
1008 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001009 .Case("pwr3", ArchDefinePpcgr)
1010 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1011 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1012 | ArchDefinePpcsq)
1013 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1014 | ArchDefinePpcgr | ArchDefinePpcsq)
1015 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1016 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1017 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1018 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1019 | ArchDefinePpcsq)
1020 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1021 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001022 | ArchDefinePpcgr | ArchDefinePpcsq)
1023 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1024 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1025 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001026 .Case("power3", ArchDefinePpcgr)
1027 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1028 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1029 | ArchDefinePpcsq)
1030 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1031 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1033 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1034 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1035 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1036 | ArchDefinePpcsq)
1037 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1038 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001039 | ArchDefinePpcgr | ArchDefinePpcsq)
1040 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1041 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1042 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001043 .Default(ArchDefineNone);
1044
1045 if (defs & ArchDefineName)
1046 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1047 if (defs & ArchDefinePpcgr)
1048 Builder.defineMacro("_ARCH_PPCGR");
1049 if (defs & ArchDefinePpcsq)
1050 Builder.defineMacro("_ARCH_PPCSQ");
1051 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001052 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001053 if (defs & ArchDefine603)
1054 Builder.defineMacro("_ARCH_603");
1055 if (defs & ArchDefine604)
1056 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001057 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001058 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001059 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001060 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001061 if (defs & ArchDefinePwr5x)
1062 Builder.defineMacro("_ARCH_PWR5X");
1063 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001064 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001065 if (defs & ArchDefinePwr6x)
1066 Builder.defineMacro("_ARCH_PWR6X");
1067 if (defs & ArchDefinePwr7)
1068 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001069 if (defs & ArchDefinePwr8)
1070 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001071 if (defs & ArchDefineA2)
1072 Builder.defineMacro("_ARCH_A2");
1073 if (defs & ArchDefineA2q) {
1074 Builder.defineMacro("_ARCH_A2Q");
1075 Builder.defineMacro("_ARCH_QP");
1076 }
1077
1078 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1079 Builder.defineMacro("__bg__");
1080 Builder.defineMacro("__THW_BLUEGENE__");
1081 Builder.defineMacro("__bgq__");
1082 Builder.defineMacro("__TOS_BGQ__");
1083 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001084
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001085 if (HasVSX)
1086 Builder.defineMacro("__VSX__");
1087
Bill Schmidt38378a02013-02-01 20:23:10 +00001088 // FIXME: The following are not yet generated here by Clang, but are
1089 // generated by GCC:
1090 //
1091 // _SOFT_FLOAT_
1092 // __RECIP_PRECISION__
1093 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001094 // __RECIP__
1095 // __RECIPF__
1096 // __RSQRTE__
1097 // __RSQRTEF__
1098 // _SOFT_DOUBLE_
1099 // __NO_LWSYNC__
1100 // __HAVE_BSWAP__
1101 // __LONGDOUBLE128
1102 // __CMODEL_MEDIUM__
1103 // __CMODEL_LARGE__
1104 // _CALL_SYSV
1105 // _CALL_DARWIN
1106 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001107}
1108
1109void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1110 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1111 .Case("7400", true)
1112 .Case("g4", true)
1113 .Case("7450", true)
1114 .Case("g4+", true)
1115 .Case("970", true)
1116 .Case("g5", true)
1117 .Case("pwr6", true)
1118 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001119 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001120 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001121 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001122 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001123
1124 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001125
1126 if (!ABI.empty())
1127 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001128}
1129
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001130bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1131 return Feature == "powerpc";
1132}
Chris Lattner17df24e2008-04-21 18:56:49 +00001133
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001134
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001136 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1137 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1138 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1139 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1140 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1141 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1142 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1143 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001144 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001145 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001146 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001147 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1148 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1149 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1150 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001151 "vrsave", "vscr",
1152 "spe_acc", "spefscr",
1153 "sfp"
1154};
Chris Lattner10a5b382007-01-29 05:24:35 +00001155
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001156void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001157 unsigned &NumNames) const {
1158 Names = GCCRegNames;
1159 NumNames = llvm::array_lengthof(GCCRegNames);
1160}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001161
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001162const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1163 // While some of these aliases do map to different registers
1164 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001165 { { "0" }, "r0" },
1166 { { "1"}, "r1" },
1167 { { "2" }, "r2" },
1168 { { "3" }, "r3" },
1169 { { "4" }, "r4" },
1170 { { "5" }, "r5" },
1171 { { "6" }, "r6" },
1172 { { "7" }, "r7" },
1173 { { "8" }, "r8" },
1174 { { "9" }, "r9" },
1175 { { "10" }, "r10" },
1176 { { "11" }, "r11" },
1177 { { "12" }, "r12" },
1178 { { "13" }, "r13" },
1179 { { "14" }, "r14" },
1180 { { "15" }, "r15" },
1181 { { "16" }, "r16" },
1182 { { "17" }, "r17" },
1183 { { "18" }, "r18" },
1184 { { "19" }, "r19" },
1185 { { "20" }, "r20" },
1186 { { "21" }, "r21" },
1187 { { "22" }, "r22" },
1188 { { "23" }, "r23" },
1189 { { "24" }, "r24" },
1190 { { "25" }, "r25" },
1191 { { "26" }, "r26" },
1192 { { "27" }, "r27" },
1193 { { "28" }, "r28" },
1194 { { "29" }, "r29" },
1195 { { "30" }, "r30" },
1196 { { "31" }, "r31" },
1197 { { "fr0" }, "f0" },
1198 { { "fr1" }, "f1" },
1199 { { "fr2" }, "f2" },
1200 { { "fr3" }, "f3" },
1201 { { "fr4" }, "f4" },
1202 { { "fr5" }, "f5" },
1203 { { "fr6" }, "f6" },
1204 { { "fr7" }, "f7" },
1205 { { "fr8" }, "f8" },
1206 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001207 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001208 { { "fr11" }, "f11" },
1209 { { "fr12" }, "f12" },
1210 { { "fr13" }, "f13" },
1211 { { "fr14" }, "f14" },
1212 { { "fr15" }, "f15" },
1213 { { "fr16" }, "f16" },
1214 { { "fr17" }, "f17" },
1215 { { "fr18" }, "f18" },
1216 { { "fr19" }, "f19" },
1217 { { "fr20" }, "f20" },
1218 { { "fr21" }, "f21" },
1219 { { "fr22" }, "f22" },
1220 { { "fr23" }, "f23" },
1221 { { "fr24" }, "f24" },
1222 { { "fr25" }, "f25" },
1223 { { "fr26" }, "f26" },
1224 { { "fr27" }, "f27" },
1225 { { "fr28" }, "f28" },
1226 { { "fr29" }, "f29" },
1227 { { "fr30" }, "f30" },
1228 { { "fr31" }, "f31" },
1229 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001230};
1231
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001232void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001233 unsigned &NumAliases) const {
1234 Aliases = GCCRegAliases;
1235 NumAliases = llvm::array_lengthof(GCCRegAliases);
1236}
1237} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001238
Chris Lattner5ba61f02006-10-14 07:39:34 +00001239namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001240class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001241public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001242 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001243 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001244
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001245 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001246 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001247 case llvm::Triple::FreeBSD:
1248 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001249 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001250 PtrDiffType = SignedInt;
1251 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001252 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001253 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001254 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001255 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001256
Roman Divacky3ffe7462012-03-13 19:20:17 +00001257 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1258 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001259 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001260 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001261
1262 // PPC32 supports atomics up to 4 bytes.
1263 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001264 }
1265
Craig Topper3164f332014-03-11 03:39:26 +00001266 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001267 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001268 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001269 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001270};
1271} // end anonymous namespace.
1272
Bill Schmidt778d3872013-07-26 01:36:11 +00001273// Note: ABI differences may eventually require us to have a separate
1274// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001275namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001276class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001277public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001278 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001279 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001280 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001281 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001282
Roman Divacky3ffe7462012-03-13 19:20:17 +00001283 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1284 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001285 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001286 DescriptionString = "E-m:e-i64:64-n32:64";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001287 } else {
1288 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1289 DescriptionString = "e-m:e-i64:64-n32:64";
Ulrich Weigand8afad612014-07-28 13:17:52 +00001290 ABI = "elfv2";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001291 } else {
1292 DescriptionString = "E-m:e-i64:64-n32:64";
Ulrich Weigand8afad612014-07-28 13:17:52 +00001293 ABI = "elfv1";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001294 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001295 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001296
1297 // PPC64 supports atomics up to 8 bytes.
1298 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001299 }
Craig Topper3164f332014-03-11 03:39:26 +00001300 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001301 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001302 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001303 // PPC64 Linux-specifc ABI options.
1304 bool setABI(const std::string &Name) override {
1305 if (Name == "elfv1" || Name == "elfv2") {
1306 ABI = Name;
1307 return true;
1308 }
1309 return false;
1310 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001311};
1312} // end anonymous namespace.
1313
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001314
1315namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001316class DarwinPPC32TargetInfo :
1317 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001318public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001319 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1320 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001321 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001322 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001323 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001324 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001325 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001326 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001327 }
Craig Topper3164f332014-03-11 03:39:26 +00001328 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001329 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001330 }
1331};
1332
1333class DarwinPPC64TargetInfo :
1334 public DarwinTargetInfo<PPC64TargetInfo> {
1335public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001336 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1337 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001338 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001339 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001340 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001341 }
1342};
1343} // end anonymous namespace.
1344
Chris Lattner5ba61f02006-10-14 07:39:34 +00001345namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001346 static const unsigned NVPTXAddrSpaceMap[] = {
1347 1, // opencl_global
1348 3, // opencl_local
1349 4, // opencl_constant
1350 1, // cuda_device
1351 4, // cuda_constant
1352 3, // cuda_shared
1353 };
1354 class NVPTXTargetInfo : public TargetInfo {
1355 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001356 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001357 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001358 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001359 BigEndian = false;
1360 TLSSupported = false;
1361 LongWidth = LongAlign = 64;
1362 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001363 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001364 // Define available target features
1365 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001366 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001367 }
Craig Topper3164f332014-03-11 03:39:26 +00001368 void getTargetDefines(const LangOptions &Opts,
1369 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001370 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001371 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001372 }
Craig Topper3164f332014-03-11 03:39:26 +00001373 void getTargetBuiltins(const Builtin::Info *&Records,
1374 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001375 Records = BuiltinInfo;
1376 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001377 }
Craig Topper3164f332014-03-11 03:39:26 +00001378 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001379 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001380 }
Craig Topper3164f332014-03-11 03:39:26 +00001381
1382 void getGCCRegNames(const char * const *&Names,
1383 unsigned &NumNames) const override;
1384 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1385 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001386 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001387 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001388 NumAliases = 0;
1389 }
Craig Topper3164f332014-03-11 03:39:26 +00001390 bool validateAsmConstraint(const char *&Name,
1391 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001392 switch (*Name) {
1393 default: return false;
1394 case 'c':
1395 case 'h':
1396 case 'r':
1397 case 'l':
1398 case 'f':
1399 case 'd':
1400 Info.setAllowsRegister();
1401 return true;
1402 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001403 }
Craig Topper3164f332014-03-11 03:39:26 +00001404 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001405 // FIXME: Is this really right?
1406 return "";
1407 }
Craig Topper3164f332014-03-11 03:39:26 +00001408 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001409 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001410 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001411 }
Craig Topper3164f332014-03-11 03:39:26 +00001412 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001413 bool Valid = llvm::StringSwitch<bool>(Name)
1414 .Case("sm_20", true)
1415 .Case("sm_21", true)
1416 .Case("sm_30", true)
1417 .Case("sm_35", true)
1418 .Default(false);
1419
1420 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001421 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001422 };
1423
1424 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1425#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1426#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1427 ALL_LANGUAGES },
1428#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001429 };
1430
1431 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1432 "r0"
1433 };
1434
1435 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1436 unsigned &NumNames) const {
1437 Names = GCCRegNames;
1438 NumNames = llvm::array_lengthof(GCCRegNames);
1439 }
1440
1441 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1442 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001443 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001444 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001445 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1446 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001447 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001448 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001449 };
1450
1451 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1452 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001453 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001454 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001455 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1456 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001457 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001458 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001459 };
1460}
1461
1462namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001463
1464static const unsigned R600AddrSpaceMap[] = {
1465 1, // opencl_global
1466 3, // opencl_local
1467 2, // opencl_constant
1468 1, // cuda_device
1469 2, // cuda_constant
1470 3 // cuda_shared
1471};
1472
Tom Stellarda96344b2014-08-21 13:58:40 +00001473// If you edit the description strings, make sure you update
1474// getPointerWidthV().
1475
Tom Stellardc74b1e02013-03-04 17:40:53 +00001476static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001477 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1478 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001479
1480static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001481 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1482 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001483
1484static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001485 "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 +00001486 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1487 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001488
Eli Friedmand13b41e2012-10-12 23:32:00 +00001489class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001490 static const Builtin::Info BuiltinInfo[];
1491
Tom Stellardc74b1e02013-03-04 17:40:53 +00001492 /// \brief The GPU profiles supported by the R600 target.
1493 enum GPUKind {
1494 GK_NONE,
1495 GK_R600,
1496 GK_R600_DOUBLE_OPS,
1497 GK_R700,
1498 GK_R700_DOUBLE_OPS,
1499 GK_EVERGREEN,
1500 GK_EVERGREEN_DOUBLE_OPS,
1501 GK_NORTHERN_ISLANDS,
1502 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001503 GK_SOUTHERN_ISLANDS,
1504 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001505 } GPU;
1506
Eli Friedmand13b41e2012-10-12 23:32:00 +00001507public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001508 R600TargetInfo(const llvm::Triple &Triple)
1509 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001510 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001511 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001512 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001513 }
1514
Tom Stellarda96344b2014-08-21 13:58:40 +00001515 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1516 if (GPU <= GK_CAYMAN)
1517 return 32;
1518
1519 switch(AddrSpace) {
1520 default:
1521 return 64;
1522 case 0:
1523 case 3:
1524 case 5:
1525 return 32;
1526 }
1527 }
1528
Craig Topper3164f332014-03-11 03:39:26 +00001529 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001530 return "";
1531 }
1532
Craig Topper3164f332014-03-11 03:39:26 +00001533 void getGCCRegNames(const char * const *&Names,
1534 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001535 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001536 numNames = 0;
1537 }
1538
Craig Topper3164f332014-03-11 03:39:26 +00001539 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1540 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001541 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001542 NumAliases = 0;
1543 }
1544
Craig Topper3164f332014-03-11 03:39:26 +00001545 bool validateAsmConstraint(const char *&Name,
1546 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001547 return true;
1548 }
1549
Craig Topper3164f332014-03-11 03:39:26 +00001550 void getTargetBuiltins(const Builtin::Info *&Records,
1551 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001552 Records = BuiltinInfo;
1553 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001554 }
1555
Craig Topper3164f332014-03-11 03:39:26 +00001556 void getTargetDefines(const LangOptions &Opts,
1557 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001558 Builder.defineMacro("__R600__");
1559 }
1560
Craig Topper3164f332014-03-11 03:39:26 +00001561 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001562 return TargetInfo::CharPtrBuiltinVaList;
1563 }
1564
Craig Topper3164f332014-03-11 03:39:26 +00001565 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001566 GPU = llvm::StringSwitch<GPUKind>(Name)
1567 .Case("r600" , GK_R600)
1568 .Case("rv610", GK_R600)
1569 .Case("rv620", GK_R600)
1570 .Case("rv630", GK_R600)
1571 .Case("rv635", GK_R600)
1572 .Case("rs780", GK_R600)
1573 .Case("rs880", GK_R600)
1574 .Case("rv670", GK_R600_DOUBLE_OPS)
1575 .Case("rv710", GK_R700)
1576 .Case("rv730", GK_R700)
1577 .Case("rv740", GK_R700_DOUBLE_OPS)
1578 .Case("rv770", GK_R700_DOUBLE_OPS)
1579 .Case("palm", GK_EVERGREEN)
1580 .Case("cedar", GK_EVERGREEN)
1581 .Case("sumo", GK_EVERGREEN)
1582 .Case("sumo2", GK_EVERGREEN)
1583 .Case("redwood", GK_EVERGREEN)
1584 .Case("juniper", GK_EVERGREEN)
1585 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1586 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1587 .Case("barts", GK_NORTHERN_ISLANDS)
1588 .Case("turks", GK_NORTHERN_ISLANDS)
1589 .Case("caicos", GK_NORTHERN_ISLANDS)
1590 .Case("cayman", GK_CAYMAN)
1591 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001592 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001593 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1594 .Case("verde", GK_SOUTHERN_ISLANDS)
1595 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001596 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001597 .Case("bonaire", GK_SEA_ISLANDS)
1598 .Case("kabini", GK_SEA_ISLANDS)
1599 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001600 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001601 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001602 .Default(GK_NONE);
1603
1604 if (GPU == GK_NONE) {
1605 return false;
1606 }
1607
1608 // Set the correct data layout
1609 switch (GPU) {
1610 case GK_NONE:
1611 case GK_R600:
1612 case GK_R700:
1613 case GK_EVERGREEN:
1614 case GK_NORTHERN_ISLANDS:
1615 DescriptionString = DescriptionStringR600;
1616 break;
1617 case GK_R600_DOUBLE_OPS:
1618 case GK_R700_DOUBLE_OPS:
1619 case GK_EVERGREEN_DOUBLE_OPS:
1620 case GK_CAYMAN:
1621 DescriptionString = DescriptionStringR600DoubleOps;
1622 break;
1623 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001624 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001625 DescriptionString = DescriptionStringSI;
1626 break;
1627 }
1628
1629 return true;
1630 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001631};
1632
Matt Arsenault56f008d2014-06-24 20:45:01 +00001633const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1634#define BUILTIN(ID, TYPE, ATTRS) \
1635 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1636#include "clang/Basic/BuiltinsR600.def"
1637};
1638
Eli Friedmand13b41e2012-10-12 23:32:00 +00001639} // end anonymous namespace
1640
1641namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001642// Namespace for x86 abstract base class
1643const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001644#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001645#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001646 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001647#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001648};
Eli Friedmanb5366062008-05-20 14:21:01 +00001649
Nuno Lopescfca1f02009-12-23 17:49:57 +00001650static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001651 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1652 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001653 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001654 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1655 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1656 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001657 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001658 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1659 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001660};
1661
Eric Christophercdd36352011-06-21 00:05:20 +00001662const TargetInfo::AddlRegName AddlRegNames[] = {
1663 { { "al", "ah", "eax", "rax" }, 0 },
1664 { { "bl", "bh", "ebx", "rbx" }, 3 },
1665 { { "cl", "ch", "ecx", "rcx" }, 2 },
1666 { { "dl", "dh", "edx", "rdx" }, 1 },
1667 { { "esi", "rsi" }, 4 },
1668 { { "edi", "rdi" }, 5 },
1669 { { "esp", "rsp" }, 7 },
1670 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001671};
1672
1673// X86 target abstract base class; x86-32 and x86-64 are very close, so
1674// most of the implementation can be shared.
1675class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001676 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001677 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001678 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001679 enum MMX3DNowEnum {
1680 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1681 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001682 enum XOPEnum {
1683 NoXOP,
1684 SSE4A,
1685 FMA4,
1686 XOP
1687 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001688
Eric Christophere1ddaf92010-04-02 23:50:19 +00001689 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001690 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001691 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001692 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001693 bool HasBMI;
1694 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001695 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001696 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001697 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001698 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001699 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001700 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001701 bool HasF16C;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001702 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001703 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001704 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001705
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001706 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1707 ///
1708 /// Each enumeration represents a particular CPU supported by Clang. These
1709 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1710 enum CPUKind {
1711 CK_Generic,
1712
1713 /// \name i386
1714 /// i386-generation processors.
1715 //@{
1716 CK_i386,
1717 //@}
1718
1719 /// \name i486
1720 /// i486-generation processors.
1721 //@{
1722 CK_i486,
1723 CK_WinChipC6,
1724 CK_WinChip2,
1725 CK_C3,
1726 //@}
1727
1728 /// \name i586
1729 /// i586-generation processors, P5 microarchitecture based.
1730 //@{
1731 CK_i586,
1732 CK_Pentium,
1733 CK_PentiumMMX,
1734 //@}
1735
1736 /// \name i686
1737 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1738 //@{
1739 CK_i686,
1740 CK_PentiumPro,
1741 CK_Pentium2,
1742 CK_Pentium3,
1743 CK_Pentium3M,
1744 CK_PentiumM,
1745 CK_C3_2,
1746
1747 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1748 /// Clang however has some logic to suport this.
1749 // FIXME: Warn, deprecate, and potentially remove this.
1750 CK_Yonah,
1751 //@}
1752
1753 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001754 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001755 //@{
1756 CK_Pentium4,
1757 CK_Pentium4M,
1758 CK_Prescott,
1759 CK_Nocona,
1760 //@}
1761
1762 /// \name Core
1763 /// Core microarchitecture based processors.
1764 //@{
1765 CK_Core2,
1766
1767 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1768 /// codename which GCC no longer accepts as an option to -march, but Clang
1769 /// has some logic for recognizing it.
1770 // FIXME: Warn, deprecate, and potentially remove this.
1771 CK_Penryn,
1772 //@}
1773
1774 /// \name Atom
1775 /// Atom processors
1776 //@{
1777 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001778 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001779 //@}
1780
1781 /// \name Nehalem
1782 /// Nehalem microarchitecture based processors.
1783 //@{
1784 CK_Corei7,
1785 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001786 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001787 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001788 //@}
1789
Craig Topper449314e2013-08-20 07:09:39 +00001790 /// \name Knights Landing
1791 /// Knights Landing processor.
1792 CK_KNL,
1793
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001794 /// \name Skylake Server
1795 /// Skylake server processor.
1796 CK_SKX,
1797
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001798 /// \name K6
1799 /// K6 architecture processors.
1800 //@{
1801 CK_K6,
1802 CK_K6_2,
1803 CK_K6_3,
1804 //@}
1805
1806 /// \name K7
1807 /// K7 architecture processors.
1808 //@{
1809 CK_Athlon,
1810 CK_AthlonThunderbird,
1811 CK_Athlon4,
1812 CK_AthlonXP,
1813 CK_AthlonMP,
1814 //@}
1815
1816 /// \name K8
1817 /// K8 architecture processors.
1818 //@{
1819 CK_Athlon64,
1820 CK_Athlon64SSE3,
1821 CK_AthlonFX,
1822 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001823 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001824 CK_Opteron,
1825 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001826 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001827 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001828
Benjamin Kramer569f2152012-01-10 11:50:18 +00001829 /// \name Bobcat
1830 /// Bobcat architecture processors.
1831 //@{
1832 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001833 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001834 //@}
1835
1836 /// \name Bulldozer
1837 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001838 //@{
1839 CK_BDVER1,
1840 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001841 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001842 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001843 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001844
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001845 /// This specification is deprecated and will be removed in the future.
1846 /// Users should prefer \see CK_K8.
1847 // FIXME: Warn on this when the CPU is set to it.
1848 CK_x86_64,
1849 //@}
1850
1851 /// \name Geode
1852 /// Geode processors.
1853 //@{
1854 CK_Geode
1855 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001856 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001857
Rafael Espindolaeb265472013-08-21 21:59:03 +00001858 enum FPMathKind {
1859 FP_Default,
1860 FP_SSE,
1861 FP_387
1862 } FPMath;
1863
Eli Friedman3fd920a2008-08-20 02:34:37 +00001864public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001865 X86TargetInfo(const llvm::Triple &Triple)
1866 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001867 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1868 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001869 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1870 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001871 HasAVX512PF(false), HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1872 HasSHA(false), HasCX16(false), CPU(CK_Generic),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001873 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001874 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001875 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001876 }
Craig Topper3164f332014-03-11 03:39:26 +00001877 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001878 // X87 evaluates with 80 bits "long double" precision.
1879 return SSELevel == NoSSE ? 2 : 0;
1880 }
Craig Topper3164f332014-03-11 03:39:26 +00001881 void getTargetBuiltins(const Builtin::Info *&Records,
1882 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001883 Records = BuiltinInfo;
1884 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001885 }
Craig Topper3164f332014-03-11 03:39:26 +00001886 void getGCCRegNames(const char * const *&Names,
1887 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001888 Names = GCCRegNames;
1889 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001890 }
Craig Topper3164f332014-03-11 03:39:26 +00001891 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1892 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001893 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001894 NumAliases = 0;
1895 }
Craig Topper3164f332014-03-11 03:39:26 +00001896 void getGCCAddlRegNames(const AddlRegName *&Names,
1897 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001898 Names = AddlRegNames;
1899 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001900 }
Craig Topper3164f332014-03-11 03:39:26 +00001901 bool validateAsmConstraint(const char *&Name,
1902 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001903
Akira Hatanaka974131e2014-09-18 18:17:18 +00001904 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1905
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001906 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1907
Akira Hatanaka974131e2014-09-18 18:17:18 +00001908 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1909
Craig Topper3164f332014-03-11 03:39:26 +00001910 std::string convertConstraint(const char *&Constraint) const override;
1911 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001912 return "~{dirflag},~{fpsr},~{flags}";
1913 }
Craig Topper3164f332014-03-11 03:39:26 +00001914 void getTargetDefines(const LangOptions &Opts,
1915 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001916 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1917 bool Enabled);
1918 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1919 bool Enabled);
1920 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1921 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001922 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1923 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001924 setFeatureEnabledImpl(Features, Name, Enabled);
1925 }
1926 // This exists purely to cut down on the number of virtual calls in
1927 // getDefaultFeatures which calls this repeatedly.
1928 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1929 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001930 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1931 bool hasFeature(StringRef Feature) const override;
1932 bool handleTargetFeatures(std::vector<std::string> &Features,
1933 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001934 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001935 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001936 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001937 else if (getTriple().getArch() == llvm::Triple::x86 &&
1938 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001939 return "no-mmx";
1940 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001941 }
Craig Topper3164f332014-03-11 03:39:26 +00001942 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001943 CPU = llvm::StringSwitch<CPUKind>(Name)
1944 .Case("i386", CK_i386)
1945 .Case("i486", CK_i486)
1946 .Case("winchip-c6", CK_WinChipC6)
1947 .Case("winchip2", CK_WinChip2)
1948 .Case("c3", CK_C3)
1949 .Case("i586", CK_i586)
1950 .Case("pentium", CK_Pentium)
1951 .Case("pentium-mmx", CK_PentiumMMX)
1952 .Case("i686", CK_i686)
1953 .Case("pentiumpro", CK_PentiumPro)
1954 .Case("pentium2", CK_Pentium2)
1955 .Case("pentium3", CK_Pentium3)
1956 .Case("pentium3m", CK_Pentium3M)
1957 .Case("pentium-m", CK_PentiumM)
1958 .Case("c3-2", CK_C3_2)
1959 .Case("yonah", CK_Yonah)
1960 .Case("pentium4", CK_Pentium4)
1961 .Case("pentium4m", CK_Pentium4M)
1962 .Case("prescott", CK_Prescott)
1963 .Case("nocona", CK_Nocona)
1964 .Case("core2", CK_Core2)
1965 .Case("penryn", CK_Penryn)
1966 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001967 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001968 .Case("corei7", CK_Corei7)
1969 .Case("corei7-avx", CK_Corei7AVX)
1970 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001971 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001972 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001973 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00001974 .Case("k6", CK_K6)
1975 .Case("k6-2", CK_K6_2)
1976 .Case("k6-3", CK_K6_3)
1977 .Case("athlon", CK_Athlon)
1978 .Case("athlon-tbird", CK_AthlonThunderbird)
1979 .Case("athlon-4", CK_Athlon4)
1980 .Case("athlon-xp", CK_AthlonXP)
1981 .Case("athlon-mp", CK_AthlonMP)
1982 .Case("athlon64", CK_Athlon64)
1983 .Case("athlon64-sse3", CK_Athlon64SSE3)
1984 .Case("athlon-fx", CK_AthlonFX)
1985 .Case("k8", CK_K8)
1986 .Case("k8-sse3", CK_K8SSE3)
1987 .Case("opteron", CK_Opteron)
1988 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001989 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001990 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001991 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001992 .Case("bdver1", CK_BDVER1)
1993 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001994 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001995 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001996 .Case("x86-64", CK_x86_64)
1997 .Case("geode", CK_Geode)
1998 .Default(CK_Generic);
1999
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002000 // Perform any per-CPU checks necessary to determine if this CPU is
2001 // acceptable.
2002 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2003 // invalid without explaining *why*.
2004 switch (CPU) {
2005 case CK_Generic:
2006 // No processor selected!
2007 return false;
2008
2009 case CK_i386:
2010 case CK_i486:
2011 case CK_WinChipC6:
2012 case CK_WinChip2:
2013 case CK_C3:
2014 case CK_i586:
2015 case CK_Pentium:
2016 case CK_PentiumMMX:
2017 case CK_i686:
2018 case CK_PentiumPro:
2019 case CK_Pentium2:
2020 case CK_Pentium3:
2021 case CK_Pentium3M:
2022 case CK_PentiumM:
2023 case CK_Yonah:
2024 case CK_C3_2:
2025 case CK_Pentium4:
2026 case CK_Pentium4M:
2027 case CK_Prescott:
2028 case CK_K6:
2029 case CK_K6_2:
2030 case CK_K6_3:
2031 case CK_Athlon:
2032 case CK_AthlonThunderbird:
2033 case CK_Athlon4:
2034 case CK_AthlonXP:
2035 case CK_AthlonMP:
2036 case CK_Geode:
2037 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002038 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002039 return false;
2040
2041 // Fallthrough
2042 case CK_Nocona:
2043 case CK_Core2:
2044 case CK_Penryn:
2045 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002046 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002047 case CK_Corei7:
2048 case CK_Corei7AVX:
2049 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002050 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00002051 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002052 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002053 case CK_Athlon64:
2054 case CK_Athlon64SSE3:
2055 case CK_AthlonFX:
2056 case CK_K8:
2057 case CK_K8SSE3:
2058 case CK_Opteron:
2059 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002060 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002061 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002062 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002063 case CK_BDVER1:
2064 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002065 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002066 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002067 case CK_x86_64:
2068 return true;
2069 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002070 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002071 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002072
Craig Topper3164f332014-03-11 03:39:26 +00002073 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002074
Craig Topper3164f332014-03-11 03:39:26 +00002075 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002076 // We accept all non-ARM calling conventions
2077 return (CC == CC_X86ThisCall ||
2078 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002079 CC == CC_X86StdCall ||
2080 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002081 CC == CC_X86Pascal ||
2082 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002083 }
2084
Craig Topper3164f332014-03-11 03:39:26 +00002085 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002086 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002087 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002088};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002089
Rafael Espindolaeb265472013-08-21 21:59:03 +00002090bool X86TargetInfo::setFPMath(StringRef Name) {
2091 if (Name == "387") {
2092 FPMath = FP_387;
2093 return true;
2094 }
2095 if (Name == "sse") {
2096 FPMath = FP_SSE;
2097 return true;
2098 }
2099 return false;
2100}
2101
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002102void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002103 // FIXME: This *really* should not be here.
2104
2105 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002106 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002107 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002108
Chandler Carruth212334f2011-09-28 08:55:37 +00002109 switch (CPU) {
2110 case CK_Generic:
2111 case CK_i386:
2112 case CK_i486:
2113 case CK_i586:
2114 case CK_Pentium:
2115 case CK_i686:
2116 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002117 break;
2118 case CK_PentiumMMX:
2119 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002121 break;
2122 case CK_Pentium3:
2123 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002124 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002125 break;
2126 case CK_PentiumM:
2127 case CK_Pentium4:
2128 case CK_Pentium4M:
2129 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002130 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002131 break;
2132 case CK_Yonah:
2133 case CK_Prescott:
2134 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002135 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002136 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002137 break;
2138 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002140 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002141 break;
2142 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002143 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002144 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002145 break;
2146 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002147 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002148 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002149 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002150 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002151 setFeatureEnabledImpl(Features, "sse4.2", true);
2152 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002153 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002154 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002155 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002156 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002157 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002158 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002159 break;
2160 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002161 setFeatureEnabledImpl(Features, "avx", true);
2162 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002163 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002164 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002165 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002166 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002167 setFeatureEnabledImpl(Features, "avx", true);
2168 setFeatureEnabledImpl(Features, "aes", true);
2169 setFeatureEnabledImpl(Features, "pclmul", true);
2170 setFeatureEnabledImpl(Features, "rdrnd", true);
2171 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002172 break;
Craig Topper865fff52011-12-17 19:55:21 +00002173 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002174 setFeatureEnabledImpl(Features, "avx2", true);
2175 setFeatureEnabledImpl(Features, "aes", true);
2176 setFeatureEnabledImpl(Features, "pclmul", true);
2177 setFeatureEnabledImpl(Features, "lzcnt", true);
2178 setFeatureEnabledImpl(Features, "rdrnd", true);
2179 setFeatureEnabledImpl(Features, "f16c", true);
2180 setFeatureEnabledImpl(Features, "bmi", true);
2181 setFeatureEnabledImpl(Features, "bmi2", true);
2182 setFeatureEnabledImpl(Features, "rtm", true);
2183 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002184 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002185 break;
Craig Topper449314e2013-08-20 07:09:39 +00002186 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002187 setFeatureEnabledImpl(Features, "avx512f", true);
2188 setFeatureEnabledImpl(Features, "avx512cd", true);
2189 setFeatureEnabledImpl(Features, "avx512er", true);
2190 setFeatureEnabledImpl(Features, "avx512pf", true);
2191 setFeatureEnabledImpl(Features, "aes", true);
2192 setFeatureEnabledImpl(Features, "pclmul", true);
2193 setFeatureEnabledImpl(Features, "lzcnt", true);
2194 setFeatureEnabledImpl(Features, "rdrnd", true);
2195 setFeatureEnabledImpl(Features, "f16c", true);
2196 setFeatureEnabledImpl(Features, "bmi", true);
2197 setFeatureEnabledImpl(Features, "bmi2", true);
2198 setFeatureEnabledImpl(Features, "rtm", true);
2199 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002200 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002201 case CK_SKX:
2202 setFeatureEnabledImpl(Features, "avx512f", true);
2203 setFeatureEnabledImpl(Features, "avx512cd", true);
2204 setFeatureEnabledImpl(Features, "avx512dq", true);
2205 setFeatureEnabledImpl(Features, "avx512bw", true);
2206 setFeatureEnabledImpl(Features, "avx512vl", true);
2207 setFeatureEnabledImpl(Features, "aes", true);
2208 setFeatureEnabledImpl(Features, "pclmul", true);
2209 setFeatureEnabledImpl(Features, "lzcnt", true);
2210 setFeatureEnabledImpl(Features, "rdrnd", true);
2211 setFeatureEnabledImpl(Features, "f16c", true);
2212 setFeatureEnabledImpl(Features, "bmi", true);
2213 setFeatureEnabledImpl(Features, "bmi2", true);
2214 setFeatureEnabledImpl(Features, "rtm", true);
2215 setFeatureEnabledImpl(Features, "fma", true);
2216 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002217 case CK_K6:
2218 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002219 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002220 break;
2221 case CK_K6_2:
2222 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002223 case CK_WinChip2:
2224 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002225 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002226 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002227 case CK_Athlon:
2228 case CK_AthlonThunderbird:
2229 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002230 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002231 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002232 case CK_Athlon4:
2233 case CK_AthlonXP:
2234 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002235 setFeatureEnabledImpl(Features, "sse", true);
2236 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002237 break;
2238 case CK_K8:
2239 case CK_Opteron:
2240 case CK_Athlon64:
2241 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002242 setFeatureEnabledImpl(Features, "sse2", true);
2243 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002244 break;
2245 case CK_K8SSE3:
2246 case CK_OpteronSSE3:
2247 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002248 setFeatureEnabledImpl(Features, "sse3", true);
2249 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002250 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002251 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002252 setFeatureEnabledImpl(Features, "sse3", true);
2253 setFeatureEnabledImpl(Features, "sse4a", true);
2254 setFeatureEnabledImpl(Features, "3dnowa", true);
2255 setFeatureEnabledImpl(Features, "lzcnt", true);
2256 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002257 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002258 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002259 setFeatureEnabledImpl(Features, "ssse3", true);
2260 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002261 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002262 setFeatureEnabledImpl(Features, "lzcnt", true);
2263 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002264 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002265 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002266 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002267 setFeatureEnabledImpl(Features, "avx", true);
2268 setFeatureEnabledImpl(Features, "sse4a", true);
2269 setFeatureEnabledImpl(Features, "lzcnt", true);
2270 setFeatureEnabledImpl(Features, "aes", true);
2271 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002272 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002273 setFeatureEnabledImpl(Features, "bmi", true);
2274 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002275 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002276 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002277 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002278 setFeatureEnabledImpl(Features, "xop", true);
2279 setFeatureEnabledImpl(Features, "lzcnt", true);
2280 setFeatureEnabledImpl(Features, "aes", true);
2281 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002282 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002283 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002284 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002285 case CK_BDVER4:
2286 setFeatureEnabledImpl(Features, "avx2", true);
2287 setFeatureEnabledImpl(Features, "bmi2", true);
2288 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002289 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002290 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002291 setFeatureEnabledImpl(Features, "xop", true);
2292 setFeatureEnabledImpl(Features, "lzcnt", true);
2293 setFeatureEnabledImpl(Features, "aes", true);
2294 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002295 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002296 setFeatureEnabledImpl(Features, "bmi", true);
2297 setFeatureEnabledImpl(Features, "fma", true);
2298 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002299 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002300 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002301 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002302 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002303 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002304 break;
Eli Friedman33465822011-07-08 23:31:17 +00002305 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002306}
2307
Rafael Espindolae62e2792013-08-20 13:44:29 +00002308void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002309 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002310 if (Enabled) {
2311 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002312 case AVX512F:
2313 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002314 case AVX2:
2315 Features["avx2"] = true;
2316 case AVX:
2317 Features["avx"] = true;
2318 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002319 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002320 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002321 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002322 case SSSE3:
2323 Features["ssse3"] = true;
2324 case SSE3:
2325 Features["sse3"] = true;
2326 case SSE2:
2327 Features["sse2"] = true;
2328 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 Features["sse"] = true;
2330 case NoSSE:
2331 break;
2332 }
2333 return;
2334 }
2335
2336 switch (Level) {
2337 case NoSSE:
2338 case SSE1:
2339 Features["sse"] = false;
2340 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002341 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2342 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002343 case SSE3:
2344 Features["sse3"] = false;
2345 setXOPLevel(Features, NoXOP, false);
2346 case SSSE3:
2347 Features["ssse3"] = false;
2348 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002349 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002350 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002351 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002352 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002353 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002354 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002355 case AVX2:
2356 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002357 case AVX512F:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002358 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2359 Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002360 }
2361}
2362
2363void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002364 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002365 if (Enabled) {
2366 switch (Level) {
2367 case AMD3DNowAthlon:
2368 Features["3dnowa"] = true;
2369 case AMD3DNow:
2370 Features["3dnow"] = true;
2371 case MMX:
2372 Features["mmx"] = true;
2373 case NoMMX3DNow:
2374 break;
2375 }
2376 return;
2377 }
2378
2379 switch (Level) {
2380 case NoMMX3DNow:
2381 case MMX:
2382 Features["mmx"] = false;
2383 case AMD3DNow:
2384 Features["3dnow"] = false;
2385 case AMD3DNowAthlon:
2386 Features["3dnowa"] = false;
2387 }
2388}
2389
2390void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002391 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002392 if (Enabled) {
2393 switch (Level) {
2394 case XOP:
2395 Features["xop"] = true;
2396 case FMA4:
2397 Features["fma4"] = true;
2398 setSSELevel(Features, AVX, true);
2399 case SSE4A:
2400 Features["sse4a"] = true;
2401 setSSELevel(Features, SSE3, true);
2402 case NoXOP:
2403 break;
2404 }
2405 return;
2406 }
2407
2408 switch (Level) {
2409 case NoXOP:
2410 case SSE4A:
2411 Features["sse4a"] = false;
2412 case FMA4:
2413 Features["fma4"] = false;
2414 case XOP:
2415 Features["xop"] = false;
2416 }
2417}
2418
Craig Topper86d79ef2013-09-17 04:51:29 +00002419void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2420 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002421 // FIXME: This *really* should not be here. We need some way of translating
2422 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002423 if (Name == "sse4")
2424 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002425
Rafael Espindolae62e2792013-08-20 13:44:29 +00002426 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002427
Craig Topper29561122013-09-19 01:13:07 +00002428 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002429 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002430 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002431 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002432 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002433 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002434 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002435 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002436 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002437 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002438 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002439 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002440 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002441 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002442 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002443 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002444 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002445 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002446 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002447 if (Enabled)
2448 setSSELevel(Features, SSE2, Enabled);
2449 } else if (Name == "pclmul") {
2450 if (Enabled)
2451 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002452 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002453 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002454 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002455 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002456 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002457 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002458 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2459 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002460 if (Enabled)
2461 setSSELevel(Features, AVX512F, Enabled);
2462 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002463 if (Enabled)
2464 setSSELevel(Features, AVX, Enabled);
2465 } else if (Name == "fma4") {
2466 setXOPLevel(Features, FMA4, Enabled);
2467 } else if (Name == "xop") {
2468 setXOPLevel(Features, XOP, Enabled);
2469 } else if (Name == "sse4a") {
2470 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002471 } else if (Name == "f16c") {
2472 if (Enabled)
2473 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002474 } else if (Name == "sha") {
2475 if (Enabled)
2476 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002477 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002478}
2479
Eric Christopher3ff21b32013-10-16 21:26:26 +00002480/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002481/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002482bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002483 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002484 // Remember the maximum enabled sselevel.
2485 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2486 // Ignore disabled features.
2487 if (Features[i][0] == '-')
2488 continue;
2489
Benjamin Kramer27402c62012-03-05 15:10:44 +00002490 StringRef Feature = StringRef(Features[i]).substr(1);
2491
2492 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002493 HasAES = true;
2494 continue;
2495 }
2496
Craig Topper3f122a72012-05-31 05:18:48 +00002497 if (Feature == "pclmul") {
2498 HasPCLMUL = true;
2499 continue;
2500 }
2501
Benjamin Kramer27402c62012-03-05 15:10:44 +00002502 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002503 HasLZCNT = true;
2504 continue;
2505 }
2506
Rafael Espindola89049822013-08-23 20:21:37 +00002507 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002508 HasRDRND = true;
2509 continue;
2510 }
2511
Benjamin Kramer27402c62012-03-05 15:10:44 +00002512 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002513 HasBMI = true;
2514 continue;
2515 }
2516
Benjamin Kramer27402c62012-03-05 15:10:44 +00002517 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002518 HasBMI2 = true;
2519 continue;
2520 }
2521
Benjamin Kramer27402c62012-03-05 15:10:44 +00002522 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002523 HasPOPCNT = true;
2524 continue;
2525 }
2526
Michael Liao625a8752012-11-10 05:17:46 +00002527 if (Feature == "rtm") {
2528 HasRTM = true;
2529 continue;
2530 }
2531
Michael Liao74f4eaf2013-03-26 17:52:08 +00002532 if (Feature == "prfchw") {
2533 HasPRFCHW = true;
2534 continue;
2535 }
2536
Michael Liaoffaae352013-03-29 05:17:55 +00002537 if (Feature == "rdseed") {
2538 HasRDSEED = true;
2539 continue;
2540 }
2541
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002542 if (Feature == "tbm") {
2543 HasTBM = true;
2544 continue;
2545 }
2546
Craig Topperbba778b2012-06-03 21:46:30 +00002547 if (Feature == "fma") {
2548 HasFMA = true;
2549 continue;
2550 }
2551
Manman Rena45358c2012-10-11 00:59:55 +00002552 if (Feature == "f16c") {
2553 HasF16C = true;
2554 continue;
2555 }
2556
Craig Topper679b53a2013-08-21 05:29:10 +00002557 if (Feature == "avx512cd") {
2558 HasAVX512CD = true;
2559 continue;
2560 }
2561
2562 if (Feature == "avx512er") {
2563 HasAVX512ER = true;
2564 continue;
2565 }
2566
2567 if (Feature == "avx512pf") {
2568 HasAVX512PF = true;
2569 continue;
2570 }
2571
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002572 if (Feature == "avx512dq") {
2573 HasAVX512DQ = true;
2574 continue;
2575 }
2576
2577 if (Feature == "avx512bw") {
2578 HasAVX512BW = true;
2579 continue;
2580 }
2581
2582 if (Feature == "avx512vl") {
2583 HasAVX512VL = true;
2584 continue;
2585 }
2586
Ben Langmuir58078d02013-09-19 13:22:04 +00002587 if (Feature == "sha") {
2588 HasSHA = true;
2589 continue;
2590 }
2591
Nick Lewycky50e8f482013-10-05 20:14:27 +00002592 if (Feature == "cx16") {
2593 HasCX16 = true;
2594 continue;
2595 }
2596
Daniel Dunbar979586e2009-11-11 09:38:56 +00002597 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002598 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002599 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002600 .Case("avx2", AVX2)
2601 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002602 .Case("sse4.2", SSE42)
2603 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002604 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002605 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002606 .Case("sse2", SSE2)
2607 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002608 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002609 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002610
Eli Friedman33465822011-07-08 23:31:17 +00002611 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002612 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002613 .Case("3dnowa", AMD3DNowAthlon)
2614 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002615 .Case("mmx", MMX)
2616 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002617 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002618
2619 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2620 .Case("xop", XOP)
2621 .Case("fma4", FMA4)
2622 .Case("sse4a", SSE4A)
2623 .Default(NoXOP);
2624 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002625 }
Eli Friedman33465822011-07-08 23:31:17 +00002626
Craig Topper7481d8a2013-09-10 06:55:47 +00002627 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2628 // Can't do this earlier because we need to be able to explicitly enable
2629 // popcnt and still disable sse4.2.
2630 if (!HasPOPCNT && SSELevel >= SSE42 &&
2631 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2632 HasPOPCNT = true;
2633 Features.push_back("+popcnt");
2634 }
2635
Yunzhong Gao61089362013-10-16 19:07:02 +00002636 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2637 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2638 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2639 HasPRFCHW = true;
2640 Features.push_back("+prfchw");
2641 }
2642
Rafael Espindolaeb265472013-08-21 21:59:03 +00002643 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2644 // matches the selected sse level.
2645 if (FPMath == FP_SSE && SSELevel < SSE1) {
2646 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2647 return false;
2648 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2649 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2650 return false;
2651 }
2652
Eli Friedman33465822011-07-08 23:31:17 +00002653 // Don't tell the backend if we're turning off mmx; it will end up disabling
2654 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002655 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2656 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002657 std::vector<std::string>::iterator it;
2658 it = std::find(Features.begin(), Features.end(), "-mmx");
2659 if (it != Features.end())
2660 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002661 else if (SSELevel > NoSSE)
2662 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002663 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002664}
Chris Lattnerecd49032009-03-02 22:27:17 +00002665
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002666/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2667/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002668void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002669 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002670 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002671 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002672 Builder.defineMacro("__amd64__");
2673 Builder.defineMacro("__amd64");
2674 Builder.defineMacro("__x86_64");
2675 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002676 if (getTriple().getArchName() == "x86_64h") {
2677 Builder.defineMacro("__x86_64h");
2678 Builder.defineMacro("__x86_64h__");
2679 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002680 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002681 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002682 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002683
Chris Lattnerecd49032009-03-02 22:27:17 +00002684 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002685 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2686 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002687 switch (CPU) {
2688 case CK_Generic:
2689 break;
2690 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002691 // The rest are coming from the i386 define above.
2692 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002693 break;
2694 case CK_i486:
2695 case CK_WinChipC6:
2696 case CK_WinChip2:
2697 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002698 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002699 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002700 case CK_PentiumMMX:
2701 Builder.defineMacro("__pentium_mmx__");
2702 Builder.defineMacro("__tune_pentium_mmx__");
2703 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002704 case CK_i586:
2705 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002706 defineCPUMacros(Builder, "i586");
2707 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002708 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002709 case CK_Pentium3:
2710 case CK_Pentium3M:
2711 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002712 Builder.defineMacro("__tune_pentium3__");
2713 // Fallthrough
2714 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002715 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002716 Builder.defineMacro("__tune_pentium2__");
2717 // Fallthrough
2718 case CK_PentiumPro:
2719 Builder.defineMacro("__tune_i686__");
2720 Builder.defineMacro("__tune_pentiumpro__");
2721 // Fallthrough
2722 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002723 Builder.defineMacro("__i686");
2724 Builder.defineMacro("__i686__");
2725 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2726 Builder.defineMacro("__pentiumpro");
2727 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002728 break;
2729 case CK_Pentium4:
2730 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002731 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002732 break;
2733 case CK_Yonah:
2734 case CK_Prescott:
2735 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002736 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002737 break;
2738 case CK_Core2:
2739 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002740 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002741 break;
2742 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002743 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002744 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002745 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002746 defineCPUMacros(Builder, "slm");
2747 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002748 case CK_Corei7:
2749 case CK_Corei7AVX:
2750 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002751 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002752 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002753 break;
Craig Topper449314e2013-08-20 07:09:39 +00002754 case CK_KNL:
2755 defineCPUMacros(Builder, "knl");
2756 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002757 case CK_SKX:
2758 defineCPUMacros(Builder, "skx");
2759 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002760 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002761 Builder.defineMacro("__k6_2__");
2762 Builder.defineMacro("__tune_k6_2__");
2763 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002764 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002765 if (CPU != CK_K6_2) { // In case of fallthrough
2766 // FIXME: GCC may be enabling these in cases where some other k6
2767 // architecture is specified but -m3dnow is explicitly provided. The
2768 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002769 Builder.defineMacro("__k6_3__");
2770 Builder.defineMacro("__tune_k6_3__");
2771 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002772 // Fallthrough
2773 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002774 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002775 break;
2776 case CK_Athlon:
2777 case CK_AthlonThunderbird:
2778 case CK_Athlon4:
2779 case CK_AthlonXP:
2780 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002781 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002782 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002783 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002784 Builder.defineMacro("__tune_athlon_sse__");
2785 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002786 break;
2787 case CK_K8:
2788 case CK_K8SSE3:
2789 case CK_x86_64:
2790 case CK_Opteron:
2791 case CK_OpteronSSE3:
2792 case CK_Athlon64:
2793 case CK_Athlon64SSE3:
2794 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002795 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002796 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002797 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002798 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002799 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002800 case CK_BTVER1:
2801 defineCPUMacros(Builder, "btver1");
2802 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002803 case CK_BTVER2:
2804 defineCPUMacros(Builder, "btver2");
2805 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002806 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002807 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002808 break;
2809 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002810 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002811 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002812 case CK_BDVER3:
2813 defineCPUMacros(Builder, "bdver3");
2814 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002815 case CK_BDVER4:
2816 defineCPUMacros(Builder, "bdver4");
2817 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002818 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002819 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002820 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002821 }
Chris Lattner96e43572009-03-02 22:40:39 +00002822
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002823 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002824 Builder.defineMacro("__REGISTER_PREFIX__", "");
2825
Chris Lattner6df41af2009-04-19 17:32:33 +00002826 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2827 // functions in glibc header files that use FP Stack inline asm which the
2828 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002829 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002830
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002831 if (HasAES)
2832 Builder.defineMacro("__AES__");
2833
Craig Topper3f122a72012-05-31 05:18:48 +00002834 if (HasPCLMUL)
2835 Builder.defineMacro("__PCLMUL__");
2836
Craig Topper22967d42011-12-25 05:06:45 +00002837 if (HasLZCNT)
2838 Builder.defineMacro("__LZCNT__");
2839
Benjamin Kramer1e250392012-07-07 09:39:18 +00002840 if (HasRDRND)
2841 Builder.defineMacro("__RDRND__");
2842
Craig Topper22967d42011-12-25 05:06:45 +00002843 if (HasBMI)
2844 Builder.defineMacro("__BMI__");
2845
2846 if (HasBMI2)
2847 Builder.defineMacro("__BMI2__");
2848
Craig Topper1de83482011-12-29 16:10:46 +00002849 if (HasPOPCNT)
2850 Builder.defineMacro("__POPCNT__");
2851
Michael Liao625a8752012-11-10 05:17:46 +00002852 if (HasRTM)
2853 Builder.defineMacro("__RTM__");
2854
Michael Liao74f4eaf2013-03-26 17:52:08 +00002855 if (HasPRFCHW)
2856 Builder.defineMacro("__PRFCHW__");
2857
Michael Liaoffaae352013-03-29 05:17:55 +00002858 if (HasRDSEED)
2859 Builder.defineMacro("__RDSEED__");
2860
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002861 if (HasTBM)
2862 Builder.defineMacro("__TBM__");
2863
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 switch (XOPLevel) {
2865 case XOP:
2866 Builder.defineMacro("__XOP__");
2867 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002868 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 case SSE4A:
2870 Builder.defineMacro("__SSE4A__");
2871 case NoXOP:
2872 break;
2873 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002874
Craig Topperbba778b2012-06-03 21:46:30 +00002875 if (HasFMA)
2876 Builder.defineMacro("__FMA__");
2877
Manman Rena45358c2012-10-11 00:59:55 +00002878 if (HasF16C)
2879 Builder.defineMacro("__F16C__");
2880
Craig Topper679b53a2013-08-21 05:29:10 +00002881 if (HasAVX512CD)
2882 Builder.defineMacro("__AVX512CD__");
2883 if (HasAVX512ER)
2884 Builder.defineMacro("__AVX512ER__");
2885 if (HasAVX512PF)
2886 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002887 if (HasAVX512DQ)
2888 Builder.defineMacro("__AVX512DQ__");
2889 if (HasAVX512BW)
2890 Builder.defineMacro("__AVX512BW__");
2891 if (HasAVX512VL)
2892 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002893
Ben Langmuir58078d02013-09-19 13:22:04 +00002894 if (HasSHA)
2895 Builder.defineMacro("__SHA__");
2896
Nick Lewycky50e8f482013-10-05 20:14:27 +00002897 if (HasCX16)
2898 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2899
Chris Lattner96e43572009-03-02 22:40:39 +00002900 // Each case falls through to the previous one here.
2901 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002902 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002903 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002904 case AVX2:
2905 Builder.defineMacro("__AVX2__");
2906 case AVX:
2907 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002908 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002909 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002910 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002911 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002912 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002913 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002914 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002915 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002916 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002917 Builder.defineMacro("__SSE2__");
2918 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002919 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002920 Builder.defineMacro("__SSE__");
2921 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002922 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002923 break;
2924 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002925
Derek Schuffc7dd7222012-10-11 15:52:22 +00002926 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002927 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002928 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002929 case AVX2:
2930 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002931 case SSE42:
2932 case SSE41:
2933 case SSSE3:
2934 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002935 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002936 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002937 break;
2938 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002939 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002940 break;
2941 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002942 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002943 }
2944 }
2945
Anders Carlssone437c682010-01-27 03:47:49 +00002946 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002947 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002948 case AMD3DNowAthlon:
2949 Builder.defineMacro("__3dNOW_A__");
2950 case AMD3DNow:
2951 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002952 case MMX:
2953 Builder.defineMacro("__MMX__");
2954 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002955 break;
2956 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002957
2958 if (CPU >= CK_i486) {
2959 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2960 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2961 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2962 }
2963 if (CPU >= CK_i586)
2964 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002965}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002966
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002967bool X86TargetInfo::hasFeature(StringRef Feature) const {
2968 return llvm::StringSwitch<bool>(Feature)
2969 .Case("aes", HasAES)
2970 .Case("avx", SSELevel >= AVX)
2971 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002972 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002973 .Case("avx512cd", HasAVX512CD)
2974 .Case("avx512er", HasAVX512ER)
2975 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002976 .Case("avx512dq", HasAVX512DQ)
2977 .Case("avx512bw", HasAVX512BW)
2978 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002979 .Case("bmi", HasBMI)
2980 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002981 .Case("cx16", HasCX16)
2982 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002983 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002984 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002985 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002986 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002987 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002988 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2989 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2990 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002991 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002992 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002993 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002994 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002995 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002996 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002997 .Case("sse", SSELevel >= SSE1)
2998 .Case("sse2", SSELevel >= SSE2)
2999 .Case("sse3", SSELevel >= SSE3)
3000 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003001 .Case("sse4.1", SSELevel >= SSE41)
3002 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003003 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003004 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003005 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3006 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003007 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003008 .Default(false);
3009}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003010
Eli Friedman3fd920a2008-08-20 02:34:37 +00003011bool
Anders Carlsson58436352009-02-28 17:11:49 +00003012X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003013 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003014 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003015 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00003016 case 'Y': // first letter of a pair:
3017 switch (*(Name+1)) {
3018 default: return false;
3019 case '0': // First SSE register.
3020 case 't': // Any SSE register, when SSE2 is enabled.
3021 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3022 case 'm': // any MMX register, when inter-unit moves enabled.
3023 break; // falls through to setAllowsRegister.
3024 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003025 case 'f': // any x87 floating point stack register.
3026 // Constraint 'f' cannot be used for output operands.
3027 if (Info.ConstraintStr[0] == '=')
3028 return false;
3029
3030 Info.setAllowsRegister();
3031 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003032 case 'a': // eax.
3033 case 'b': // ebx.
3034 case 'c': // ecx.
3035 case 'd': // edx.
3036 case 'S': // esi.
3037 case 'D': // edi.
3038 case 'A': // edx:eax.
3039 case 't': // top of floating point stack.
3040 case 'u': // second from top of floating point stack.
3041 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003042 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003043 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003044 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003045 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3046 case 'l': // "Index" registers: any general register that can be used as an
3047 // index in a base+index memory access.
3048 Info.setAllowsRegister();
3049 return true;
3050 case 'C': // SSE floating point constant.
3051 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003052 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003053 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003054 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003055 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003056 return true;
3057 }
3058}
3059
Akira Hatanaka974131e2014-09-18 18:17:18 +00003060bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3061 unsigned Size) const {
3062 // Strip off constraint modifiers.
3063 while (Constraint[0] == '=' ||
3064 Constraint[0] == '+' ||
3065 Constraint[0] == '&')
3066 Constraint = Constraint.substr(1);
3067
3068 return validateOperandSize(Constraint, Size);
3069}
3070
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003071bool X86TargetInfo::validateInputSize(StringRef Constraint,
3072 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003073 return validateOperandSize(Constraint, Size);
3074}
3075
3076bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3077 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003078 switch (Constraint[0]) {
3079 default: break;
3080 case 'y':
3081 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003082 case 'f':
3083 case 't':
3084 case 'u':
3085 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003086 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003087 // 256-bit ymm registers can be used if target supports AVX.
3088 return Size <= (SSELevel >= AVX ? 256 : 128);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003089 }
3090
3091 return true;
3092}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003093
Eli Friedman3fd920a2008-08-20 02:34:37 +00003094std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003095X86TargetInfo::convertConstraint(const char *&Constraint) const {
3096 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003097 case 'a': return std::string("{ax}");
3098 case 'b': return std::string("{bx}");
3099 case 'c': return std::string("{cx}");
3100 case 'd': return std::string("{dx}");
3101 case 'S': return std::string("{si}");
3102 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003103 case 'p': // address
3104 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003105 case 't': // top of floating point stack.
3106 return std::string("{st}");
3107 case 'u': // second from top of floating point stack.
3108 return std::string("{st(1)}"); // second from top of floating point stack.
3109 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003110 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003111 }
3112}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003113} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003114
3115namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003116// X86-32 generic target
3117class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003118public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003119 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003120 DoubleAlign = LongLongAlign = 32;
3121 LongDoubleWidth = 96;
3122 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003123 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003124 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003125 SizeType = UnsignedInt;
3126 PtrDiffType = SignedInt;
3127 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003128 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003129
3130 // Use fpret for all types.
3131 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3132 (1 << TargetInfo::Double) |
3133 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003134
3135 // x86-32 has atomics up to 8 bytes
3136 // FIXME: Check that we actually have cmpxchg8b before setting
3137 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3138 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003139 }
Craig Topper3164f332014-03-11 03:39:26 +00003140 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003141 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003142 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003143
Craig Topper3164f332014-03-11 03:39:26 +00003144 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003145 if (RegNo == 0) return 0;
3146 if (RegNo == 1) return 2;
3147 return -1;
3148 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003149 bool validateOperandSize(StringRef Constraint,
3150 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003151 switch (Constraint[0]) {
3152 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003153 case 'R':
3154 case 'q':
3155 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003156 case 'a':
3157 case 'b':
3158 case 'c':
3159 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003160 case 'S':
3161 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003162 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003163 case 'A':
3164 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003165 }
3166
Akira Hatanaka974131e2014-09-18 18:17:18 +00003167 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003168 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003169};
3170} // end anonymous namespace
3171
3172namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003173class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3174public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003175 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3176 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003177
Craig Topper3164f332014-03-11 03:39:26 +00003178 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003179 unsigned Major, Minor, Micro;
3180 getTriple().getOSVersion(Major, Minor, Micro);
3181 // New NetBSD uses the default rounding mode.
3182 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3183 return X86_32TargetInfo::getFloatEvalMethod();
3184 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003185 return 1;
3186 }
3187};
3188} // end anonymous namespace
3189
3190namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003191class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3192public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003193 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3194 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003195 SizeType = UnsignedLong;
3196 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003197 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003198 }
3199};
3200} // end anonymous namespace
3201
3202namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003203class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3204public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003205 BitrigI386TargetInfo(const llvm::Triple &Triple)
3206 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003207 SizeType = UnsignedLong;
3208 IntPtrType = SignedLong;
3209 PtrDiffType = SignedLong;
3210 }
3211};
3212} // end anonymous namespace
3213
3214namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003215class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003216public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003217 DarwinI386TargetInfo(const llvm::Triple &Triple)
3218 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003219 LongDoubleWidth = 128;
3220 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003221 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003222 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003223 SizeType = UnsignedLong;
3224 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003225 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003226 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003227 }
3228
Eli Friedman3fd920a2008-08-20 02:34:37 +00003229};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003230} // end anonymous namespace
3231
3232namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003233// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003234class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003235public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003236 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3237 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003238 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003239 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003240 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003241 }
Craig Topper3164f332014-03-11 03:39:26 +00003242 void getTargetDefines(const LangOptions &Opts,
3243 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003244 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3245 }
3246};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003247
3248// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003249class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003250public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003251 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003252 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003253 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003254 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3255 }
Craig Topper3164f332014-03-11 03:39:26 +00003256 void getTargetDefines(const LangOptions &Opts,
3257 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003258 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3259 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3260 // The value of the following reflects processor type.
3261 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3262 // We lost the original triple, so we use the default.
3263 Builder.defineMacro("_M_IX86", "600");
3264 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003265};
3266} // end anonymous namespace
3267
Reid Kleckner47606832014-04-21 20:58:00 +00003268static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3269 Builder.defineMacro("__MSVCRT__");
3270 Builder.defineMacro("__MINGW32__");
3271
3272 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3273 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3274 // macro anyway for pre-processor compatibility.
3275 if (Opts.MicrosoftExt)
3276 Builder.defineMacro("__declspec", "__declspec");
3277 else
3278 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3279
3280 if (!Opts.MicrosoftExt) {
3281 // Provide macros for all the calling convention keywords. Provide both
3282 // single and double underscore prefixed variants. These are available on
3283 // x64 as well as x86, even though they have no effect.
3284 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3285 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003286 std::string GCCSpelling = "__attribute__((__";
3287 GCCSpelling += CC;
3288 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003289 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3290 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3291 }
3292 }
3293}
3294
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003295namespace {
3296// x86-32 MinGW target
3297class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3298public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003299 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3300 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003301 void getTargetDefines(const LangOptions &Opts,
3302 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003303 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003304 DefineStd(Builder, "WIN32", Opts);
3305 DefineStd(Builder, "WINNT", Opts);
3306 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003307 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003308 }
3309};
3310} // end anonymous namespace
3311
3312namespace {
3313// x86-32 Cygwin target
3314class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3315public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003316 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3317 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003318 TLSSupported = false;
3319 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003320 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003321 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003322 }
Craig Topper3164f332014-03-11 03:39:26 +00003323 void getTargetDefines(const LangOptions &Opts,
3324 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003325 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003326 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003327 Builder.defineMacro("__CYGWIN__");
3328 Builder.defineMacro("__CYGWIN32__");
3329 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003330 if (Opts.CPlusPlus)
3331 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003332 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003333};
3334} // end anonymous namespace
3335
3336namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003337// x86-32 Haiku target
3338class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3339public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003340 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003341 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003342 IntPtrType = SignedLong;
3343 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003344 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003345 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003346 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003347 }
Craig Topper3164f332014-03-11 03:39:26 +00003348 void getTargetDefines(const LangOptions &Opts,
3349 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003350 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3351 Builder.defineMacro("__INTEL__");
3352 Builder.defineMacro("__HAIKU__");
3353 }
3354};
3355} // end anonymous namespace
3356
Douglas Gregor9fabd852011-07-01 22:41:14 +00003357// RTEMS Target
3358template<typename Target>
3359class RTEMSTargetInfo : public OSTargetInfo<Target> {
3360protected:
Craig Topper3164f332014-03-11 03:39:26 +00003361 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3362 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003363 // RTEMS defines; list based off of gcc output
3364
Douglas Gregor9fabd852011-07-01 22:41:14 +00003365 Builder.defineMacro("__rtems__");
3366 Builder.defineMacro("__ELF__");
3367 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003368
Douglas Gregor9fabd852011-07-01 22:41:14 +00003369public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003370 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3371 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003372
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003373 switch (Triple.getArch()) {
3374 default:
3375 case llvm::Triple::x86:
3376 // this->MCountName = ".mcount";
3377 break;
3378 case llvm::Triple::mips:
3379 case llvm::Triple::mipsel:
3380 case llvm::Triple::ppc:
3381 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003382 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003383 // this->MCountName = "_mcount";
3384 break;
3385 case llvm::Triple::arm:
3386 // this->MCountName = "__mcount";
3387 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003388 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003389 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003390};
3391
3392namespace {
3393// x86-32 RTEMS target
3394class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3395public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003396 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003397 SizeType = UnsignedLong;
3398 IntPtrType = SignedLong;
3399 PtrDiffType = SignedLong;
3400 this->UserLabelPrefix = "";
3401 }
Craig Topper3164f332014-03-11 03:39:26 +00003402 void getTargetDefines(const LangOptions &Opts,
3403 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003404 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3405 Builder.defineMacro("__INTEL__");
3406 Builder.defineMacro("__rtems__");
3407 }
3408};
3409} // end anonymous namespace
3410
Chris Lattnerb986aba2010-04-11 19:29:39 +00003411namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003412// x86-64 generic target
3413class X86_64TargetInfo : public X86TargetInfo {
3414public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003415 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003416 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003417 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003418 LongDoubleWidth = 128;
3419 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003420 LargeArrayMinWidth = 128;
3421 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003422 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003423 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3424 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3425 IntPtrType = IsX32 ? SignedInt : SignedLong;
3426 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003427 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003428 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003429
Zinovy Nis1db95732014-07-10 15:27:19 +00003430 DescriptionString = (IsX32)
3431 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3432 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003433
3434 // Use fpret only for long double.
3435 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003436
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003437 // Use fp2ret for _Complex long double.
3438 ComplexLongDoubleUsesFP2Ret = true;
3439
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003440 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003441 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003442 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003443 }
Craig Topper3164f332014-03-11 03:39:26 +00003444 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003445 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003446 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003447
Craig Topper3164f332014-03-11 03:39:26 +00003448 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003449 if (RegNo == 0) return 0;
3450 if (RegNo == 1) return 1;
3451 return -1;
3452 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003453
Craig Topper3164f332014-03-11 03:39:26 +00003454 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003455 return (CC == CC_C ||
3456 CC == CC_IntelOclBicc ||
3457 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003458 }
3459
Craig Topper3164f332014-03-11 03:39:26 +00003460 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003461 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003462 }
3463
Pavel Chupinfd223e12014-08-04 12:39:43 +00003464 // for x32 we need it here explicitly
3465 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003466};
3467} // end anonymous namespace
3468
3469namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003470// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003471class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003472public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003473 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3474 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003475 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003476 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003477 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003478 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003479 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003480 SizeType = UnsignedLongLong;
3481 PtrDiffType = SignedLongLong;
3482 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003483 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003484 }
Craig Topper3164f332014-03-11 03:39:26 +00003485 void getTargetDefines(const LangOptions &Opts,
3486 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003487 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003488 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003489 }
Craig Topper3164f332014-03-11 03:39:26 +00003490 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003491 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003492 }
Craig Topper3164f332014-03-11 03:39:26 +00003493 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003494 return (CC == CC_C ||
3495 CC == CC_IntelOclBicc ||
3496 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3497 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003498};
3499} // end anonymous namespace
3500
3501namespace {
3502// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003503class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003504public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003505 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003506 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003507 LongDoubleWidth = LongDoubleAlign = 64;
3508 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003509 }
Craig Topper3164f332014-03-11 03:39:26 +00003510 void getTargetDefines(const LangOptions &Opts,
3511 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003512 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3513 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003514 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003515 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003516 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003517};
3518} // end anonymous namespace
3519
3520namespace {
3521// x86-64 MinGW target
3522class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3523public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003524 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3525 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003526 void getTargetDefines(const LangOptions &Opts,
3527 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003528 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003529 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003530 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003531 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003532 }
3533};
3534} // end anonymous namespace
3535
3536namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003537class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3538public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003539 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3540 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003541 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003542 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003543 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3544 llvm::Triple T = llvm::Triple(Triple);
3545 if (T.getOS() == llvm::Triple::IOS)
3546 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003547 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003548 }
3549};
3550} // end anonymous namespace
3551
3552namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003553class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003555 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3556 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003557 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003558 Int64Type = SignedLongLong;
3559 }
3560};
3561} // end anonymous namespace
3562
3563namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003564class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3565public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003566 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3567 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3568 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003569 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003570 }
3571};
Tim Northover9bb857a2013-01-31 12:13:10 +00003572}
3573
Eli Friedman9fa28852012-08-08 23:57:20 +00003574
3575namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003576class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003577 // Possible FPU choices.
3578 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003579 VFP2FPU = (1 << 0),
3580 VFP3FPU = (1 << 1),
3581 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003582 NeonFPU = (1 << 3),
3583 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003584 };
3585
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003586 // Possible HWDiv features.
3587 enum HWDivMode {
3588 HWDivThumb = (1 << 0),
3589 HWDivARM = (1 << 1)
3590 };
3591
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003592 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003593 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003594 }
3595
3596 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3597 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003598
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003599 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003600
Rafael Espindolaeb265472013-08-21 21:59:03 +00003601 enum {
3602 FP_Default,
3603 FP_VFP,
3604 FP_Neon
3605 } FPMath;
3606
Bernard Ogdenda13af32013-10-24 18:32:51 +00003607 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003608
Logan Chien57086ce2012-10-10 06:56:20 +00003609 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003610 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003611 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003612
3613 // Initialized via features.
3614 unsigned SoftFloat : 1;
3615 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003616
Bernard Ogden18b57012013-10-29 09:47:51 +00003617 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003618 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003619
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003620 // ACLE 6.5.1 Hardware floating point
3621 enum {
3622 HW_FP_HP = (1 << 1), /// half (16-bit)
3623 HW_FP_SP = (1 << 2), /// single (32-bit)
3624 HW_FP_DP = (1 << 3), /// double (64-bit)
3625 };
3626 uint32_t HW_FP;
3627
Chris Lattner5cc15e02010-03-03 19:03:45 +00003628 static const Builtin::Info BuiltinInfo[];
3629
Rafael Espindola101d5b92013-05-13 20:09:47 +00003630 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003631 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003632 if (T.getArch() == llvm::Triple::arm ||
3633 T.getArch() == llvm::Triple::armeb) {
3634 StringRef VersionStr;
3635 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003636 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003637 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003638 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003639 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003640 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003641 unsigned Version;
3642 if (VersionStr.getAsInteger(10, Version))
3643 return false;
3644 return Version >= 6;
3645 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003646 assert(T.getArch() == llvm::Triple::thumb ||
3647 T.getArch() == llvm::Triple::thumbeb);
3648 StringRef VersionStr;
3649 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003650 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003651 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003652 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003653 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003654 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003655 unsigned Version;
3656 if (VersionStr.getAsInteger(10, Version))
3657 return false;
3658 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003659 }
3660
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003661 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003662 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003663
3664 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003665 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003666
Tim Northover00853e52014-08-05 11:07:26 +00003667 // size_t is unsigned long on MachO-derived environments and NetBSD.
3668 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003669 SizeType = UnsignedLong;
3670 else
3671 SizeType = UnsignedInt;
3672
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003673 switch (T.getOS()) {
3674 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003675 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003676 break;
3677 case llvm::Triple::Win32:
3678 WCharType = UnsignedShort;
3679 break;
3680 case llvm::Triple::Linux:
3681 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003682 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3683 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003684 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003685 }
3686
3687 UseBitFieldTypeAlignment = true;
3688
3689 ZeroLengthBitfieldBoundary = 0;
3690
3691 if (IsThumb) {
3692 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3693 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003694 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003695 DescriptionString = BigEndian ?
3696 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3697 "v128:64:128-a:0:32-n32-S64" :
3698 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3699 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003700 } else if (T.isOSWindows()) {
3701 // FIXME: this is invalid for WindowsCE
3702 assert(!BigEndian && "Windows on ARM does not support big endian");
3703 DescriptionString = "e"
3704 "-m:e"
3705 "-p:32:32"
3706 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3707 "-v128:64:128"
3708 "-a:0:32"
3709 "-n32"
3710 "-S64";
3711 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003712 DescriptionString = BigEndian ?
3713 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3714 "v128:64:128-a:0:32-n32-S64" :
3715 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3716 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003717 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003718 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003719 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003720 DescriptionString = BigEndian ?
3721 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3722 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003723 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003724 DescriptionString = BigEndian ?
3725 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3726 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003727 }
3728
3729 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003730 }
3731
3732 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003733 const llvm::Triple &T = getTriple();
3734
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003735 IsAAPCS = false;
3736
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003737 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003738
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003739 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003740 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003741 SizeType = UnsignedInt;
3742 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003743 SizeType = UnsignedLong;
3744
3745 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3746 WCharType = SignedInt;
3747
3748 // Do not respect the alignment of bit-field types when laying out
3749 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3750 UseBitFieldTypeAlignment = false;
3751
3752 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3753 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3754 /// gcc.
3755 ZeroLengthBitfieldBoundary = 32;
3756
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003757 if (IsThumb) {
3758 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3759 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003760 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003761 DescriptionString = BigEndian ?
3762 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3763 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3764 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3765 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003766 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003767 DescriptionString = BigEndian ?
3768 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3769 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3770 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3771 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003772 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003773 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003774 DescriptionString = BigEndian ?
3775 "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
Rafael Espindolac418ae92014-01-03 19:22:05 +00003776 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3777 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003778 DescriptionString = BigEndian ?
3779 "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
Rafael Espindolac418ae92014-01-03 19:22:05 +00003780 "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 +00003781 }
3782
3783 // FIXME: Override "preferred align" for double and long long.
3784 }
3785
Chris Lattner17df24e2008-04-21 18:56:49 +00003786public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003787 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003788 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003789 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003790 BigEndian = IsBigEndian;
3791
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003792 switch (getTriple().getOS()) {
3793 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003794 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003795 break;
3796 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003797 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003798 break;
3799 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003800
Chris Lattner1a8f3942010-04-23 16:29:58 +00003801 // {} in inline assembly are neon specifiers, not assembly variant
3802 // specifiers.
3803 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003804
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003805 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003806 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003807
3808 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003809
3810 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003811 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003812
3813 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003814 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003815 if (shouldUseInlineAtomic(getTriple()))
3816 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003817
3818 // Do force alignment of members that follow zero length bitfields. If
3819 // the alignment of the zero-length bitfield is greater than the member
3820 // that follows it, `bar', `bar' will be aligned as the type of the
3821 // zero length bitfield.
3822 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003823 }
Alp Toker4925ba72014-06-07 23:30:42 +00003824 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003825 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003826 ABI = Name;
3827
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003828 // The defaults (above) are for AAPCS, check if we need to change them.
3829 //
3830 // FIXME: We need support for -meabi... we could just mangle it into the
3831 // name.
3832 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003833 setABIAPCS();
3834 return true;
3835 }
3836 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3837 setABIAAPCS();
3838 return true;
3839 }
3840 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003841 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003842
Craig Topper3164f332014-03-11 03:39:26 +00003843 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003844 if (IsAAPCS)
3845 Features["aapcs"] = true;
3846 else
3847 Features["apcs"] = true;
3848
Silviu Barangae5690462013-10-21 10:59:33 +00003849 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003850 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3851 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003852 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3853 CPU == "cortex-a9-mp") {
3854 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003855 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003856 }
3857 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003858 Features["vfp4"] = true;
3859 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003860 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3861 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3862 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003863 Features["vfp4"] = true;
3864 Features["neon"] = true;
3865 Features["hwdiv"] = true;
3866 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003867 } else if (CPU == "cyclone") {
3868 Features["v8fp"] = true;
3869 Features["neon"] = true;
3870 Features["hwdiv"] = true;
3871 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003872 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3873 Features["fp-armv8"] = true;
3874 Features["neon"] = true;
3875 Features["hwdiv"] = true;
3876 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003877 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003878 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003879 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003880 // Enable the hwdiv extension for all v8a AArch32 cores by
3881 // default.
3882 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003883 ArchName == "armebv8a" || ArchName == "armebv8" ||
3884 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3885 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003886 Features["hwdiv"] = true;
3887 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003888 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3889 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003890 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003891 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003892
Craig Topper3164f332014-03-11 03:39:26 +00003893 bool handleTargetFeatures(std::vector<std::string> &Features,
3894 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003895 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003896 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003897 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003898 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003899 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003900
3901 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003902 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003903 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003904 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003905 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003906 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003907 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003908 HW_FP = HW_FP_SP | HW_FP_DP;
3909 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003910 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003911 HW_FP = HW_FP_SP | HW_FP_DP;
3912 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003913 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003914 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3915 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003916 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003917 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3918 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003919 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003920 HW_FP = HW_FP_SP | HW_FP_DP;
3921 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003922 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003923 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003924 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003925 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00003926 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003927 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00003928 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003929 } else if (Feature == "+fp-only-sp") {
3930 HW_FP &= ~HW_FP_DP;
3931 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003932 }
3933
Rafael Espindolaeb265472013-08-21 21:59:03 +00003934 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3935 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3936 return false;
3937 }
3938
3939 if (FPMath == FP_Neon)
3940 Features.push_back("+neonfp");
3941 else if (FPMath == FP_VFP)
3942 Features.push_back("-neonfp");
3943
Daniel Dunbar893d4752009-12-19 04:15:38 +00003944 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003945 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
3946 for (const auto &FEFeature : FrontEndFeatures) {
3947 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
3948 if (Feature != Features.end())
3949 Features.erase(Feature);
3950 }
3951
Rafael Espindolaeb265472013-08-21 21:59:03 +00003952 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003953 }
3954
Craig Topper3164f332014-03-11 03:39:26 +00003955 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003956 return llvm::StringSwitch<bool>(Feature)
3957 .Case("arm", true)
3958 .Case("softfloat", SoftFloat)
3959 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003960 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003961 .Case("hwdiv", HWDiv & HWDivThumb)
3962 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003963 .Default(false);
3964 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003965 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003966 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003967 return llvm::StringSwitch<const char*>(Name)
3968 .Cases("arm8", "arm810", "4")
3969 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3970 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3971 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3972 .Case("ep9312", "4T")
3973 .Cases("arm10tdmi", "arm1020t", "5T")
3974 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3975 .Case("arm926ej-s", "5TEJ")
3976 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3977 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003978 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003979 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003980 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003981 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003982 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003983 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003984 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003985 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003986 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00003987 .Case("cortex-m3", "7M")
3988 .Case("cortex-m4", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003989 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003990 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003991 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003992 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003993 static const char *getCPUProfile(StringRef Name) {
3994 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003995 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003996 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003997 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003998 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003999 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004000 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004001 }
Craig Topper3164f332014-03-11 03:39:26 +00004002 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004003 if (!getCPUDefineSuffix(Name))
4004 return false;
4005
Tim Northovere8c37212014-07-09 09:24:43 +00004006 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4007 StringRef Profile = getCPUProfile(Name);
4008 if (Profile == "M" && MaxAtomicInlineWidth) {
4009 MaxAtomicPromoteWidth = 32;
4010 MaxAtomicInlineWidth = 32;
4011 }
4012
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004013 CPU = Name;
4014 return true;
4015 }
Craig Topper3164f332014-03-11 03:39:26 +00004016 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004017 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4018 unsigned CPUArchVer) const {
4019 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4020 (CPUArch.find('M') != StringRef::npos);
4021 }
4022 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4023 unsigned CPUArchVer) const {
4024 // We check both CPUArchVer and ArchName because when only triple is
4025 // specified, the default CPU is arm1136j-s.
4026 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4027 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4028 }
Craig Topper3164f332014-03-11 03:39:26 +00004029 void getTargetDefines(const LangOptions &Opts,
4030 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004031 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004032 Builder.defineMacro("__arm");
4033 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004034
Chris Lattnerecd49032009-03-02 22:27:17 +00004035 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004036 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004037
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004038 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004039 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004040 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004041 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004042 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004043
4044 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004045 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004046 StringRef ArchName = getTriple().getArchName();
4047
4048 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4049 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
James Molloy0ffb0932014-09-15 11:25:38 +00004050 if (CPUArch[0] >= '8') {
4051 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4052 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4053 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004054
4055 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4056 // is not defined for the M-profile.
4057 // NOTE that the deffault profile is assumed to be 'A'
4058 if (CPUProfile.empty() || CPUProfile != "M")
4059 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4060
4061 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4062 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4063 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4064 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4065 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4066 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4067 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4068
4069 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4070 // instruction set such as ARM or Thumb.
4071 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4072
4073 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4074
4075 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004076 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004077 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004078
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004079 // ACLE 6.5.1 Hardware Floating Point
4080 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004081 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004082
Yi Konga44c4d72014-06-27 21:25:42 +00004083 // ACLE predefines.
4084 Builder.defineMacro("__ARM_ACLE", "200");
4085
Mike Stump9d54bd72009-04-08 02:07:04 +00004086 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004087
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004088 // FIXME: It's more complicated than this and we don't really support
4089 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004090 // Windows on ARM does not "support" interworking
4091 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004092 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004093
David Tweed8f676532012-10-25 13:33:01 +00004094 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004095 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004096 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4097 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004098 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004099 Builder.defineMacro("__ARM_PCS", "1");
4100
David Tweed8f676532012-10-25 13:33:01 +00004101 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004102 Builder.defineMacro("__ARM_PCS_VFP", "1");
4103 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004104
Daniel Dunbar893d4752009-12-19 04:15:38 +00004105 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004106 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004107
4108 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004109 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004110
4111 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004112 Builder.defineMacro("__THUMBEL__");
4113 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004114 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004115 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004116 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004117 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4118 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004119
4120 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004121 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004122
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004123 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004124 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004125 if (FPU & VFP2FPU)
4126 Builder.defineMacro("__ARM_VFPV2__");
4127 if (FPU & VFP3FPU)
4128 Builder.defineMacro("__ARM_VFPV3__");
4129 if (FPU & VFP4FPU)
4130 Builder.defineMacro("__ARM_VFPV4__");
4131 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004132
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004133 // This only gets set when Neon instructions are actually available, unlike
4134 // the VFP define, hence the soft float and arch check. This is subtly
4135 // different from gcc, we follow the intent which was that it should be set
4136 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004137 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4138 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004139 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004140 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004141
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004142 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4143 Opts.ShortWChar ? "2" : "4");
4144
4145 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4146 Opts.ShortEnums ? "1" : "4");
4147
Bernard Ogden18b57012013-10-29 09:47:51 +00004148 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004149 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004150
Tim Northover02e38602014-02-03 17:28:04 +00004151 if (Crypto)
4152 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4153
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004154 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004155 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4156 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4157 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4158 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4159 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004160 }
Craig Topper3164f332014-03-11 03:39:26 +00004161 void getTargetBuiltins(const Builtin::Info *&Records,
4162 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004163 Records = BuiltinInfo;
4164 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004165 }
Craig Topper3164f332014-03-11 03:39:26 +00004166 bool isCLZForZeroUndef() const override { return false; }
4167 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004168 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004169 }
Craig Topper3164f332014-03-11 03:39:26 +00004170 void getGCCRegNames(const char * const *&Names,
4171 unsigned &NumNames) const override;
4172 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4173 unsigned &NumAliases) const override;
4174 bool validateAsmConstraint(const char *&Name,
4175 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004176 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004177 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004178 case 'l': // r0-r7
4179 case 'h': // r8-r15
4180 case 'w': // VFP Floating point register single precision
4181 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004182 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004183 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004184 case 'Q': // A memory address that is a single base register.
4185 Info.setAllowsMemory();
4186 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004187 case 'U': // a memory reference...
4188 switch (Name[1]) {
4189 case 'q': // ...ARMV4 ldrsb
4190 case 'v': // ...VFP load/store (reg+constant offset)
4191 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004192 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004193 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004194 case 'n': // valid address for Neon doubleword vector load/store
4195 case 'm': // valid address for Neon element and structure load/store
4196 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004197 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004198 Info.setAllowsMemory();
4199 Name++;
4200 return true;
4201 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004202 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004203 return false;
4204 }
Craig Topper3164f332014-03-11 03:39:26 +00004205 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004206 std::string R;
4207 switch (*Constraint) {
4208 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004209 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004210 Constraint++;
4211 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004212 case 'p': // 'p' should be translated to 'r' by default.
4213 R = std::string("r");
4214 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004215 default:
4216 return std::string(1, *Constraint);
4217 }
4218 return R;
4219 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004220 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004221 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004222 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004223 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004224 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004225
Bill Wendling9d1ee112012-10-25 23:28:48 +00004226 // Strip off constraint modifiers.
4227 while (Constraint[0] == '=' ||
4228 Constraint[0] == '+' ||
4229 Constraint[0] == '&')
4230 Constraint = Constraint.substr(1);
4231
4232 switch (Constraint[0]) {
4233 default: break;
4234 case 'r': {
4235 switch (Modifier) {
4236 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004237 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004238 case 'q':
4239 // A register of size 32 cannot fit a vector type.
4240 return false;
4241 }
4242 }
4243 }
4244
4245 return true;
4246 }
Craig Topper3164f332014-03-11 03:39:26 +00004247 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004248 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004249 return "";
4250 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004251
Craig Topper3164f332014-03-11 03:39:26 +00004252 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004253 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4254 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004255
Craig Topper3164f332014-03-11 03:39:26 +00004256 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004257 if (RegNo == 0) return 0;
4258 if (RegNo == 1) return 1;
4259 return -1;
4260 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004261};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004262
Rafael Espindolaeb265472013-08-21 21:59:03 +00004263bool ARMTargetInfo::setFPMath(StringRef Name) {
4264 if (Name == "neon") {
4265 FPMath = FP_Neon;
4266 return true;
4267 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4268 Name == "vfp4") {
4269 FPMath = FP_VFP;
4270 return true;
4271 }
4272 return false;
4273}
4274
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004275const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004276 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004277 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004278 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4279
4280 // Float registers
4281 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4282 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4283 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004284 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004285
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004286 // Double registers
4287 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4288 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004289 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4290 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004291
4292 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004293 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4294 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004295};
4296
4297void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004298 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004299 Names = GCCRegNames;
4300 NumNames = llvm::array_lengthof(GCCRegNames);
4301}
4302
4303const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004304 { { "a1" }, "r0" },
4305 { { "a2" }, "r1" },
4306 { { "a3" }, "r2" },
4307 { { "a4" }, "r3" },
4308 { { "v1" }, "r4" },
4309 { { "v2" }, "r5" },
4310 { { "v3" }, "r6" },
4311 { { "v4" }, "r7" },
4312 { { "v5" }, "r8" },
4313 { { "v6", "rfp" }, "r9" },
4314 { { "sl" }, "r10" },
4315 { { "fp" }, "r11" },
4316 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004317 { { "r13" }, "sp" },
4318 { { "r14" }, "lr" },
4319 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004320 // The S, D and Q registers overlap, but aren't really aliases; we
4321 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004322};
4323
4324void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4325 unsigned &NumAliases) const {
4326 Aliases = GCCRegAliases;
4327 NumAliases = llvm::array_lengthof(GCCRegAliases);
4328}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004329
4330const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004331#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004332#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004333 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004334#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004335
4336#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004337#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004338#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4339 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004340#include "clang/Basic/BuiltinsARM.def"
4341};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004342
4343class ARMleTargetInfo : public ARMTargetInfo {
4344public:
4345 ARMleTargetInfo(const llvm::Triple &Triple)
4346 : ARMTargetInfo(Triple, false) { }
4347 virtual void getTargetDefines(const LangOptions &Opts,
4348 MacroBuilder &Builder) const {
4349 Builder.defineMacro("__ARMEL__");
4350 ARMTargetInfo::getTargetDefines(Opts, Builder);
4351 }
4352};
4353
4354class ARMbeTargetInfo : public ARMTargetInfo {
4355public:
4356 ARMbeTargetInfo(const llvm::Triple &Triple)
4357 : ARMTargetInfo(Triple, true) { }
4358 virtual void getTargetDefines(const LangOptions &Opts,
4359 MacroBuilder &Builder) const {
4360 Builder.defineMacro("__ARMEB__");
4361 Builder.defineMacro("__ARM_BIG_ENDIAN");
4362 ARMTargetInfo::getTargetDefines(Opts, Builder);
4363 }
4364};
Chris Lattner17df24e2008-04-21 18:56:49 +00004365} // end anonymous namespace.
4366
Eli Friedmanf05b7722008-08-20 07:44:10 +00004367namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004368class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4369 const llvm::Triple Triple;
4370public:
4371 WindowsARMTargetInfo(const llvm::Triple &Triple)
4372 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4373 TLSSupported = false;
4374 WCharType = UnsignedShort;
4375 SizeType = UnsignedInt;
4376 UserLabelPrefix = "";
4377 }
4378 void getVisualStudioDefines(const LangOptions &Opts,
4379 MacroBuilder &Builder) const {
4380 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4381
4382 // FIXME: this is invalid for WindowsCE
4383 Builder.defineMacro("_M_ARM_NT", "1");
4384 Builder.defineMacro("_M_ARMT", "_M_ARM");
4385 Builder.defineMacro("_M_THUMB", "_M_ARM");
4386
4387 assert((Triple.getArch() == llvm::Triple::arm ||
4388 Triple.getArch() == llvm::Triple::thumb) &&
4389 "invalid architecture for Windows ARM target info");
4390 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4391 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4392
4393 // TODO map the complete set of values
4394 // 31: VFPv3 40: VFPv4
4395 Builder.defineMacro("_M_ARM_FP", "31");
4396 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004397 BuiltinVaListKind getBuiltinVaListKind() const override {
4398 return TargetInfo::CharPtrBuiltinVaList;
4399 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004400};
4401
4402// Windows ARM + Itanium C++ ABI Target
4403class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4404public:
4405 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4406 : WindowsARMTargetInfo(Triple) {
4407 TheCXXABI.set(TargetCXXABI::GenericARM);
4408 }
4409
4410 void getTargetDefines(const LangOptions &Opts,
4411 MacroBuilder &Builder) const override {
4412 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4413
4414 if (Opts.MSVCCompat)
4415 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4416 }
4417};
4418
4419// Windows ARM, MS (C++) ABI
4420class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4421public:
4422 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4423 : WindowsARMTargetInfo(Triple) {
4424 TheCXXABI.set(TargetCXXABI::Microsoft);
4425 }
4426
4427 void getTargetDefines(const LangOptions &Opts,
4428 MacroBuilder &Builder) const override {
4429 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4430 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4431 }
4432};
4433}
4434
4435
4436namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004437class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004438 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004439protected:
Craig Topper3164f332014-03-11 03:39:26 +00004440 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4441 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004442 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004443 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004444
Torok Edwinb2b37c62009-06-30 17:10:35 +00004445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004446 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004447 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004448 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004449 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004450 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004451 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004452
4453 // Darwin on iOS uses a variant of the ARM C++ ABI.
4454 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004455 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004456};
4457} // end anonymous namespace.
4458
Tony Linthicum76329bf2011-12-12 21:14:55 +00004459
4460namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004461class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004462 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004463 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4464 static const char *const GCCRegNames[];
4465
James Molloy75f5f9e2014-04-16 15:33:48 +00004466 enum FPUModeEnum {
4467 FPUMode,
4468 NeonMode
4469 };
4470
4471 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004472 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004473 unsigned Crypto;
4474
Tim Northovera2ee4332014-03-29 15:09:45 +00004475 static const Builtin::Info BuiltinInfo[];
4476
4477 std::string ABI;
4478
4479public:
Tim Northover573cbee2014-05-24 12:52:07 +00004480 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004481 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004482
4483 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4484 WCharType = SignedInt;
4485
4486 // NetBSD apparently prefers consistency across ARM targets to consistency
4487 // across 64-bit targets.
4488 Int64Type = SignedLongLong;
4489 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004490 } else {
4491 WCharType = UnsignedInt;
4492 Int64Type = SignedLong;
4493 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004494 }
4495
Tim Northovera2ee4332014-03-29 15:09:45 +00004496 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004497 MaxVectorAlign = 128;
4498 RegParmMax = 8;
4499 MaxAtomicInlineWidth = 128;
4500 MaxAtomicPromoteWidth = 128;
4501
4502 LongDoubleWidth = LongDoubleAlign = 128;
4503 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4504
Tim Northovera2ee4332014-03-29 15:09:45 +00004505 // {} in inline assembly are neon specifiers, not assembly variant
4506 // specifiers.
4507 NoAsmVariants = true;
4508
Tim Northover573cbee2014-05-24 12:52:07 +00004509 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004510 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4511 }
4512
Alp Toker4925ba72014-06-07 23:30:42 +00004513 StringRef getABI() const override { return ABI; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004514 virtual bool setABI(const std::string &Name) {
4515 if (Name != "aapcs" && Name != "darwinpcs")
4516 return false;
4517
4518 ABI = Name;
4519 return true;
4520 }
4521
4522 virtual bool setCPU(const std::string &Name) {
4523 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004524 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004525 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004526 .Case("cyclone", true)
4527 .Default(false);
4528 return CPUKnown;
4529 }
4530
4531 virtual void getTargetDefines(const LangOptions &Opts,
4532 MacroBuilder &Builder) const {
4533 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004534 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004535
4536 // Target properties.
4537 Builder.defineMacro("_LP64");
4538 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004539
4540 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4541 Builder.defineMacro("__ARM_ACLE", "200");
4542 Builder.defineMacro("__ARM_ARCH", "8");
4543 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4544
4545 Builder.defineMacro("__ARM_64BIT_STATE");
4546 Builder.defineMacro("__ARM_PCS_AAPCS64");
4547 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4548
4549 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4550 Builder.defineMacro("__ARM_FEATURE_CLZ");
4551 Builder.defineMacro("__ARM_FEATURE_FMA");
4552 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004553 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4554 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4555 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4556 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004557
4558 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4559
4560 // 0xe implies support for half, single and double precision operations.
4561 Builder.defineMacro("__ARM_FP", "0xe");
4562
4563 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4564 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4565 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4566
4567 if (Opts.FastMath || Opts.FiniteMathOnly)
4568 Builder.defineMacro("__ARM_FP_FAST");
4569
4570 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4571 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4572
4573 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4574
4575 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4576 Opts.ShortEnums ? "1" : "4");
4577
James Molloy75f5f9e2014-04-16 15:33:48 +00004578 if (FPU == NeonMode) {
4579 Builder.defineMacro("__ARM_NEON");
4580 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004581 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004582 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004583
Bradley Smith418c5932014-05-02 15:17:51 +00004584 if (CRC)
4585 Builder.defineMacro("__ARM_FEATURE_CRC32");
4586
James Molloy75f5f9e2014-04-16 15:33:48 +00004587 if (Crypto)
4588 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004589 }
4590
4591 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4592 unsigned &NumRecords) const {
4593 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004594 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004595 }
4596
4597 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004598 return Feature == "aarch64" ||
4599 Feature == "arm64" ||
4600 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004601 }
4602
James Molloy5e73df52014-04-16 15:06:20 +00004603 bool handleTargetFeatures(std::vector<std::string> &Features,
4604 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004605 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004606 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004607 Crypto = 0;
4608 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4609 if (Features[i] == "+neon")
4610 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004611 if (Features[i] == "+crc")
4612 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004613 if (Features[i] == "+crypto")
4614 Crypto = 1;
4615 }
4616
James Molloy5e73df52014-04-16 15:06:20 +00004617 setDescriptionString();
4618
4619 return true;
4620 }
4621
Tim Northovera2ee4332014-03-29 15:09:45 +00004622 virtual bool isCLZForZeroUndef() const { return false; }
4623
4624 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4625 return TargetInfo::AArch64ABIBuiltinVaList;
4626 }
4627
4628 virtual void getGCCRegNames(const char *const *&Names,
4629 unsigned &NumNames) const;
4630 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4631 unsigned &NumAliases) const;
4632
4633 virtual bool validateAsmConstraint(const char *&Name,
4634 TargetInfo::ConstraintInfo &Info) const {
4635 switch (*Name) {
4636 default:
4637 return false;
4638 case 'w': // Floating point and SIMD registers (V0-V31)
4639 Info.setAllowsRegister();
4640 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004641 case 'I': // Constant that can be used with an ADD instruction
4642 case 'J': // Constant that can be used with a SUB instruction
4643 case 'K': // Constant that can be used with a 32-bit logical instruction
4644 case 'L': // Constant that can be used with a 64-bit logical instruction
4645 case 'M': // Constant that can be used as a 32-bit MOV immediate
4646 case 'N': // Constant that can be used as a 64-bit MOV immediate
4647 case 'Y': // Floating point constant zero
4648 case 'Z': // Integer constant zero
4649 return true;
4650 case 'Q': // A memory reference with base register and no offset
4651 Info.setAllowsMemory();
4652 return true;
4653 case 'S': // A symbolic address
4654 Info.setAllowsRegister();
4655 return true;
4656 case 'U':
4657 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4658 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4659 // Usa: An absolute symbolic address
4660 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4661 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004662 case 'z': // Zero register, wzr or xzr
4663 Info.setAllowsRegister();
4664 return true;
4665 case 'x': // Floating point and SIMD registers (V0-V15)
4666 Info.setAllowsRegister();
4667 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004668 }
4669 return false;
4670 }
4671
Akira Hatanaka987f1862014-08-22 06:05:21 +00004672 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004673 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004674 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004675 // Strip off constraint modifiers.
4676 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4677 Constraint = Constraint.substr(1);
4678
4679 switch (Constraint[0]) {
4680 default:
4681 return true;
4682 case 'z':
4683 case 'r': {
4684 switch (Modifier) {
4685 case 'x':
4686 case 'w':
4687 // For now assume that the person knows what they're
4688 // doing with the modifier.
4689 return true;
4690 default:
4691 // By default an 'r' constraint will be in the 'x'
4692 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004693 if (Size == 64)
4694 return true;
4695
4696 SuggestedModifier = "w";
4697 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004698 }
4699 }
4700 }
4701 }
4702
Tim Northovera2ee4332014-03-29 15:09:45 +00004703 virtual const char *getClobbers() const { return ""; }
4704
4705 int getEHDataRegisterNumber(unsigned RegNo) const {
4706 if (RegNo == 0)
4707 return 0;
4708 if (RegNo == 1)
4709 return 1;
4710 return -1;
4711 }
4712};
4713
Tim Northover573cbee2014-05-24 12:52:07 +00004714const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004715 // 32-bit Integer registers
4716 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4717 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4718 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4719
4720 // 64-bit Integer registers
4721 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4722 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4723 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4724
4725 // 32-bit floating point regsisters
4726 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4727 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4728 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4729
4730 // 64-bit floating point regsisters
4731 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4732 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4733 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4734
4735 // Vector registers
4736 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4737 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4738 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4739};
4740
Tim Northover573cbee2014-05-24 12:52:07 +00004741void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004742 unsigned &NumNames) const {
4743 Names = GCCRegNames;
4744 NumNames = llvm::array_lengthof(GCCRegNames);
4745}
4746
Tim Northover573cbee2014-05-24 12:52:07 +00004747const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004748 { { "w31" }, "wsp" },
4749 { { "x29" }, "fp" },
4750 { { "x30" }, "lr" },
4751 { { "x31" }, "sp" },
4752 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4753 // don't want to substitute one of these for a different-sized one.
4754};
4755
Tim Northover573cbee2014-05-24 12:52:07 +00004756void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004757 unsigned &NumAliases) const {
4758 Aliases = GCCRegAliases;
4759 NumAliases = llvm::array_lengthof(GCCRegAliases);
4760}
4761
Tim Northover573cbee2014-05-24 12:52:07 +00004762const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004763#define BUILTIN(ID, TYPE, ATTRS) \
4764 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4765#include "clang/Basic/BuiltinsNEON.def"
4766
4767#define BUILTIN(ID, TYPE, ATTRS) \
4768 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004769#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004770};
James Molloy5e73df52014-04-16 15:06:20 +00004771
Tim Northover573cbee2014-05-24 12:52:07 +00004772class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004773 void setDescriptionString() override {
4774 if (getTriple().isOSBinFormatMachO())
4775 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4776 else
4777 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4778 }
4779
4780public:
Tim Northover573cbee2014-05-24 12:52:07 +00004781 AArch64leTargetInfo(const llvm::Triple &Triple)
4782 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004783 BigEndian = false;
4784 }
4785 void getTargetDefines(const LangOptions &Opts,
4786 MacroBuilder &Builder) const override {
4787 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004788 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004789 }
4790};
4791
Tim Northover573cbee2014-05-24 12:52:07 +00004792class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004793 void setDescriptionString() override {
4794 assert(!getTriple().isOSBinFormatMachO());
4795 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4796 }
4797
4798public:
Tim Northover573cbee2014-05-24 12:52:07 +00004799 AArch64beTargetInfo(const llvm::Triple &Triple)
4800 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004801 void getTargetDefines(const LangOptions &Opts,
4802 MacroBuilder &Builder) const override {
4803 Builder.defineMacro("__AARCH64EB__");
4804 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4805 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004806 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004807 }
4808};
Tim Northovera2ee4332014-03-29 15:09:45 +00004809} // end anonymous namespace.
4810
4811namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004812class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004813protected:
4814 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4815 MacroBuilder &Builder) const override {
4816 Builder.defineMacro("__AARCH64_SIMD__");
4817 Builder.defineMacro("__ARM64_ARCH_8__");
4818 Builder.defineMacro("__ARM_NEON__");
4819 Builder.defineMacro("__LITTLE_ENDIAN__");
4820 Builder.defineMacro("__REGISTER_PREFIX__", "");
4821 Builder.defineMacro("__arm64", "1");
4822 Builder.defineMacro("__arm64__", "1");
4823
4824 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4825 }
4826
Tim Northovera2ee4332014-03-29 15:09:45 +00004827public:
Tim Northover573cbee2014-05-24 12:52:07 +00004828 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4829 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004830 Int64Type = SignedLongLong;
4831 WCharType = SignedInt;
4832 UseSignedCharForObjCBool = false;
4833
4834 LongDoubleWidth = LongDoubleAlign = 64;
4835 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4836
4837 TheCXXABI.set(TargetCXXABI::iOS64);
4838 }
4839
4840 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4841 return TargetInfo::CharPtrBuiltinVaList;
4842 }
4843};
4844} // end anonymous namespace
4845
4846namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004847// Hexagon abstract base class
4848class HexagonTargetInfo : public TargetInfo {
4849 static const Builtin::Info BuiltinInfo[];
4850 static const char * const GCCRegNames[];
4851 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4852 std::string CPU;
4853public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004854 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004855 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004856 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004857
4858 // {} in inline assembly are packet specifiers, not assembly variant
4859 // specifiers.
4860 NoAsmVariants = true;
4861 }
4862
Craig Topper3164f332014-03-11 03:39:26 +00004863 void getTargetBuiltins(const Builtin::Info *&Records,
4864 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004865 Records = BuiltinInfo;
4866 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4867 }
4868
Craig Topper3164f332014-03-11 03:39:26 +00004869 bool validateAsmConstraint(const char *&Name,
4870 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004871 return true;
4872 }
4873
Craig Topper3164f332014-03-11 03:39:26 +00004874 void getTargetDefines(const LangOptions &Opts,
4875 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004876
Craig Topper3164f332014-03-11 03:39:26 +00004877 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004878 return Feature == "hexagon";
4879 }
Craig Topper3164f332014-03-11 03:39:26 +00004880
4881 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004882 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004883 }
Craig Topper3164f332014-03-11 03:39:26 +00004884 void getGCCRegNames(const char * const *&Names,
4885 unsigned &NumNames) const override;
4886 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4887 unsigned &NumAliases) const override;
4888 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004889 return "";
4890 }
Sebastian Pop86500282012-01-13 20:37:10 +00004891
4892 static const char *getHexagonCPUSuffix(StringRef Name) {
4893 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004894 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004895 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004896 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004897 }
4898
Craig Topper3164f332014-03-11 03:39:26 +00004899 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004900 if (!getHexagonCPUSuffix(Name))
4901 return false;
4902
Tony Linthicum76329bf2011-12-12 21:14:55 +00004903 CPU = Name;
4904 return true;
4905 }
4906};
4907
4908void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4909 MacroBuilder &Builder) const {
4910 Builder.defineMacro("qdsp6");
4911 Builder.defineMacro("__qdsp6", "1");
4912 Builder.defineMacro("__qdsp6__", "1");
4913
4914 Builder.defineMacro("hexagon");
4915 Builder.defineMacro("__hexagon", "1");
4916 Builder.defineMacro("__hexagon__", "1");
4917
4918 if(CPU == "hexagonv1") {
4919 Builder.defineMacro("__HEXAGON_V1__");
4920 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4921 if(Opts.HexagonQdsp6Compat) {
4922 Builder.defineMacro("__QDSP6_V1__");
4923 Builder.defineMacro("__QDSP6_ARCH__", "1");
4924 }
4925 }
4926 else if(CPU == "hexagonv2") {
4927 Builder.defineMacro("__HEXAGON_V2__");
4928 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4929 if(Opts.HexagonQdsp6Compat) {
4930 Builder.defineMacro("__QDSP6_V2__");
4931 Builder.defineMacro("__QDSP6_ARCH__", "2");
4932 }
4933 }
4934 else if(CPU == "hexagonv3") {
4935 Builder.defineMacro("__HEXAGON_V3__");
4936 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4937 if(Opts.HexagonQdsp6Compat) {
4938 Builder.defineMacro("__QDSP6_V3__");
4939 Builder.defineMacro("__QDSP6_ARCH__", "3");
4940 }
4941 }
4942 else if(CPU == "hexagonv4") {
4943 Builder.defineMacro("__HEXAGON_V4__");
4944 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4945 if(Opts.HexagonQdsp6Compat) {
4946 Builder.defineMacro("__QDSP6_V4__");
4947 Builder.defineMacro("__QDSP6_ARCH__", "4");
4948 }
4949 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004950 else if(CPU == "hexagonv5") {
4951 Builder.defineMacro("__HEXAGON_V5__");
4952 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4953 if(Opts.HexagonQdsp6Compat) {
4954 Builder.defineMacro("__QDSP6_V5__");
4955 Builder.defineMacro("__QDSP6_ARCH__", "5");
4956 }
4957 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004958}
4959
4960const char * const HexagonTargetInfo::GCCRegNames[] = {
4961 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4962 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4963 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4964 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4965 "p0", "p1", "p2", "p3",
4966 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4967};
4968
4969void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4970 unsigned &NumNames) const {
4971 Names = GCCRegNames;
4972 NumNames = llvm::array_lengthof(GCCRegNames);
4973}
4974
4975
4976const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4977 { { "sp" }, "r29" },
4978 { { "fp" }, "r30" },
4979 { { "lr" }, "r31" },
4980 };
4981
4982void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4983 unsigned &NumAliases) const {
4984 Aliases = GCCRegAliases;
4985 NumAliases = llvm::array_lengthof(GCCRegAliases);
4986}
4987
4988
4989const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4990#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4991#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4992 ALL_LANGUAGES },
4993#include "clang/Basic/BuiltinsHexagon.def"
4994};
4995}
4996
4997
Chris Lattner5ba61f02006-10-14 07:39:34 +00004998namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004999// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5000class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005001 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5002 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005003 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005004public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005005 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005006
Craig Topper3164f332014-03-11 03:39:26 +00005007 bool handleTargetFeatures(std::vector<std::string> &Features,
5008 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005009 SoftFloat = false;
5010 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5011 if (Features[i] == "+soft-float")
5012 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005013 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005014 }
Craig Topper3164f332014-03-11 03:39:26 +00005015 void getTargetDefines(const LangOptions &Opts,
5016 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005017 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005018 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005019
5020 if (SoftFloat)
5021 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005022 }
Craig Topper3164f332014-03-11 03:39:26 +00005023
5024 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005025 return llvm::StringSwitch<bool>(Feature)
5026 .Case("softfloat", SoftFloat)
5027 .Case("sparc", true)
5028 .Default(false);
5029 }
Craig Topper3164f332014-03-11 03:39:26 +00005030
5031 void getTargetBuiltins(const Builtin::Info *&Records,
5032 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005033 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005034 }
Craig Topper3164f332014-03-11 03:39:26 +00005035 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005036 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005037 }
Craig Topper3164f332014-03-11 03:39:26 +00005038 void getGCCRegNames(const char * const *&Names,
5039 unsigned &NumNames) const override;
5040 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5041 unsigned &NumAliases) const override;
5042 bool validateAsmConstraint(const char *&Name,
5043 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005044 // FIXME: Implement!
5045 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005046 }
Craig Topper3164f332014-03-11 03:39:26 +00005047 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005048 // FIXME: Implement!
5049 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005050 }
5051};
5052
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005053const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005054 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5055 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5056 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5057 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5058};
5059
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005060void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5061 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005062 Names = GCCRegNames;
5063 NumNames = llvm::array_lengthof(GCCRegNames);
5064}
5065
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005066const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005067 { { "g0" }, "r0" },
5068 { { "g1" }, "r1" },
5069 { { "g2" }, "r2" },
5070 { { "g3" }, "r3" },
5071 { { "g4" }, "r4" },
5072 { { "g5" }, "r5" },
5073 { { "g6" }, "r6" },
5074 { { "g7" }, "r7" },
5075 { { "o0" }, "r8" },
5076 { { "o1" }, "r9" },
5077 { { "o2" }, "r10" },
5078 { { "o3" }, "r11" },
5079 { { "o4" }, "r12" },
5080 { { "o5" }, "r13" },
5081 { { "o6", "sp" }, "r14" },
5082 { { "o7" }, "r15" },
5083 { { "l0" }, "r16" },
5084 { { "l1" }, "r17" },
5085 { { "l2" }, "r18" },
5086 { { "l3" }, "r19" },
5087 { { "l4" }, "r20" },
5088 { { "l5" }, "r21" },
5089 { { "l6" }, "r22" },
5090 { { "l7" }, "r23" },
5091 { { "i0" }, "r24" },
5092 { { "i1" }, "r25" },
5093 { { "i2" }, "r26" },
5094 { { "i3" }, "r27" },
5095 { { "i4" }, "r28" },
5096 { { "i5" }, "r29" },
5097 { { "i6", "fp" }, "r30" },
5098 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005099};
5100
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005101void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5102 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005103 Aliases = GCCRegAliases;
5104 NumAliases = llvm::array_lengthof(GCCRegAliases);
5105}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005106
5107// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5108class SparcV8TargetInfo : public SparcTargetInfo {
5109public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005110 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005111 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005112 }
5113
Craig Topper3164f332014-03-11 03:39:26 +00005114 void getTargetDefines(const LangOptions &Opts,
5115 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005116 SparcTargetInfo::getTargetDefines(Opts, Builder);
5117 Builder.defineMacro("__sparcv8");
5118 }
5119};
5120
5121// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5122class SparcV9TargetInfo : public SparcTargetInfo {
5123public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005124 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005125 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005126 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005127 // This is an LP64 platform.
5128 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005129
5130 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005131 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005132 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005133 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005134 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005135 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005136
5137 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5138 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5139 LongDoubleWidth = 128;
5140 LongDoubleAlign = 128;
5141 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005142 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005143 }
5144
Craig Topper3164f332014-03-11 03:39:26 +00005145 void getTargetDefines(const LangOptions &Opts,
5146 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005147 SparcTargetInfo::getTargetDefines(Opts, Builder);
5148 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005149 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005150 // Solaris doesn't need these variants, but the BSDs do.
5151 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005152 Builder.defineMacro("__sparc64__");
5153 Builder.defineMacro("__sparc_v9__");
5154 Builder.defineMacro("__sparcv9__");
5155 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005156 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005157
Craig Topper3164f332014-03-11 03:39:26 +00005158 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005159 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5160 .Case("v9", true)
5161 .Case("ultrasparc", true)
5162 .Case("ultrasparc3", true)
5163 .Case("niagara", true)
5164 .Case("niagara2", true)
5165 .Case("niagara3", true)
5166 .Case("niagara4", true)
5167 .Default(false);
5168
5169 // No need to store the CPU yet. There aren't any CPU-specific
5170 // macros to define.
5171 return CPUKnown;
5172 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005173};
5174
Gabor Greif49991682008-02-21 16:29:08 +00005175} // end anonymous namespace.
5176
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005177namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005178class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005179public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005180 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5181 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005182 SizeType = UnsignedInt;
5183 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005184 }
5185};
5186} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005187
Chris Lattnerb781dc792008-05-08 05:58:21 +00005188namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005189class SystemZTargetInfo : public TargetInfo {
5190 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005191
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005192public:
5193 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5194 TLSSupported = true;
5195 IntWidth = IntAlign = 32;
5196 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5197 PointerWidth = PointerAlign = 64;
5198 LongDoubleWidth = 128;
5199 LongDoubleAlign = 64;
5200 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5201 MinGlobalAlign = 16;
5202 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5203 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5204 }
5205 void getTargetDefines(const LangOptions &Opts,
5206 MacroBuilder &Builder) const override {
5207 Builder.defineMacro("__s390__");
5208 Builder.defineMacro("__s390x__");
5209 Builder.defineMacro("__zarch__");
5210 Builder.defineMacro("__LONG_DOUBLE_128__");
5211 }
5212 void getTargetBuiltins(const Builtin::Info *&Records,
5213 unsigned &NumRecords) const override {
5214 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005215 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005216 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005217 }
5218
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005219 void getGCCRegNames(const char *const *&Names,
5220 unsigned &NumNames) const override;
5221 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5222 unsigned &NumAliases) const override {
5223 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005224 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005225 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005226 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005227 bool validateAsmConstraint(const char *&Name,
5228 TargetInfo::ConstraintInfo &info) const override;
5229 const char *getClobbers() const override {
5230 // FIXME: Is this really right?
5231 return "";
5232 }
5233 BuiltinVaListKind getBuiltinVaListKind() const override {
5234 return TargetInfo::SystemZBuiltinVaList;
5235 }
5236 bool setCPU(const std::string &Name) override {
5237 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5238 .Case("z10", true)
5239 .Case("z196", true)
5240 .Case("zEC12", true)
5241 .Default(false);
5242
5243 // No need to store the CPU yet. There aren't any CPU-specific
5244 // macros to define.
5245 return CPUKnown;
5246 }
5247};
5248
5249const char *const SystemZTargetInfo::GCCRegNames[] = {
5250 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5251 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5252 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5253 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5254};
5255
5256void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5257 unsigned &NumNames) const {
5258 Names = GCCRegNames;
5259 NumNames = llvm::array_lengthof(GCCRegNames);
5260}
5261
5262bool SystemZTargetInfo::
5263validateAsmConstraint(const char *&Name,
5264 TargetInfo::ConstraintInfo &Info) const {
5265 switch (*Name) {
5266 default:
5267 return false;
5268
5269 case 'a': // Address register
5270 case 'd': // Data register (equivalent to 'r')
5271 case 'f': // Floating-point register
5272 Info.setAllowsRegister();
5273 return true;
5274
5275 case 'I': // Unsigned 8-bit constant
5276 case 'J': // Unsigned 12-bit constant
5277 case 'K': // Signed 16-bit constant
5278 case 'L': // Signed 20-bit displacement (on all targets we support)
5279 case 'M': // 0x7fffffff
5280 return true;
5281
5282 case 'Q': // Memory with base and unsigned 12-bit displacement
5283 case 'R': // Likewise, plus an index
5284 case 'S': // Memory with base and signed 20-bit displacement
5285 case 'T': // Likewise, plus an index
5286 Info.setAllowsMemory();
5287 return true;
5288 }
5289}
Ulrich Weigand47445072013-05-06 16:26:41 +00005290}
5291
5292namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005293 class MSP430TargetInfo : public TargetInfo {
5294 static const char * const GCCRegNames[];
5295 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005296 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005297 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005298 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005299 IntWidth = 16; IntAlign = 16;
5300 LongWidth = 32; LongLongWidth = 64;
5301 LongAlign = LongLongAlign = 16;
5302 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005303 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005304 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005305 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005306 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005307 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005308 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005309 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005310 }
5311 void getTargetDefines(const LangOptions &Opts,
5312 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005313 Builder.defineMacro("MSP430");
5314 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005315 // FIXME: defines for different 'flavours' of MCU
5316 }
Craig Topper3164f332014-03-11 03:39:26 +00005317 void getTargetBuiltins(const Builtin::Info *&Records,
5318 unsigned &NumRecords) const override {
5319 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005320 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005321 NumRecords = 0;
5322 }
Craig Topper3164f332014-03-11 03:39:26 +00005323 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005324 return Feature == "msp430";
5325 }
Craig Topper3164f332014-03-11 03:39:26 +00005326 void getGCCRegNames(const char * const *&Names,
5327 unsigned &NumNames) const override;
5328 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5329 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005330 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005331 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005332 NumAliases = 0;
5333 }
Craig Topper3164f332014-03-11 03:39:26 +00005334 bool validateAsmConstraint(const char *&Name,
5335 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005336 // No target constraints for now.
5337 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005338 }
Craig Topper3164f332014-03-11 03:39:26 +00005339 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005340 // FIXME: Is this really right?
5341 return "";
5342 }
Craig Topper3164f332014-03-11 03:39:26 +00005343 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005344 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005345 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005346 }
5347 };
5348
5349 const char * const MSP430TargetInfo::GCCRegNames[] = {
5350 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5351 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5352 };
5353
5354 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5355 unsigned &NumNames) const {
5356 Names = GCCRegNames;
5357 NumNames = llvm::array_lengthof(GCCRegNames);
5358 }
5359}
5360
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005361namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005362
Mike Stump11289f42009-09-09 15:08:12 +00005363 // LLVM and Clang cannot be used directly to output native binaries for
5364 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005365 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005366 //
5367 // TCE uses the llvm bitcode as input and uses it for generating customized
5368 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005369 // publicly available in http://tce.cs.tut.fi
5370
Eli Friedman1f191002011-10-07 19:51:42 +00005371 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5372 3, // opencl_global
5373 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005374 5, // opencl_constant
5375 0, // cuda_device
5376 0, // cuda_constant
5377 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005378 };
5379
Eli Friedmana9c3d712009-08-19 20:47:07 +00005380 class TCETargetInfo : public TargetInfo{
5381 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005382 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005383 TLSSupported = false;
5384 IntWidth = 32;
5385 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005386 PointerWidth = 32;
5387 IntAlign = 32;
5388 LongAlign = LongLongAlign = 32;
5389 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005390 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005391 SizeType = UnsignedInt;
5392 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005393 IntPtrType = SignedInt;
5394 PtrDiffType = SignedInt;
5395 FloatWidth = 32;
5396 FloatAlign = 32;
5397 DoubleWidth = 32;
5398 DoubleAlign = 32;
5399 LongDoubleWidth = 32;
5400 LongDoubleAlign = 32;
5401 FloatFormat = &llvm::APFloat::IEEEsingle;
5402 DoubleFormat = &llvm::APFloat::IEEEsingle;
5403 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005404 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5405 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005406 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005407 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005408 }
5409
Craig Topper3164f332014-03-11 03:39:26 +00005410 void getTargetDefines(const LangOptions &Opts,
5411 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005412 DefineStd(Builder, "tce", Opts);
5413 Builder.defineMacro("__TCE__");
5414 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005415 }
Craig Topper3164f332014-03-11 03:39:26 +00005416 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005417 return Feature == "tce";
5418 }
Craig Topper3164f332014-03-11 03:39:26 +00005419
5420 void getTargetBuiltins(const Builtin::Info *&Records,
5421 unsigned &NumRecords) const override {}
5422 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005423 return "";
5424 }
Craig Topper3164f332014-03-11 03:39:26 +00005425 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005426 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005427 }
Craig Topper3164f332014-03-11 03:39:26 +00005428 void getGCCRegNames(const char * const *&Names,
5429 unsigned &NumNames) const override {}
5430 bool validateAsmConstraint(const char *&Name,
5431 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005432 return true;
5433 }
Craig Topper3164f332014-03-11 03:39:26 +00005434 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5435 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005436 };
5437}
5438
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005439namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005440class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005441 virtual void setDescriptionString() = 0;
5442
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005443 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005444 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005445 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005446 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005447 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005448 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005449 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005450 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005451 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005452 enum DspRevEnum {
5453 NoDSP, DSP1, DSP2
5454 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005455 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005456
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005457protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005458 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005459 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005460
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005462 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5463 const std::string &CPUStr)
5464 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005465 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005466 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005467
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005468 bool isNaN2008Default() const {
5469 return CPU == "mips32r6" || CPU == "mips64r6";
5470 }
5471
5472 bool isFP64Default() const {
5473 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5474 }
5475
Alp Toker4925ba72014-06-07 23:30:42 +00005476 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005477 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005478 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5479 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005480 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005481 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005482 .Case("mips1", IsMips32)
5483 .Case("mips2", IsMips32)
5484 .Case("mips3", true)
5485 .Case("mips4", true)
5486 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005487 .Case("mips32", IsMips32)
5488 .Case("mips32r2", IsMips32)
5489 .Case("mips32r6", IsMips32)
5490 .Case("mips64", true)
5491 .Case("mips64r2", true)
5492 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005493 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005494 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005495 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005496 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005497 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005498 // The backend enables certain ABI's by default according to the
5499 // architecture.
5500 // Disable both possible defaults so that we don't end up with multiple
5501 // ABI's selected and trigger an assertion.
5502 Features["o32"] = false;
5503 Features["n64"] = false;
5504
Eric Christopher0b26a612010-03-02 02:41:08 +00005505 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005506 if (CPU == "octeon")
5507 Features["mips64r2"] = Features["cnmips"] = true;
5508 else
5509 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005510 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005511
Craig Topper3164f332014-03-11 03:39:26 +00005512 void getTargetDefines(const LangOptions &Opts,
5513 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005514 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005515 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005516 if (Opts.GNUMode)
5517 Builder.defineMacro("mips");
5518
Simon Atanasyan683535b2012-08-29 19:14:58 +00005519 Builder.defineMacro("__REGISTER_PREFIX__", "");
5520
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005521 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005522 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005523 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005524 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005525 case SoftFloat:
5526 Builder.defineMacro("__mips_soft_float", Twine(1));
5527 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005528 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005529
Simon Atanasyan16071912013-04-14 14:07:30 +00005530 if (IsSingleFloat)
5531 Builder.defineMacro("__mips_single_float", Twine(1));
5532
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005533 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5534 Builder.defineMacro("_MIPS_FPSET",
5535 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5536
Simon Atanasyan72244b62012-07-05 16:06:06 +00005537 if (IsMips16)
5538 Builder.defineMacro("__mips16", Twine(1));
5539
Simon Atanasyan60777612013-04-14 14:07:51 +00005540 if (IsMicromips)
5541 Builder.defineMacro("__mips_micromips", Twine(1));
5542
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005543 if (IsNan2008)
5544 Builder.defineMacro("__mips_nan2008", Twine(1));
5545
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005546 switch (DspRev) {
5547 default:
5548 break;
5549 case DSP1:
5550 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5551 Builder.defineMacro("__mips_dsp", Twine(1));
5552 break;
5553 case DSP2:
5554 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5555 Builder.defineMacro("__mips_dspr2", Twine(1));
5556 Builder.defineMacro("__mips_dsp", Twine(1));
5557 break;
5558 }
5559
Jack Carter44ff1e52013-08-12 17:20:29 +00005560 if (HasMSA)
5561 Builder.defineMacro("__mips_msa", Twine(1));
5562
Simon Atanasyan26f19672012-04-05 19:28:31 +00005563 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5564 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5565 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005566
5567 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5568 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005569 }
5570
Craig Topper3164f332014-03-11 03:39:26 +00005571 void getTargetBuiltins(const Builtin::Info *&Records,
5572 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005573 Records = BuiltinInfo;
5574 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005575 }
Craig Topper3164f332014-03-11 03:39:26 +00005576 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005577 return llvm::StringSwitch<bool>(Feature)
5578 .Case("mips", true)
5579 .Case("fp64", HasFP64)
5580 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005581 }
Craig Topper3164f332014-03-11 03:39:26 +00005582 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005583 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005584 }
Craig Topper3164f332014-03-11 03:39:26 +00005585 void getGCCRegNames(const char * const *&Names,
5586 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005587 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005588 // CPU register names
5589 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005590 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5591 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5592 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005593 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5594 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005595 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5596 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5597 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5598 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005599 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005600 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005601 "$fcc5","$fcc6","$fcc7",
5602 // MSA register names
5603 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5604 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5605 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5606 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5607 // MSA control register names
5608 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5609 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005610 };
5611 Names = GCCRegNames;
5612 NumNames = llvm::array_lengthof(GCCRegNames);
5613 }
Craig Topper3164f332014-03-11 03:39:26 +00005614 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5615 unsigned &NumAliases) const override = 0;
5616 bool validateAsmConstraint(const char *&Name,
5617 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005618 switch (*Name) {
5619 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005620 return false;
5621
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005622 case 'r': // CPU registers.
5623 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005624 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005625 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005626 case 'c': // $25 for indirect jumps
5627 case 'l': // lo register
5628 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005629 Info.setAllowsRegister();
5630 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005631 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005632 Info.setAllowsMemory();
5633 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005634 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005635 }
5636
Craig Topper3164f332014-03-11 03:39:26 +00005637 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005638 // FIXME: Implement!
5639 return "";
5640 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005641
Craig Topper3164f332014-03-11 03:39:26 +00005642 bool handleTargetFeatures(std::vector<std::string> &Features,
5643 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005644 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005645 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005646 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005647 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005648 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005649 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005650 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005651
5652 for (std::vector<std::string>::iterator it = Features.begin(),
5653 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005654 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005655 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005656 else if (*it == "+soft-float")
5657 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005658 else if (*it == "+mips16")
5659 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005660 else if (*it == "+micromips")
5661 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005662 else if (*it == "+dsp")
5663 DspRev = std::max(DspRev, DSP1);
5664 else if (*it == "+dspr2")
5665 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005666 else if (*it == "+msa")
5667 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005668 else if (*it == "+fp64")
5669 HasFP64 = true;
5670 else if (*it == "-fp64")
5671 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005672 else if (*it == "+nan2008")
5673 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005674 else if (*it == "-nan2008")
5675 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005676 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005677
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005678 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005679 std::vector<std::string>::iterator it =
5680 std::find(Features.begin(), Features.end(), "+soft-float");
5681 if (it != Features.end())
5682 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005683
Akira Hatanaka9064e362013-10-29 18:30:33 +00005684 setDescriptionString();
5685
Rafael Espindolaeb265472013-08-21 21:59:03 +00005686 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005687 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005688
Craig Topper3164f332014-03-11 03:39:26 +00005689 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005690 if (RegNo == 0) return 4;
5691 if (RegNo == 1) return 5;
5692 return -1;
5693 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005694
5695 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005696};
5697
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005698const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5699#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5700#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5701 ALL_LANGUAGES },
5702#include "clang/Basic/BuiltinsMips.def"
5703};
5704
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005705class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005706public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005707 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005708 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005709 SizeType = UnsignedInt;
5710 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005711 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005712 }
Craig Topper3164f332014-03-11 03:39:26 +00005713 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005714 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005715 ABI = Name;
5716 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005717 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005718 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005719 }
Craig Topper3164f332014-03-11 03:39:26 +00005720 void getTargetDefines(const LangOptions &Opts,
5721 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005722 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005723
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005724 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005725 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5726
5727 const std::string& CPUStr = getCPU();
5728 if (CPUStr == "mips32")
5729 Builder.defineMacro("__mips_isa_rev", "1");
5730 else if (CPUStr == "mips32r2")
5731 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005732
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005733 if (ABI == "o32") {
5734 Builder.defineMacro("__mips_o32");
5735 Builder.defineMacro("_ABIO32", "1");
5736 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5737 }
5738 else if (ABI == "eabi")
5739 Builder.defineMacro("__mips_eabi");
5740 else
David Blaikie83d382b2011-09-23 05:06:16 +00005741 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005742 }
Craig Topper3164f332014-03-11 03:39:26 +00005743 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5744 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005745 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5746 { { "at" }, "$1" },
5747 { { "v0" }, "$2" },
5748 { { "v1" }, "$3" },
5749 { { "a0" }, "$4" },
5750 { { "a1" }, "$5" },
5751 { { "a2" }, "$6" },
5752 { { "a3" }, "$7" },
5753 { { "t0" }, "$8" },
5754 { { "t1" }, "$9" },
5755 { { "t2" }, "$10" },
5756 { { "t3" }, "$11" },
5757 { { "t4" }, "$12" },
5758 { { "t5" }, "$13" },
5759 { { "t6" }, "$14" },
5760 { { "t7" }, "$15" },
5761 { { "s0" }, "$16" },
5762 { { "s1" }, "$17" },
5763 { { "s2" }, "$18" },
5764 { { "s3" }, "$19" },
5765 { { "s4" }, "$20" },
5766 { { "s5" }, "$21" },
5767 { { "s6" }, "$22" },
5768 { { "s7" }, "$23" },
5769 { { "t8" }, "$24" },
5770 { { "t9" }, "$25" },
5771 { { "k0" }, "$26" },
5772 { { "k1" }, "$27" },
5773 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005774 { { "sp","$sp" }, "$29" },
5775 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005776 { { "ra" }, "$31" }
5777 };
5778 Aliases = GCCRegAliases;
5779 NumAliases = llvm::array_lengthof(GCCRegAliases);
5780 }
5781};
5782
5783class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005784 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005785 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005786 }
5787
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005788public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005789 Mips32EBTargetInfo(const llvm::Triple &Triple)
5790 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005791 }
Craig Topper3164f332014-03-11 03:39:26 +00005792 void getTargetDefines(const LangOptions &Opts,
5793 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005794 DefineStd(Builder, "MIPSEB", Opts);
5795 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005796 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005797 }
5798};
5799
5800class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005801 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005802 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005803 }
5804
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005805public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005806 Mips32ELTargetInfo(const llvm::Triple &Triple)
5807 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005808 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005809 }
Craig Topper3164f332014-03-11 03:39:26 +00005810 void getTargetDefines(const LangOptions &Opts,
5811 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005812 DefineStd(Builder, "MIPSEL", Opts);
5813 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005814 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005815 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005816};
Akira Hatanakabef17452011-09-20 19:21:49 +00005817
5818class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005819public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005820 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005821 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005822 LongDoubleWidth = LongDoubleAlign = 128;
5823 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005824 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5825 LongDoubleWidth = LongDoubleAlign = 64;
5826 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5827 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005828 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005829 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005830 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005831 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005832
5833 void setN64ABITypes() {
5834 LongWidth = LongAlign = 64;
5835 PointerWidth = PointerAlign = 64;
5836 SizeType = UnsignedLong;
5837 PtrDiffType = SignedLong;
5838 }
5839
5840 void setN32ABITypes() {
5841 LongWidth = LongAlign = 32;
5842 PointerWidth = PointerAlign = 32;
5843 SizeType = UnsignedInt;
5844 PtrDiffType = SignedInt;
5845 }
5846
Craig Topper3164f332014-03-11 03:39:26 +00005847 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005848 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005849 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005850 ABI = Name;
5851 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005852 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005853 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005854 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005855 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005856 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005857 }
5858 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005859 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005860
Craig Topper3164f332014-03-11 03:39:26 +00005861 void getTargetDefines(const LangOptions &Opts,
5862 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005863 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005864
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005865 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005866 Builder.defineMacro("__mips64");
5867 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005868 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5869
5870 const std::string& CPUStr = getCPU();
5871 if (CPUStr == "mips64")
5872 Builder.defineMacro("__mips_isa_rev", "1");
5873 else if (CPUStr == "mips64r2")
5874 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005875
Akira Hatanakabef17452011-09-20 19:21:49 +00005876 if (ABI == "n32") {
5877 Builder.defineMacro("__mips_n32");
5878 Builder.defineMacro("_ABIN32", "2");
5879 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5880 }
5881 else if (ABI == "n64") {
5882 Builder.defineMacro("__mips_n64");
5883 Builder.defineMacro("_ABI64", "3");
5884 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5885 }
5886 else
David Blaikie83d382b2011-09-23 05:06:16 +00005887 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005888 }
Craig Topper3164f332014-03-11 03:39:26 +00005889 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5890 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005891 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5892 { { "at" }, "$1" },
5893 { { "v0" }, "$2" },
5894 { { "v1" }, "$3" },
5895 { { "a0" }, "$4" },
5896 { { "a1" }, "$5" },
5897 { { "a2" }, "$6" },
5898 { { "a3" }, "$7" },
5899 { { "a4" }, "$8" },
5900 { { "a5" }, "$9" },
5901 { { "a6" }, "$10" },
5902 { { "a7" }, "$11" },
5903 { { "t0" }, "$12" },
5904 { { "t1" }, "$13" },
5905 { { "t2" }, "$14" },
5906 { { "t3" }, "$15" },
5907 { { "s0" }, "$16" },
5908 { { "s1" }, "$17" },
5909 { { "s2" }, "$18" },
5910 { { "s3" }, "$19" },
5911 { { "s4" }, "$20" },
5912 { { "s5" }, "$21" },
5913 { { "s6" }, "$22" },
5914 { { "s7" }, "$23" },
5915 { { "t8" }, "$24" },
5916 { { "t9" }, "$25" },
5917 { { "k0" }, "$26" },
5918 { { "k1" }, "$27" },
5919 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005920 { { "sp","$sp" }, "$29" },
5921 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005922 { { "ra" }, "$31" }
5923 };
5924 Aliases = GCCRegAliases;
5925 NumAliases = llvm::array_lengthof(GCCRegAliases);
5926 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005927
5928 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005929};
5930
5931class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005932 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005933 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005934 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 +00005935 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005936 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005937
Akira Hatanakabef17452011-09-20 19:21:49 +00005938 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005939
Akira Hatanakabef17452011-09-20 19:21:49 +00005940public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005941 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005942 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005943 void getTargetDefines(const LangOptions &Opts,
5944 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005945 DefineStd(Builder, "MIPSEB", Opts);
5946 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005947 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005948 }
5949};
5950
5951class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005952 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005953 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005954 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 +00005955 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005956 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005957 }
5958public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005959 Mips64ELTargetInfo(const llvm::Triple &Triple)
5960 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005961 // Default ABI is n64.
5962 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005963 }
Craig Topper3164f332014-03-11 03:39:26 +00005964 void getTargetDefines(const LangOptions &Opts,
5965 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005966 DefineStd(Builder, "MIPSEL", Opts);
5967 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005968 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005969 }
5970};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005971} // end anonymous namespace.
5972
Ivan Krasindd7403e2011-08-24 20:22:22 +00005973namespace {
5974class PNaClTargetInfo : public TargetInfo {
5975public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005976 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005977 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005978 this->UserLabelPrefix = "";
5979 this->LongAlign = 32;
5980 this->LongWidth = 32;
5981 this->PointerAlign = 32;
5982 this->PointerWidth = 32;
5983 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005984 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005985 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005986 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005987 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005988 this->SizeType = TargetInfo::UnsignedInt;
5989 this->PtrDiffType = TargetInfo::SignedInt;
5990 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005991 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005992 }
5993
Craig Topper3164f332014-03-11 03:39:26 +00005994 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005995 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005996 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005997 Builder.defineMacro("__le32__");
5998 Builder.defineMacro("__pnacl__");
5999 }
Craig Topper3164f332014-03-11 03:39:26 +00006000 void getTargetDefines(const LangOptions &Opts,
6001 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006002 getArchDefines(Opts, Builder);
6003 }
Craig Topper3164f332014-03-11 03:39:26 +00006004 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006005 return Feature == "pnacl";
6006 }
Craig Topper3164f332014-03-11 03:39:26 +00006007 void getTargetBuiltins(const Builtin::Info *&Records,
6008 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006009 }
Craig Topper3164f332014-03-11 03:39:26 +00006010 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006011 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006012 }
Craig Topper3164f332014-03-11 03:39:26 +00006013 void getGCCRegNames(const char * const *&Names,
6014 unsigned &NumNames) const override;
6015 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6016 unsigned &NumAliases) const override;
6017 bool validateAsmConstraint(const char *&Name,
6018 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006019 return false;
6020 }
6021
Craig Topper3164f332014-03-11 03:39:26 +00006022 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006023 return "";
6024 }
6025};
6026
6027void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6028 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006029 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006030 NumNames = 0;
6031}
6032
6033void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6034 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006035 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006036 NumAliases = 0;
6037}
6038} // end anonymous namespace.
6039
Guy Benyeib798fc92012-12-11 21:38:14 +00006040namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006041class Le64TargetInfo : public TargetInfo {
6042 static const Builtin::Info BuiltinInfo[];
6043
6044public:
6045 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6046 BigEndian = false;
6047 NoAsmVariants = true;
6048 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6049 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6050 DescriptionString =
6051 "e-S128-p:64:64-v16:16-v32:32-v64:64-v96:32-v128:32-m:e-n8:16:32:64";
6052 }
6053
6054 void getTargetDefines(const LangOptions &Opts,
6055 MacroBuilder &Builder) const override {
6056 DefineStd(Builder, "unix", Opts);
6057 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6058 Builder.defineMacro("__ELF__");
6059 }
6060 void getTargetBuiltins(const Builtin::Info *&Records,
6061 unsigned &NumRecords) const override {
6062 Records = BuiltinInfo;
6063 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6064 }
6065 BuiltinVaListKind getBuiltinVaListKind() const override {
6066 return TargetInfo::PNaClABIBuiltinVaList;
6067 }
6068 const char *getClobbers() const override { return ""; }
6069 void getGCCRegNames(const char *const *&Names,
6070 unsigned &NumNames) const override {
6071 Names = nullptr;
6072 NumNames = 0;
6073 }
6074 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6075 unsigned &NumAliases) const override {
6076 Aliases = nullptr;
6077 NumAliases = 0;
6078 }
6079 bool validateAsmConstraint(const char *&Name,
6080 TargetInfo::ConstraintInfo &Info) const override {
6081 return false;
6082 }
6083
6084 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006085};
6086} // end anonymous namespace.
6087
6088const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6089#define BUILTIN(ID, TYPE, ATTRS) \
6090 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6091#include "clang/Basic/BuiltinsLe64.def"
6092};
6093
6094namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006095 static const unsigned SPIRAddrSpaceMap[] = {
6096 1, // opencl_global
6097 3, // opencl_local
6098 2, // opencl_constant
6099 0, // cuda_device
6100 0, // cuda_constant
6101 0 // cuda_shared
6102 };
6103 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006104 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006105 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006106 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6107 "SPIR target must use unknown OS");
6108 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6109 "SPIR target must use unknown environment type");
6110 BigEndian = false;
6111 TLSSupported = false;
6112 LongWidth = LongAlign = 64;
6113 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006114 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006115 // Define available target features
6116 // These must be defined in sorted order!
6117 NoAsmVariants = true;
6118 }
Craig Topper3164f332014-03-11 03:39:26 +00006119 void getTargetDefines(const LangOptions &Opts,
6120 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006121 DefineStd(Builder, "SPIR", Opts);
6122 }
Craig Topper3164f332014-03-11 03:39:26 +00006123 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006124 return Feature == "spir";
6125 }
Craig Topper3164f332014-03-11 03:39:26 +00006126
6127 void getTargetBuiltins(const Builtin::Info *&Records,
6128 unsigned &NumRecords) const override {}
6129 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006130 return "";
6131 }
Craig Topper3164f332014-03-11 03:39:26 +00006132 void getGCCRegNames(const char * const *&Names,
6133 unsigned &NumNames) const override {}
6134 bool validateAsmConstraint(const char *&Name,
6135 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006136 return true;
6137 }
Craig Topper3164f332014-03-11 03:39:26 +00006138 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6139 unsigned &NumAliases) const override {}
6140 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006141 return TargetInfo::VoidPtrBuiltinVaList;
6142 }
6143 };
6144
6145
6146 class SPIR32TargetInfo : public SPIRTargetInfo {
6147 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006148 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006149 PointerWidth = PointerAlign = 32;
6150 SizeType = TargetInfo::UnsignedInt;
6151 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6152 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006153 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6154 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006155 }
Craig Topper3164f332014-03-11 03:39:26 +00006156 void getTargetDefines(const LangOptions &Opts,
6157 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006158 DefineStd(Builder, "SPIR32", Opts);
6159 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006160 };
6161
6162 class SPIR64TargetInfo : public SPIRTargetInfo {
6163 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006164 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006165 PointerWidth = PointerAlign = 64;
6166 SizeType = TargetInfo::UnsignedLong;
6167 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006168 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6169 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006170 }
Craig Topper3164f332014-03-11 03:39:26 +00006171 void getTargetDefines(const LangOptions &Opts,
6172 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006173 DefineStd(Builder, "SPIR64", Opts);
6174 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006175 };
6176}
6177
Robert Lytton0e076492013-08-13 09:43:10 +00006178namespace {
6179class XCoreTargetInfo : public TargetInfo {
6180 static const Builtin::Info BuiltinInfo[];
6181public:
6182 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6183 BigEndian = false;
6184 NoAsmVariants = true;
6185 LongLongAlign = 32;
6186 SuitableAlign = 32;
6187 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006188 SizeType = UnsignedInt;
6189 PtrDiffType = SignedInt;
6190 IntPtrType = SignedInt;
6191 WCharType = UnsignedChar;
6192 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006193 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006194 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 +00006195 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006196 }
Craig Topper3164f332014-03-11 03:39:26 +00006197 void getTargetDefines(const LangOptions &Opts,
6198 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006199 Builder.defineMacro("__XS1B__");
6200 }
Craig Topper3164f332014-03-11 03:39:26 +00006201 void getTargetBuiltins(const Builtin::Info *&Records,
6202 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006203 Records = BuiltinInfo;
6204 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6205 }
Craig Topper3164f332014-03-11 03:39:26 +00006206 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006207 return TargetInfo::VoidPtrBuiltinVaList;
6208 }
Craig Topper3164f332014-03-11 03:39:26 +00006209 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006210 return "";
6211 }
Craig Topper3164f332014-03-11 03:39:26 +00006212 void getGCCRegNames(const char * const *&Names,
6213 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006214 static const char * const GCCRegNames[] = {
6215 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6216 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6217 };
6218 Names = GCCRegNames;
6219 NumNames = llvm::array_lengthof(GCCRegNames);
6220 }
Craig Topper3164f332014-03-11 03:39:26 +00006221 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6222 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006223 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006224 NumAliases = 0;
6225 }
Craig Topper3164f332014-03-11 03:39:26 +00006226 bool validateAsmConstraint(const char *&Name,
6227 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006228 return false;
6229 }
Craig Topper3164f332014-03-11 03:39:26 +00006230 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006231 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6232 return (RegNo < 2)? RegNo : -1;
6233 }
Robert Lytton0e076492013-08-13 09:43:10 +00006234};
6235
6236const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6237#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6238#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6239 ALL_LANGUAGES },
6240#include "clang/Basic/BuiltinsXCore.def"
6241};
6242} // end anonymous namespace.
6243
Ivan Krasindd7403e2011-08-24 20:22:22 +00006244
Chris Lattner5ba61f02006-10-14 07:39:34 +00006245//===----------------------------------------------------------------------===//
6246// Driver code
6247//===----------------------------------------------------------------------===//
6248
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006249static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006250 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006251
Daniel Dunbar52322032009-08-18 05:47:58 +00006252 switch (Triple.getArch()) {
6253 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006254 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006255
Tim Northover2a0783d2014-05-30 14:14:07 +00006256 case llvm::Triple::xcore:
6257 return new XCoreTargetInfo(Triple);
6258
6259 case llvm::Triple::hexagon:
6260 return new HexagonTargetInfo(Triple);
6261
6262 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006263 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006264 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006265
6266 switch (os) {
6267 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006268 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006269 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006270 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006271 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006272 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006273 }
6274
Christian Pirker9b019ae2014-02-25 13:51:00 +00006275 case llvm::Triple::aarch64_be:
6276 switch (os) {
6277 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006278 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006279 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006280 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006281 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006282 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006283 }
6284
Daniel Dunbar52322032009-08-18 05:47:58 +00006285 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006286 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006287 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006288 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006289
Daniel Dunbar52322032009-08-18 05:47:58 +00006290 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006291 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006292 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006293 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006294 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006295 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006296 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006297 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006298 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006299 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006300 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006301 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006302 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006303 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006304 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006305 case llvm::Triple::Win32:
6306 switch (Triple.getEnvironment()) {
6307 default:
6308 return new ARMleTargetInfo(Triple);
6309 case llvm::Triple::Itanium:
6310 return new ItaniumWindowsARMleTargetInfo(Triple);
6311 case llvm::Triple::MSVC:
6312 return new MicrosoftARMleTargetInfo(Triple);
6313 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006314 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006315 return new ARMleTargetInfo(Triple);
6316 }
6317
6318 case llvm::Triple::armeb:
6319 case llvm::Triple::thumbeb:
6320 if (Triple.isOSDarwin())
6321 return new DarwinARMTargetInfo(Triple);
6322
6323 switch (os) {
6324 case llvm::Triple::Linux:
6325 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6326 case llvm::Triple::FreeBSD:
6327 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6328 case llvm::Triple::NetBSD:
6329 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6330 case llvm::Triple::OpenBSD:
6331 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6332 case llvm::Triple::Bitrig:
6333 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6334 case llvm::Triple::RTEMS:
6335 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6336 case llvm::Triple::NaCl:
6337 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6338 default:
6339 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006340 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006341
Daniel Dunbar52322032009-08-18 05:47:58 +00006342 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006343 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006344
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006345 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006346 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006347 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006348 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006349 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006350 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006351 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006352 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006353 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006354 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006355 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006356 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006357 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006358
6359 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006360 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006361 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006362 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006363 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006364 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006365 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006366 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006367 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006368 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006369 case llvm::Triple::NaCl:
6370 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006371 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006373 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006374
Akira Hatanakabef17452011-09-20 19:21:49 +00006375 case llvm::Triple::mips64:
6376 switch (os) {
6377 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006378 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006379 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006380 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006381 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006383 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006384 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006385 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006386 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006387 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006389 }
6390
6391 case llvm::Triple::mips64el:
6392 switch (os) {
6393 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006394 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006395 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006396 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006397 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006398 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006399 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006400 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006401 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006402 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006403 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006404 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006405 }
6406
Ivan Krasindd7403e2011-08-24 20:22:22 +00006407 case llvm::Triple::le32:
6408 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006409 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006410 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006411 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006412 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006413 }
6414
JF Bastien643817d2014-09-12 17:52:47 +00006415 case llvm::Triple::le64:
6416 return new Le64TargetInfo(Triple);
6417
Daniel Dunbar52322032009-08-18 05:47:58 +00006418 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006419 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006420 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006421 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006422 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006423 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006424 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006425 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006426 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006427 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006428 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006429 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006430 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006431 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006432 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006433 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006434 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006435
6436 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006437 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006438 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006439 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006440 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006441 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006442 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006443 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006444 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006445 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006446 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006447 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006448 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006449 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006450 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006451
Bill Schmidt778d3872013-07-26 01:36:11 +00006452 case llvm::Triple::ppc64le:
6453 switch (os) {
6454 case llvm::Triple::Linux:
6455 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6456 default:
6457 return new PPC64TargetInfo(Triple);
6458 }
6459
Peter Collingbournec947aae2012-05-20 23:28:41 +00006460 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006461 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006462 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006463 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006464
Eli Friedmand13b41e2012-10-12 23:32:00 +00006465 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006466 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006467
Daniel Dunbar52322032009-08-18 05:47:58 +00006468 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006469 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006470 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006471 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006472 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006473 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006474 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006475 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006476 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006477 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006478 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006479 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006480 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006481 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006482 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006483
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006484 case llvm::Triple::sparcv9:
6485 switch (os) {
6486 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006487 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006488 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006489 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006490 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006492 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006493 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006494 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006495 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006496 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006497 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006498 }
6499
Ulrich Weigand47445072013-05-06 16:26:41 +00006500 case llvm::Triple::systemz:
6501 switch (os) {
6502 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006503 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006504 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006505 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006506 }
6507
Eli Friedmana9c3d712009-08-19 20:47:07 +00006508 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006509 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006510
Daniel Dunbar52322032009-08-18 05:47:58 +00006511 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006512 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006513 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006514
Daniel Dunbar52322032009-08-18 05:47:58 +00006515 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006516 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006517 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006518 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006519 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006520 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006521 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006522 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006523 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006524 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006525 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006526 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006527 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006528 case llvm::Triple::KFreeBSD:
6529 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006530 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006531 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006532 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006533 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006534 case llvm::Triple::Win32: {
6535 switch (Triple.getEnvironment()) {
6536 default:
6537 return new X86_32TargetInfo(Triple);
6538 case llvm::Triple::Cygnus:
6539 return new CygwinX86_32TargetInfo(Triple);
6540 case llvm::Triple::GNU:
6541 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006542 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006543 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006544 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006545 }
6546 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006547 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006548 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006549 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006550 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006551 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006552 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006553 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006554 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006555 }
6556
6557 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006558 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006559 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006560
Daniel Dunbar52322032009-08-18 05:47:58 +00006561 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006562 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006563 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006564 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006565 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006566 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006567 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006568 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006569 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006570 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006571 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006572 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006573 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006574 case llvm::Triple::KFreeBSD:
6575 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006576 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006577 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006578 case llvm::Triple::Win32: {
6579 switch (Triple.getEnvironment()) {
6580 default:
6581 return new X86_64TargetInfo(Triple);
6582 case llvm::Triple::GNU:
6583 return new MinGWX86_64TargetInfo(Triple);
6584 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006585 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006586 }
6587 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006588 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006589 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006590 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006591 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006592 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006593
6594 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006595 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006596 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006597 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006598 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006599 }
6600 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006601 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006602 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006603 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006604 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006605 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006606 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006607}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006608
6609/// CreateTargetInfo - Return the target info object for the specified target
6610/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006611TargetInfo *
6612TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6613 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006614 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006615
6616 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006617 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006618 if (!Target) {
6619 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006620 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006621 }
Alp Toker80758082014-07-06 05:26:44 +00006622 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006623
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006624 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006625 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6626 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006627 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006628 }
6629
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006630 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006631 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6632 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006633 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006634 }
6635
Rafael Espindolaeb265472013-08-21 21:59:03 +00006636 // Set the fp math unit.
6637 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6638 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006639 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006640 }
6641
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006642 // Compute the default target features, we need the target to handle this
6643 // because features may have dependencies on one another.
6644 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006645 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006646
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006647 // Apply the user specified deltas.
6648 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6649 I < N; ++I) {
6650 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006651 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006652 bool Enabled = Name[0] == '+';
6653 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006654 }
6655
6656 // Add the features to the compile options.
6657 //
6658 // FIXME: If we are completely confident that we have the right set, we only
6659 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006660 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006661 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6662 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006663 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006664 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006665 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006666
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006667 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006668}