blob: 511817f324c8f7dd06d3576f6a4317f99d626959 [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
1904 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1905
Craig Topper3164f332014-03-11 03:39:26 +00001906 std::string convertConstraint(const char *&Constraint) const override;
1907 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001908 return "~{dirflag},~{fpsr},~{flags}";
1909 }
Craig Topper3164f332014-03-11 03:39:26 +00001910 void getTargetDefines(const LangOptions &Opts,
1911 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001912 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1913 bool Enabled);
1914 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1915 bool Enabled);
1916 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1917 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001918 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1919 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001920 setFeatureEnabledImpl(Features, Name, Enabled);
1921 }
1922 // This exists purely to cut down on the number of virtual calls in
1923 // getDefaultFeatures which calls this repeatedly.
1924 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1925 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001926 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1927 bool hasFeature(StringRef Feature) const override;
1928 bool handleTargetFeatures(std::vector<std::string> &Features,
1929 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001930 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001931 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001932 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001933 else if (getTriple().getArch() == llvm::Triple::x86 &&
1934 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001935 return "no-mmx";
1936 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001937 }
Craig Topper3164f332014-03-11 03:39:26 +00001938 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001939 CPU = llvm::StringSwitch<CPUKind>(Name)
1940 .Case("i386", CK_i386)
1941 .Case("i486", CK_i486)
1942 .Case("winchip-c6", CK_WinChipC6)
1943 .Case("winchip2", CK_WinChip2)
1944 .Case("c3", CK_C3)
1945 .Case("i586", CK_i586)
1946 .Case("pentium", CK_Pentium)
1947 .Case("pentium-mmx", CK_PentiumMMX)
1948 .Case("i686", CK_i686)
1949 .Case("pentiumpro", CK_PentiumPro)
1950 .Case("pentium2", CK_Pentium2)
1951 .Case("pentium3", CK_Pentium3)
1952 .Case("pentium3m", CK_Pentium3M)
1953 .Case("pentium-m", CK_PentiumM)
1954 .Case("c3-2", CK_C3_2)
1955 .Case("yonah", CK_Yonah)
1956 .Case("pentium4", CK_Pentium4)
1957 .Case("pentium4m", CK_Pentium4M)
1958 .Case("prescott", CK_Prescott)
1959 .Case("nocona", CK_Nocona)
1960 .Case("core2", CK_Core2)
1961 .Case("penryn", CK_Penryn)
1962 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001963 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001964 .Case("corei7", CK_Corei7)
1965 .Case("corei7-avx", CK_Corei7AVX)
1966 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001967 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001968 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001969 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00001970 .Case("k6", CK_K6)
1971 .Case("k6-2", CK_K6_2)
1972 .Case("k6-3", CK_K6_3)
1973 .Case("athlon", CK_Athlon)
1974 .Case("athlon-tbird", CK_AthlonThunderbird)
1975 .Case("athlon-4", CK_Athlon4)
1976 .Case("athlon-xp", CK_AthlonXP)
1977 .Case("athlon-mp", CK_AthlonMP)
1978 .Case("athlon64", CK_Athlon64)
1979 .Case("athlon64-sse3", CK_Athlon64SSE3)
1980 .Case("athlon-fx", CK_AthlonFX)
1981 .Case("k8", CK_K8)
1982 .Case("k8-sse3", CK_K8SSE3)
1983 .Case("opteron", CK_Opteron)
1984 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001985 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001986 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001987 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001988 .Case("bdver1", CK_BDVER1)
1989 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001990 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001991 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001992 .Case("x86-64", CK_x86_64)
1993 .Case("geode", CK_Geode)
1994 .Default(CK_Generic);
1995
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001996 // Perform any per-CPU checks necessary to determine if this CPU is
1997 // acceptable.
1998 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1999 // invalid without explaining *why*.
2000 switch (CPU) {
2001 case CK_Generic:
2002 // No processor selected!
2003 return false;
2004
2005 case CK_i386:
2006 case CK_i486:
2007 case CK_WinChipC6:
2008 case CK_WinChip2:
2009 case CK_C3:
2010 case CK_i586:
2011 case CK_Pentium:
2012 case CK_PentiumMMX:
2013 case CK_i686:
2014 case CK_PentiumPro:
2015 case CK_Pentium2:
2016 case CK_Pentium3:
2017 case CK_Pentium3M:
2018 case CK_PentiumM:
2019 case CK_Yonah:
2020 case CK_C3_2:
2021 case CK_Pentium4:
2022 case CK_Pentium4M:
2023 case CK_Prescott:
2024 case CK_K6:
2025 case CK_K6_2:
2026 case CK_K6_3:
2027 case CK_Athlon:
2028 case CK_AthlonThunderbird:
2029 case CK_Athlon4:
2030 case CK_AthlonXP:
2031 case CK_AthlonMP:
2032 case CK_Geode:
2033 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002034 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002035 return false;
2036
2037 // Fallthrough
2038 case CK_Nocona:
2039 case CK_Core2:
2040 case CK_Penryn:
2041 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002042 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002043 case CK_Corei7:
2044 case CK_Corei7AVX:
2045 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002046 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00002047 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002048 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002049 case CK_Athlon64:
2050 case CK_Athlon64SSE3:
2051 case CK_AthlonFX:
2052 case CK_K8:
2053 case CK_K8SSE3:
2054 case CK_Opteron:
2055 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002056 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002057 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002058 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002059 case CK_BDVER1:
2060 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002061 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002062 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002063 case CK_x86_64:
2064 return true;
2065 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002066 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002067 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002068
Craig Topper3164f332014-03-11 03:39:26 +00002069 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002070
Craig Topper3164f332014-03-11 03:39:26 +00002071 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002072 // We accept all non-ARM calling conventions
2073 return (CC == CC_X86ThisCall ||
2074 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002075 CC == CC_X86StdCall ||
2076 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002077 CC == CC_X86Pascal ||
2078 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002079 }
2080
Craig Topper3164f332014-03-11 03:39:26 +00002081 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002082 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002083 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002084};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002085
Rafael Espindolaeb265472013-08-21 21:59:03 +00002086bool X86TargetInfo::setFPMath(StringRef Name) {
2087 if (Name == "387") {
2088 FPMath = FP_387;
2089 return true;
2090 }
2091 if (Name == "sse") {
2092 FPMath = FP_SSE;
2093 return true;
2094 }
2095 return false;
2096}
2097
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002098void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002099 // FIXME: This *really* should not be here.
2100
2101 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002102 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002103 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002104
Chandler Carruth212334f2011-09-28 08:55:37 +00002105 switch (CPU) {
2106 case CK_Generic:
2107 case CK_i386:
2108 case CK_i486:
2109 case CK_i586:
2110 case CK_Pentium:
2111 case CK_i686:
2112 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002113 break;
2114 case CK_PentiumMMX:
2115 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002116 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002117 break;
2118 case CK_Pentium3:
2119 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002121 break;
2122 case CK_PentiumM:
2123 case CK_Pentium4:
2124 case CK_Pentium4M:
2125 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002126 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002127 break;
2128 case CK_Yonah:
2129 case CK_Prescott:
2130 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002131 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002132 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002133 break;
2134 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002135 setFeatureEnabledImpl(Features, "ssse3", 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_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, "sse4.1", 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_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002143 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002144 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002145 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002146 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002147 setFeatureEnabledImpl(Features, "sse4.2", true);
2148 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002149 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002150 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002151 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002152 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002153 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002154 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002155 break;
2156 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002157 setFeatureEnabledImpl(Features, "avx", true);
2158 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002159 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002160 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002161 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002162 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002163 setFeatureEnabledImpl(Features, "avx", true);
2164 setFeatureEnabledImpl(Features, "aes", true);
2165 setFeatureEnabledImpl(Features, "pclmul", true);
2166 setFeatureEnabledImpl(Features, "rdrnd", true);
2167 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002168 break;
Craig Topper865fff52011-12-17 19:55:21 +00002169 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002170 setFeatureEnabledImpl(Features, "avx2", true);
2171 setFeatureEnabledImpl(Features, "aes", true);
2172 setFeatureEnabledImpl(Features, "pclmul", true);
2173 setFeatureEnabledImpl(Features, "lzcnt", true);
2174 setFeatureEnabledImpl(Features, "rdrnd", true);
2175 setFeatureEnabledImpl(Features, "f16c", true);
2176 setFeatureEnabledImpl(Features, "bmi", true);
2177 setFeatureEnabledImpl(Features, "bmi2", true);
2178 setFeatureEnabledImpl(Features, "rtm", true);
2179 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002180 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002181 break;
Craig Topper449314e2013-08-20 07:09:39 +00002182 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002183 setFeatureEnabledImpl(Features, "avx512f", true);
2184 setFeatureEnabledImpl(Features, "avx512cd", true);
2185 setFeatureEnabledImpl(Features, "avx512er", true);
2186 setFeatureEnabledImpl(Features, "avx512pf", true);
2187 setFeatureEnabledImpl(Features, "aes", true);
2188 setFeatureEnabledImpl(Features, "pclmul", true);
2189 setFeatureEnabledImpl(Features, "lzcnt", true);
2190 setFeatureEnabledImpl(Features, "rdrnd", true);
2191 setFeatureEnabledImpl(Features, "f16c", true);
2192 setFeatureEnabledImpl(Features, "bmi", true);
2193 setFeatureEnabledImpl(Features, "bmi2", true);
2194 setFeatureEnabledImpl(Features, "rtm", true);
2195 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002196 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002197 case CK_SKX:
2198 setFeatureEnabledImpl(Features, "avx512f", true);
2199 setFeatureEnabledImpl(Features, "avx512cd", true);
2200 setFeatureEnabledImpl(Features, "avx512dq", true);
2201 setFeatureEnabledImpl(Features, "avx512bw", true);
2202 setFeatureEnabledImpl(Features, "avx512vl", true);
2203 setFeatureEnabledImpl(Features, "aes", true);
2204 setFeatureEnabledImpl(Features, "pclmul", true);
2205 setFeatureEnabledImpl(Features, "lzcnt", true);
2206 setFeatureEnabledImpl(Features, "rdrnd", true);
2207 setFeatureEnabledImpl(Features, "f16c", true);
2208 setFeatureEnabledImpl(Features, "bmi", true);
2209 setFeatureEnabledImpl(Features, "bmi2", true);
2210 setFeatureEnabledImpl(Features, "rtm", true);
2211 setFeatureEnabledImpl(Features, "fma", true);
2212 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002213 case CK_K6:
2214 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002215 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002216 break;
2217 case CK_K6_2:
2218 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002219 case CK_WinChip2:
2220 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002221 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002222 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002223 case CK_Athlon:
2224 case CK_AthlonThunderbird:
2225 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002226 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002227 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002228 case CK_Athlon4:
2229 case CK_AthlonXP:
2230 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002231 setFeatureEnabledImpl(Features, "sse", true);
2232 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002233 break;
2234 case CK_K8:
2235 case CK_Opteron:
2236 case CK_Athlon64:
2237 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002238 setFeatureEnabledImpl(Features, "sse2", true);
2239 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002240 break;
2241 case CK_K8SSE3:
2242 case CK_OpteronSSE3:
2243 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002244 setFeatureEnabledImpl(Features, "sse3", true);
2245 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002246 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002247 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002248 setFeatureEnabledImpl(Features, "sse3", true);
2249 setFeatureEnabledImpl(Features, "sse4a", true);
2250 setFeatureEnabledImpl(Features, "3dnowa", true);
2251 setFeatureEnabledImpl(Features, "lzcnt", true);
2252 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002253 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002254 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002255 setFeatureEnabledImpl(Features, "ssse3", true);
2256 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002257 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002258 setFeatureEnabledImpl(Features, "lzcnt", true);
2259 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002260 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002261 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002262 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002263 setFeatureEnabledImpl(Features, "avx", true);
2264 setFeatureEnabledImpl(Features, "sse4a", true);
2265 setFeatureEnabledImpl(Features, "lzcnt", true);
2266 setFeatureEnabledImpl(Features, "aes", true);
2267 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002268 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002269 setFeatureEnabledImpl(Features, "bmi", true);
2270 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002271 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002272 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002273 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002274 setFeatureEnabledImpl(Features, "xop", true);
2275 setFeatureEnabledImpl(Features, "lzcnt", true);
2276 setFeatureEnabledImpl(Features, "aes", true);
2277 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002278 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002279 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002280 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002281 case CK_BDVER4:
2282 setFeatureEnabledImpl(Features, "avx2", true);
2283 setFeatureEnabledImpl(Features, "bmi2", true);
2284 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002285 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002286 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002287 setFeatureEnabledImpl(Features, "xop", true);
2288 setFeatureEnabledImpl(Features, "lzcnt", true);
2289 setFeatureEnabledImpl(Features, "aes", true);
2290 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002291 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002292 setFeatureEnabledImpl(Features, "bmi", true);
2293 setFeatureEnabledImpl(Features, "fma", true);
2294 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002295 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002296 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002297 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002298 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002299 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002300 break;
Eli Friedman33465822011-07-08 23:31:17 +00002301 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002302}
2303
Rafael Espindolae62e2792013-08-20 13:44:29 +00002304void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002305 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002306 if (Enabled) {
2307 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002308 case AVX512F:
2309 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002310 case AVX2:
2311 Features["avx2"] = true;
2312 case AVX:
2313 Features["avx"] = true;
2314 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002315 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002316 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002317 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002318 case SSSE3:
2319 Features["ssse3"] = true;
2320 case SSE3:
2321 Features["sse3"] = true;
2322 case SSE2:
2323 Features["sse2"] = true;
2324 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002325 Features["sse"] = true;
2326 case NoSSE:
2327 break;
2328 }
2329 return;
2330 }
2331
2332 switch (Level) {
2333 case NoSSE:
2334 case SSE1:
2335 Features["sse"] = false;
2336 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002337 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2338 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002339 case SSE3:
2340 Features["sse3"] = false;
2341 setXOPLevel(Features, NoXOP, false);
2342 case SSSE3:
2343 Features["ssse3"] = false;
2344 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002345 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002346 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002347 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002348 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002349 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002350 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002351 case AVX2:
2352 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002353 case AVX512F:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002354 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2355 Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002356 }
2357}
2358
2359void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002360 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002361 if (Enabled) {
2362 switch (Level) {
2363 case AMD3DNowAthlon:
2364 Features["3dnowa"] = true;
2365 case AMD3DNow:
2366 Features["3dnow"] = true;
2367 case MMX:
2368 Features["mmx"] = true;
2369 case NoMMX3DNow:
2370 break;
2371 }
2372 return;
2373 }
2374
2375 switch (Level) {
2376 case NoMMX3DNow:
2377 case MMX:
2378 Features["mmx"] = false;
2379 case AMD3DNow:
2380 Features["3dnow"] = false;
2381 case AMD3DNowAthlon:
2382 Features["3dnowa"] = false;
2383 }
2384}
2385
2386void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002387 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002388 if (Enabled) {
2389 switch (Level) {
2390 case XOP:
2391 Features["xop"] = true;
2392 case FMA4:
2393 Features["fma4"] = true;
2394 setSSELevel(Features, AVX, true);
2395 case SSE4A:
2396 Features["sse4a"] = true;
2397 setSSELevel(Features, SSE3, true);
2398 case NoXOP:
2399 break;
2400 }
2401 return;
2402 }
2403
2404 switch (Level) {
2405 case NoXOP:
2406 case SSE4A:
2407 Features["sse4a"] = false;
2408 case FMA4:
2409 Features["fma4"] = false;
2410 case XOP:
2411 Features["xop"] = false;
2412 }
2413}
2414
Craig Topper86d79ef2013-09-17 04:51:29 +00002415void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2416 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002417 // FIXME: This *really* should not be here. We need some way of translating
2418 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002419 if (Name == "sse4")
2420 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002421
Rafael Espindolae62e2792013-08-20 13:44:29 +00002422 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002423
Craig Topper29561122013-09-19 01:13:07 +00002424 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002425 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002426 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002427 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002428 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002429 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002430 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002431 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002432 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002433 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002434 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002435 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002436 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002437 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002438 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002439 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002440 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002441 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002442 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002443 if (Enabled)
2444 setSSELevel(Features, SSE2, Enabled);
2445 } else if (Name == "pclmul") {
2446 if (Enabled)
2447 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002448 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002449 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002450 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002451 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002452 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002453 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002454 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2455 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002456 if (Enabled)
2457 setSSELevel(Features, AVX512F, Enabled);
2458 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002459 if (Enabled)
2460 setSSELevel(Features, AVX, Enabled);
2461 } else if (Name == "fma4") {
2462 setXOPLevel(Features, FMA4, Enabled);
2463 } else if (Name == "xop") {
2464 setXOPLevel(Features, XOP, Enabled);
2465 } else if (Name == "sse4a") {
2466 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002467 } else if (Name == "f16c") {
2468 if (Enabled)
2469 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002470 } else if (Name == "sha") {
2471 if (Enabled)
2472 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002473 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002474}
2475
Eric Christopher3ff21b32013-10-16 21:26:26 +00002476/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002477/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002478bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002479 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002480 // Remember the maximum enabled sselevel.
2481 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2482 // Ignore disabled features.
2483 if (Features[i][0] == '-')
2484 continue;
2485
Benjamin Kramer27402c62012-03-05 15:10:44 +00002486 StringRef Feature = StringRef(Features[i]).substr(1);
2487
2488 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002489 HasAES = true;
2490 continue;
2491 }
2492
Craig Topper3f122a72012-05-31 05:18:48 +00002493 if (Feature == "pclmul") {
2494 HasPCLMUL = true;
2495 continue;
2496 }
2497
Benjamin Kramer27402c62012-03-05 15:10:44 +00002498 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002499 HasLZCNT = true;
2500 continue;
2501 }
2502
Rafael Espindola89049822013-08-23 20:21:37 +00002503 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002504 HasRDRND = true;
2505 continue;
2506 }
2507
Benjamin Kramer27402c62012-03-05 15:10:44 +00002508 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002509 HasBMI = true;
2510 continue;
2511 }
2512
Benjamin Kramer27402c62012-03-05 15:10:44 +00002513 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002514 HasBMI2 = true;
2515 continue;
2516 }
2517
Benjamin Kramer27402c62012-03-05 15:10:44 +00002518 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002519 HasPOPCNT = true;
2520 continue;
2521 }
2522
Michael Liao625a8752012-11-10 05:17:46 +00002523 if (Feature == "rtm") {
2524 HasRTM = true;
2525 continue;
2526 }
2527
Michael Liao74f4eaf2013-03-26 17:52:08 +00002528 if (Feature == "prfchw") {
2529 HasPRFCHW = true;
2530 continue;
2531 }
2532
Michael Liaoffaae352013-03-29 05:17:55 +00002533 if (Feature == "rdseed") {
2534 HasRDSEED = true;
2535 continue;
2536 }
2537
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002538 if (Feature == "tbm") {
2539 HasTBM = true;
2540 continue;
2541 }
2542
Craig Topperbba778b2012-06-03 21:46:30 +00002543 if (Feature == "fma") {
2544 HasFMA = true;
2545 continue;
2546 }
2547
Manman Rena45358c2012-10-11 00:59:55 +00002548 if (Feature == "f16c") {
2549 HasF16C = true;
2550 continue;
2551 }
2552
Craig Topper679b53a2013-08-21 05:29:10 +00002553 if (Feature == "avx512cd") {
2554 HasAVX512CD = true;
2555 continue;
2556 }
2557
2558 if (Feature == "avx512er") {
2559 HasAVX512ER = true;
2560 continue;
2561 }
2562
2563 if (Feature == "avx512pf") {
2564 HasAVX512PF = true;
2565 continue;
2566 }
2567
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002568 if (Feature == "avx512dq") {
2569 HasAVX512DQ = true;
2570 continue;
2571 }
2572
2573 if (Feature == "avx512bw") {
2574 HasAVX512BW = true;
2575 continue;
2576 }
2577
2578 if (Feature == "avx512vl") {
2579 HasAVX512VL = true;
2580 continue;
2581 }
2582
Ben Langmuir58078d02013-09-19 13:22:04 +00002583 if (Feature == "sha") {
2584 HasSHA = true;
2585 continue;
2586 }
2587
Nick Lewycky50e8f482013-10-05 20:14:27 +00002588 if (Feature == "cx16") {
2589 HasCX16 = true;
2590 continue;
2591 }
2592
Daniel Dunbar979586e2009-11-11 09:38:56 +00002593 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002594 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002595 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002596 .Case("avx2", AVX2)
2597 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002598 .Case("sse4.2", SSE42)
2599 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002600 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002601 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002602 .Case("sse2", SSE2)
2603 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002604 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002605 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002606
Eli Friedman33465822011-07-08 23:31:17 +00002607 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002608 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002609 .Case("3dnowa", AMD3DNowAthlon)
2610 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002611 .Case("mmx", MMX)
2612 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002613 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002614
2615 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2616 .Case("xop", XOP)
2617 .Case("fma4", FMA4)
2618 .Case("sse4a", SSE4A)
2619 .Default(NoXOP);
2620 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002621 }
Eli Friedman33465822011-07-08 23:31:17 +00002622
Craig Topper7481d8a2013-09-10 06:55:47 +00002623 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2624 // Can't do this earlier because we need to be able to explicitly enable
2625 // popcnt and still disable sse4.2.
2626 if (!HasPOPCNT && SSELevel >= SSE42 &&
2627 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2628 HasPOPCNT = true;
2629 Features.push_back("+popcnt");
2630 }
2631
Yunzhong Gao61089362013-10-16 19:07:02 +00002632 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2633 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2634 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2635 HasPRFCHW = true;
2636 Features.push_back("+prfchw");
2637 }
2638
Rafael Espindolaeb265472013-08-21 21:59:03 +00002639 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2640 // matches the selected sse level.
2641 if (FPMath == FP_SSE && SSELevel < SSE1) {
2642 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2643 return false;
2644 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2645 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2646 return false;
2647 }
2648
Eli Friedman33465822011-07-08 23:31:17 +00002649 // Don't tell the backend if we're turning off mmx; it will end up disabling
2650 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002651 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2652 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002653 std::vector<std::string>::iterator it;
2654 it = std::find(Features.begin(), Features.end(), "-mmx");
2655 if (it != Features.end())
2656 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002657 else if (SSELevel > NoSSE)
2658 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002659 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002660}
Chris Lattnerecd49032009-03-02 22:27:17 +00002661
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002662/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2663/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002664void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002665 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002666 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002667 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002668 Builder.defineMacro("__amd64__");
2669 Builder.defineMacro("__amd64");
2670 Builder.defineMacro("__x86_64");
2671 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002672 if (getTriple().getArchName() == "x86_64h") {
2673 Builder.defineMacro("__x86_64h");
2674 Builder.defineMacro("__x86_64h__");
2675 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002676 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002677 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002678 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002679
Chris Lattnerecd49032009-03-02 22:27:17 +00002680 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002681 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2682 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002683 switch (CPU) {
2684 case CK_Generic:
2685 break;
2686 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002687 // The rest are coming from the i386 define above.
2688 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002689 break;
2690 case CK_i486:
2691 case CK_WinChipC6:
2692 case CK_WinChip2:
2693 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002694 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002695 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002696 case CK_PentiumMMX:
2697 Builder.defineMacro("__pentium_mmx__");
2698 Builder.defineMacro("__tune_pentium_mmx__");
2699 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002700 case CK_i586:
2701 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002702 defineCPUMacros(Builder, "i586");
2703 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002704 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002705 case CK_Pentium3:
2706 case CK_Pentium3M:
2707 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002708 Builder.defineMacro("__tune_pentium3__");
2709 // Fallthrough
2710 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002711 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002712 Builder.defineMacro("__tune_pentium2__");
2713 // Fallthrough
2714 case CK_PentiumPro:
2715 Builder.defineMacro("__tune_i686__");
2716 Builder.defineMacro("__tune_pentiumpro__");
2717 // Fallthrough
2718 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002719 Builder.defineMacro("__i686");
2720 Builder.defineMacro("__i686__");
2721 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2722 Builder.defineMacro("__pentiumpro");
2723 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002724 break;
2725 case CK_Pentium4:
2726 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002727 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002728 break;
2729 case CK_Yonah:
2730 case CK_Prescott:
2731 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002732 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002733 break;
2734 case CK_Core2:
2735 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002736 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002737 break;
2738 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002739 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002740 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002741 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002742 defineCPUMacros(Builder, "slm");
2743 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002744 case CK_Corei7:
2745 case CK_Corei7AVX:
2746 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002747 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002748 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002749 break;
Craig Topper449314e2013-08-20 07:09:39 +00002750 case CK_KNL:
2751 defineCPUMacros(Builder, "knl");
2752 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002753 case CK_SKX:
2754 defineCPUMacros(Builder, "skx");
2755 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002756 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002757 Builder.defineMacro("__k6_2__");
2758 Builder.defineMacro("__tune_k6_2__");
2759 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002760 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002761 if (CPU != CK_K6_2) { // In case of fallthrough
2762 // FIXME: GCC may be enabling these in cases where some other k6
2763 // architecture is specified but -m3dnow is explicitly provided. The
2764 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002765 Builder.defineMacro("__k6_3__");
2766 Builder.defineMacro("__tune_k6_3__");
2767 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002768 // Fallthrough
2769 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002770 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002771 break;
2772 case CK_Athlon:
2773 case CK_AthlonThunderbird:
2774 case CK_Athlon4:
2775 case CK_AthlonXP:
2776 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002777 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002778 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002779 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002780 Builder.defineMacro("__tune_athlon_sse__");
2781 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002782 break;
2783 case CK_K8:
2784 case CK_K8SSE3:
2785 case CK_x86_64:
2786 case CK_Opteron:
2787 case CK_OpteronSSE3:
2788 case CK_Athlon64:
2789 case CK_Athlon64SSE3:
2790 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002791 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002792 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002793 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002794 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002795 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002796 case CK_BTVER1:
2797 defineCPUMacros(Builder, "btver1");
2798 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002799 case CK_BTVER2:
2800 defineCPUMacros(Builder, "btver2");
2801 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002802 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002803 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002804 break;
2805 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002806 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002807 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002808 case CK_BDVER3:
2809 defineCPUMacros(Builder, "bdver3");
2810 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002811 case CK_BDVER4:
2812 defineCPUMacros(Builder, "bdver4");
2813 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002814 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002815 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002816 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002817 }
Chris Lattner96e43572009-03-02 22:40:39 +00002818
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002819 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002820 Builder.defineMacro("__REGISTER_PREFIX__", "");
2821
Chris Lattner6df41af2009-04-19 17:32:33 +00002822 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2823 // functions in glibc header files that use FP Stack inline asm which the
2824 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002825 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002826
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002827 if (HasAES)
2828 Builder.defineMacro("__AES__");
2829
Craig Topper3f122a72012-05-31 05:18:48 +00002830 if (HasPCLMUL)
2831 Builder.defineMacro("__PCLMUL__");
2832
Craig Topper22967d42011-12-25 05:06:45 +00002833 if (HasLZCNT)
2834 Builder.defineMacro("__LZCNT__");
2835
Benjamin Kramer1e250392012-07-07 09:39:18 +00002836 if (HasRDRND)
2837 Builder.defineMacro("__RDRND__");
2838
Craig Topper22967d42011-12-25 05:06:45 +00002839 if (HasBMI)
2840 Builder.defineMacro("__BMI__");
2841
2842 if (HasBMI2)
2843 Builder.defineMacro("__BMI2__");
2844
Craig Topper1de83482011-12-29 16:10:46 +00002845 if (HasPOPCNT)
2846 Builder.defineMacro("__POPCNT__");
2847
Michael Liao625a8752012-11-10 05:17:46 +00002848 if (HasRTM)
2849 Builder.defineMacro("__RTM__");
2850
Michael Liao74f4eaf2013-03-26 17:52:08 +00002851 if (HasPRFCHW)
2852 Builder.defineMacro("__PRFCHW__");
2853
Michael Liaoffaae352013-03-29 05:17:55 +00002854 if (HasRDSEED)
2855 Builder.defineMacro("__RDSEED__");
2856
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002857 if (HasTBM)
2858 Builder.defineMacro("__TBM__");
2859
Rafael Espindolae62e2792013-08-20 13:44:29 +00002860 switch (XOPLevel) {
2861 case XOP:
2862 Builder.defineMacro("__XOP__");
2863 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002864 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002865 case SSE4A:
2866 Builder.defineMacro("__SSE4A__");
2867 case NoXOP:
2868 break;
2869 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002870
Craig Topperbba778b2012-06-03 21:46:30 +00002871 if (HasFMA)
2872 Builder.defineMacro("__FMA__");
2873
Manman Rena45358c2012-10-11 00:59:55 +00002874 if (HasF16C)
2875 Builder.defineMacro("__F16C__");
2876
Craig Topper679b53a2013-08-21 05:29:10 +00002877 if (HasAVX512CD)
2878 Builder.defineMacro("__AVX512CD__");
2879 if (HasAVX512ER)
2880 Builder.defineMacro("__AVX512ER__");
2881 if (HasAVX512PF)
2882 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002883 if (HasAVX512DQ)
2884 Builder.defineMacro("__AVX512DQ__");
2885 if (HasAVX512BW)
2886 Builder.defineMacro("__AVX512BW__");
2887 if (HasAVX512VL)
2888 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002889
Ben Langmuir58078d02013-09-19 13:22:04 +00002890 if (HasSHA)
2891 Builder.defineMacro("__SHA__");
2892
Nick Lewycky50e8f482013-10-05 20:14:27 +00002893 if (HasCX16)
2894 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2895
Chris Lattner96e43572009-03-02 22:40:39 +00002896 // Each case falls through to the previous one here.
2897 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002898 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002899 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002900 case AVX2:
2901 Builder.defineMacro("__AVX2__");
2902 case AVX:
2903 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002904 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002905 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002906 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002907 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002908 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002909 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002910 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002911 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002912 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002913 Builder.defineMacro("__SSE2__");
2914 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002915 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002916 Builder.defineMacro("__SSE__");
2917 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002918 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002919 break;
2920 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002921
Derek Schuffc7dd7222012-10-11 15:52:22 +00002922 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002923 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002924 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002925 case AVX2:
2926 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002927 case SSE42:
2928 case SSE41:
2929 case SSSE3:
2930 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002931 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002932 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002933 break;
2934 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002935 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002936 break;
2937 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002938 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002939 }
2940 }
2941
Anders Carlssone437c682010-01-27 03:47:49 +00002942 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002943 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002944 case AMD3DNowAthlon:
2945 Builder.defineMacro("__3dNOW_A__");
2946 case AMD3DNow:
2947 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002948 case MMX:
2949 Builder.defineMacro("__MMX__");
2950 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002951 break;
2952 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002953
2954 if (CPU >= CK_i486) {
2955 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2956 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2957 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2958 }
2959 if (CPU >= CK_i586)
2960 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002961}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002962
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002963bool X86TargetInfo::hasFeature(StringRef Feature) const {
2964 return llvm::StringSwitch<bool>(Feature)
2965 .Case("aes", HasAES)
2966 .Case("avx", SSELevel >= AVX)
2967 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002968 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002969 .Case("avx512cd", HasAVX512CD)
2970 .Case("avx512er", HasAVX512ER)
2971 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002972 .Case("avx512dq", HasAVX512DQ)
2973 .Case("avx512bw", HasAVX512BW)
2974 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002975 .Case("bmi", HasBMI)
2976 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002977 .Case("cx16", HasCX16)
2978 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002979 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002980 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002981 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002982 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002983 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002984 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2985 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2986 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002987 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002988 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002989 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002990 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002991 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002992 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002993 .Case("sse", SSELevel >= SSE1)
2994 .Case("sse2", SSELevel >= SSE2)
2995 .Case("sse3", SSELevel >= SSE3)
2996 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002997 .Case("sse4.1", SSELevel >= SSE41)
2998 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002999 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003000 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003001 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3002 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003003 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003004 .Default(false);
3005}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003006
Eli Friedman3fd920a2008-08-20 02:34:37 +00003007bool
Anders Carlsson58436352009-02-28 17:11:49 +00003008X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003009 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003010 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003011 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00003012 case 'Y': // first letter of a pair:
3013 switch (*(Name+1)) {
3014 default: return false;
3015 case '0': // First SSE register.
3016 case 't': // Any SSE register, when SSE2 is enabled.
3017 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3018 case 'm': // any MMX register, when inter-unit moves enabled.
3019 break; // falls through to setAllowsRegister.
3020 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003021 case 'f': // any x87 floating point stack register.
3022 // Constraint 'f' cannot be used for output operands.
3023 if (Info.ConstraintStr[0] == '=')
3024 return false;
3025
3026 Info.setAllowsRegister();
3027 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003028 case 'a': // eax.
3029 case 'b': // ebx.
3030 case 'c': // ecx.
3031 case 'd': // edx.
3032 case 'S': // esi.
3033 case 'D': // edi.
3034 case 'A': // edx:eax.
3035 case 't': // top of floating point stack.
3036 case 'u': // second from top of floating point stack.
3037 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003038 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003039 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003040 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003041 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3042 case 'l': // "Index" registers: any general register that can be used as an
3043 // index in a base+index memory access.
3044 Info.setAllowsRegister();
3045 return true;
3046 case 'C': // SSE floating point constant.
3047 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003048 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003049 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003050 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003051 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003052 return true;
3053 }
3054}
3055
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003056bool X86TargetInfo::validateInputSize(StringRef Constraint,
3057 unsigned Size) const {
3058 switch (Constraint[0]) {
3059 default: break;
3060 case 'y':
3061 return Size <= 64;
3062 case 'x':
3063 case 'f':
3064 case 't':
3065 case 'u':
3066 return Size <= 128;
3067 }
3068
3069 return true;
3070}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003071
Eli Friedman3fd920a2008-08-20 02:34:37 +00003072std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003073X86TargetInfo::convertConstraint(const char *&Constraint) const {
3074 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003075 case 'a': return std::string("{ax}");
3076 case 'b': return std::string("{bx}");
3077 case 'c': return std::string("{cx}");
3078 case 'd': return std::string("{dx}");
3079 case 'S': return std::string("{si}");
3080 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003081 case 'p': // address
3082 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003083 case 't': // top of floating point stack.
3084 return std::string("{st}");
3085 case 'u': // second from top of floating point stack.
3086 return std::string("{st(1)}"); // second from top of floating point stack.
3087 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003088 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003089 }
3090}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003091} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003092
3093namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003094// X86-32 generic target
3095class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003096public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003097 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003098 DoubleAlign = LongLongAlign = 32;
3099 LongDoubleWidth = 96;
3100 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003101 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003102 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003103 SizeType = UnsignedInt;
3104 PtrDiffType = SignedInt;
3105 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003106 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003107
3108 // Use fpret for all types.
3109 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3110 (1 << TargetInfo::Double) |
3111 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003112
3113 // x86-32 has atomics up to 8 bytes
3114 // FIXME: Check that we actually have cmpxchg8b before setting
3115 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3116 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003117 }
Craig Topper3164f332014-03-11 03:39:26 +00003118 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003119 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003120 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003121
Craig Topper3164f332014-03-11 03:39:26 +00003122 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003123 if (RegNo == 0) return 0;
3124 if (RegNo == 1) return 2;
3125 return -1;
3126 }
Craig Topper3164f332014-03-11 03:39:26 +00003127 bool validateInputSize(StringRef Constraint,
3128 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003129 switch (Constraint[0]) {
3130 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003131 case 'R':
3132 case 'q':
3133 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003134 case 'a':
3135 case 'b':
3136 case 'c':
3137 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003138 case 'S':
3139 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003140 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003141 case 'A':
3142 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003143 }
3144
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003145 return X86TargetInfo::validateInputSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003146 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003147};
3148} // end anonymous namespace
3149
3150namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003151class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3152public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003153 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3154 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003155
Craig Topper3164f332014-03-11 03:39:26 +00003156 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003157 unsigned Major, Minor, Micro;
3158 getTriple().getOSVersion(Major, Minor, Micro);
3159 // New NetBSD uses the default rounding mode.
3160 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3161 return X86_32TargetInfo::getFloatEvalMethod();
3162 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003163 return 1;
3164 }
3165};
3166} // end anonymous namespace
3167
3168namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003169class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3170public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003171 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3172 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003173 SizeType = UnsignedLong;
3174 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003175 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003176 }
3177};
3178} // end anonymous namespace
3179
3180namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003181class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3182public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003183 BitrigI386TargetInfo(const llvm::Triple &Triple)
3184 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003185 SizeType = UnsignedLong;
3186 IntPtrType = SignedLong;
3187 PtrDiffType = SignedLong;
3188 }
3189};
3190} // end anonymous namespace
3191
3192namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003193class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003195 DarwinI386TargetInfo(const llvm::Triple &Triple)
3196 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003197 LongDoubleWidth = 128;
3198 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003199 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003200 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003201 SizeType = UnsignedLong;
3202 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003203 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003204 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003205 }
3206
Eli Friedman3fd920a2008-08-20 02:34:37 +00003207};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003208} // end anonymous namespace
3209
3210namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003211// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003212class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003213public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003214 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3215 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003216 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003217 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003218 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003219 }
Craig Topper3164f332014-03-11 03:39:26 +00003220 void getTargetDefines(const LangOptions &Opts,
3221 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003222 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3223 }
3224};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003225
3226// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003227class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003228public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003229 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003230 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003231 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003232 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3233 }
Craig Topper3164f332014-03-11 03:39:26 +00003234 void getTargetDefines(const LangOptions &Opts,
3235 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003236 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3237 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3238 // The value of the following reflects processor type.
3239 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3240 // We lost the original triple, so we use the default.
3241 Builder.defineMacro("_M_IX86", "600");
3242 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003243};
3244} // end anonymous namespace
3245
Reid Kleckner47606832014-04-21 20:58:00 +00003246static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3247 Builder.defineMacro("__MSVCRT__");
3248 Builder.defineMacro("__MINGW32__");
3249
3250 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3251 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3252 // macro anyway for pre-processor compatibility.
3253 if (Opts.MicrosoftExt)
3254 Builder.defineMacro("__declspec", "__declspec");
3255 else
3256 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3257
3258 if (!Opts.MicrosoftExt) {
3259 // Provide macros for all the calling convention keywords. Provide both
3260 // single and double underscore prefixed variants. These are available on
3261 // x64 as well as x86, even though they have no effect.
3262 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3263 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003264 std::string GCCSpelling = "__attribute__((__";
3265 GCCSpelling += CC;
3266 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003267 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3268 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3269 }
3270 }
3271}
3272
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003273namespace {
3274// x86-32 MinGW target
3275class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3276public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003277 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3278 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003279 void getTargetDefines(const LangOptions &Opts,
3280 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003281 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003282 DefineStd(Builder, "WIN32", Opts);
3283 DefineStd(Builder, "WINNT", Opts);
3284 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003285 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003286 }
3287};
3288} // end anonymous namespace
3289
3290namespace {
3291// x86-32 Cygwin target
3292class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3293public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003294 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3295 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003296 TLSSupported = false;
3297 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003298 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003299 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003300 }
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 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003304 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003305 Builder.defineMacro("__CYGWIN__");
3306 Builder.defineMacro("__CYGWIN32__");
3307 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003308 if (Opts.CPlusPlus)
3309 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003310 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003311};
3312} // end anonymous namespace
3313
3314namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003315// x86-32 Haiku target
3316class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3317public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003318 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003319 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003320 IntPtrType = SignedLong;
3321 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003322 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003323 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003324 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003325 }
Craig Topper3164f332014-03-11 03:39:26 +00003326 void getTargetDefines(const LangOptions &Opts,
3327 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003328 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3329 Builder.defineMacro("__INTEL__");
3330 Builder.defineMacro("__HAIKU__");
3331 }
3332};
3333} // end anonymous namespace
3334
Douglas Gregor9fabd852011-07-01 22:41:14 +00003335// RTEMS Target
3336template<typename Target>
3337class RTEMSTargetInfo : public OSTargetInfo<Target> {
3338protected:
Craig Topper3164f332014-03-11 03:39:26 +00003339 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3340 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003341 // RTEMS defines; list based off of gcc output
3342
Douglas Gregor9fabd852011-07-01 22:41:14 +00003343 Builder.defineMacro("__rtems__");
3344 Builder.defineMacro("__ELF__");
3345 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003346
Douglas Gregor9fabd852011-07-01 22:41:14 +00003347public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003348 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3349 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003350
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003351 switch (Triple.getArch()) {
3352 default:
3353 case llvm::Triple::x86:
3354 // this->MCountName = ".mcount";
3355 break;
3356 case llvm::Triple::mips:
3357 case llvm::Triple::mipsel:
3358 case llvm::Triple::ppc:
3359 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003360 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003361 // this->MCountName = "_mcount";
3362 break;
3363 case llvm::Triple::arm:
3364 // this->MCountName = "__mcount";
3365 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003366 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003367 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003368};
3369
3370namespace {
3371// x86-32 RTEMS target
3372class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3373public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003374 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003375 SizeType = UnsignedLong;
3376 IntPtrType = SignedLong;
3377 PtrDiffType = SignedLong;
3378 this->UserLabelPrefix = "";
3379 }
Craig Topper3164f332014-03-11 03:39:26 +00003380 void getTargetDefines(const LangOptions &Opts,
3381 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003382 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3383 Builder.defineMacro("__INTEL__");
3384 Builder.defineMacro("__rtems__");
3385 }
3386};
3387} // end anonymous namespace
3388
Chris Lattnerb986aba2010-04-11 19:29:39 +00003389namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003390// x86-64 generic target
3391class X86_64TargetInfo : public X86TargetInfo {
3392public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003393 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003394 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003395 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003396 LongDoubleWidth = 128;
3397 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003398 LargeArrayMinWidth = 128;
3399 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003400 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003401 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3402 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3403 IntPtrType = IsX32 ? SignedInt : SignedLong;
3404 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003405 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003406 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003407
Zinovy Nis1db95732014-07-10 15:27:19 +00003408 DescriptionString = (IsX32)
3409 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3410 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003411
3412 // Use fpret only for long double.
3413 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003414
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003415 // Use fp2ret for _Complex long double.
3416 ComplexLongDoubleUsesFP2Ret = true;
3417
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003418 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003419 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003420 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003421 }
Craig Topper3164f332014-03-11 03:39:26 +00003422 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003423 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003424 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003425
Craig Topper3164f332014-03-11 03:39:26 +00003426 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003427 if (RegNo == 0) return 0;
3428 if (RegNo == 1) return 1;
3429 return -1;
3430 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003431
Craig Topper3164f332014-03-11 03:39:26 +00003432 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003433 return (CC == CC_C ||
3434 CC == CC_IntelOclBicc ||
3435 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003436 }
3437
Craig Topper3164f332014-03-11 03:39:26 +00003438 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003439 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003440 }
3441
Pavel Chupinfd223e12014-08-04 12:39:43 +00003442 // for x32 we need it here explicitly
3443 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003444};
3445} // end anonymous namespace
3446
3447namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003448// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003449class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003450public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003451 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3452 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003453 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003454 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003455 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003456 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003457 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003458 SizeType = UnsignedLongLong;
3459 PtrDiffType = SignedLongLong;
3460 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003461 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003462 }
Craig Topper3164f332014-03-11 03:39:26 +00003463 void getTargetDefines(const LangOptions &Opts,
3464 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003465 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003466 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003467 }
Craig Topper3164f332014-03-11 03:39:26 +00003468 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003469 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003470 }
Craig Topper3164f332014-03-11 03:39:26 +00003471 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003472 return (CC == CC_C ||
3473 CC == CC_IntelOclBicc ||
3474 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3475 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003476};
3477} // end anonymous namespace
3478
3479namespace {
3480// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003481class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003482public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003483 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003484 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003485 LongDoubleWidth = LongDoubleAlign = 64;
3486 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003487 }
Craig Topper3164f332014-03-11 03:39:26 +00003488 void getTargetDefines(const LangOptions &Opts,
3489 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003490 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3491 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003492 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003493 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003494 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003495};
3496} // end anonymous namespace
3497
3498namespace {
3499// x86-64 MinGW target
3500class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3501public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003502 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3503 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003504 void getTargetDefines(const LangOptions &Opts,
3505 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003506 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003507 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003508 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003509 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003510 }
3511};
3512} // end anonymous namespace
3513
3514namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003515class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003517 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3518 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003519 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003520 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003521 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3522 llvm::Triple T = llvm::Triple(Triple);
3523 if (T.getOS() == llvm::Triple::IOS)
3524 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003525 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003526 }
3527};
3528} // end anonymous namespace
3529
3530namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003531class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3532public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003533 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3534 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003535 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003536 Int64Type = SignedLongLong;
3537 }
3538};
3539} // end anonymous namespace
3540
3541namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003542class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3543public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003544 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3545 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3546 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003547 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003548 }
3549};
Tim Northover9bb857a2013-01-31 12:13:10 +00003550}
3551
Eli Friedman9fa28852012-08-08 23:57:20 +00003552
3553namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003554class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003555 // Possible FPU choices.
3556 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003557 VFP2FPU = (1 << 0),
3558 VFP3FPU = (1 << 1),
3559 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003560 NeonFPU = (1 << 3),
3561 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003562 };
3563
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003564 // Possible HWDiv features.
3565 enum HWDivMode {
3566 HWDivThumb = (1 << 0),
3567 HWDivARM = (1 << 1)
3568 };
3569
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003570 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003571 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003572 }
3573
3574 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3575 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003576
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003577 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003578
Rafael Espindolaeb265472013-08-21 21:59:03 +00003579 enum {
3580 FP_Default,
3581 FP_VFP,
3582 FP_Neon
3583 } FPMath;
3584
Bernard Ogdenda13af32013-10-24 18:32:51 +00003585 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003586
Logan Chien57086ce2012-10-10 06:56:20 +00003587 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003588 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003589 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003590
3591 // Initialized via features.
3592 unsigned SoftFloat : 1;
3593 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003594
Bernard Ogden18b57012013-10-29 09:47:51 +00003595 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003596 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003597
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003598 // ACLE 6.5.1 Hardware floating point
3599 enum {
3600 HW_FP_HP = (1 << 1), /// half (16-bit)
3601 HW_FP_SP = (1 << 2), /// single (32-bit)
3602 HW_FP_DP = (1 << 3), /// double (64-bit)
3603 };
3604 uint32_t HW_FP;
3605
Chris Lattner5cc15e02010-03-03 19:03:45 +00003606 static const Builtin::Info BuiltinInfo[];
3607
Rafael Espindola101d5b92013-05-13 20:09:47 +00003608 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003609 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003610 if (T.getArch() == llvm::Triple::arm ||
3611 T.getArch() == llvm::Triple::armeb) {
3612 StringRef VersionStr;
3613 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003614 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003615 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003616 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003617 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003618 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003619 unsigned Version;
3620 if (VersionStr.getAsInteger(10, Version))
3621 return false;
3622 return Version >= 6;
3623 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003624 assert(T.getArch() == llvm::Triple::thumb ||
3625 T.getArch() == llvm::Triple::thumbeb);
3626 StringRef VersionStr;
3627 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003628 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003629 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003630 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003631 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003632 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003633 unsigned Version;
3634 if (VersionStr.getAsInteger(10, Version))
3635 return false;
3636 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003637 }
3638
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003639 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003640 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003641
3642 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003643 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003644
Tim Northover00853e52014-08-05 11:07:26 +00003645 // size_t is unsigned long on MachO-derived environments and NetBSD.
3646 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003647 SizeType = UnsignedLong;
3648 else
3649 SizeType = UnsignedInt;
3650
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003651 switch (T.getOS()) {
3652 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003653 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003654 break;
3655 case llvm::Triple::Win32:
3656 WCharType = UnsignedShort;
3657 break;
3658 case llvm::Triple::Linux:
3659 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003660 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3661 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003662 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003663 }
3664
3665 UseBitFieldTypeAlignment = true;
3666
3667 ZeroLengthBitfieldBoundary = 0;
3668
3669 if (IsThumb) {
3670 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3671 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003672 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003673 DescriptionString = BigEndian ?
3674 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3675 "v128:64:128-a:0:32-n32-S64" :
3676 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3677 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003678 } else if (T.isOSWindows()) {
3679 // FIXME: this is invalid for WindowsCE
3680 assert(!BigEndian && "Windows on ARM does not support big endian");
3681 DescriptionString = "e"
3682 "-m:e"
3683 "-p:32:32"
3684 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3685 "-v128:64:128"
3686 "-a:0:32"
3687 "-n32"
3688 "-S64";
3689 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003690 DescriptionString = BigEndian ?
3691 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3692 "v128:64:128-a:0:32-n32-S64" :
3693 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3694 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003695 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003696 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003697 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003698 DescriptionString = BigEndian ?
3699 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3700 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003701 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003702 DescriptionString = BigEndian ?
3703 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3704 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003705 }
3706
3707 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003708 }
3709
3710 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003711 const llvm::Triple &T = getTriple();
3712
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003713 IsAAPCS = false;
3714
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003715 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003716
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003717 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003718 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003719 SizeType = UnsignedInt;
3720 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003721 SizeType = UnsignedLong;
3722
3723 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3724 WCharType = SignedInt;
3725
3726 // Do not respect the alignment of bit-field types when laying out
3727 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3728 UseBitFieldTypeAlignment = false;
3729
3730 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3731 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3732 /// gcc.
3733 ZeroLengthBitfieldBoundary = 32;
3734
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003735 if (IsThumb) {
3736 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3737 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003738 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003739 DescriptionString = BigEndian ?
3740 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3741 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3742 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3743 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003744 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003745 DescriptionString = BigEndian ?
3746 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3747 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3748 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3749 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003750 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003751 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003752 DescriptionString = BigEndian ?
3753 "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 +00003754 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3755 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003756 DescriptionString = BigEndian ?
3757 "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 +00003758 "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 +00003759 }
3760
3761 // FIXME: Override "preferred align" for double and long long.
3762 }
3763
Chris Lattner17df24e2008-04-21 18:56:49 +00003764public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003765 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003766 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003767 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003768 BigEndian = IsBigEndian;
3769
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003770 switch (getTriple().getOS()) {
3771 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003772 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003773 break;
3774 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003775 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003776 break;
3777 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003778
Chris Lattner1a8f3942010-04-23 16:29:58 +00003779 // {} in inline assembly are neon specifiers, not assembly variant
3780 // specifiers.
3781 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003782
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003783 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003784 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003785
3786 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003787
3788 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003789 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003790
3791 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003792 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003793 if (shouldUseInlineAtomic(getTriple()))
3794 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003795
3796 // Do force alignment of members that follow zero length bitfields. If
3797 // the alignment of the zero-length bitfield is greater than the member
3798 // that follows it, `bar', `bar' will be aligned as the type of the
3799 // zero length bitfield.
3800 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003801 }
Alp Toker4925ba72014-06-07 23:30:42 +00003802 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003803 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003804 ABI = Name;
3805
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003806 // The defaults (above) are for AAPCS, check if we need to change them.
3807 //
3808 // FIXME: We need support for -meabi... we could just mangle it into the
3809 // name.
3810 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003811 setABIAPCS();
3812 return true;
3813 }
3814 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3815 setABIAAPCS();
3816 return true;
3817 }
3818 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003819 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003820
Craig Topper3164f332014-03-11 03:39:26 +00003821 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003822 if (IsAAPCS)
3823 Features["aapcs"] = true;
3824 else
3825 Features["apcs"] = true;
3826
Silviu Barangae5690462013-10-21 10:59:33 +00003827 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003828 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3829 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003830 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3831 CPU == "cortex-a9-mp") {
3832 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003833 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003834 }
3835 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003836 Features["vfp4"] = true;
3837 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003838 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3839 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3840 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003841 Features["vfp4"] = true;
3842 Features["neon"] = true;
3843 Features["hwdiv"] = true;
3844 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003845 } else if (CPU == "cyclone") {
3846 Features["v8fp"] = true;
3847 Features["neon"] = true;
3848 Features["hwdiv"] = true;
3849 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003850 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3851 Features["fp-armv8"] = true;
3852 Features["neon"] = true;
3853 Features["hwdiv"] = true;
3854 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003855 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003856 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003857 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003858 // Enable the hwdiv extension for all v8a AArch32 cores by
3859 // default.
3860 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003861 ArchName == "armebv8a" || ArchName == "armebv8" ||
3862 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3863 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003864 Features["hwdiv"] = true;
3865 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003866 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3867 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003868 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003869 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003870
Craig Topper3164f332014-03-11 03:39:26 +00003871 bool handleTargetFeatures(std::vector<std::string> &Features,
3872 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003873 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003874 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003875 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003876 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003877 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003878
3879 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003880 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003881 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003882 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003883 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003884 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003885 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003886 HW_FP = HW_FP_SP | HW_FP_DP;
3887 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003888 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003889 HW_FP = HW_FP_SP | HW_FP_DP;
3890 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003891 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003892 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3893 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003894 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003895 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3896 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003897 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003898 HW_FP = HW_FP_SP | HW_FP_DP;
3899 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003900 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003901 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003902 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003903 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00003904 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003905 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00003906 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003907 } else if (Feature == "+fp-only-sp") {
3908 HW_FP &= ~HW_FP_DP;
3909 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003910 }
3911
Rafael Espindolaeb265472013-08-21 21:59:03 +00003912 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3913 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3914 return false;
3915 }
3916
3917 if (FPMath == FP_Neon)
3918 Features.push_back("+neonfp");
3919 else if (FPMath == FP_VFP)
3920 Features.push_back("-neonfp");
3921
Daniel Dunbar893d4752009-12-19 04:15:38 +00003922 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003923 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
3924 for (const auto &FEFeature : FrontEndFeatures) {
3925 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
3926 if (Feature != Features.end())
3927 Features.erase(Feature);
3928 }
3929
Rafael Espindolaeb265472013-08-21 21:59:03 +00003930 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003931 }
3932
Craig Topper3164f332014-03-11 03:39:26 +00003933 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003934 return llvm::StringSwitch<bool>(Feature)
3935 .Case("arm", true)
3936 .Case("softfloat", SoftFloat)
3937 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003938 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003939 .Case("hwdiv", HWDiv & HWDivThumb)
3940 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003941 .Default(false);
3942 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003943 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003944 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003945 return llvm::StringSwitch<const char*>(Name)
3946 .Cases("arm8", "arm810", "4")
3947 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3948 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3949 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3950 .Case("ep9312", "4T")
3951 .Cases("arm10tdmi", "arm1020t", "5T")
3952 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3953 .Case("arm926ej-s", "5TEJ")
3954 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3955 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003956 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003957 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003958 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003959 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003960 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003961 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003962 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003963 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003964 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00003965 .Case("cortex-m3", "7M")
3966 .Case("cortex-m4", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003967 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003968 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003969 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003970 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003971 static const char *getCPUProfile(StringRef Name) {
3972 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003973 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003974 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003975 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003976 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003977 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003978 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003979 }
Craig Topper3164f332014-03-11 03:39:26 +00003980 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003981 if (!getCPUDefineSuffix(Name))
3982 return false;
3983
Tim Northovere8c37212014-07-09 09:24:43 +00003984 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3985 StringRef Profile = getCPUProfile(Name);
3986 if (Profile == "M" && MaxAtomicInlineWidth) {
3987 MaxAtomicPromoteWidth = 32;
3988 MaxAtomicInlineWidth = 32;
3989 }
3990
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003991 CPU = Name;
3992 return true;
3993 }
Craig Topper3164f332014-03-11 03:39:26 +00003994 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003995 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3996 unsigned CPUArchVer) const {
3997 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3998 (CPUArch.find('M') != StringRef::npos);
3999 }
4000 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4001 unsigned CPUArchVer) const {
4002 // We check both CPUArchVer and ArchName because when only triple is
4003 // specified, the default CPU is arm1136j-s.
4004 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4005 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4006 }
Craig Topper3164f332014-03-11 03:39:26 +00004007 void getTargetDefines(const LangOptions &Opts,
4008 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004009 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004010 Builder.defineMacro("__arm");
4011 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004012
Chris Lattnerecd49032009-03-02 22:27:17 +00004013 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004014 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004015
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004016 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004017 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004018 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004019 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004020 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004021
4022 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004023 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004024 StringRef ArchName = getTriple().getArchName();
4025
4026 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4027 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
James Molloy0ffb0932014-09-15 11:25:38 +00004028 if (CPUArch[0] >= '8') {
4029 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4030 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4031 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004032
4033 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4034 // is not defined for the M-profile.
4035 // NOTE that the deffault profile is assumed to be 'A'
4036 if (CPUProfile.empty() || CPUProfile != "M")
4037 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4038
4039 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4040 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4041 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4042 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4043 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4044 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4045 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4046
4047 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4048 // instruction set such as ARM or Thumb.
4049 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4050
4051 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4052
4053 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004054 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004055 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004056
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004057 // ACLE 6.5.1 Hardware Floating Point
4058 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004059 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004060
Yi Konga44c4d72014-06-27 21:25:42 +00004061 // ACLE predefines.
4062 Builder.defineMacro("__ARM_ACLE", "200");
4063
Mike Stump9d54bd72009-04-08 02:07:04 +00004064 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004065
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004066 // FIXME: It's more complicated than this and we don't really support
4067 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004068 // Windows on ARM does not "support" interworking
4069 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004070 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004071
David Tweed8f676532012-10-25 13:33:01 +00004072 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004073 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004074 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4075 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004076 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004077 Builder.defineMacro("__ARM_PCS", "1");
4078
David Tweed8f676532012-10-25 13:33:01 +00004079 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004080 Builder.defineMacro("__ARM_PCS_VFP", "1");
4081 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004082
Daniel Dunbar893d4752009-12-19 04:15:38 +00004083 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004084 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004085
4086 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004087 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004088
4089 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004090 Builder.defineMacro("__THUMBEL__");
4091 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004092 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004093 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004094 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004095 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4096 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004097
4098 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004099 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004100
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004101 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004102 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004103 if (FPU & VFP2FPU)
4104 Builder.defineMacro("__ARM_VFPV2__");
4105 if (FPU & VFP3FPU)
4106 Builder.defineMacro("__ARM_VFPV3__");
4107 if (FPU & VFP4FPU)
4108 Builder.defineMacro("__ARM_VFPV4__");
4109 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004110
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004111 // This only gets set when Neon instructions are actually available, unlike
4112 // the VFP define, hence the soft float and arch check. This is subtly
4113 // different from gcc, we follow the intent which was that it should be set
4114 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004115 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4116 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004117 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004118 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004119
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004120 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4121 Opts.ShortWChar ? "2" : "4");
4122
4123 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4124 Opts.ShortEnums ? "1" : "4");
4125
Bernard Ogden18b57012013-10-29 09:47:51 +00004126 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004127 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004128
Tim Northover02e38602014-02-03 17:28:04 +00004129 if (Crypto)
4130 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4131
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004132 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004133 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4134 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4135 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4136 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4137 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004138 }
Craig Topper3164f332014-03-11 03:39:26 +00004139 void getTargetBuiltins(const Builtin::Info *&Records,
4140 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004141 Records = BuiltinInfo;
4142 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004143 }
Craig Topper3164f332014-03-11 03:39:26 +00004144 bool isCLZForZeroUndef() const override { return false; }
4145 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004146 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004147 }
Craig Topper3164f332014-03-11 03:39:26 +00004148 void getGCCRegNames(const char * const *&Names,
4149 unsigned &NumNames) const override;
4150 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4151 unsigned &NumAliases) const override;
4152 bool validateAsmConstraint(const char *&Name,
4153 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004154 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004155 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004156 case 'l': // r0-r7
4157 case 'h': // r8-r15
4158 case 'w': // VFP Floating point register single precision
4159 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004160 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004161 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004162 case 'Q': // A memory address that is a single base register.
4163 Info.setAllowsMemory();
4164 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004165 case 'U': // a memory reference...
4166 switch (Name[1]) {
4167 case 'q': // ...ARMV4 ldrsb
4168 case 'v': // ...VFP load/store (reg+constant offset)
4169 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004170 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004171 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004172 case 'n': // valid address for Neon doubleword vector load/store
4173 case 'm': // valid address for Neon element and structure load/store
4174 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004175 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004176 Info.setAllowsMemory();
4177 Name++;
4178 return true;
4179 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004180 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004181 return false;
4182 }
Craig Topper3164f332014-03-11 03:39:26 +00004183 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004184 std::string R;
4185 switch (*Constraint) {
4186 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004187 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004188 Constraint++;
4189 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004190 case 'p': // 'p' should be translated to 'r' by default.
4191 R = std::string("r");
4192 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004193 default:
4194 return std::string(1, *Constraint);
4195 }
4196 return R;
4197 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004198 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004199 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004200 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004201 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004202 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004203
Bill Wendling9d1ee112012-10-25 23:28:48 +00004204 // Strip off constraint modifiers.
4205 while (Constraint[0] == '=' ||
4206 Constraint[0] == '+' ||
4207 Constraint[0] == '&')
4208 Constraint = Constraint.substr(1);
4209
4210 switch (Constraint[0]) {
4211 default: break;
4212 case 'r': {
4213 switch (Modifier) {
4214 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004215 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004216 case 'q':
4217 // A register of size 32 cannot fit a vector type.
4218 return false;
4219 }
4220 }
4221 }
4222
4223 return true;
4224 }
Craig Topper3164f332014-03-11 03:39:26 +00004225 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004226 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004227 return "";
4228 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004229
Craig Topper3164f332014-03-11 03:39:26 +00004230 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004231 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4232 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004233
Craig Topper3164f332014-03-11 03:39:26 +00004234 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004235 if (RegNo == 0) return 0;
4236 if (RegNo == 1) return 1;
4237 return -1;
4238 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004239};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004240
Rafael Espindolaeb265472013-08-21 21:59:03 +00004241bool ARMTargetInfo::setFPMath(StringRef Name) {
4242 if (Name == "neon") {
4243 FPMath = FP_Neon;
4244 return true;
4245 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4246 Name == "vfp4") {
4247 FPMath = FP_VFP;
4248 return true;
4249 }
4250 return false;
4251}
4252
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004253const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004254 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004255 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004256 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4257
4258 // Float registers
4259 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4260 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4261 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004262 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004263
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004264 // Double registers
4265 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4266 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004267 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4268 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004269
4270 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004271 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4272 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004273};
4274
4275void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004276 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004277 Names = GCCRegNames;
4278 NumNames = llvm::array_lengthof(GCCRegNames);
4279}
4280
4281const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004282 { { "a1" }, "r0" },
4283 { { "a2" }, "r1" },
4284 { { "a3" }, "r2" },
4285 { { "a4" }, "r3" },
4286 { { "v1" }, "r4" },
4287 { { "v2" }, "r5" },
4288 { { "v3" }, "r6" },
4289 { { "v4" }, "r7" },
4290 { { "v5" }, "r8" },
4291 { { "v6", "rfp" }, "r9" },
4292 { { "sl" }, "r10" },
4293 { { "fp" }, "r11" },
4294 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004295 { { "r13" }, "sp" },
4296 { { "r14" }, "lr" },
4297 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004298 // The S, D and Q registers overlap, but aren't really aliases; we
4299 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004300};
4301
4302void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4303 unsigned &NumAliases) const {
4304 Aliases = GCCRegAliases;
4305 NumAliases = llvm::array_lengthof(GCCRegAliases);
4306}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004307
4308const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004309#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004310#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004311 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004312#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004313
4314#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004315#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004316#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4317 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004318#include "clang/Basic/BuiltinsARM.def"
4319};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004320
4321class ARMleTargetInfo : public ARMTargetInfo {
4322public:
4323 ARMleTargetInfo(const llvm::Triple &Triple)
4324 : ARMTargetInfo(Triple, false) { }
4325 virtual void getTargetDefines(const LangOptions &Opts,
4326 MacroBuilder &Builder) const {
4327 Builder.defineMacro("__ARMEL__");
4328 ARMTargetInfo::getTargetDefines(Opts, Builder);
4329 }
4330};
4331
4332class ARMbeTargetInfo : public ARMTargetInfo {
4333public:
4334 ARMbeTargetInfo(const llvm::Triple &Triple)
4335 : ARMTargetInfo(Triple, true) { }
4336 virtual void getTargetDefines(const LangOptions &Opts,
4337 MacroBuilder &Builder) const {
4338 Builder.defineMacro("__ARMEB__");
4339 Builder.defineMacro("__ARM_BIG_ENDIAN");
4340 ARMTargetInfo::getTargetDefines(Opts, Builder);
4341 }
4342};
Chris Lattner17df24e2008-04-21 18:56:49 +00004343} // end anonymous namespace.
4344
Eli Friedmanf05b7722008-08-20 07:44:10 +00004345namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004346class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4347 const llvm::Triple Triple;
4348public:
4349 WindowsARMTargetInfo(const llvm::Triple &Triple)
4350 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4351 TLSSupported = false;
4352 WCharType = UnsignedShort;
4353 SizeType = UnsignedInt;
4354 UserLabelPrefix = "";
4355 }
4356 void getVisualStudioDefines(const LangOptions &Opts,
4357 MacroBuilder &Builder) const {
4358 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4359
4360 // FIXME: this is invalid for WindowsCE
4361 Builder.defineMacro("_M_ARM_NT", "1");
4362 Builder.defineMacro("_M_ARMT", "_M_ARM");
4363 Builder.defineMacro("_M_THUMB", "_M_ARM");
4364
4365 assert((Triple.getArch() == llvm::Triple::arm ||
4366 Triple.getArch() == llvm::Triple::thumb) &&
4367 "invalid architecture for Windows ARM target info");
4368 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4369 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4370
4371 // TODO map the complete set of values
4372 // 31: VFPv3 40: VFPv4
4373 Builder.defineMacro("_M_ARM_FP", "31");
4374 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004375 BuiltinVaListKind getBuiltinVaListKind() const override {
4376 return TargetInfo::CharPtrBuiltinVaList;
4377 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004378};
4379
4380// Windows ARM + Itanium C++ ABI Target
4381class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4382public:
4383 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4384 : WindowsARMTargetInfo(Triple) {
4385 TheCXXABI.set(TargetCXXABI::GenericARM);
4386 }
4387
4388 void getTargetDefines(const LangOptions &Opts,
4389 MacroBuilder &Builder) const override {
4390 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4391
4392 if (Opts.MSVCCompat)
4393 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4394 }
4395};
4396
4397// Windows ARM, MS (C++) ABI
4398class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4399public:
4400 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4401 : WindowsARMTargetInfo(Triple) {
4402 TheCXXABI.set(TargetCXXABI::Microsoft);
4403 }
4404
4405 void getTargetDefines(const LangOptions &Opts,
4406 MacroBuilder &Builder) const override {
4407 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4408 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4409 }
4410};
4411}
4412
4413
4414namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004415class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004416 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004417protected:
Craig Topper3164f332014-03-11 03:39:26 +00004418 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4419 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004420 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004421 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004422
Torok Edwinb2b37c62009-06-30 17:10:35 +00004423public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004424 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004425 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004426 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004427 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004428 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004429 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004430
4431 // Darwin on iOS uses a variant of the ARM C++ ABI.
4432 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004433 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004434};
4435} // end anonymous namespace.
4436
Tony Linthicum76329bf2011-12-12 21:14:55 +00004437
4438namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004439class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004440 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004441 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4442 static const char *const GCCRegNames[];
4443
James Molloy75f5f9e2014-04-16 15:33:48 +00004444 enum FPUModeEnum {
4445 FPUMode,
4446 NeonMode
4447 };
4448
4449 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004450 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004451 unsigned Crypto;
4452
Tim Northovera2ee4332014-03-29 15:09:45 +00004453 static const Builtin::Info BuiltinInfo[];
4454
4455 std::string ABI;
4456
4457public:
Tim Northover573cbee2014-05-24 12:52:07 +00004458 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004459 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004460
4461 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4462 WCharType = SignedInt;
4463
4464 // NetBSD apparently prefers consistency across ARM targets to consistency
4465 // across 64-bit targets.
4466 Int64Type = SignedLongLong;
4467 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004468 } else {
4469 WCharType = UnsignedInt;
4470 Int64Type = SignedLong;
4471 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004472 }
4473
Tim Northovera2ee4332014-03-29 15:09:45 +00004474 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004475 MaxVectorAlign = 128;
4476 RegParmMax = 8;
4477 MaxAtomicInlineWidth = 128;
4478 MaxAtomicPromoteWidth = 128;
4479
4480 LongDoubleWidth = LongDoubleAlign = 128;
4481 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4482
Tim Northovera2ee4332014-03-29 15:09:45 +00004483 // {} in inline assembly are neon specifiers, not assembly variant
4484 // specifiers.
4485 NoAsmVariants = true;
4486
Tim Northover573cbee2014-05-24 12:52:07 +00004487 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004488 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4489 }
4490
Alp Toker4925ba72014-06-07 23:30:42 +00004491 StringRef getABI() const override { return ABI; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004492 virtual bool setABI(const std::string &Name) {
4493 if (Name != "aapcs" && Name != "darwinpcs")
4494 return false;
4495
4496 ABI = Name;
4497 return true;
4498 }
4499
4500 virtual bool setCPU(const std::string &Name) {
4501 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004502 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004503 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004504 .Case("cyclone", true)
4505 .Default(false);
4506 return CPUKnown;
4507 }
4508
4509 virtual void getTargetDefines(const LangOptions &Opts,
4510 MacroBuilder &Builder) const {
4511 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004512 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004513
4514 // Target properties.
4515 Builder.defineMacro("_LP64");
4516 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004517
4518 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4519 Builder.defineMacro("__ARM_ACLE", "200");
4520 Builder.defineMacro("__ARM_ARCH", "8");
4521 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4522
4523 Builder.defineMacro("__ARM_64BIT_STATE");
4524 Builder.defineMacro("__ARM_PCS_AAPCS64");
4525 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4526
4527 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4528 Builder.defineMacro("__ARM_FEATURE_CLZ");
4529 Builder.defineMacro("__ARM_FEATURE_FMA");
4530 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004531 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4532 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4533 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4534 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004535
4536 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4537
4538 // 0xe implies support for half, single and double precision operations.
4539 Builder.defineMacro("__ARM_FP", "0xe");
4540
4541 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4542 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4543 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4544
4545 if (Opts.FastMath || Opts.FiniteMathOnly)
4546 Builder.defineMacro("__ARM_FP_FAST");
4547
4548 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4549 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4550
4551 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4552
4553 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4554 Opts.ShortEnums ? "1" : "4");
4555
James Molloy75f5f9e2014-04-16 15:33:48 +00004556 if (FPU == NeonMode) {
4557 Builder.defineMacro("__ARM_NEON");
4558 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004559 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004560 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004561
Bradley Smith418c5932014-05-02 15:17:51 +00004562 if (CRC)
4563 Builder.defineMacro("__ARM_FEATURE_CRC32");
4564
James Molloy75f5f9e2014-04-16 15:33:48 +00004565 if (Crypto)
4566 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004567 }
4568
4569 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4570 unsigned &NumRecords) const {
4571 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004572 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004573 }
4574
4575 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004576 return Feature == "aarch64" ||
4577 Feature == "arm64" ||
4578 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004579 }
4580
James Molloy5e73df52014-04-16 15:06:20 +00004581 bool handleTargetFeatures(std::vector<std::string> &Features,
4582 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004583 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004584 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004585 Crypto = 0;
4586 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4587 if (Features[i] == "+neon")
4588 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004589 if (Features[i] == "+crc")
4590 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004591 if (Features[i] == "+crypto")
4592 Crypto = 1;
4593 }
4594
James Molloy5e73df52014-04-16 15:06:20 +00004595 setDescriptionString();
4596
4597 return true;
4598 }
4599
Tim Northovera2ee4332014-03-29 15:09:45 +00004600 virtual bool isCLZForZeroUndef() const { return false; }
4601
4602 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4603 return TargetInfo::AArch64ABIBuiltinVaList;
4604 }
4605
4606 virtual void getGCCRegNames(const char *const *&Names,
4607 unsigned &NumNames) const;
4608 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4609 unsigned &NumAliases) const;
4610
4611 virtual bool validateAsmConstraint(const char *&Name,
4612 TargetInfo::ConstraintInfo &Info) const {
4613 switch (*Name) {
4614 default:
4615 return false;
4616 case 'w': // Floating point and SIMD registers (V0-V31)
4617 Info.setAllowsRegister();
4618 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004619 case 'I': // Constant that can be used with an ADD instruction
4620 case 'J': // Constant that can be used with a SUB instruction
4621 case 'K': // Constant that can be used with a 32-bit logical instruction
4622 case 'L': // Constant that can be used with a 64-bit logical instruction
4623 case 'M': // Constant that can be used as a 32-bit MOV immediate
4624 case 'N': // Constant that can be used as a 64-bit MOV immediate
4625 case 'Y': // Floating point constant zero
4626 case 'Z': // Integer constant zero
4627 return true;
4628 case 'Q': // A memory reference with base register and no offset
4629 Info.setAllowsMemory();
4630 return true;
4631 case 'S': // A symbolic address
4632 Info.setAllowsRegister();
4633 return true;
4634 case 'U':
4635 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4636 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4637 // Usa: An absolute symbolic address
4638 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4639 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004640 case 'z': // Zero register, wzr or xzr
4641 Info.setAllowsRegister();
4642 return true;
4643 case 'x': // Floating point and SIMD registers (V0-V15)
4644 Info.setAllowsRegister();
4645 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004646 }
4647 return false;
4648 }
4649
Akira Hatanaka987f1862014-08-22 06:05:21 +00004650 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004651 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004652 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004653 // Strip off constraint modifiers.
4654 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4655 Constraint = Constraint.substr(1);
4656
4657 switch (Constraint[0]) {
4658 default:
4659 return true;
4660 case 'z':
4661 case 'r': {
4662 switch (Modifier) {
4663 case 'x':
4664 case 'w':
4665 // For now assume that the person knows what they're
4666 // doing with the modifier.
4667 return true;
4668 default:
4669 // By default an 'r' constraint will be in the 'x'
4670 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004671 if (Size == 64)
4672 return true;
4673
4674 SuggestedModifier = "w";
4675 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004676 }
4677 }
4678 }
4679 }
4680
Tim Northovera2ee4332014-03-29 15:09:45 +00004681 virtual const char *getClobbers() const { return ""; }
4682
4683 int getEHDataRegisterNumber(unsigned RegNo) const {
4684 if (RegNo == 0)
4685 return 0;
4686 if (RegNo == 1)
4687 return 1;
4688 return -1;
4689 }
4690};
4691
Tim Northover573cbee2014-05-24 12:52:07 +00004692const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004693 // 32-bit Integer registers
4694 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4695 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4696 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4697
4698 // 64-bit Integer registers
4699 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4700 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4701 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4702
4703 // 32-bit floating point regsisters
4704 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4705 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4706 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4707
4708 // 64-bit floating point regsisters
4709 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4710 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4711 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4712
4713 // Vector registers
4714 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4715 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4716 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4717};
4718
Tim Northover573cbee2014-05-24 12:52:07 +00004719void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004720 unsigned &NumNames) const {
4721 Names = GCCRegNames;
4722 NumNames = llvm::array_lengthof(GCCRegNames);
4723}
4724
Tim Northover573cbee2014-05-24 12:52:07 +00004725const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004726 { { "w31" }, "wsp" },
4727 { { "x29" }, "fp" },
4728 { { "x30" }, "lr" },
4729 { { "x31" }, "sp" },
4730 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4731 // don't want to substitute one of these for a different-sized one.
4732};
4733
Tim Northover573cbee2014-05-24 12:52:07 +00004734void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004735 unsigned &NumAliases) const {
4736 Aliases = GCCRegAliases;
4737 NumAliases = llvm::array_lengthof(GCCRegAliases);
4738}
4739
Tim Northover573cbee2014-05-24 12:52:07 +00004740const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004741#define BUILTIN(ID, TYPE, ATTRS) \
4742 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4743#include "clang/Basic/BuiltinsNEON.def"
4744
4745#define BUILTIN(ID, TYPE, ATTRS) \
4746 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004747#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004748};
James Molloy5e73df52014-04-16 15:06:20 +00004749
Tim Northover573cbee2014-05-24 12:52:07 +00004750class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004751 void setDescriptionString() override {
4752 if (getTriple().isOSBinFormatMachO())
4753 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4754 else
4755 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4756 }
4757
4758public:
Tim Northover573cbee2014-05-24 12:52:07 +00004759 AArch64leTargetInfo(const llvm::Triple &Triple)
4760 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004761 BigEndian = false;
4762 }
4763 void getTargetDefines(const LangOptions &Opts,
4764 MacroBuilder &Builder) const override {
4765 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004766 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004767 }
4768};
4769
Tim Northover573cbee2014-05-24 12:52:07 +00004770class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004771 void setDescriptionString() override {
4772 assert(!getTriple().isOSBinFormatMachO());
4773 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4774 }
4775
4776public:
Tim Northover573cbee2014-05-24 12:52:07 +00004777 AArch64beTargetInfo(const llvm::Triple &Triple)
4778 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004779 void getTargetDefines(const LangOptions &Opts,
4780 MacroBuilder &Builder) const override {
4781 Builder.defineMacro("__AARCH64EB__");
4782 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4783 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004784 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004785 }
4786};
Tim Northovera2ee4332014-03-29 15:09:45 +00004787} // end anonymous namespace.
4788
4789namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004790class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004791protected:
4792 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4793 MacroBuilder &Builder) const override {
4794 Builder.defineMacro("__AARCH64_SIMD__");
4795 Builder.defineMacro("__ARM64_ARCH_8__");
4796 Builder.defineMacro("__ARM_NEON__");
4797 Builder.defineMacro("__LITTLE_ENDIAN__");
4798 Builder.defineMacro("__REGISTER_PREFIX__", "");
4799 Builder.defineMacro("__arm64", "1");
4800 Builder.defineMacro("__arm64__", "1");
4801
4802 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4803 }
4804
Tim Northovera2ee4332014-03-29 15:09:45 +00004805public:
Tim Northover573cbee2014-05-24 12:52:07 +00004806 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4807 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004808 Int64Type = SignedLongLong;
4809 WCharType = SignedInt;
4810 UseSignedCharForObjCBool = false;
4811
4812 LongDoubleWidth = LongDoubleAlign = 64;
4813 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4814
4815 TheCXXABI.set(TargetCXXABI::iOS64);
4816 }
4817
4818 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4819 return TargetInfo::CharPtrBuiltinVaList;
4820 }
4821};
4822} // end anonymous namespace
4823
4824namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004825// Hexagon abstract base class
4826class HexagonTargetInfo : public TargetInfo {
4827 static const Builtin::Info BuiltinInfo[];
4828 static const char * const GCCRegNames[];
4829 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4830 std::string CPU;
4831public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004832 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004833 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004834 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004835
4836 // {} in inline assembly are packet specifiers, not assembly variant
4837 // specifiers.
4838 NoAsmVariants = true;
4839 }
4840
Craig Topper3164f332014-03-11 03:39:26 +00004841 void getTargetBuiltins(const Builtin::Info *&Records,
4842 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004843 Records = BuiltinInfo;
4844 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4845 }
4846
Craig Topper3164f332014-03-11 03:39:26 +00004847 bool validateAsmConstraint(const char *&Name,
4848 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004849 return true;
4850 }
4851
Craig Topper3164f332014-03-11 03:39:26 +00004852 void getTargetDefines(const LangOptions &Opts,
4853 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004854
Craig Topper3164f332014-03-11 03:39:26 +00004855 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004856 return Feature == "hexagon";
4857 }
Craig Topper3164f332014-03-11 03:39:26 +00004858
4859 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004860 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004861 }
Craig Topper3164f332014-03-11 03:39:26 +00004862 void getGCCRegNames(const char * const *&Names,
4863 unsigned &NumNames) const override;
4864 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4865 unsigned &NumAliases) const override;
4866 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004867 return "";
4868 }
Sebastian Pop86500282012-01-13 20:37:10 +00004869
4870 static const char *getHexagonCPUSuffix(StringRef Name) {
4871 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004872 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004873 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004874 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004875 }
4876
Craig Topper3164f332014-03-11 03:39:26 +00004877 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004878 if (!getHexagonCPUSuffix(Name))
4879 return false;
4880
Tony Linthicum76329bf2011-12-12 21:14:55 +00004881 CPU = Name;
4882 return true;
4883 }
4884};
4885
4886void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4887 MacroBuilder &Builder) const {
4888 Builder.defineMacro("qdsp6");
4889 Builder.defineMacro("__qdsp6", "1");
4890 Builder.defineMacro("__qdsp6__", "1");
4891
4892 Builder.defineMacro("hexagon");
4893 Builder.defineMacro("__hexagon", "1");
4894 Builder.defineMacro("__hexagon__", "1");
4895
4896 if(CPU == "hexagonv1") {
4897 Builder.defineMacro("__HEXAGON_V1__");
4898 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4899 if(Opts.HexagonQdsp6Compat) {
4900 Builder.defineMacro("__QDSP6_V1__");
4901 Builder.defineMacro("__QDSP6_ARCH__", "1");
4902 }
4903 }
4904 else if(CPU == "hexagonv2") {
4905 Builder.defineMacro("__HEXAGON_V2__");
4906 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4907 if(Opts.HexagonQdsp6Compat) {
4908 Builder.defineMacro("__QDSP6_V2__");
4909 Builder.defineMacro("__QDSP6_ARCH__", "2");
4910 }
4911 }
4912 else if(CPU == "hexagonv3") {
4913 Builder.defineMacro("__HEXAGON_V3__");
4914 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4915 if(Opts.HexagonQdsp6Compat) {
4916 Builder.defineMacro("__QDSP6_V3__");
4917 Builder.defineMacro("__QDSP6_ARCH__", "3");
4918 }
4919 }
4920 else if(CPU == "hexagonv4") {
4921 Builder.defineMacro("__HEXAGON_V4__");
4922 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4923 if(Opts.HexagonQdsp6Compat) {
4924 Builder.defineMacro("__QDSP6_V4__");
4925 Builder.defineMacro("__QDSP6_ARCH__", "4");
4926 }
4927 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004928 else if(CPU == "hexagonv5") {
4929 Builder.defineMacro("__HEXAGON_V5__");
4930 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4931 if(Opts.HexagonQdsp6Compat) {
4932 Builder.defineMacro("__QDSP6_V5__");
4933 Builder.defineMacro("__QDSP6_ARCH__", "5");
4934 }
4935 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004936}
4937
4938const char * const HexagonTargetInfo::GCCRegNames[] = {
4939 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4940 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4941 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4942 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4943 "p0", "p1", "p2", "p3",
4944 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4945};
4946
4947void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4948 unsigned &NumNames) const {
4949 Names = GCCRegNames;
4950 NumNames = llvm::array_lengthof(GCCRegNames);
4951}
4952
4953
4954const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4955 { { "sp" }, "r29" },
4956 { { "fp" }, "r30" },
4957 { { "lr" }, "r31" },
4958 };
4959
4960void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4961 unsigned &NumAliases) const {
4962 Aliases = GCCRegAliases;
4963 NumAliases = llvm::array_lengthof(GCCRegAliases);
4964}
4965
4966
4967const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4968#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4969#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4970 ALL_LANGUAGES },
4971#include "clang/Basic/BuiltinsHexagon.def"
4972};
4973}
4974
4975
Chris Lattner5ba61f02006-10-14 07:39:34 +00004976namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004977// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4978class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004979 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4980 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004981 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004982public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004983 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004984
Craig Topper3164f332014-03-11 03:39:26 +00004985 bool handleTargetFeatures(std::vector<std::string> &Features,
4986 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004987 SoftFloat = false;
4988 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4989 if (Features[i] == "+soft-float")
4990 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004991 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004992 }
Craig Topper3164f332014-03-11 03:39:26 +00004993 void getTargetDefines(const LangOptions &Opts,
4994 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004995 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004996 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004997
4998 if (SoftFloat)
4999 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005000 }
Craig Topper3164f332014-03-11 03:39:26 +00005001
5002 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005003 return llvm::StringSwitch<bool>(Feature)
5004 .Case("softfloat", SoftFloat)
5005 .Case("sparc", true)
5006 .Default(false);
5007 }
Craig Topper3164f332014-03-11 03:39:26 +00005008
5009 void getTargetBuiltins(const Builtin::Info *&Records,
5010 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005011 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005012 }
Craig Topper3164f332014-03-11 03:39:26 +00005013 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005014 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005015 }
Craig Topper3164f332014-03-11 03:39:26 +00005016 void getGCCRegNames(const char * const *&Names,
5017 unsigned &NumNames) const override;
5018 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5019 unsigned &NumAliases) const override;
5020 bool validateAsmConstraint(const char *&Name,
5021 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005022 // FIXME: Implement!
5023 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005024 }
Craig Topper3164f332014-03-11 03:39:26 +00005025 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005026 // FIXME: Implement!
5027 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005028 }
5029};
5030
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005031const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005032 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5033 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5034 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5035 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5036};
5037
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005038void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5039 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005040 Names = GCCRegNames;
5041 NumNames = llvm::array_lengthof(GCCRegNames);
5042}
5043
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005044const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005045 { { "g0" }, "r0" },
5046 { { "g1" }, "r1" },
5047 { { "g2" }, "r2" },
5048 { { "g3" }, "r3" },
5049 { { "g4" }, "r4" },
5050 { { "g5" }, "r5" },
5051 { { "g6" }, "r6" },
5052 { { "g7" }, "r7" },
5053 { { "o0" }, "r8" },
5054 { { "o1" }, "r9" },
5055 { { "o2" }, "r10" },
5056 { { "o3" }, "r11" },
5057 { { "o4" }, "r12" },
5058 { { "o5" }, "r13" },
5059 { { "o6", "sp" }, "r14" },
5060 { { "o7" }, "r15" },
5061 { { "l0" }, "r16" },
5062 { { "l1" }, "r17" },
5063 { { "l2" }, "r18" },
5064 { { "l3" }, "r19" },
5065 { { "l4" }, "r20" },
5066 { { "l5" }, "r21" },
5067 { { "l6" }, "r22" },
5068 { { "l7" }, "r23" },
5069 { { "i0" }, "r24" },
5070 { { "i1" }, "r25" },
5071 { { "i2" }, "r26" },
5072 { { "i3" }, "r27" },
5073 { { "i4" }, "r28" },
5074 { { "i5" }, "r29" },
5075 { { "i6", "fp" }, "r30" },
5076 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005077};
5078
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005079void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5080 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005081 Aliases = GCCRegAliases;
5082 NumAliases = llvm::array_lengthof(GCCRegAliases);
5083}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005084
5085// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5086class SparcV8TargetInfo : public SparcTargetInfo {
5087public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005088 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005089 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005090 }
5091
Craig Topper3164f332014-03-11 03:39:26 +00005092 void getTargetDefines(const LangOptions &Opts,
5093 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005094 SparcTargetInfo::getTargetDefines(Opts, Builder);
5095 Builder.defineMacro("__sparcv8");
5096 }
5097};
5098
5099// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5100class SparcV9TargetInfo : public SparcTargetInfo {
5101public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005102 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005103 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005104 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005105 // This is an LP64 platform.
5106 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005107
5108 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005109 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005110 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005111 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005112 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005113 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005114
5115 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5116 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5117 LongDoubleWidth = 128;
5118 LongDoubleAlign = 128;
5119 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005120 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005121 }
5122
Craig Topper3164f332014-03-11 03:39:26 +00005123 void getTargetDefines(const LangOptions &Opts,
5124 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005125 SparcTargetInfo::getTargetDefines(Opts, Builder);
5126 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005127 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005128 // Solaris doesn't need these variants, but the BSDs do.
5129 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005130 Builder.defineMacro("__sparc64__");
5131 Builder.defineMacro("__sparc_v9__");
5132 Builder.defineMacro("__sparcv9__");
5133 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005134 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005135
Craig Topper3164f332014-03-11 03:39:26 +00005136 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005137 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5138 .Case("v9", true)
5139 .Case("ultrasparc", true)
5140 .Case("ultrasparc3", true)
5141 .Case("niagara", true)
5142 .Case("niagara2", true)
5143 .Case("niagara3", true)
5144 .Case("niagara4", true)
5145 .Default(false);
5146
5147 // No need to store the CPU yet. There aren't any CPU-specific
5148 // macros to define.
5149 return CPUKnown;
5150 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005151};
5152
Gabor Greif49991682008-02-21 16:29:08 +00005153} // end anonymous namespace.
5154
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005155namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005156class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005157public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005158 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5159 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005160 SizeType = UnsignedInt;
5161 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005162 }
5163};
5164} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005165
Chris Lattnerb781dc792008-05-08 05:58:21 +00005166namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005167class SystemZTargetInfo : public TargetInfo {
5168 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005169
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005170public:
5171 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5172 TLSSupported = true;
5173 IntWidth = IntAlign = 32;
5174 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5175 PointerWidth = PointerAlign = 64;
5176 LongDoubleWidth = 128;
5177 LongDoubleAlign = 64;
5178 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5179 MinGlobalAlign = 16;
5180 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5181 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5182 }
5183 void getTargetDefines(const LangOptions &Opts,
5184 MacroBuilder &Builder) const override {
5185 Builder.defineMacro("__s390__");
5186 Builder.defineMacro("__s390x__");
5187 Builder.defineMacro("__zarch__");
5188 Builder.defineMacro("__LONG_DOUBLE_128__");
5189 }
5190 void getTargetBuiltins(const Builtin::Info *&Records,
5191 unsigned &NumRecords) const override {
5192 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005193 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005194 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005195 }
5196
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005197 void getGCCRegNames(const char *const *&Names,
5198 unsigned &NumNames) const override;
5199 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5200 unsigned &NumAliases) const override {
5201 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005202 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005203 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005204 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005205 bool validateAsmConstraint(const char *&Name,
5206 TargetInfo::ConstraintInfo &info) const override;
5207 const char *getClobbers() const override {
5208 // FIXME: Is this really right?
5209 return "";
5210 }
5211 BuiltinVaListKind getBuiltinVaListKind() const override {
5212 return TargetInfo::SystemZBuiltinVaList;
5213 }
5214 bool setCPU(const std::string &Name) override {
5215 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5216 .Case("z10", true)
5217 .Case("z196", true)
5218 .Case("zEC12", true)
5219 .Default(false);
5220
5221 // No need to store the CPU yet. There aren't any CPU-specific
5222 // macros to define.
5223 return CPUKnown;
5224 }
5225};
5226
5227const char *const SystemZTargetInfo::GCCRegNames[] = {
5228 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5229 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5230 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5231 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5232};
5233
5234void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5235 unsigned &NumNames) const {
5236 Names = GCCRegNames;
5237 NumNames = llvm::array_lengthof(GCCRegNames);
5238}
5239
5240bool SystemZTargetInfo::
5241validateAsmConstraint(const char *&Name,
5242 TargetInfo::ConstraintInfo &Info) const {
5243 switch (*Name) {
5244 default:
5245 return false;
5246
5247 case 'a': // Address register
5248 case 'd': // Data register (equivalent to 'r')
5249 case 'f': // Floating-point register
5250 Info.setAllowsRegister();
5251 return true;
5252
5253 case 'I': // Unsigned 8-bit constant
5254 case 'J': // Unsigned 12-bit constant
5255 case 'K': // Signed 16-bit constant
5256 case 'L': // Signed 20-bit displacement (on all targets we support)
5257 case 'M': // 0x7fffffff
5258 return true;
5259
5260 case 'Q': // Memory with base and unsigned 12-bit displacement
5261 case 'R': // Likewise, plus an index
5262 case 'S': // Memory with base and signed 20-bit displacement
5263 case 'T': // Likewise, plus an index
5264 Info.setAllowsMemory();
5265 return true;
5266 }
5267}
Ulrich Weigand47445072013-05-06 16:26:41 +00005268}
5269
5270namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005271 class MSP430TargetInfo : public TargetInfo {
5272 static const char * const GCCRegNames[];
5273 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005274 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005275 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005276 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005277 IntWidth = 16; IntAlign = 16;
5278 LongWidth = 32; LongLongWidth = 64;
5279 LongAlign = LongLongAlign = 16;
5280 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005281 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005282 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005283 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005284 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005285 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005286 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005287 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005288 }
5289 void getTargetDefines(const LangOptions &Opts,
5290 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005291 Builder.defineMacro("MSP430");
5292 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005293 // FIXME: defines for different 'flavours' of MCU
5294 }
Craig Topper3164f332014-03-11 03:39:26 +00005295 void getTargetBuiltins(const Builtin::Info *&Records,
5296 unsigned &NumRecords) const override {
5297 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005298 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005299 NumRecords = 0;
5300 }
Craig Topper3164f332014-03-11 03:39:26 +00005301 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005302 return Feature == "msp430";
5303 }
Craig Topper3164f332014-03-11 03:39:26 +00005304 void getGCCRegNames(const char * const *&Names,
5305 unsigned &NumNames) const override;
5306 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5307 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005308 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005309 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005310 NumAliases = 0;
5311 }
Craig Topper3164f332014-03-11 03:39:26 +00005312 bool validateAsmConstraint(const char *&Name,
5313 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005314 // No target constraints for now.
5315 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005316 }
Craig Topper3164f332014-03-11 03:39:26 +00005317 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005318 // FIXME: Is this really right?
5319 return "";
5320 }
Craig Topper3164f332014-03-11 03:39:26 +00005321 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005322 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005323 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005324 }
5325 };
5326
5327 const char * const MSP430TargetInfo::GCCRegNames[] = {
5328 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5329 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5330 };
5331
5332 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5333 unsigned &NumNames) const {
5334 Names = GCCRegNames;
5335 NumNames = llvm::array_lengthof(GCCRegNames);
5336 }
5337}
5338
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005339namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005340
Mike Stump11289f42009-09-09 15:08:12 +00005341 // LLVM and Clang cannot be used directly to output native binaries for
5342 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005343 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005344 //
5345 // TCE uses the llvm bitcode as input and uses it for generating customized
5346 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005347 // publicly available in http://tce.cs.tut.fi
5348
Eli Friedman1f191002011-10-07 19:51:42 +00005349 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5350 3, // opencl_global
5351 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005352 5, // opencl_constant
5353 0, // cuda_device
5354 0, // cuda_constant
5355 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005356 };
5357
Eli Friedmana9c3d712009-08-19 20:47:07 +00005358 class TCETargetInfo : public TargetInfo{
5359 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005360 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005361 TLSSupported = false;
5362 IntWidth = 32;
5363 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005364 PointerWidth = 32;
5365 IntAlign = 32;
5366 LongAlign = LongLongAlign = 32;
5367 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005368 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005369 SizeType = UnsignedInt;
5370 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005371 IntPtrType = SignedInt;
5372 PtrDiffType = SignedInt;
5373 FloatWidth = 32;
5374 FloatAlign = 32;
5375 DoubleWidth = 32;
5376 DoubleAlign = 32;
5377 LongDoubleWidth = 32;
5378 LongDoubleAlign = 32;
5379 FloatFormat = &llvm::APFloat::IEEEsingle;
5380 DoubleFormat = &llvm::APFloat::IEEEsingle;
5381 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005382 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5383 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005384 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005385 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005386 }
5387
Craig Topper3164f332014-03-11 03:39:26 +00005388 void getTargetDefines(const LangOptions &Opts,
5389 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005390 DefineStd(Builder, "tce", Opts);
5391 Builder.defineMacro("__TCE__");
5392 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005393 }
Craig Topper3164f332014-03-11 03:39:26 +00005394 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005395 return Feature == "tce";
5396 }
Craig Topper3164f332014-03-11 03:39:26 +00005397
5398 void getTargetBuiltins(const Builtin::Info *&Records,
5399 unsigned &NumRecords) const override {}
5400 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005401 return "";
5402 }
Craig Topper3164f332014-03-11 03:39:26 +00005403 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005404 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005405 }
Craig Topper3164f332014-03-11 03:39:26 +00005406 void getGCCRegNames(const char * const *&Names,
5407 unsigned &NumNames) const override {}
5408 bool validateAsmConstraint(const char *&Name,
5409 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005410 return true;
5411 }
Craig Topper3164f332014-03-11 03:39:26 +00005412 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5413 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005414 };
5415}
5416
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005417namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005418class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005419 virtual void setDescriptionString() = 0;
5420
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005421 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005422 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005423 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005424 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005425 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005426 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005427 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005428 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005429 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005430 enum DspRevEnum {
5431 NoDSP, DSP1, DSP2
5432 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005433 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005434
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005435protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005436 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005437 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005438
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005439public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005440 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5441 const std::string &CPUStr)
5442 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005443 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005444 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005445
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005446 bool isNaN2008Default() const {
5447 return CPU == "mips32r6" || CPU == "mips64r6";
5448 }
5449
5450 bool isFP64Default() const {
5451 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5452 }
5453
Alp Toker4925ba72014-06-07 23:30:42 +00005454 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005455 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005456 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5457 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005458 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005459 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005460 .Case("mips1", IsMips32)
5461 .Case("mips2", IsMips32)
5462 .Case("mips3", true)
5463 .Case("mips4", true)
5464 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005465 .Case("mips32", IsMips32)
5466 .Case("mips32r2", IsMips32)
5467 .Case("mips32r6", IsMips32)
5468 .Case("mips64", true)
5469 .Case("mips64r2", true)
5470 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005471 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005472 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005473 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005474 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005475 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005476 // The backend enables certain ABI's by default according to the
5477 // architecture.
5478 // Disable both possible defaults so that we don't end up with multiple
5479 // ABI's selected and trigger an assertion.
5480 Features["o32"] = false;
5481 Features["n64"] = false;
5482
Eric Christopher0b26a612010-03-02 02:41:08 +00005483 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005484 if (CPU == "octeon")
5485 Features["mips64r2"] = Features["cnmips"] = true;
5486 else
5487 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005488 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005489
Craig Topper3164f332014-03-11 03:39:26 +00005490 void getTargetDefines(const LangOptions &Opts,
5491 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005492 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005493 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005494 if (Opts.GNUMode)
5495 Builder.defineMacro("mips");
5496
Simon Atanasyan683535b2012-08-29 19:14:58 +00005497 Builder.defineMacro("__REGISTER_PREFIX__", "");
5498
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005499 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005500 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005501 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005502 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005503 case SoftFloat:
5504 Builder.defineMacro("__mips_soft_float", Twine(1));
5505 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005506 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005507
Simon Atanasyan16071912013-04-14 14:07:30 +00005508 if (IsSingleFloat)
5509 Builder.defineMacro("__mips_single_float", Twine(1));
5510
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005511 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5512 Builder.defineMacro("_MIPS_FPSET",
5513 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5514
Simon Atanasyan72244b62012-07-05 16:06:06 +00005515 if (IsMips16)
5516 Builder.defineMacro("__mips16", Twine(1));
5517
Simon Atanasyan60777612013-04-14 14:07:51 +00005518 if (IsMicromips)
5519 Builder.defineMacro("__mips_micromips", Twine(1));
5520
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005521 if (IsNan2008)
5522 Builder.defineMacro("__mips_nan2008", Twine(1));
5523
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005524 switch (DspRev) {
5525 default:
5526 break;
5527 case DSP1:
5528 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5529 Builder.defineMacro("__mips_dsp", Twine(1));
5530 break;
5531 case DSP2:
5532 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5533 Builder.defineMacro("__mips_dspr2", Twine(1));
5534 Builder.defineMacro("__mips_dsp", Twine(1));
5535 break;
5536 }
5537
Jack Carter44ff1e52013-08-12 17:20:29 +00005538 if (HasMSA)
5539 Builder.defineMacro("__mips_msa", Twine(1));
5540
Simon Atanasyan26f19672012-04-05 19:28:31 +00005541 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5542 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5543 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005544
5545 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5546 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005547 }
5548
Craig Topper3164f332014-03-11 03:39:26 +00005549 void getTargetBuiltins(const Builtin::Info *&Records,
5550 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005551 Records = BuiltinInfo;
5552 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005553 }
Craig Topper3164f332014-03-11 03:39:26 +00005554 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005555 return llvm::StringSwitch<bool>(Feature)
5556 .Case("mips", true)
5557 .Case("fp64", HasFP64)
5558 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005559 }
Craig Topper3164f332014-03-11 03:39:26 +00005560 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005561 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005562 }
Craig Topper3164f332014-03-11 03:39:26 +00005563 void getGCCRegNames(const char * const *&Names,
5564 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005565 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005566 // CPU register names
5567 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005568 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5569 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5570 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005571 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5572 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005573 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5574 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5575 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5576 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005577 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005578 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005579 "$fcc5","$fcc6","$fcc7",
5580 // MSA register names
5581 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5582 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5583 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5584 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5585 // MSA control register names
5586 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5587 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005588 };
5589 Names = GCCRegNames;
5590 NumNames = llvm::array_lengthof(GCCRegNames);
5591 }
Craig Topper3164f332014-03-11 03:39:26 +00005592 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5593 unsigned &NumAliases) const override = 0;
5594 bool validateAsmConstraint(const char *&Name,
5595 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005596 switch (*Name) {
5597 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005598 return false;
5599
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005600 case 'r': // CPU registers.
5601 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005602 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005603 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005604 case 'c': // $25 for indirect jumps
5605 case 'l': // lo register
5606 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005607 Info.setAllowsRegister();
5608 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005609 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005610 Info.setAllowsMemory();
5611 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005612 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005613 }
5614
Craig Topper3164f332014-03-11 03:39:26 +00005615 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005616 // FIXME: Implement!
5617 return "";
5618 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005619
Craig Topper3164f332014-03-11 03:39:26 +00005620 bool handleTargetFeatures(std::vector<std::string> &Features,
5621 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005622 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005623 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005624 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005625 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005626 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005627 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005628 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005629
5630 for (std::vector<std::string>::iterator it = Features.begin(),
5631 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005632 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005633 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005634 else if (*it == "+soft-float")
5635 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005636 else if (*it == "+mips16")
5637 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005638 else if (*it == "+micromips")
5639 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005640 else if (*it == "+dsp")
5641 DspRev = std::max(DspRev, DSP1);
5642 else if (*it == "+dspr2")
5643 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005644 else if (*it == "+msa")
5645 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005646 else if (*it == "+fp64")
5647 HasFP64 = true;
5648 else if (*it == "-fp64")
5649 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005650 else if (*it == "+nan2008")
5651 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005652 else if (*it == "-nan2008")
5653 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005654 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005655
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005656 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005657 std::vector<std::string>::iterator it =
5658 std::find(Features.begin(), Features.end(), "+soft-float");
5659 if (it != Features.end())
5660 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005661
Akira Hatanaka9064e362013-10-29 18:30:33 +00005662 setDescriptionString();
5663
Rafael Espindolaeb265472013-08-21 21:59:03 +00005664 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005665 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005666
Craig Topper3164f332014-03-11 03:39:26 +00005667 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005668 if (RegNo == 0) return 4;
5669 if (RegNo == 1) return 5;
5670 return -1;
5671 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005672
5673 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005674};
5675
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005676const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5677#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5678#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5679 ALL_LANGUAGES },
5680#include "clang/Basic/BuiltinsMips.def"
5681};
5682
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005683class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005684public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005685 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005686 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005687 SizeType = UnsignedInt;
5688 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005689 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005690 }
Craig Topper3164f332014-03-11 03:39:26 +00005691 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005692 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005693 ABI = Name;
5694 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005695 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005696 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005697 }
Craig Topper3164f332014-03-11 03:39:26 +00005698 void getTargetDefines(const LangOptions &Opts,
5699 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005700 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005701
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005702 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005703 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5704
5705 const std::string& CPUStr = getCPU();
5706 if (CPUStr == "mips32")
5707 Builder.defineMacro("__mips_isa_rev", "1");
5708 else if (CPUStr == "mips32r2")
5709 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005710
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005711 if (ABI == "o32") {
5712 Builder.defineMacro("__mips_o32");
5713 Builder.defineMacro("_ABIO32", "1");
5714 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5715 }
5716 else if (ABI == "eabi")
5717 Builder.defineMacro("__mips_eabi");
5718 else
David Blaikie83d382b2011-09-23 05:06:16 +00005719 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005720 }
Craig Topper3164f332014-03-11 03:39:26 +00005721 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5722 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005723 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5724 { { "at" }, "$1" },
5725 { { "v0" }, "$2" },
5726 { { "v1" }, "$3" },
5727 { { "a0" }, "$4" },
5728 { { "a1" }, "$5" },
5729 { { "a2" }, "$6" },
5730 { { "a3" }, "$7" },
5731 { { "t0" }, "$8" },
5732 { { "t1" }, "$9" },
5733 { { "t2" }, "$10" },
5734 { { "t3" }, "$11" },
5735 { { "t4" }, "$12" },
5736 { { "t5" }, "$13" },
5737 { { "t6" }, "$14" },
5738 { { "t7" }, "$15" },
5739 { { "s0" }, "$16" },
5740 { { "s1" }, "$17" },
5741 { { "s2" }, "$18" },
5742 { { "s3" }, "$19" },
5743 { { "s4" }, "$20" },
5744 { { "s5" }, "$21" },
5745 { { "s6" }, "$22" },
5746 { { "s7" }, "$23" },
5747 { { "t8" }, "$24" },
5748 { { "t9" }, "$25" },
5749 { { "k0" }, "$26" },
5750 { { "k1" }, "$27" },
5751 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005752 { { "sp","$sp" }, "$29" },
5753 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005754 { { "ra" }, "$31" }
5755 };
5756 Aliases = GCCRegAliases;
5757 NumAliases = llvm::array_lengthof(GCCRegAliases);
5758 }
5759};
5760
5761class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005762 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005763 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005764 }
5765
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005766public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005767 Mips32EBTargetInfo(const llvm::Triple &Triple)
5768 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005769 }
Craig Topper3164f332014-03-11 03:39:26 +00005770 void getTargetDefines(const LangOptions &Opts,
5771 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005772 DefineStd(Builder, "MIPSEB", Opts);
5773 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005774 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005775 }
5776};
5777
5778class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005779 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005780 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005781 }
5782
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005783public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005784 Mips32ELTargetInfo(const llvm::Triple &Triple)
5785 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005786 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005787 }
Craig Topper3164f332014-03-11 03:39:26 +00005788 void getTargetDefines(const LangOptions &Opts,
5789 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005790 DefineStd(Builder, "MIPSEL", Opts);
5791 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005792 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005793 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005794};
Akira Hatanakabef17452011-09-20 19:21:49 +00005795
5796class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005797public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005798 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005799 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005800 LongDoubleWidth = LongDoubleAlign = 128;
5801 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005802 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5803 LongDoubleWidth = LongDoubleAlign = 64;
5804 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5805 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005806 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005807 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005808 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005809 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005810
5811 void setN64ABITypes() {
5812 LongWidth = LongAlign = 64;
5813 PointerWidth = PointerAlign = 64;
5814 SizeType = UnsignedLong;
5815 PtrDiffType = SignedLong;
5816 }
5817
5818 void setN32ABITypes() {
5819 LongWidth = LongAlign = 32;
5820 PointerWidth = PointerAlign = 32;
5821 SizeType = UnsignedInt;
5822 PtrDiffType = SignedInt;
5823 }
5824
Craig Topper3164f332014-03-11 03:39:26 +00005825 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005826 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005827 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005828 ABI = Name;
5829 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005830 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005831 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005832 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005833 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005834 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005835 }
5836 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005837 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005838
Craig Topper3164f332014-03-11 03:39:26 +00005839 void getTargetDefines(const LangOptions &Opts,
5840 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005841 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005842
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005843 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005844 Builder.defineMacro("__mips64");
5845 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005846 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5847
5848 const std::string& CPUStr = getCPU();
5849 if (CPUStr == "mips64")
5850 Builder.defineMacro("__mips_isa_rev", "1");
5851 else if (CPUStr == "mips64r2")
5852 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005853
Akira Hatanakabef17452011-09-20 19:21:49 +00005854 if (ABI == "n32") {
5855 Builder.defineMacro("__mips_n32");
5856 Builder.defineMacro("_ABIN32", "2");
5857 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5858 }
5859 else if (ABI == "n64") {
5860 Builder.defineMacro("__mips_n64");
5861 Builder.defineMacro("_ABI64", "3");
5862 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5863 }
5864 else
David Blaikie83d382b2011-09-23 05:06:16 +00005865 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005866 }
Craig Topper3164f332014-03-11 03:39:26 +00005867 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5868 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005869 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5870 { { "at" }, "$1" },
5871 { { "v0" }, "$2" },
5872 { { "v1" }, "$3" },
5873 { { "a0" }, "$4" },
5874 { { "a1" }, "$5" },
5875 { { "a2" }, "$6" },
5876 { { "a3" }, "$7" },
5877 { { "a4" }, "$8" },
5878 { { "a5" }, "$9" },
5879 { { "a6" }, "$10" },
5880 { { "a7" }, "$11" },
5881 { { "t0" }, "$12" },
5882 { { "t1" }, "$13" },
5883 { { "t2" }, "$14" },
5884 { { "t3" }, "$15" },
5885 { { "s0" }, "$16" },
5886 { { "s1" }, "$17" },
5887 { { "s2" }, "$18" },
5888 { { "s3" }, "$19" },
5889 { { "s4" }, "$20" },
5890 { { "s5" }, "$21" },
5891 { { "s6" }, "$22" },
5892 { { "s7" }, "$23" },
5893 { { "t8" }, "$24" },
5894 { { "t9" }, "$25" },
5895 { { "k0" }, "$26" },
5896 { { "k1" }, "$27" },
5897 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005898 { { "sp","$sp" }, "$29" },
5899 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005900 { { "ra" }, "$31" }
5901 };
5902 Aliases = GCCRegAliases;
5903 NumAliases = llvm::array_lengthof(GCCRegAliases);
5904 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005905
5906 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005907};
5908
5909class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005910 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005911 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005912 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 +00005913 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005914 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005915
Akira Hatanakabef17452011-09-20 19:21:49 +00005916 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005917
Akira Hatanakabef17452011-09-20 19:21:49 +00005918public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005919 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005920 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005921 void getTargetDefines(const LangOptions &Opts,
5922 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005923 DefineStd(Builder, "MIPSEB", Opts);
5924 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005925 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005926 }
5927};
5928
5929class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005930 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005931 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005932 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 +00005933 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005934 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005935 }
5936public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005937 Mips64ELTargetInfo(const llvm::Triple &Triple)
5938 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005939 // Default ABI is n64.
5940 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005941 }
Craig Topper3164f332014-03-11 03:39:26 +00005942 void getTargetDefines(const LangOptions &Opts,
5943 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005944 DefineStd(Builder, "MIPSEL", Opts);
5945 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005946 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005947 }
5948};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005949} // end anonymous namespace.
5950
Ivan Krasindd7403e2011-08-24 20:22:22 +00005951namespace {
5952class PNaClTargetInfo : public TargetInfo {
5953public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005954 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005955 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005956 this->UserLabelPrefix = "";
5957 this->LongAlign = 32;
5958 this->LongWidth = 32;
5959 this->PointerAlign = 32;
5960 this->PointerWidth = 32;
5961 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005962 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005963 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005964 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005965 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005966 this->SizeType = TargetInfo::UnsignedInt;
5967 this->PtrDiffType = TargetInfo::SignedInt;
5968 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005969 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005970 }
5971
Craig Topper3164f332014-03-11 03:39:26 +00005972 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005973 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005974 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005975 Builder.defineMacro("__le32__");
5976 Builder.defineMacro("__pnacl__");
5977 }
Craig Topper3164f332014-03-11 03:39:26 +00005978 void getTargetDefines(const LangOptions &Opts,
5979 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005980 getArchDefines(Opts, Builder);
5981 }
Craig Topper3164f332014-03-11 03:39:26 +00005982 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005983 return Feature == "pnacl";
5984 }
Craig Topper3164f332014-03-11 03:39:26 +00005985 void getTargetBuiltins(const Builtin::Info *&Records,
5986 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005987 }
Craig Topper3164f332014-03-11 03:39:26 +00005988 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005989 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005990 }
Craig Topper3164f332014-03-11 03:39:26 +00005991 void getGCCRegNames(const char * const *&Names,
5992 unsigned &NumNames) const override;
5993 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5994 unsigned &NumAliases) const override;
5995 bool validateAsmConstraint(const char *&Name,
5996 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005997 return false;
5998 }
5999
Craig Topper3164f332014-03-11 03:39:26 +00006000 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006001 return "";
6002 }
6003};
6004
6005void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6006 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006007 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006008 NumNames = 0;
6009}
6010
6011void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6012 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006013 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006014 NumAliases = 0;
6015}
6016} // end anonymous namespace.
6017
Guy Benyeib798fc92012-12-11 21:38:14 +00006018namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006019class Le64TargetInfo : public TargetInfo {
6020 static const Builtin::Info BuiltinInfo[];
6021
6022public:
6023 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6024 BigEndian = false;
6025 NoAsmVariants = true;
6026 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6027 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6028 DescriptionString =
6029 "e-S128-p:64:64-v16:16-v32:32-v64:64-v96:32-v128:32-m:e-n8:16:32:64";
6030 }
6031
6032 void getTargetDefines(const LangOptions &Opts,
6033 MacroBuilder &Builder) const override {
6034 DefineStd(Builder, "unix", Opts);
6035 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6036 Builder.defineMacro("__ELF__");
6037 }
6038 void getTargetBuiltins(const Builtin::Info *&Records,
6039 unsigned &NumRecords) const override {
6040 Records = BuiltinInfo;
6041 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6042 }
6043 BuiltinVaListKind getBuiltinVaListKind() const override {
6044 return TargetInfo::PNaClABIBuiltinVaList;
6045 }
6046 const char *getClobbers() const override { return ""; }
6047 void getGCCRegNames(const char *const *&Names,
6048 unsigned &NumNames) const override {
6049 Names = nullptr;
6050 NumNames = 0;
6051 }
6052 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6053 unsigned &NumAliases) const override {
6054 Aliases = nullptr;
6055 NumAliases = 0;
6056 }
6057 bool validateAsmConstraint(const char *&Name,
6058 TargetInfo::ConstraintInfo &Info) const override {
6059 return false;
6060 }
6061
6062 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006063};
6064} // end anonymous namespace.
6065
6066const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6067#define BUILTIN(ID, TYPE, ATTRS) \
6068 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6069#include "clang/Basic/BuiltinsLe64.def"
6070};
6071
6072namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006073 static const unsigned SPIRAddrSpaceMap[] = {
6074 1, // opencl_global
6075 3, // opencl_local
6076 2, // opencl_constant
6077 0, // cuda_device
6078 0, // cuda_constant
6079 0 // cuda_shared
6080 };
6081 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006082 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006083 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006084 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6085 "SPIR target must use unknown OS");
6086 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6087 "SPIR target must use unknown environment type");
6088 BigEndian = false;
6089 TLSSupported = false;
6090 LongWidth = LongAlign = 64;
6091 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006092 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006093 // Define available target features
6094 // These must be defined in sorted order!
6095 NoAsmVariants = true;
6096 }
Craig Topper3164f332014-03-11 03:39:26 +00006097 void getTargetDefines(const LangOptions &Opts,
6098 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006099 DefineStd(Builder, "SPIR", Opts);
6100 }
Craig Topper3164f332014-03-11 03:39:26 +00006101 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006102 return Feature == "spir";
6103 }
Craig Topper3164f332014-03-11 03:39:26 +00006104
6105 void getTargetBuiltins(const Builtin::Info *&Records,
6106 unsigned &NumRecords) const override {}
6107 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006108 return "";
6109 }
Craig Topper3164f332014-03-11 03:39:26 +00006110 void getGCCRegNames(const char * const *&Names,
6111 unsigned &NumNames) const override {}
6112 bool validateAsmConstraint(const char *&Name,
6113 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006114 return true;
6115 }
Craig Topper3164f332014-03-11 03:39:26 +00006116 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6117 unsigned &NumAliases) const override {}
6118 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006119 return TargetInfo::VoidPtrBuiltinVaList;
6120 }
6121 };
6122
6123
6124 class SPIR32TargetInfo : public SPIRTargetInfo {
6125 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006126 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006127 PointerWidth = PointerAlign = 32;
6128 SizeType = TargetInfo::UnsignedInt;
6129 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6130 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006131 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6132 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006133 }
Craig Topper3164f332014-03-11 03:39:26 +00006134 void getTargetDefines(const LangOptions &Opts,
6135 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006136 DefineStd(Builder, "SPIR32", Opts);
6137 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006138 };
6139
6140 class SPIR64TargetInfo : public SPIRTargetInfo {
6141 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006142 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006143 PointerWidth = PointerAlign = 64;
6144 SizeType = TargetInfo::UnsignedLong;
6145 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006146 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6147 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006148 }
Craig Topper3164f332014-03-11 03:39:26 +00006149 void getTargetDefines(const LangOptions &Opts,
6150 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006151 DefineStd(Builder, "SPIR64", Opts);
6152 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006153 };
6154}
6155
Robert Lytton0e076492013-08-13 09:43:10 +00006156namespace {
6157class XCoreTargetInfo : public TargetInfo {
6158 static const Builtin::Info BuiltinInfo[];
6159public:
6160 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6161 BigEndian = false;
6162 NoAsmVariants = true;
6163 LongLongAlign = 32;
6164 SuitableAlign = 32;
6165 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006166 SizeType = UnsignedInt;
6167 PtrDiffType = SignedInt;
6168 IntPtrType = SignedInt;
6169 WCharType = UnsignedChar;
6170 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006171 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006172 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 +00006173 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006174 }
Craig Topper3164f332014-03-11 03:39:26 +00006175 void getTargetDefines(const LangOptions &Opts,
6176 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006177 Builder.defineMacro("__XS1B__");
6178 }
Craig Topper3164f332014-03-11 03:39:26 +00006179 void getTargetBuiltins(const Builtin::Info *&Records,
6180 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006181 Records = BuiltinInfo;
6182 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6183 }
Craig Topper3164f332014-03-11 03:39:26 +00006184 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006185 return TargetInfo::VoidPtrBuiltinVaList;
6186 }
Craig Topper3164f332014-03-11 03:39:26 +00006187 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006188 return "";
6189 }
Craig Topper3164f332014-03-11 03:39:26 +00006190 void getGCCRegNames(const char * const *&Names,
6191 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006192 static const char * const GCCRegNames[] = {
6193 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6194 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6195 };
6196 Names = GCCRegNames;
6197 NumNames = llvm::array_lengthof(GCCRegNames);
6198 }
Craig Topper3164f332014-03-11 03:39:26 +00006199 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6200 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006201 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006202 NumAliases = 0;
6203 }
Craig Topper3164f332014-03-11 03:39:26 +00006204 bool validateAsmConstraint(const char *&Name,
6205 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006206 return false;
6207 }
Craig Topper3164f332014-03-11 03:39:26 +00006208 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006209 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6210 return (RegNo < 2)? RegNo : -1;
6211 }
Robert Lytton0e076492013-08-13 09:43:10 +00006212};
6213
6214const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6215#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6216#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6217 ALL_LANGUAGES },
6218#include "clang/Basic/BuiltinsXCore.def"
6219};
6220} // end anonymous namespace.
6221
Ivan Krasindd7403e2011-08-24 20:22:22 +00006222
Chris Lattner5ba61f02006-10-14 07:39:34 +00006223//===----------------------------------------------------------------------===//
6224// Driver code
6225//===----------------------------------------------------------------------===//
6226
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006227static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006228 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006229
Daniel Dunbar52322032009-08-18 05:47:58 +00006230 switch (Triple.getArch()) {
6231 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006232 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006233
Tim Northover2a0783d2014-05-30 14:14:07 +00006234 case llvm::Triple::xcore:
6235 return new XCoreTargetInfo(Triple);
6236
6237 case llvm::Triple::hexagon:
6238 return new HexagonTargetInfo(Triple);
6239
6240 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006241 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006242 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006243
6244 switch (os) {
6245 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006246 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006247 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006248 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006249 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006250 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006251 }
6252
Christian Pirker9b019ae2014-02-25 13:51:00 +00006253 case llvm::Triple::aarch64_be:
6254 switch (os) {
6255 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006256 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006257 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006258 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006259 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006260 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006261 }
6262
Daniel Dunbar52322032009-08-18 05:47:58 +00006263 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006264 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006265 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006266 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006267
Daniel Dunbar52322032009-08-18 05:47:58 +00006268 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006269 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006270 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006271 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006272 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006273 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006274 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006275 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006276 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006277 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006278 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006279 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006280 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006281 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006282 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006283 case llvm::Triple::Win32:
6284 switch (Triple.getEnvironment()) {
6285 default:
6286 return new ARMleTargetInfo(Triple);
6287 case llvm::Triple::Itanium:
6288 return new ItaniumWindowsARMleTargetInfo(Triple);
6289 case llvm::Triple::MSVC:
6290 return new MicrosoftARMleTargetInfo(Triple);
6291 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006292 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006293 return new ARMleTargetInfo(Triple);
6294 }
6295
6296 case llvm::Triple::armeb:
6297 case llvm::Triple::thumbeb:
6298 if (Triple.isOSDarwin())
6299 return new DarwinARMTargetInfo(Triple);
6300
6301 switch (os) {
6302 case llvm::Triple::Linux:
6303 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6304 case llvm::Triple::FreeBSD:
6305 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6306 case llvm::Triple::NetBSD:
6307 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6308 case llvm::Triple::OpenBSD:
6309 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6310 case llvm::Triple::Bitrig:
6311 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6312 case llvm::Triple::RTEMS:
6313 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6314 case llvm::Triple::NaCl:
6315 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6316 default:
6317 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006318 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006319
Daniel Dunbar52322032009-08-18 05:47:58 +00006320 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006321 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006322
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006323 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006324 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006325 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006326 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006327 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006328 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006329 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006330 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006331 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006332 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006333 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006334 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006335 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006336
6337 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006338 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006339 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006341 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006342 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006343 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006344 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006345 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006346 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006347 case llvm::Triple::NaCl:
6348 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006349 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006350 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006351 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006352
Akira Hatanakabef17452011-09-20 19:21:49 +00006353 case llvm::Triple::mips64:
6354 switch (os) {
6355 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006356 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006357 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006358 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006359 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006360 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006361 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006362 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006363 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006364 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006365 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006366 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006367 }
6368
6369 case llvm::Triple::mips64el:
6370 switch (os) {
6371 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006373 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006374 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006375 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006376 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006377 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006378 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006379 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006380 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006381 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006383 }
6384
Ivan Krasindd7403e2011-08-24 20:22:22 +00006385 case llvm::Triple::le32:
6386 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006387 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006389 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006390 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006391 }
6392
JF Bastien643817d2014-09-12 17:52:47 +00006393 case llvm::Triple::le64:
6394 return new Le64TargetInfo(Triple);
6395
Daniel Dunbar52322032009-08-18 05:47:58 +00006396 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006397 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006398 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006399 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006400 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006401 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006402 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006403 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006404 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006405 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006406 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006407 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006408 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006409 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006410 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006411 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006412 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006413
6414 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006415 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006416 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006417 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006418 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006419 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006420 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006421 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006422 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006423 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006424 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006425 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006426 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006427 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006428 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006429
Bill Schmidt778d3872013-07-26 01:36:11 +00006430 case llvm::Triple::ppc64le:
6431 switch (os) {
6432 case llvm::Triple::Linux:
6433 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6434 default:
6435 return new PPC64TargetInfo(Triple);
6436 }
6437
Peter Collingbournec947aae2012-05-20 23:28:41 +00006438 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006439 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006440 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006441 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006442
Eli Friedmand13b41e2012-10-12 23:32:00 +00006443 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006444 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006445
Daniel Dunbar52322032009-08-18 05:47:58 +00006446 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006447 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006448 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006449 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006450 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006451 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006452 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006453 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006454 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006455 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006456 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006457 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006458 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006459 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006460 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006461
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006462 case llvm::Triple::sparcv9:
6463 switch (os) {
6464 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006465 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006466 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006467 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006468 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006469 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006470 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006471 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006472 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006473 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006474 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006475 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006476 }
6477
Ulrich Weigand47445072013-05-06 16:26:41 +00006478 case llvm::Triple::systemz:
6479 switch (os) {
6480 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006481 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006482 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006483 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006484 }
6485
Eli Friedmana9c3d712009-08-19 20:47:07 +00006486 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006487 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006488
Daniel Dunbar52322032009-08-18 05:47:58 +00006489 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006490 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006492
Daniel Dunbar52322032009-08-18 05:47:58 +00006493 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006494 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006495 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006496 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006497 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006498 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006499 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006500 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006501 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006502 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006503 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006504 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006505 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006506 case llvm::Triple::KFreeBSD:
6507 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006508 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006509 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006510 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006511 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006512 case llvm::Triple::Win32: {
6513 switch (Triple.getEnvironment()) {
6514 default:
6515 return new X86_32TargetInfo(Triple);
6516 case llvm::Triple::Cygnus:
6517 return new CygwinX86_32TargetInfo(Triple);
6518 case llvm::Triple::GNU:
6519 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006520 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006521 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006522 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006523 }
6524 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006525 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006526 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006527 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006528 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006529 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006530 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006531 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006532 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006533 }
6534
6535 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006536 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006537 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006538
Daniel Dunbar52322032009-08-18 05:47:58 +00006539 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006540 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006541 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006542 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006543 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006544 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006545 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006546 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006547 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006548 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006549 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006550 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006551 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006552 case llvm::Triple::KFreeBSD:
6553 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006554 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006555 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006556 case llvm::Triple::Win32: {
6557 switch (Triple.getEnvironment()) {
6558 default:
6559 return new X86_64TargetInfo(Triple);
6560 case llvm::Triple::GNU:
6561 return new MinGWX86_64TargetInfo(Triple);
6562 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006563 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006564 }
6565 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006566 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006567 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006568 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006569 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006570 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006571
6572 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006573 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006574 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006575 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006576 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006577 }
6578 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006579 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006580 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006581 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006582 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006583 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006584 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006585}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006586
6587/// CreateTargetInfo - Return the target info object for the specified target
6588/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006589TargetInfo *
6590TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6591 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006592 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006593
6594 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006595 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006596 if (!Target) {
6597 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006598 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006599 }
Alp Toker80758082014-07-06 05:26:44 +00006600 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006601
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006602 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006603 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6604 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006605 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006606 }
6607
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006608 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006609 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6610 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006611 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006612 }
6613
Rafael Espindolaeb265472013-08-21 21:59:03 +00006614 // Set the fp math unit.
6615 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6616 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006617 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006618 }
6619
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006620 // Compute the default target features, we need the target to handle this
6621 // because features may have dependencies on one another.
6622 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006623 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006624
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006625 // Apply the user specified deltas.
6626 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6627 I < N; ++I) {
6628 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006629 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006630 bool Enabled = Name[0] == '+';
6631 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006632 }
6633
6634 // Add the features to the compile options.
6635 //
6636 // FIXME: If we are completely confident that we have the right set, we only
6637 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006638 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006639 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6640 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006641 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006642 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006643 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006644
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006645 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006646}